From 06bd1832a4cd71282f330e32c81975e86d616eb9 Mon Sep 17 00:00:00 2001 From: bangerth Date: Fri, 15 Dec 2006 02:34:08 +0000 Subject: [PATCH] Make the rowstart field of the sparsity pattern class of type std::size_t, to allow matrices with more than 4B elements on 64-bit machines. git-svn-id: https://svn.dealii.org/trunk@14249 0785d39b-7218-0410-832d-ea1e28bc413d --- .../multigrid/mg_tools.all_dimensions.cc | 2 +- .../numerics/matrices.all_dimensions.cc | 2 +- deal.II/doc/news/changes.html | 22 +++++--- .../lac/sparse_decomposition.templates.h | 4 +- .../lac/include/lac/sparse_ilu.templates.h | 6 +-- .../lac/include/lac/sparse_matrix.templates.h | 4 +- .../lac/include/lac/sparse_mic.templates.h | 6 +-- deal.II/lac/include/lac/sparsity_pattern.h | 8 +-- deal.II/lac/source/sparse_direct.cc | 8 +-- deal.II/lac/source/sparsity_pattern.cc | 54 ++++++++++++++----- 10 files changed, 77 insertions(+), 39 deletions(-) diff --git a/deal.II/deal.II/source/multigrid/mg_tools.all_dimensions.cc b/deal.II/deal.II/source/multigrid/mg_tools.all_dimensions.cc index 00aca6f0f6..0ff5d6ca11 100644 --- a/deal.II/deal.II/source/multigrid/mg_tools.all_dimensions.cc +++ b/deal.II/deal.II/source/multigrid/mg_tools.all_dimensions.cc @@ -60,7 +60,7 @@ MGTools::apply_boundary_values ( std::set::const_iterator dof = boundary_dofs.begin(), endd = boundary_dofs.end(); const SparsityPattern &sparsity = matrix.get_sparsity_pattern(); - const unsigned int *sparsity_rowstart = sparsity.get_rowstart_indices(); + const std::size_t *sparsity_rowstart = sparsity.get_rowstart_indices(); const unsigned int *sparsity_colnums = sparsity.get_column_numbers(); for (; dof != endd; ++dof) { diff --git a/deal.II/deal.II/source/numerics/matrices.all_dimensions.cc b/deal.II/deal.II/source/numerics/matrices.all_dimensions.cc index d335079911..0b6fd8ceae 100644 --- a/deal.II/deal.II/source/numerics/matrices.all_dimensions.cc +++ b/deal.II/deal.II/source/numerics/matrices.all_dimensions.cc @@ -74,7 +74,7 @@ MatrixTools::apply_boundary_values (const std::map &boundar std::map::const_iterator dof = boundary_values.begin(), endd = boundary_values.end(); const SparsityPattern &sparsity = matrix.get_sparsity_pattern(); - const unsigned int *sparsity_rowstart = sparsity.get_rowstart_indices(); + const std::size_t *sparsity_rowstart = sparsity.get_rowstart_indices(); const unsigned int *sparsity_colnums = sparsity.get_column_numbers(); for (; dof != endd; ++dof) { diff --git a/deal.II/doc/news/changes.html b/deal.II/doc/news/changes.html index 8752cc5f9c..ade9c244f7 100644 --- a/deal.II/doc/news/changes.html +++ b/deal.II/doc/news/changes.html @@ -689,12 +689,22 @@ inconvenience this causes.
    -
  1. Improved: The class LAPACKFullMatrix now also uses LU factorization - of LAPACK. The new wrapper PreconditionLU - allows us to use this as a preconditioner. -
    - (GK 2006/10/02) +

  2. Improved: The SparsityPattern class would produce + segmentation faults if one tried to allocate a matrix with more + than about 4.2 billion elements (i.e. the number that one can + store in a 32-bit unsigned integer). This is now fixed: if you + have enough memory, this is now possible on 64-bit + systems. (The number of rows is still limited by the 32-bit + limit, but this is probably going to be enough for some time to + come.) This fix also required changing the return type of the + SparsityPattern::get_rowstart_indices function + from const unsigned int * to const + std::size_t *; since this function should not be used + outside of the library anyway, this is probably not a change + that affects user code. +
    + (WB 2006/12/14)

  3. New: The class ::prebuild_lower_bound() { const unsigned int * const column_numbers = this->get_sparsity_pattern().get_column_numbers(); - const unsigned int * const + const std::size_t * const rowstart_indices = this->get_sparsity_pattern().get_rowstart_indices(); const unsigned int N = this->m(); @@ -185,7 +185,7 @@ SparseLUDecomposition::copy_from (const SparseMatrix& matrix // note: pointers to the sparsity // pattern of the old matrix! - const unsigned int * const rowstart_indices + const std::size_t * const rowstart_indices = matrix.get_sparsity_pattern().get_rowstart_indices(); const unsigned int * const column_numbers diff --git a/deal.II/lac/include/lac/sparse_ilu.templates.h b/deal.II/lac/include/lac/sparse_ilu.templates.h index 7cdba0d1d0..14e2845220 100644 --- a/deal.II/lac/include/lac/sparse_ilu.templates.h +++ b/deal.II/lac/include/lac/sparse_ilu.templates.h @@ -67,7 +67,7 @@ void SparseILU::decompose (const SparseMatrix &matrix, this->strengthen_diagonal_impl(); const SparsityPattern &sparsity = this->get_sparsity_pattern(); - const unsigned int * const rowstart_indices = sparsity.get_rowstart_indices(); + const std::size_t * const rowstart_indices = sparsity.get_rowstart_indices(); const unsigned int * const column_numbers = sparsity.get_column_numbers(); /* @@ -185,7 +185,7 @@ void SparseILU::vmult (Vector &dst, Assert (dst.size() == this->m(), ExcDimensionMismatch(dst.size(), this->m())); const unsigned int N=dst.size(); - const unsigned int * const rowstart_indices + const std::size_t * const rowstart_indices = this->get_sparsity_pattern().get_rowstart_indices(); const unsigned int * const column_numbers = this->get_sparsity_pattern().get_column_numbers(); @@ -253,7 +253,7 @@ void SparseILU::Tvmult (Vector &dst, Assert (dst.size() == this->m(), ExcDimensionMismatch(dst.size(), this->m())); const unsigned int N=dst.size(); - const unsigned int * const rowstart_indices + const std::size_t * const rowstart_indices = this->get_sparsity_pattern().get_rowstart_indices(); const unsigned int * const column_numbers = this->get_sparsity_pattern().get_column_numbers(); diff --git a/deal.II/lac/include/lac/sparse_matrix.templates.h b/deal.II/lac/include/lac/sparse_matrix.templates.h index b4c174dd7f..fc43544a1c 100644 --- a/deal.II/lac/include/lac/sparse_matrix.templates.h +++ b/deal.II/lac/include/lac/sparse_matrix.templates.h @@ -933,7 +933,7 @@ SparseMatrix::precondition_Jacobi (Vector &dst, const unsigned int n = src.size(); somenumber *dst_ptr = dst.begin(); const somenumber *src_ptr = src.begin(); - const unsigned int *rowstart_ptr = &cols->rowstart[0]; + const std::size_t *rowstart_ptr = &cols->rowstart[0]; // optimize the following loop for // the case that the relaxation @@ -976,7 +976,7 @@ SparseMatrix::precondition_SSOR (Vector &dst, Assert (src.size() == n(), ExcDimensionMismatch (src.size(), n())); const unsigned int n = src.size(); - const unsigned int *rowstart_ptr = &cols->rowstart[0]; + const std::size_t *rowstart_ptr = &cols->rowstart[0]; somenumber *dst_ptr = &dst(0); // forward sweep diff --git a/deal.II/lac/include/lac/sparse_mic.templates.h b/deal.II/lac/include/lac/sparse_mic.templates.h index e6081ee045..00de1e1790 100644 --- a/deal.II/lac/include/lac/sparse_mic.templates.h +++ b/deal.II/lac/include/lac/sparse_mic.templates.h @@ -140,7 +140,7 @@ void SparseMIC::decompose (const SparseMatrix &matrix, } const unsigned int* const col_nums = this->get_sparsity_pattern().get_column_numbers(); - const unsigned int* const rowstarts = this->get_sparsity_pattern().get_rowstart_indices(); + const std::size_t* const rowstarts = this->get_sparsity_pattern().get_rowstart_indices(); for(unsigned int row=0; rowm(); row++) { @@ -171,7 +171,7 @@ SparseMIC::get_rowsum (const unsigned int row) const // get start of this row. skip the // diagonal element const unsigned int * const column_numbers = this->get_sparsity_pattern().get_column_numbers(); - const unsigned int * const rowstart_indices = this->get_sparsity_pattern().get_rowstart_indices(); + const std::size_t * const rowstart_indices = this->get_sparsity_pattern().get_rowstart_indices(); const unsigned int * const rowend = &column_numbers[rowstart_indices[row+1]]; // find the position where the part @@ -197,7 +197,7 @@ SparseMIC::vmult (Vector &dst, Assert (dst.size() == this->m(), ExcDimensionMismatch(dst.size(), this->m())); const unsigned int N=dst.size(); - const unsigned int * const rowstart_indices = this->get_sparsity_pattern().get_rowstart_indices(); + const std::size_t * const rowstart_indices = this->get_sparsity_pattern().get_rowstart_indices(); const unsigned int * const column_numbers = this->get_sparsity_pattern().get_column_numbers(); // We assume the underlying matrix A is: // A = X - L - U, where -L and -U are diff --git a/deal.II/lac/include/lac/sparsity_pattern.h b/deal.II/lac/include/lac/sparsity_pattern.h index 48b6905bce..8b36a7be7c 100644 --- a/deal.II/lac/include/lac/sparsity_pattern.h +++ b/deal.II/lac/include/lac/sparsity_pattern.h @@ -1257,7 +1257,7 @@ class SparsityPattern : public Subscriptor * avoid programs relying on outdated * information! */ - inline const unsigned int * get_rowstart_indices () const; + inline const std::size_t * get_rowstart_indices () const; /** * @deprecated. Use @p row_length and @@ -1396,7 +1396,7 @@ class SparsityPattern : public Subscriptor * may be larger than the actually used * part of the array. */ - unsigned int max_vec_len; + std::size_t max_vec_len; /** * Maximum number of elements per @@ -1439,7 +1439,7 @@ class SparsityPattern : public Subscriptor * number of elements that was allocated * is stored in #max_dim. */ - unsigned int *rowstart; + std::size_t *rowstart; /** * Array of column numbers. In @@ -1961,7 +1961,7 @@ SparsityPattern::optimize_diagonal () const inline -const unsigned int * +const std::size_t * SparsityPattern::get_rowstart_indices () const { return rowstart; diff --git a/deal.II/lac/source/sparse_direct.cc b/deal.II/lac/source/sparse_direct.cc index da5c303053..a2d3097924 100644 --- a/deal.II/lac/source/sparse_direct.cc +++ b/deal.II/lac/source/sparse_direct.cc @@ -661,7 +661,7 @@ SparseDirectMA27::initialize (const SparsityPattern &sp) const unsigned int n_rows = sparsity_pattern->n_rows(); - const unsigned int * const + const std::size_t * const rowstart_indices = sparsity_pattern->get_rowstart_indices(); const unsigned int * const col_nums = sparsity_pattern->get_column_numbers(); @@ -991,7 +991,7 @@ SparseDirectMA27::fill_A (const SparseMatrix &matrix) const SparsityPattern &sparsity_pattern = matrix.get_sparsity_pattern (); const unsigned int n_rows = sparsity_pattern.n_rows(); - const unsigned int *rowstart_indices = sparsity_pattern.get_rowstart_indices(); + const std::size_t *rowstart_indices = sparsity_pattern.get_rowstart_indices(); const unsigned int *col_nums = sparsity_pattern.get_column_numbers(); unsigned int global_index = 0; @@ -1236,7 +1236,7 @@ SparseDirectMA47::initialize (const SparseMatrix &m) const unsigned int n_rows = sparsity_pattern.n_rows(); - const unsigned int * const + const std::size_t * const rowstart_indices = sparsity_pattern.get_rowstart_indices(); const unsigned int * const col_nums = sparsity_pattern.get_column_numbers(); @@ -1508,7 +1508,7 @@ SparseDirectMA47::fill_A (const SparseMatrix &matrix) const SparsityPattern &sparsity_pattern = matrix.get_sparsity_pattern (); const unsigned int n_rows = sparsity_pattern.n_rows(); - const unsigned int *rowstart_indices = sparsity_pattern.get_rowstart_indices(); + const std::size_t *rowstart_indices = sparsity_pattern.get_rowstart_indices(); const unsigned int *col_nums = sparsity_pattern.get_column_numbers(); unsigned int global_index = 0; diff --git a/deal.II/lac/source/sparsity_pattern.cc b/deal.II/lac/source/sparsity_pattern.cc index e49158f19a..e815591672 100644 --- a/deal.II/lac/source/sparsity_pattern.cc +++ b/deal.II/lac/source/sparsity_pattern.cc @@ -299,7 +299,7 @@ SparsityPattern::reinit ( max_row_length = 0; compressed = false; return; - }; + } // first, if the matrix is // quadratic and special treatment @@ -320,7 +320,7 @@ SparsityPattern::reinit ( // note that the number of elements // per row is bounded by the number // of columns - unsigned int vec_len = 0; + std::size_t vec_len = 0; for (unsigned int i=0; i max_dim) { - if (rowstart) delete[] rowstart; + if (rowstart) + { + delete[] rowstart; + rowstart = 0; + } + max_dim = rows; - rowstart = new unsigned int[max_dim+1]; - }; + rowstart = new std::size_t[max_dim+1]; + } // allocate memory for the column // numbers if necessary if (vec_len > max_vec_len) { - if (colnums) delete[] colnums; + if (colnums) + { + delete[] colnums; + colnums = 0; + } + max_vec_len = vec_len; colnums = new unsigned int[max_vec_len]; - }; + } // set the rowstart array rowstart[0] = 0; @@ -414,7 +442,7 @@ SparsityPattern::compress () // elements there are, in order to // allocate the right amount of // memory - const unsigned int nonzero_elements + const std::size_t nonzero_elements = std::count_if (&colnums[rowstart[0]], &colnums[rowstart[rows]], std::bind2nd(std::not_equal_to(), invalid_entry)); @@ -647,7 +675,7 @@ SparsityPattern::max_entries_per_row () const // gives us a sharp bound unsigned int m = 0; for (unsigned int i=1; i(rowstart[i]-rowstart[i-1])); return m; } @@ -939,7 +967,7 @@ SparsityPattern::block_read (std::istream &in) if (colnums) delete[] colnums; - rowstart = new unsigned int[max_dim+1]; + rowstart = new std::size_t[max_dim+1]; colnums = new unsigned int[max_vec_len]; // then read data -- 2.39.5