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);