16 #include <deal.II/lac/petsc_parallel_sparse_matrix.h> 18 #ifdef DEAL_II_WITH_PETSC 20 # include <deal.II/lac/petsc_vector.h> 21 # include <deal.II/lac/sparsity_pattern.h> 22 # include <deal.II/lac/dynamic_sparsity_pattern.h> 24 DEAL_II_NAMESPACE_OPEN
36 const int m=0,
n=0, n_nonzero_per_row=0;
38 = MatCreateSeqAIJ(PETSC_COMM_SELF, m,
n, n_nonzero_per_row,
48 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 49 ierr = MatDestroy (
matrix);
51 ierr = MatDestroy (&
matrix);
63 const size_type n_offdiag_nonzero_per_row)
65 communicator (communicator)
67 do_reinit (m, n, local_rows, local_columns,
68 n_nonzero_per_row, is_symmetric,
69 n_offdiag_nonzero_per_row);
79 const std::vector<size_type> &row_lengths,
81 const std::vector<size_type> &offdiag_row_lengths)
83 communicator (communicator)
85 do_reinit (m, n, local_rows, local_columns,
86 row_lengths, is_symmetric, offdiag_row_lengths);
91 template <
typename SparsityPatternType>
94 const SparsityPatternType &sparsity_pattern,
95 const std::vector<size_type> &local_rows_per_process,
96 const std::vector<size_type> &local_columns_per_process,
97 const unsigned int this_process,
98 const bool preset_nonzero_locations)
100 communicator (communicator)
102 do_reinit (sparsity_pattern, local_rows_per_process,
103 local_columns_per_process, this_process,
104 preset_nonzero_locations);
118 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 119 ierr = MatDestroy (
matrix);
121 ierr = MatDestroy (&
matrix);
125 ierr = MatDuplicate(other.
matrix, MAT_DO_NOT_COPY_VALUES, &
matrix);
145 int ierr = MatCopy(other.
matrix,
matrix, SAME_NONZERO_PATTERN);
157 const size_type n_offdiag_nonzero_per_row)
163 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 164 const int ierr = MatDestroy (
matrix);
166 const int ierr = MatDestroy (&
matrix);
170 do_reinit (m, n, local_rows, local_columns,
171 n_nonzero_per_row, is_symmetric,
172 n_offdiag_nonzero_per_row);
183 const std::vector<size_type> &row_lengths,
185 const std::vector<size_type> &offdiag_row_lengths)
191 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 192 const int ierr = MatDestroy (
matrix);
194 const int ierr = MatDestroy (&
matrix);
198 do_reinit (m, n, local_rows, local_columns,
199 row_lengths, is_symmetric, offdiag_row_lengths);
204 template <
typename SparsityPatternType>
208 const SparsityPatternType &sparsity_pattern,
209 const std::vector<size_type> &local_rows_per_process,
210 const std::vector<size_type> &local_columns_per_process,
211 const unsigned int this_process,
212 const bool preset_nonzero_locations)
218 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 219 const int ierr = MatDestroy (
matrix);
221 const int ierr = MatDestroy (&
matrix);
225 do_reinit (sparsity_pattern, local_rows_per_process,
226 local_columns_per_process, this_process,
227 preset_nonzero_locations);
230 template <
typename SparsityPatternType>
235 const SparsityPatternType &sparsity_pattern,
242 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 243 const int ierr = MatDestroy (
matrix);
245 const int ierr = MatDestroy (&
matrix);
249 do_reinit (local_rows, local_columns, sparsity_pattern);
259 const size_type n_offdiag_nonzero_per_row)
261 Assert (local_rows <= m, ExcLocalRowsTooLarge (local_rows, m));
268 #if DEAL_II_PETSC_VERSION_LT(3,3,0) 271 local_rows, local_columns,
273 n_nonzero_per_row, 0,
274 n_offdiag_nonzero_per_row, 0,
279 local_rows, local_columns,
281 n_nonzero_per_row, 0,
282 n_offdiag_nonzero_per_row, 0,
286 ierr = MatSetOption (
matrix, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE);
291 if (is_symmetric ==
true)
293 #if DEAL_II_PETSC_VERSION_LT(3,0,0) 295 = MatSetOption (
matrix, MAT_SYMMETRIC);
298 = MatSetOption (
matrix, MAT_SYMMETRIC, PETSC_TRUE);
312 const std::vector<size_type> &row_lengths,
314 const std::vector<size_type> &offdiag_row_lengths)
316 Assert (local_rows <= m, ExcLocalRowsTooLarge (local_rows, m));
318 Assert (row_lengths.size() ==
m,
319 ExcDimensionMismatch (row_lengths.size(),
m));
327 for (
size_type i=0; i<row_lengths.size(); ++i)
328 Assert(row_lengths[i]<=local_columns,
329 ExcIndexRange(row_lengths[i], 1, local_columns+1));
339 const std::vector<PetscInt> int_row_lengths (row_lengths.begin(),
341 const std::vector<PetscInt> int_offdiag_row_lengths (offdiag_row_lengths.begin(),
342 offdiag_row_lengths.end());
348 #if DEAL_II_PETSC_VERSION_LT(3,3,0) 351 local_rows, local_columns,
353 0, &int_row_lengths[0],
354 0, offdiag_row_lengths.size() ? &int_offdiag_row_lengths[0] : 0,
359 local_rows, local_columns,
361 0, &int_row_lengths[0],
362 0, offdiag_row_lengths.size() ? &int_offdiag_row_lengths[0] : 0,
368 ierr = MatSetOption (
matrix, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE);
373 if (is_symmetric ==
true)
375 #if DEAL_II_PETSC_VERSION_LT(3,0,0) 377 = MatSetOption (
matrix, MAT_SYMMETRIC);
380 = MatSetOption (
matrix, MAT_SYMMETRIC, PETSC_TRUE);
388 template <
typename SparsityPatternType>
393 const SparsityPatternType &sparsity_pattern)
395 Assert(sparsity_pattern.n_rows()==local_rows.
size(),
396 ExcMessage(
"SparsityPattern and IndexSet have different number of rows"));
397 Assert(sparsity_pattern.n_cols()==local_columns.
size(),
398 ExcMessage(
"SparsityPattern and IndexSet have different number of columns"));
400 ExcMessage(
"PETSc only supports contiguous row/column ranges"));
407 Assert(row_owners == sparsity_pattern.n_rows(),
408 ExcMessage(std::string(
"Each row has to be owned by exactly one owner (n_rows()=")
410 +
" but sum(local_rows.n_elements())=" 413 Assert(col_owners == sparsity_pattern.n_cols(),
414 ExcMessage(std::string(
"Each column has to be owned by exactly one owner (n_cols()=")
416 +
" but sum(local_columns.n_elements())=" 430 ierr = MatSetSizes(
matrix,
433 sparsity_pattern.n_rows(),
434 sparsity_pattern.n_cols());
437 ierr = MatSetType(
matrix,MATMPIAIJ);
463 local_row_end = local_row_start + local_rows.
n_elements();
472 std::vector<PetscInt>
474 rowstart_in_window (local_row_end - local_row_start + 1, 0),
477 unsigned int n_cols = 0;
478 for (PetscInt i=local_row_start; i<local_row_end; ++i)
480 const PetscInt
row_length = sparsity_pattern.row_length(i);
481 rowstart_in_window[i+1-local_row_start]
482 = rowstart_in_window[i-local_row_start] +
row_length;
485 colnums_in_window.resize (n_cols+1, -1);
491 PetscInt *ptr = & colnums_in_window[0];
492 for (PetscInt i=local_row_start; i<local_row_end; ++i)
493 for (
typename SparsityPatternType::iterator p=sparsity_pattern.begin(i);
494 p != sparsity_pattern.end(i); ++p, ++ptr)
502 MatMPIAIJSetPreallocationCSR (
matrix,
503 &rowstart_in_window[0],
504 &colnums_in_window[0],
510 MatMPIAIJSetPreallocationCSR (
matrix,
517 compress (::VectorOperation::insert);
526 #if DEAL_II_PETSC_VERSION_LT(3,0,0) 528 ierr = MatSetOption (
matrix, MAT_NEW_NONZERO_LOCATION_ERR);
531 ierr = MatSetOption (
matrix, MAT_NO_NEW_NONZERO_LOCATIONS);
536 ierr = MatSetOption (
matrix, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_TRUE);
539 ierr = MatSetOption (
matrix, MAT_NEW_NONZERO_LOCATIONS, PETSC_FALSE);
551 #if DEAL_II_PETSC_VERSION_LT(3,0,0) 552 ierr = MatSetOption (
matrix, MAT_KEEP_ZEROED_ROWS);
554 #elif DEAL_II_PETSC_VERSION_LT(3,1,0) 555 ierr = MatSetOption (
matrix, MAT_KEEP_ZEROED_ROWS, PETSC_TRUE);
558 ierr = MatSetOption (
matrix, MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE);
567 template <
typename SparsityPatternType>
571 const std::vector<size_type> &local_rows_per_process,
572 const std::vector<size_type> &local_columns_per_process,
573 const unsigned int this_process,
574 const bool preset_nonzero_locations)
576 Assert (local_rows_per_process.size() == local_columns_per_process.size(),
577 ExcDimensionMismatch (local_rows_per_process.size(),
578 local_columns_per_process.size()));
579 Assert (this_process < local_rows_per_process.size(),
592 for (
unsigned int p=0; p<this_process; ++p)
594 local_row_start += local_rows_per_process[p];
595 local_col_start += local_columns_per_process[p];
598 local_row_end = local_row_start + local_rows_per_process[this_process];
600 #if DEAL_II_PETSC_VERSION_LT(2,3,3) 607 local_col_end = local_col_start + local_columns_per_process[this_process];
611 std::vector<PetscInt>
613 row_lengths_in_window (local_row_end - local_row_start),
614 row_lengths_out_of_window (local_row_end - local_row_start);
615 for (
size_type row = local_row_start; row<local_row_end; ++row)
616 for (
size_type c=0; c<sparsity_pattern.row_length(row); ++c)
618 const size_type column = sparsity_pattern.column_number(row,c);
620 if ((column >= local_col_start) &&
621 (column < local_col_end))
622 ++row_lengths_in_window[row-local_row_start];
624 ++row_lengths_out_of_window[row-local_row_start];
637 local_rows_per_process[this_process],
638 local_columns_per_process[this_process],
639 sparsity_pattern.n_rows(),
640 sparsity_pattern.n_cols(),
641 0, &row_lengths_in_window[0],
642 0, &row_lengths_out_of_window[0],
646 #else //PETSC_VERSION>=2.3.3 655 ierr = MatSetSizes(
matrix,
656 local_rows_per_process[this_process],
657 local_columns_per_process[this_process],
658 sparsity_pattern.n_rows(),
659 sparsity_pattern.n_cols());
662 ierr = MatSetType(
matrix,MATMPIAIJ);
680 if (preset_nonzero_locations ==
true)
693 std::vector<PetscInt>
695 rowstart_in_window (local_row_end - local_row_start + 1, 0),
699 for (
size_type i=local_row_start; i<local_row_end; ++i)
702 rowstart_in_window[i+1-local_row_start]
703 = rowstart_in_window[i-local_row_start] +
row_length;
706 colnums_in_window.resize (n_cols+1, -1);
712 PetscInt *ptr = & colnums_in_window[0];
713 for (
size_type i=local_row_start; i<local_row_end; ++i)
714 for (
typename SparsityPatternType::iterator p=sparsity_pattern.begin(i);
715 p != sparsity_pattern.end(i); ++p, ++ptr)
723 MatMPIAIJSetPreallocationCSR (
matrix,
724 &rowstart_in_window[0],
725 &colnums_in_window[0],
728 #if DEAL_II_PETSC_VERSION_LT(2,3,3) 749 const std::vector<PetscScalar>
750 values (sparsity_pattern.max_entries_per_row(),
753 for (
size_type i=local_row_start; i<local_row_end; ++i)
755 PetscInt petsc_i = i;
756 MatSetValues (
matrix, 1, &petsc_i,
757 sparsity_pattern.row_length(i),
758 &colnums_in_window[rowstart_in_window[i-local_row_start]],
759 &values[0], INSERT_VALUES);
768 #endif // version <=2.3.3 776 #if DEAL_II_PETSC_VERSION_LT(3,0,0) 778 ierr = MatSetOption (
matrix, MAT_NEW_NONZERO_LOCATION_ERR);
781 ierr = MatSetOption (
matrix, MAT_NO_NEW_NONZERO_LOCATIONS);
786 ierr = MatSetOption (
matrix, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_TRUE);
789 ierr = MatSetOption (
matrix, MAT_NEW_NONZERO_LOCATIONS, PETSC_FALSE);
801 #if DEAL_II_PETSC_VERSION_LT(3,0,0) 802 ierr = MatSetOption (
matrix, MAT_KEEP_ZEROED_ROWS);
804 #elif DEAL_II_PETSC_VERSION_LT(3,1,0) 805 ierr = MatSetOption (
matrix, MAT_KEEP_ZEROED_ROWS, PETSC_TRUE);
808 ierr = MatSetOption (
matrix, MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE);
820 const std::vector<size_type> &,
821 const std::vector<size_type> &,
827 const std::vector<size_type> &,
828 const std::vector<size_type> &,
835 const std::vector<size_type> &,
836 const std::vector<size_type> &,
842 const std::vector<size_type> &,
843 const std::vector<size_type> &,
856 const std::vector<size_type> &,
857 const std::vector<size_type> &,
862 const std::vector<size_type> &,
863 const std::vector<size_type> &,
897 DEAL_II_NAMESPACE_CLOSE
899 #endif // DEAL_II_WITH_PETSC
void copy_from(const SparseMatrix &other)
size_type nth_index_in_set(const unsigned int local_index) const
void vmult(VectorBase &dst, const VectorBase &src) const
::ExceptionBase & ExcMessage(std::string arg1)
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)
size_type row_length(const size_type row) const
#define AssertThrow(cond, exc)
std::string to_string(const number value, const unsigned int digits=numbers::invalid_unsigned_int)
PetscBool is_symmetric(const double tolerance=1.e-12)
void compress(const VectorOperation::values operation)
SparseMatrix & operator=(const value_type d)
PetscScalar matrix_scalar_product(const Vector &u, const Vector &v) const
T sum(const T &t, const MPI_Comm &mpi_communicator)
unsigned int global_dof_index
#define Assert(cond, exc)
MatrixBase & operator=(const value_type d)
types::global_dof_index size_type
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)
bool is_contiguous() const
PetscScalar matrix_norm_square(const Vector &v) const
size_type n_elements() const
void assert_is_compressed()