22 #ifdef DEAL_II_WITH_PETSC 30 # include <petscversion.h> 47 , mpi_communicator(mpi_communicator)
90 const Mat B = preconditioner;
92 ExcMessage(
"PETSc preconditioner should have an " 93 "associated matrix set to be used in solver."));
97 # if DEAL_II_PETSC_VERSION_LT(3, 5, 0) 103 SAME_PRECONDITIONER);
105 ierr = KSPSetOperators(
solver_data->ksp, A, preconditioner);
122 PetscErrorCode ierr =
176 const PetscInt iteration,
177 const PetscReal residual_norm,
178 KSPConvergedReason *reason,
179 void * solver_control_x)
185 solver_control.
check(iteration, residual_norm);
189 case ::SolverControl::iterate:
190 *reason = KSP_CONVERGED_ITERATING;
193 case ::SolverControl::success:
194 *reason =
static_cast<KSPConvergedReason
>(1);
197 case ::SolverControl::failure:
199 *reason = KSP_DIVERGED_ITS;
201 *reason = KSP_DIVERGED_DTOL;
217 solver_data = std_cxx14::make_unique<SolverData>();
269 PetscErrorCode ierr = KSPSetType(ksp, KSPRICHARDSON);
279 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);
295 ierr = KSPSetTolerances(ksp,
317 PetscErrorCode ierr = KSPSetType(ksp, KSPCHEBYSHEV);
323 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);
341 PetscErrorCode ierr = KSPSetType(ksp, KSPCG);
347 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);
365 PetscErrorCode ierr = KSPSetType(ksp, KSPBICG);
371 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);
379 const unsigned int restart_parameter,
380 const bool right_preconditioning)
381 : restart_parameter(restart_parameter)
382 , right_preconditioning(right_preconditioning)
398 PetscErrorCode ierr = KSPSetType(ksp, KSPGMRES);
422 ierr = PetscObjectQueryFunction(reinterpret_cast<PetscObject>(ksp),
423 "KSPGMRESSetRestart_C",
424 reinterpret_cast<void (**)()
>(&fun_ptr));
434 ierr = KSPSetPCSide(ksp, PC_RIGHT);
441 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);
459 PetscErrorCode ierr = KSPSetType(ksp, KSPBCGS);
465 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);
483 PetscErrorCode ierr = KSPSetType(ksp, KSPCGS);
489 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);
507 PetscErrorCode ierr = KSPSetType(ksp, KSPTFQMR);
513 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);
531 PetscErrorCode ierr = KSPSetType(ksp, KSPTCQMR);
537 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);
555 PetscErrorCode ierr = KSPSetType(ksp, KSPCR);
561 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);
579 PetscErrorCode ierr = KSPSetType(ksp, KSPLSQR);
585 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);
603 PetscErrorCode ierr = KSPSetType(ksp, KSPPREONLY);
619 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_FALSE);
639 , symmetric_mode(false)
651 PetscErrorCode ierr = KSPSetType(ksp, KSPPREONLY);
666 ierr = KSPSetInitialGuessNonzero(ksp, PETSC_FALSE);
675 # ifdef DEAL_II_PETSC_WITH_MUMPS 686 PetscInt ival = 2, icntl = 7;
701 solver_data = std_cxx14::make_unique<SolverDataMUMPS>();
714 # if DEAL_II_PETSC_VERSION_LT(3, 5, 0) 716 KSPSetOperators(
solver_data->ksp, A, A, DIFFERENT_NONZERO_PATTERN);
758 # if DEAL_II_PETSC_VERSION_LT(3, 9, 0) 759 ierr = PCFactorSetMatSolverPackage(
solver_data->pc, MATSOLVERMUMPS);
761 ierr = PCFactorSetMatSolverType(
solver_data->pc, MATSOLVERMUMPS);
768 # if DEAL_II_PETSC_VERSION_LT(3, 9, 0) 769 ierr = PCFactorSetUpMatSolverPackage(
solver_data->pc);
771 ierr = PCFactorSetUpMatSolverType(
solver_data->pc);
786 ierr = MatMumpsSetIcntl(F, icntl, ival);
806 PetscErrorCode ierr = KSPSolve(
solver_data->ksp, b, x);
824 ierr = KSPGetIterationNumber(
solver_data->ksp, &its);
826 ierr = KSPGetResidualNorm(
solver_data->ksp, &rnorm);
830 # else // DEAL_II_PETSC_WITH_MUMPS 834 "Your PETSc installation does not include a copy of " 835 "the MUMPS package necessary for this solver. You will need to configure " 836 "PETSc so that it includes MUMPS, recompile it, and then re-configure " 837 "and recompile deal.II as well."));
848 const PetscInt iteration,
849 const PetscReal residual_norm,
850 KSPConvergedReason *reason,
851 void * solver_control_x)
857 solver_control.
check(iteration, residual_norm);
861 case ::SolverControl::iterate:
862 *reason = KSP_CONVERGED_ITERATING;
865 case ::SolverControl::success:
866 *reason =
static_cast<KSPConvergedReason
>(1);
869 case ::SolverControl::failure:
871 *reason = KSP_DIVERGED_ITS;
873 *reason = KSP_DIVERGED_DTOL;
893 #endif // DEAL_II_WITH_PETSC
virtual void set_solver_type(KSP &ksp) const override
virtual void set_solver_type(KSP &ksp) const =0
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const override
virtual State check(const unsigned int step, const double check_value)
virtual void set_solver_type(KSP &ksp) const override
const AdditionalData additional_data
const AdditionalData additional_data
void set_prefix(const std::string &prefix)
const AdditionalData additional_data
AdditionalData(const unsigned int restart_parameter=30, const bool right_preconditioning=false)
SolverRichardson(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
const AdditionalData additional_data
const AdditionalData additional_data
void initialize(const PreconditionerBase &preconditioner)
#define AssertThrow(cond, exc)
virtual void set_solver_type(KSP &ksp) const override
Tensor< 2, dim, Number > F(const Tensor< 2, dim, Number > &Grad_u)
std::unique_ptr< SolverDataMUMPS > solver_data
SparseDirectMUMPS(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
static ::ExceptionBase & ExcMessage(std::string arg1)
const MPI_Comm mpi_communicator
Stop iteration, goal reached.
std::unique_ptr< SolverData > solver_data
virtual void set_solver_type(KSP &ksp) const override
bool right_preconditioning
#define Assert(cond, exc)
void solve(const MatrixBase &A, VectorBase &x, const VectorBase &b, const PreconditionerBase &preconditioner)
virtual void set_solver_type(KSP &ksp) const override
virtual void set_solver_type(KSP &ksp) const override
const AdditionalData additional_data
SolverBase(SolverControl &cn, const MPI_Comm &mpi_communicator)
virtual void set_solver_type(KSP &ksp) const override
virtual void set_solver_type(KSP &ksp) const override
#define DEAL_II_NAMESPACE_CLOSE
AdditionalData(const double omega=1)
virtual void set_solver_type(KSP &ksp) const override
SolverCR(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
SolverControl & solver_control
double last_value() const
SolverBiCG(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
SolverLSQR(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
SolverChebychev(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
SymmetricTensor< 2, dim, Number > b(const Tensor< 2, dim, Number > &F)
SolverCGS(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
unsigned int last_step() const
const AdditionalData additional_data
PetscErrorCode destroy_krylov_solver(KSP &krylov_solver)
SolverBicgstab(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
SolverControl & control() const
virtual void set_solver_type(KSP &ksp) const override
void solve(const MatrixBase &A, VectorBase &x, const VectorBase &b)
SolverTCQMR(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
#define DEAL_II_NAMESPACE_OPEN
unsigned int max_steps() const
const AdditionalData additional_data
SolverTFQMR(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
static PetscErrorCode convergence_test(KSP ksp, const PetscInt iteration, const PetscReal residual_norm, KSPConvergedReason *reason, void *solver_control)
static ::ExceptionBase & ExcNotImplemented()
void set_symmetric_mode(const bool flag)
static PetscErrorCode convergence_test(KSP ksp, const PetscInt iteration, const PetscReal residual_norm, KSPConvergedReason *reason, void *solver_control)
SolverCG(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
SolverPreOnly(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
const PC & get_pc() const
const AdditionalData additional_data
SolverGMRES(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
unsigned int restart_parameter
virtual void set_solver_type(KSP &ksp) const override
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const override