16 #include <deal.II/lac/petsc_matrix_base.h> 18 #ifdef DEAL_II_WITH_PETSC 20 # include <deal.II/lac/petsc_full_matrix.h> 21 # include <deal.II/lac/petsc_sparse_matrix.h> 22 # include <deal.II/lac/petsc_parallel_sparse_matrix.h> 23 # include <deal.II/lac/petsc_vector.h> 25 DEAL_II_NAMESPACE_OPEN
29 namespace MatrixIterators
39 if (this->a_row == matrix->m())
41 colnum_cache.reset ();
49 const PetscInt *colnums;
50 const PetscScalar *values;
54 ierr = MatGetRow(*matrix, this->a_row, &ncols, &colnums, &values);
55 AssertThrow (ierr == 0, MatrixBase::ExcPETScError(ierr));
63 Assert (ncols != 0, ExcInternalError());
64 colnum_cache.reset (
new std::vector<size_type> (colnums, colnums+ncols));
65 value_cache.reset (
new std::vector<PetscScalar> (values, values+ncols));
68 ierr = MatRestoreRow(*matrix, this->a_row, &ncols, &colnums, &values);
69 AssertThrow (ierr == 0, MatrixBase::ExcPETScError(ierr));
84 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 85 const int ierr = MatDestroy (
matrix);
87 const int ierr = MatDestroy (&
matrix);
98 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 99 int ierr = MatDestroy (
matrix);
101 int ierr = MatDestroy (&
matrix);
106 const int m=0,
n=0, n_nonzero_per_row=0;
107 ierr = MatCreateSeqAIJ(PETSC_COMM_SELF, m,
n, n_nonzero_per_row,
122 const int ierr = MatZeroEntries (
matrix);
132 const PetscScalar new_diag_value)
137 const PetscInt petsc_row = row;
140 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 146 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 148 = MatZeroRowsIS(
matrix, index_set, new_diag_value);
151 = MatZeroRowsIS(
matrix, index_set, new_diag_value, PETSC_NULL, PETSC_NULL);
155 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 156 ISDestroy (index_set);
158 ISDestroy (&index_set);
166 const PetscScalar new_diag_value)
172 const std::vector<PetscInt> petsc_rows (rows.begin(), rows.end());
179 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 181 &petsc_rows[0], &index_set);
184 &petsc_rows[0], PETSC_COPY_VALUES, &index_set);
187 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 189 = MatZeroRowsIS(
matrix, index_set, new_diag_value);
192 = MatZeroRowsIS(
matrix, index_set, new_diag_value, PETSC_NULL, PETSC_NULL);
196 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 197 ISDestroy (index_set);
199 ISDestroy (&index_set);
209 PetscInt petsc_i = i, petsc_j = j;
214 = MatGetValues (
matrix, 1, &petsc_i, 1, &petsc_j,
226 Assert (
m() ==
n(), ExcNotQuadratic());
239 #ifdef DEAL_II_WITH_MPI 243 int all_int_last_action;
245 MPI_Allreduce(&my_int_last_action, &all_int_last_action, 1, MPI_INT,
248 AssertThrow(all_int_last_action != (VectorOperation::add | VectorOperation::insert),
249 ExcMessage(
"Error: not all processors agree on the last VectorOperation before this compress() call."));
255 ExcMessage(
"Missing compress() or calling with wrong VectorOperation argument."));
259 ierr = MatAssemblyBegin (
matrix,MAT_FINAL_ASSEMBLY);
262 ierr = MatAssemblyEnd (
matrix,MAT_FINAL_ASSEMBLY);
273 PetscInt n_rows, n_cols;
275 int ierr = MatGetSize (
matrix, &n_rows, &n_cols);
286 PetscInt n_rows, n_cols;
288 int ierr = MatGetSize (
matrix, &n_rows, &n_cols);
299 PetscInt n_rows, n_cols;
301 int ierr = MatGetLocalSize (
matrix, &n_rows, &n_cols);
309 std::pair<MatrixBase::size_type, MatrixBase::size_type>
314 const int ierr = MatGetOwnershipRange (static_cast<const Mat &>(
matrix),
318 return std::make_pair (begin, end);
328 = MatGetInfo (
matrix, MAT_GLOBAL_SUM, &mat_info);
331 return static_cast<size_type>(mat_info.nz_used);
346 Assert (row <
m(), ExcInternalError());
351 const PetscInt *colnums;
352 const PetscScalar *values;
357 ierr = MatGetRow(*
this, row, &ncols, &colnums, &values);
358 AssertThrow (ierr == 0, MatrixBase::ExcPETScError(ierr));
365 const PetscInt ncols_saved = ncols;
366 ierr = MatRestoreRow(*
this, row, &ncols, &colnums, &values);
367 AssertThrow (ierr == 0, MatrixBase::ExcPETScError(ierr));
379 = MatNorm (
matrix, NORM_1, &result);
393 = MatNorm (
matrix, NORM_INFINITY, &result);
407 = MatNorm (
matrix, NORM_FROBENIUS, &result);
433 #if DEAL_II_PETSC_VERSION_GTE(3,1,0) 435 MatrixBase::trace ()
const 440 = MatGetTrace (
matrix, &result);
452 const int ierr = MatScale (
matrix, a);
463 const PetscScalar factor = 1./a;
464 const int ierr = MatScale (
matrix, factor);
474 const PetscScalar factor)
476 const int ierr = MatAXPY (
matrix, factor,
477 other, DIFFERENT_NONZERO_PATTERN);
480 Assert (ierr == 0, ExcPETScError(ierr));
490 Assert (&src != &dst, ExcSourceEqualsDestination());
492 const int ierr = MatMult (
matrix, src, dst);
503 Assert (&src != &dst, ExcSourceEqualsDestination());
505 const int ierr = MatMultTranspose (
matrix, src, dst);
516 Assert (&src != &dst, ExcSourceEqualsDestination());
518 const int ierr = MatMultAdd (
matrix, src, dst, dst);
529 Assert (&src != &dst, ExcSourceEqualsDestination());
531 const int ierr = MatMultTransposeAdd (
matrix, src, dst, dst);
554 MatrixBase::operator Mat ()
const 562 int ierr = MatTranspose(
matrix, MAT_REUSE_MATRIX, &
matrix);
567 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 574 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 581 MatIsSymmetric (
matrix, tolerance, &truth);
585 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 592 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 600 MatIsHermitian (
matrix, tolerance, &truth);
611 PetscViewerSetFormat (PETSC_VIEWER_STDOUT_WORLD,
615 MatView (
matrix, PETSC_VIEWER_STDOUT_WORLD);
622 std::pair<MatrixBase::size_type, MatrixBase::size_type>
626 const PetscInt *colnums;
627 const PetscScalar *values;
630 for (row = loc_range.first; row < loc_range.second; ++row)
632 int ierr = MatGetRow(*
this, row, &ncols, &colnums, &values);
634 AssertThrow (ierr == 0, MatrixBase::ExcPETScError(ierr));
636 for (PetscInt col = 0; col < ncols; ++col)
638 out <<
"(" << row <<
"," << colnums[col] <<
") " << values[col] << std::endl;
641 ierr = MatRestoreRow(*
this, row, &ncols, &colnums, &values);
642 AssertThrow (ierr == 0, MatrixBase::ExcPETScError(ierr));
654 MatGetInfo(
matrix, MAT_LOCAL, &info);
656 return sizeof(*this) +
static_cast<size_type>(info.memory);
661 DEAL_II_NAMESPACE_CLOSE
663 #endif // DEAL_II_WITH_PETSC
PetscScalar matrix_scalar_product(const VectorBase &u, const VectorBase &v) const
void add(const size_type i, const size_type j, const PetscScalar value)
void vmult(VectorBase &dst, const VectorBase &src) const
const_iterator begin() const
real_type l2_norm() const
PetscReal frobenius_norm() const
::ExceptionBase & ExcMessage(std::string arg1)
size_type row_length(const size_type row) const
#define AssertThrow(cond, exc)
PetscBool is_symmetric(const double tolerance=1.e-12)
PetscBool is_hermitian(const double tolerance=1.e-12)
void clear_rows(const std::vector< size_type > &rows, const PetscScalar new_diag_value=0)
PetscReal linfty_norm() const
void compress(const VectorOperation::values operation)
size_type n_nonzero_elements() const
size_type local_size() const
#define Assert(cond, exc)
MatrixBase & operator=(const value_type d)
void vmult_add(VectorBase &dst, const VectorBase &src) const
PetscScalar residual(VectorBase &dst, const VectorBase &x, const VectorBase &b) const
types::global_dof_index size_type
PetscScalar diag_element(const size_type i) const
void Tvmult(VectorBase &dst, const VectorBase &src) const
PetscScalar el(const size_type i, const size_type j) const
void Tvmult_add(VectorBase &dst, const VectorBase &src) const
const_iterator end() const
void print(std::ostream &out, const bool alternative_output=false) const
void write_ascii(const PetscViewerFormat format=PETSC_VIEWER_DEFAULT)
VectorOperation::values last_action
MatrixBase & operator*=(const PetscScalar factor)
std::pair< size_type, size_type > local_range() const
PetscScalar matrix_norm_square(const VectorBase &v) const
MatrixBase & operator/=(const PetscScalar factor)
PetscReal l1_norm() const
virtual const MPI_Comm & get_mpi_communicator() const =0
void clear_row(const size_type row, const PetscScalar new_diag_value=0)
std::size_t memory_consumption() const
void assert_is_compressed()