22#ifndef INCLUDE_SOLVERS_AND_PRECONDITIONERS_PETSCOPERATION_H_
23#define INCLUDE_SOLVERS_AND_PRECONDITIONERS_PETSCOPERATION_H_
25#include <deal.II/base/exceptions.h>
26#include <deal.II/lac/petsc_vector.h>
30#ifdef DEAL_II_WITH_PETSC
34typedef Vec VectorTypePETSc;
42template<
typename VectorType>
46 VectorType
const & src,
47 VectorTypePETSc & petsc_vector_dst,
48 VectorTypePETSc & petsc_vector_src,
49 std::function<
void(dealii::PETScWrappers::VectorBase &,
50 dealii::PETScWrappers::VectorBase
const &)> petsc_operation)
57 PetscErrorCode ierr = VecGetOwnershipRange(petsc_vector_src, &begin, &end);
58 AssertThrow(ierr == 0, dealii::ExcPETScError(ierr));
61 ierr = VecGetArray(petsc_vector_src, &ptr);
62 AssertThrow(ierr == 0, dealii::ExcPETScError(ierr));
64 const PetscInt local_size = src.get_partitioner()->locally_owned_size();
65 AssertDimension(local_size,
static_cast<unsigned int>(end - begin));
66 for(PetscInt i = 0; i < local_size; ++i)
68 ptr[i] = src.local_element(i);
71 ierr = VecRestoreArray(petsc_vector_src, &ptr);
72 AssertThrow(ierr == 0, dealii::ExcPETScError(ierr));
76 dealii::PETScWrappers::VectorBase petsc_dst(petsc_vector_dst);
77 dealii::PETScWrappers::VectorBase petsc_src(petsc_vector_src);
79 petsc_operation(petsc_dst, petsc_src);
83 PetscErrorCode ierr = VecGetOwnershipRange(petsc_vector_dst, &begin, &end);
84 AssertThrow(ierr == 0, dealii::ExcPETScError(ierr));
87 ierr = VecGetArray(petsc_vector_dst, &ptr);
88 AssertThrow(ierr == 0, dealii::ExcPETScError(ierr));
90 const PetscInt local_size = dst.get_partitioner()->locally_owned_size();
91 AssertDimension(local_size,
static_cast<unsigned int>(end - begin));
93 for(PetscInt i = 0; i < local_size; ++i)
95 dst.local_element(i) = ptr[i];
98 ierr = VecRestoreArray(petsc_vector_dst, &ptr);
99 AssertThrow(ierr == 0, dealii::ExcPETScError(ierr));
108template<
typename VectorType>
110apply_petsc_operation(
112 VectorType
const & src,
113 MPI_Comm
const & petsc_mpi_communicator,
114 std::function<
void(dealii::PETScWrappers::VectorBase &,
115 dealii::PETScWrappers::VectorBase
const &)> petsc_operation)
117 VectorTypePETSc petsc_vector_dst, petsc_vector_src;
118 VecCreateMPI(petsc_mpi_communicator,
119 dst.get_partitioner()->locally_owned_size(),
122 VecCreateMPI(petsc_mpi_communicator,
123 src.get_partitioner()->locally_owned_size(),
127 apply_petsc_operation(dst, src, petsc_vector_dst, petsc_vector_src, petsc_operation);
129 PetscErrorCode ierr = VecDestroy(&petsc_vector_dst);
130 AssertThrow(ierr == 0, dealii::ExcPETScError(ierr));
131 ierr = VecDestroy(&petsc_vector_src);
132 AssertThrow(ierr == 0, dealii::ExcPETScError(ierr));