18 #include "libmesh/libmesh_config.h"
19 #ifdef LIBMESH_HAVE_PETSC
22 #include "libmesh/petsc_shell_matrix.h"
31 PetscErrorCode
ierr=0;
35 const PetscVector<T> & petsc_arg = cast_ref<const PetscVector<T> &>(arg);
37 ierr = MatMult(_mat, petsc_arg.vec(), petsc_dest.
vec());
47 PetscErrorCode
ierr=0;
51 const PetscVector<T> & petsc_arg = cast_ref<const PetscVector<T> &>(arg);
53 ierr = MatMultAdd(_mat, petsc_arg.vec(), petsc_dest.
vec(), petsc_dest.
vec());
61 PetscErrorCode
ierr=0;
65 ierr = LibMeshMatDestroy (&_mat);
87 const numeric_index_type n_l = this->_dof_map->n_dofs_on_processor(this->processor_id());
91 PetscErrorCode
ierr = 0;
92 PetscInt m_global = static_cast<PetscInt>(my_m);
93 PetscInt n_global = static_cast<PetscInt>(my_n);
94 PetscInt m_local = static_cast<PetscInt>(m_l);
95 PetscInt n_local = static_cast<PetscInt>(n_l);
97 ierr = MatCreate(this->comm().
get(), &_mat);
99 ierr = MatSetSizes(_mat, m_local, n_local, m_global, n_global);
100 LIBMESH_CHKERR(
ierr);
101 PetscInt blocksize = static_cast<PetscInt>(this->_dof_map->block_size());
102 ierr = MatSetBlockSize(_mat,blocksize);
103 LIBMESH_CHKERR(
ierr);
105 ierr = MatSetType(_mat, MATSHELL);
106 LIBMESH_CHKERR(
ierr);
109 ierr = MatSetOptionsPrefix(_mat,
"");
110 LIBMESH_CHKERR(
ierr);
111 ierr = MatSetFromOptions(_mat);
112 LIBMESH_CHKERR(
ierr);
113 ierr = MatSetUp(_mat);
114 LIBMESH_CHKERR(
ierr);