18 #include "libmesh/libmesh_config.h"
19 #ifdef LIBMESH_HAVE_PETSC
22 #include "libmesh/petsc_shell_matrix.h"
32 const PetscVector<T> & petsc_arg = cast_ref<const PetscVector<T> &>(arg);
34 PetscErrorCode ierr = MatMult(_mat, petsc_arg.vec(), petsc_dest.
vec());
45 const PetscVector<T> & petsc_arg = cast_ref<const PetscVector<T> &>(arg);
47 PetscErrorCode ierr = MatMultAdd(_mat, petsc_arg.vec(), petsc_dest.
vec(), petsc_dest.
vec());
66 libmesh_assert(this->_dof_map);
77 const numeric_index_type n_l = this->_dof_map->n_dofs_on_processor(this->processor_id());
81 PetscErrorCode ierr = 0;
82 PetscInt m_global =
static_cast<PetscInt
>(my_m);
83 PetscInt n_global =
static_cast<PetscInt
>(my_n);
84 PetscInt m_local =
static_cast<PetscInt
>(m_l);
85 PetscInt n_local =
static_cast<PetscInt
>(n_l);
87 ierr = MatCreate(this->comm().
get(), _mat.get());
89 ierr = MatSetSizes(_mat, m_local, n_local, m_global, n_global);
91 PetscInt blocksize =
static_cast<PetscInt
>(this->_dof_map->block_size());
92 ierr = MatSetBlockSize(_mat, blocksize);
95 ierr = MatSetType(_mat, MATSHELL);
99 ierr = MatSetOptionsPrefix(_mat,
"");
100 LIBMESH_CHKERR(ierr);
101 ierr = MatSetFromOptions(_mat);
102 LIBMESH_CHKERR(ierr);
103 ierr = MatSetUp(_mat);
104 LIBMESH_CHKERR(ierr);
107 template <
typename T>
113 template <
typename T>
116 libmesh_error_msg_if(!_mat,
"A petsc shell matrix is not created yet. Please call init() first.");
virtual void vector_mult_add(NumericVector< T > &dest, const NumericVector< T > &arg) const override
执行矩阵与向量的乘法,并将结果添加到目标向量。
该类提供了一个良好的接口,用于访问 PETSc 的 Vec 对象。所有重写的虚拟函数都在 numeric_vector.h 中有文档说明。
Mat mat()
返回指向底层 PETSc Mat 对象的指针。调用此函数前必须调用 init()。
virtual bool initialized() const
检查矩阵是否已初始化。
这个类允许使用 PETSc shell 矩阵。 所有覆盖的虚拟函数都在 shell_matrix.h 中有文档说明。
virtual void clear() override
清除矩阵的内部数据结构。
Vec vec()
获取当前向量的原始 PETSc Vec 指针。
virtual void vector_mult(NumericVector< T > &dest, const NumericVector< T > &arg) const override
执行矩阵与向量的乘法。
dof_id_type numeric_index_type
bool _is_initialized
Flag that tells if init() has been called.
bool initialized()
Checks that library initialization has been done.
virtual void init() override
初始化矩阵。