*/
~SparseMatrix() override;
- /**
- * Create a sparse matrix of dimensions @p m times @p n, with an initial
- * guess of @p n_nonzero_per_row and @p n_offdiag_nonzero_per_row
- * nonzero elements per row (see documentation of the MatCreateAIJ PETSc
- * function for more information about these parameters). PETSc is able
- * to cope with the situation that more than this number of elements are
- * later allocated for a row, but this involves copying data, and is
- * thus expensive.
- *
- * For the meaning of the @p local_row and @p local_columns parameters,
- * see the class documentation.
- *
- * The @p is_symmetric flag determines whether we should tell PETSc that
- * the matrix is going to be symmetric (as indicated by the call
- * <tt>MatSetOption(mat, MAT_SYMMETRIC)</tt>. Note that the PETSc
- * documentation states that one cannot form an ILU decomposition of a
- * matrix for which this flag has been set to @p true, only an ICC. The
- * default value of this flag is @p false.
- *
- * @deprecated This constructor is deprecated: please use the
- * constructor with a sparsity pattern argument instead.
- */
- DEAL_II_DEPRECATED
- SparseMatrix(const MPI_Comm &communicator,
- const size_type m,
- const size_type n,
- const size_type local_rows,
- const size_type local_columns,
- const size_type n_nonzero_per_row,
- const bool is_symmetric = false,
- const size_type n_offdiag_nonzero_per_row = 0);
-
- /**
- * Initialize a rectangular matrix with @p m rows and @p n columns. The
- * maximal number of nonzero entries for diagonal and off- diagonal
- * blocks of each row is given by the @p row_lengths and @p
- * offdiag_row_lengths arrays.
- *
- * For the meaning of the @p local_row and @p local_columns parameters,
- * see the class documentation.
- *
- * Just as for the other constructors: PETSc is able to cope with the
- * situation that more than this number of elements are later allocated
- * for a row, but this involves copying data, and is thus expensive.
- *
- * The @p is_symmetric flag determines whether we should tell PETSc that
- * the matrix is going to be symmetric (as indicated by the call
- * <tt>MatSetOption(mat, MAT_SYMMETRIC)</tt>. Note that the PETSc
- * documentation states that one cannot form an ILU decomposition of a
- * matrix for which this flag has been set to @p true, only an ICC. The
- * default value of this flag is @p false.
- *
- * @deprecated This constructor is deprecated: please use the
- * constructor with a sparsity pattern argument instead.
- */
- DEAL_II_DEPRECATED
- SparseMatrix(const MPI_Comm & communicator,
- const size_type m,
- const size_type n,
- const size_type local_rows,
- const size_type local_columns,
- const std::vector<size_type> &row_lengths,
- const bool is_symmetric = false,
- const std::vector<size_type> &offdiag_row_lengths =
- std::vector<size_type>());
-
/**
* Initialize using the given sparsity pattern with communication
* happening over the provided @p communicator.
void
copy_from(const SparseMatrix &other);
- /**
- * Throw away the present matrix and generate one that has the same
- * properties as if it were created by the constructor of this class
- * with the same argument list as the present function.
- *
- * @deprecated This overload of <code>reinit</code> is deprecated:
- * please use the overload with a sparsity pattern argument instead.
- */
- DEAL_II_DEPRECATED
- void
- reinit(const MPI_Comm &communicator,
- const size_type m,
- const size_type n,
- const size_type local_rows,
- const size_type local_columns,
- const size_type n_nonzero_per_row,
- const bool is_symmetric = false,
- const size_type n_offdiag_nonzero_per_row = 0);
-
- /**
- * Throw away the present matrix and generate one that has the same
- * properties as if it were created by the constructor of this class
- * with the same argument list as the present function.
- *
- * @deprecated This overload of <code>reinit</code> is deprecated:
- * please use the overload with a sparsity pattern argument instead.
- */
- DEAL_II_DEPRECATED
- void
- reinit(const MPI_Comm & communicator,
- const size_type m,
- const size_type n,
- const size_type local_rows,
- const size_type local_columns,
- const std::vector<size_type> &row_lengths,
- const bool is_symmetric = false,
- const std::vector<size_type> &offdiag_row_lengths =
- std::vector<size_type>());
-
/**
* Initialize using the given sparsity pattern with communication
* happening over the provided @p communicator.
*/
MPI_Comm communicator;
- /**
- * Do the actual work for the respective reinit() function and the
- * matching constructor, i.e. create a matrix. Getting rid of the
- * previous matrix is left to the caller.
- *
- * @deprecated This overload of <code>do_reinit</code> is deprecated:
- * please use the overload with a sparsity pattern argument instead.
- */
- DEAL_II_DEPRECATED
- void
- do_reinit(const size_type m,
- const size_type n,
- const size_type local_rows,
- const size_type local_columns,
- const size_type n_nonzero_per_row,
- const bool is_symmetric = false,
- const size_type n_offdiag_nonzero_per_row = 0);
-
- /**
- * Same as previous function.
- *
- * @deprecated This overload of <code>do_reinit</code> is deprecated:
- * please use the overload with a sparsity pattern argument instead.
- */
- DEAL_II_DEPRECATED
- void
- do_reinit(const size_type m,
- const size_type n,
- const size_type local_rows,
- const size_type local_columns,
- const std::vector<size_type> &row_lengths,
- const bool is_symmetric = false,
- const std::vector<size_type> &offdiag_row_lengths =
- std::vector<size_type>());
-
/**
* Same as previous functions.
*/
destroy_matrix(matrix);
}
- SparseMatrix::SparseMatrix(const MPI_Comm &communicator,
- const size_type m,
- const size_type n,
- const size_type local_rows,
- const size_type local_columns,
- const size_type n_nonzero_per_row,
- const bool is_symmetric,
- const size_type n_offdiag_nonzero_per_row)
- : communicator(communicator)
- {
- do_reinit(m,
- n,
- local_rows,
- local_columns,
- n_nonzero_per_row,
- is_symmetric,
- n_offdiag_nonzero_per_row);
- }
-
-
-
- SparseMatrix::SparseMatrix(
- const MPI_Comm & communicator,
- const size_type m,
- const size_type n,
- const size_type local_rows,
- const size_type local_columns,
- const std::vector<size_type> &row_lengths,
- const bool is_symmetric,
- const std::vector<size_type> &offdiag_row_lengths)
- : communicator(communicator)
- {
- do_reinit(m,
- n,
- local_rows,
- local_columns,
- row_lengths,
- is_symmetric,
- offdiag_row_lengths);
- }
-
template <typename SparsityPatternType>
}
+
void
SparseMatrix::reinit(const SparseMatrix &other)
{
AssertThrow(ierr == 0, ExcPETScError(ierr));
}
- void
- SparseMatrix::reinit(const MPI_Comm &communicator,
- const size_type m,
- const size_type n,
- const size_type local_rows,
- const size_type local_columns,
- const size_type n_nonzero_per_row,
- const bool is_symmetric,
- const size_type n_offdiag_nonzero_per_row)
- {
- this->communicator = communicator;
-
- // get rid of old matrix and generate a new one
- const PetscErrorCode ierr = destroy_matrix(matrix);
- AssertThrow(ierr == 0, ExcPETScError(ierr));
-
- do_reinit(m,
- n,
- local_rows,
- local_columns,
- n_nonzero_per_row,
- is_symmetric,
- n_offdiag_nonzero_per_row);
- }
-
-
-
- void
- SparseMatrix::reinit(const MPI_Comm & communicator,
- const size_type m,
- const size_type n,
- const size_type local_rows,
- const size_type local_columns,
- const std::vector<size_type> &row_lengths,
- const bool is_symmetric,
- const std::vector<size_type> &offdiag_row_lengths)
- {
- this->communicator = communicator;
-
- // get rid of old matrix and generate a
- // new one
- const PetscErrorCode ierr = destroy_matrix(matrix);
- AssertThrow(ierr == 0, ExcPETScError(ierr));
-
- do_reinit(m,
- n,
- local_rows,
- local_columns,
- row_lengths,
- is_symmetric,
- offdiag_row_lengths);
- }
-
template <typename SparsityPatternType>
do_reinit(local_rows, local_columns, sparsity_pattern);
}
- void
- SparseMatrix::do_reinit(const size_type m,
- const size_type n,
- const size_type local_rows,
- const size_type local_columns,
- const size_type n_nonzero_per_row,
- const bool is_symmetric,
- const size_type n_offdiag_nonzero_per_row)
- {
- Assert(local_rows <= m, ExcLocalRowsTooLarge(local_rows, m));
-
- // use the call sequence indicating only
- // a maximal number of elements per row
- // for all rows globally
- const PetscErrorCode ierr = MatCreateAIJ(communicator,
- local_rows,
- local_columns,
- m,
- n,
- n_nonzero_per_row,
- nullptr,
- n_offdiag_nonzero_per_row,
- nullptr,
- &matrix);
- set_matrix_option(matrix, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE);
- AssertThrow(ierr == 0, ExcPETScError(ierr));
-
- // set symmetric flag, if so requested
- if (is_symmetric == true)
- {
- set_matrix_option(matrix, MAT_SYMMETRIC, PETSC_TRUE);
- }
- }
-
-
-
- void
- SparseMatrix::do_reinit(const size_type m,
- const size_type n,
- const size_type local_rows,
- const size_type local_columns,
- const std::vector<size_type> &row_lengths,
- const bool is_symmetric,
- const std::vector<size_type> &offdiag_row_lengths)
- {
- Assert(local_rows <= m, ExcLocalRowsTooLarge(local_rows, m));
-
- Assert(row_lengths.size() == m,
- ExcDimensionMismatch(row_lengths.size(), m));
-
- // For the case that local_columns is smaller than one of the row lengths
- // MatCreateMPIAIJ throws an error. In this case use a
- // PETScWrappers::SparseMatrix
- for (const size_type row_length : row_lengths)
- {
- (void)row_length;
- Assert(row_length <= local_columns,
- ExcIndexRange(row_length, 1, local_columns + 1));
- }
-
- // use the call sequence indicating a
- // maximal number of elements for each
- // row individually. annoyingly, we
- // always use unsigned ints for cases
- // like this, while PETSc wants to see
- // signed integers. so we have to
- // convert, unless we want to play dirty
- // tricks with conversions of pointers
- const std::vector<PetscInt> int_row_lengths(row_lengths.begin(),
- row_lengths.end());
- const std::vector<PetscInt> int_offdiag_row_lengths(
- offdiag_row_lengths.begin(), offdiag_row_lengths.end());
-
- // TODO: There must be a significantly better way to provide information
- // about the off-diagonal blocks of the matrix. this way, petsc keeps
- // allocating tiny chunks of memory, and gets completely hung up over this
- const PetscErrorCode ierr =
- MatCreateAIJ(communicator,
- local_rows,
- local_columns,
- m,
- n,
- 0,
- int_row_lengths.data(),
- 0,
- offdiag_row_lengths.size() ?
- int_offdiag_row_lengths.data() :
- nullptr,
- &matrix);
-
- // TODO: Sometimes the actual number of nonzero entries allocated is
- // greater than the number of nonzero entries, which petsc will complain
- // about unless explicitly disabled with MatSetOption. There is probably a
- // way to prevent a different number nonzero elements being allocated in
- // the first place. (See also previous TODO).
- set_matrix_option(matrix, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE);
- AssertThrow(ierr == 0, ExcPETScError(ierr));
-
- // set symmetric flag, if so requested
- if (is_symmetric == true)
- {
- set_matrix_option(matrix, MAT_SYMMETRIC, PETSC_TRUE);
- }
- }
template <typename SparsityPatternType>