15#ifdef DEAL_II_WITH_PETSC
25# include <petscconf.h>
34#ifdef DEAL_II_WITH_PETSC
63 PetscErrorCode ierr = PCDestroy(&
pc);
73 PetscErrorCode ierr = PCApply(
pc, src, dst);
82 PetscErrorCode ierr = PCApplyTranspose(
pc, src, dst);
91 PetscErrorCode ierr = PCSetUp(
pc);
98 return PetscObjectComm(
reinterpret_cast<PetscObject
>(
pc));
109 PetscErrorCode ierr = PetscObjectGetComm(
110 reinterpret_cast<PetscObject
>(
static_cast<const Mat &
>(matrix)), &
comm);
115 ierr = PCSetOperators(
pc, matrix, matrix);
123 PetscErrorCode ierr = PCCreate(
comm, &
pc);
148 PetscErrorCode ierr = PCCreate(
comm, &
pc);
170 PetscErrorCode ierr = PCSetType(
pc,
const_cast<char *
>(PCJACOBI));
173 ierr = PCSetFromOptions(
pc);
205 PetscErrorCode ierr = PCCreate(
comm, &
pc);
226 PetscErrorCode ierr = PCSetType(
pc,
const_cast<char *
>(PCBJACOBI));
229 ierr = PCSetFromOptions(
pc);
280 PetscErrorCode ierr = PCSetType(
pc,
const_cast<char *
>(PCSOR));
287 ierr = PCSetFromOptions(
pc);
324 PetscErrorCode ierr = PCSetType(
pc,
const_cast<char *
>(PCSOR));
332 ierr = PCSORSetSymmetric(
pc, SOR_SYMMETRIC_SWEEP);
335 ierr = PCSetFromOptions(
pc);
372 PetscErrorCode ierr = PCSetType(
pc,
const_cast<char *
>(PCICC));
379 ierr = PCSetFromOptions(
pc);
416 PetscErrorCode ierr = PCSetType(
pc,
const_cast<char *
>(PCILU));
423 ierr = PCSetFromOptions(
pc);
459# ifdef DEAL_II_PETSC_WITH_HYPRE
470 std::string string_type;
472 switch (relaxation_type)
475 string_type =
"Jacobi";
477 case PreconditionBoomerAMG::AdditionalData::RelaxationType::
478 sequentialGaussSeidel:
479 string_type =
"sequential-Gauss-Seidel";
481 case PreconditionBoomerAMG::AdditionalData::RelaxationType::
482 seqboundaryGaussSeidel:
483 string_type =
"seqboundary-Gauss-Seidel";
486 string_type =
"SOR/Jacobi";
488 case PreconditionBoomerAMG::AdditionalData::RelaxationType::
490 string_type =
"backward-SOR/Jacobi";
492 case PreconditionBoomerAMG::AdditionalData::RelaxationType::
494 string_type =
"symmetric-SOR/Jacobi";
496 case PreconditionBoomerAMG::AdditionalData::RelaxationType::
498 string_type =
" l1scaled-SOR/Jacobi";
500 case PreconditionBoomerAMG::AdditionalData::RelaxationType::
502 string_type =
"Gaussian-elimination";
504 case PreconditionBoomerAMG::AdditionalData::RelaxationType::
506 string_type =
"l1-Gauss-Seidel";
508 case PreconditionBoomerAMG::AdditionalData::RelaxationType::
509 backwardl1GaussSeidel:
510 string_type =
"backward-l1-Gauss-Seidel";
516 string_type =
"Chebyshev";
519 string_type =
"FCF-Jacobi";
521 case PreconditionBoomerAMG::AdditionalData::RelaxationType::
523 string_type =
"l1scaled-Jacobi";
526 string_type =
"None";
551 PetscErrorCode ierr = PCCreate(
comm, &
pc);
554# ifdef DEAL_II_PETSC_WITH_HYPRE
558 ExcMessage(
"Your PETSc installation does not include a copy of "
559 "the hypre package necessary for this preconditioner."));
578# ifdef DEAL_II_PETSC_WITH_HYPRE
579 PetscErrorCode ierr = PCSetType(
pc,
const_cast<char *
>(PCHYPRE));
582 ierr = PCHYPRESetType(
pc,
"boomeramg");
626 auto relaxation_type_is_symmetric =
643 ExcMessage(
"Use a symmetric smoother for relaxation_type_up"));
648 ExcMessage(
"Use a symmetric smoother for relaxation_type_down"));
653 ExcMessage(
"Use a symmetric smoother for relaxation_type_coarse"));
674 ierr = PCSetFromOptions(
pc);
678 ExcMessage(
"Your PETSc installation does not include a copy of "
679 "the hypre package necessary for this preconditioner."));
689# ifdef DEAL_II_PETSC_WITH_HYPRE
699 (void)additional_data_;
701 ExcMessage(
"Your PETSc installation does not include a copy of "
702 "the hypre package necessary for this preconditioner."));
747# ifdef DEAL_II_PETSC_WITH_HYPRE
750 PetscErrorCode ierr = PCSetType(
pc,
const_cast<char *
>(PCHYPRE));
753 ierr = PCHYPRESetType(
pc,
"parasails");
764 "ParaSails parameter symmetric can only be equal to 0, 1, 2!"));
766 std::stringstream ssStream;
772 ssStream <<
"nonsymmetric";
784 ssStream <<
"nonsymmetric,SPD";
792 "ParaSails parameter symmetric can only be equal to 0, 1, 2!"));
808 ierr = PCSetFromOptions(
pc);
814 ExcMessage(
"Your PETSc installation does not include a copy of "
815 "the hypre package necessary for this preconditioner."));
846 PetscErrorCode ierr = PCSetType(
pc,
const_cast<char *
>(PCNONE));
849 ierr = PCSetFromOptions(
pc);
890 PetscErrorCode ierr = PCSetType(
pc,
const_cast<char *
>(PCLU));
903 ierr = PCSetFromOptions(
pc);
940 PetscErrorCode ierr = PCCreate(
comm, &
pc);
962# if DEAL_II_PETSC_VERSION_GTE(3, 10, 0)
963 PetscErrorCode ierr = PCSetType(
pc,
const_cast<char *
>(PCBDDC));
969 MatType current_type;
973 ierr = PCGetOperators(
pc, &A, &P);
975 ierr = PCGetUseAmat(
pc, &flg);
978 ierr = MatGetType(flg ? A : P, ¤t_type);
981 strcmp(current_type, MATIS) == 0,
983 "Matrix must be of IS type. For this, the variant of reinit that includes the active dofs must be used."));
987 std::stringstream ssStream;
1011 for (
unsigned int i = 0, j = 0; i <
additional_data.coords.size(); ++i)
1013 for (j = 0; j < dim; ++j)
1017 ierr = PCSetCoordinates(
pc,
1020 coords_petsc.data());
1026 ierr = PCSetCoordinates(
pc, 0, 0,
nullptr);
1031 ierr = PCSetFromOptions(
pc);
1035 false,
ExcMessage(
"BDDC preconditioner requires PETSc 3.10.0 or newer"));
1069 PetscErrorCode ierr;
1072 ierr = PCDestroy(&
pc);
1077 ierr = PCSetType(
pc, PCSHELL);
1079 ierr = PCShellSetContext(
pc,
static_cast<void *
>(
this));
1087 ierr = PCShellSetName(
pc,
"deal.II user solve");
1095 PetscErrorCode ierr;
1096 ierr = PCSetOperators(
pc, matrix, matrix);
1101# define PetscCall(code) \
1104 PetscErrorCode ierr = (code); \
1113 PetscFunctionBeginUser;
1118 PetscFunctionReturn(PETSC_SUCCESS);
1126 PetscFunctionBeginUser;
1127 PetscCall(PCShellGetContext(ppc, &ctx));
1132 PetscObjectComm((PetscObject)ppc),
1134 "Failure in ::PETScWrappers::PreconditionShell::pcapply. Missing std::function vmult");
1138 const int lineno = __LINE__;
1141 user->vmult(dst, src);
1150 PetscObjectComm((PetscObject)ppc),
1155 PETSC_ERROR_INITIAL,
1156 "Failure in pcapply from ::PETScWrappers::NonlinearSolver");
1159 PetscFunctionReturn(PETSC_SUCCESS);
1167 PetscFunctionBeginUser;
1168 PetscCall(PCShellGetContext(ppc, &ctx));
1173 PetscObjectComm((PetscObject)ppc),
1175 "Failure in ::PETScWrappers::PreconditionShell::pcapply_transpose. Missing std::function vmultT");
1179 const int lineno = __LINE__;
1182 user->vmultT(dst, src);
1191 PetscObjectComm((PetscObject)ppc),
1196 PETSC_ERROR_INITIAL,
1197 "Failure in pcapply_transpose from ::PETScWrappers::NonlinearSolver");
1200 PetscFunctionReturn(PETSC_SUCCESS);
AdditionalData additional_data
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
void Tvmult(VectorBase &dst, const VectorBase &src) const
MPI_Comm get_mpi_communicator() const
const PC & get_pc() const
void create_pc_with_comm(const MPI_Comm)
virtual ~PreconditionBase()
void vmult(VectorBase &dst, const VectorBase &src) const
PreconditionBase(const MPI_Comm mpi_communicator)
void create_pc_with_mat(const MatrixBase &)
PreconditionBlockJacobi()
AdditionalData additional_data
AdditionalData additional_data
AdditionalData additional_data
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
AdditionalData additional_data
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
AdditionalData additional_data
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
AdditionalData additional_data
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
AdditionalData additional_data
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
AdditionalData additional_data
AdditionalData additional_data
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
AdditionalData additional_data
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
static PetscErrorCode pcapply_transpose(PC pc, Vec src, Vec dst)
static PetscErrorCode pcsetup(PC pc)
void initialize(const MPI_Comm comm)
PreconditionShell()=default
static PetscErrorCode pcapply(PC pc, Vec src, Vec dst)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_NOT_IMPLEMENTED()
#define Assert(cond, exc)
static ::ExceptionBase & ExcInvalidState()
static ::ExceptionBase & RecoverableUserCallbackError()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
void set_option_value(const std::string &name, const std::string &value)
PetscErrorCode pc_set_failed_reason(PC pc, PCFailedReason reason)
void petsc_increment_state_counter(Vec v)
*braid_SplitCommworld & comm
AdditionalData(const bool use_vertices=true, const bool use_edges=false, const bool use_faces=false, const bool symmetric=false, const std::vector< Point< dim > > coords={})
std::vector< Point< dim > > coords
RelaxationType relaxation_type_up
unsigned int n_sweeps_coarse
AdditionalData(const bool symmetric_operator=false, const double strong_threshold=0.25, const double max_row_sum=0.9, const unsigned int aggressive_coarsening_num_levels=0, const bool output_details=false, const RelaxationType relaxation_type_up=RelaxationType::SORJacobi, const RelaxationType relaxation_type_down=RelaxationType::SORJacobi, const RelaxationType relaxation_type_coarse=RelaxationType::GaussianElimination, const unsigned int n_sweeps_coarse=1, const double tol=0.0, const unsigned int max_iter=1, const bool w_cycle=false)
unsigned int aggressive_coarsening_num_levels
RelaxationType relaxation_type_down
RelaxationType relaxation_type_coarse
AdditionalData(const unsigned int levels=0)
AdditionalData(const unsigned int levels=0)
AdditionalData(const double pivoting=1.e-6, const double zero_pivot=1.e-12, const double damping=0.0)
AdditionalData(const unsigned int symmetric=1, const unsigned int n_levels=1, const double threshold=0.1, const double filter=0.05, const bool output_details=false)
AdditionalData(const double omega=1)
AdditionalData(const double omega=1)