17 #include <deal.II/base/logstream.h> 18 #include <deal.II/lac/petsc_solver.h> 20 #ifdef DEAL_II_WITH_PETSC 22 # include <deal.II/lac/petsc_matrix_base.h> 23 # include <deal.II/lac/petsc_vector_base.h> 24 # include <deal.II/lac/petsc_precondition.h> 27 #include <petscversion.h> 29 DEAL_II_NAMESPACE_OPEN
39 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 40 int ierr = KSPDestroy (
ksp);
42 int ierr = KSPDestroy (&
ksp);
55 mpi_communicator (mpi_communicator)
99 const Mat B = preconditioner;
101 ExcMessage(
"PETSc preconditioner should have an" 102 "associated matrix set to be used in solver."));
106 #if DEAL_II_PETSC_VERSION_LT(3, 5, 0) 109 ierr = KSPSetOperators (
solver_data->ksp, A, preconditioner,
110 SAME_PRECONDITIONER);
112 ierr = KSPSetOperators (
solver_data->ksp, A, preconditioner);
179 const PetscInt iteration,
180 const PetscReal residual_norm,
181 KSPConvergedReason *reason,
182 void *solver_control_x)
187 = solver_control.
check (iteration, residual_norm);
191 case ::SolverControl::iterate:
192 *reason = KSP_CONVERGED_ITERATING;
195 case ::SolverControl::success:
196 *reason =
static_cast<KSPConvergedReason
>(1);
199 case ::SolverControl::failure:
201 *reason = KSP_DIVERGED_ITS;
203 *reason = KSP_DIVERGED_DTOL;
207 Assert (
false, ExcNotImplemented());
273 ierr = KSPSetType (ksp, KSPRICHARDSON);
283 KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
323 #if DEAL_II_PETSC_VERSION_LT(3,3,0) 324 ierr = KSPSetType (ksp, KSPCHEBYCHEV);
326 ierr = KSPSetType (ksp, KSPCHEBYSHEV);
333 KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
352 ierr = KSPSetType (ksp, KSPCG);
358 KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
377 ierr = KSPSetType (ksp, KSPBICG);
383 KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
391 const bool right_preconditioning)
393 restart_parameter (restart_parameter),
394 right_preconditioning (right_preconditioning)
412 ierr = KSPSetType (ksp, KSPGMRES);
435 int (*fun_ptr)(KSP,int);
436 ierr = PetscObjectQueryFunction((PetscObject)(ksp),
437 "KSPGMRESSetRestart_C",
438 (
void (* *)())&fun_ptr);
448 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 449 ierr = KSPSetPreconditionerSide(ksp, PC_RIGHT);
451 ierr = KSPSetPCSide(ksp, PC_RIGHT);
460 KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
479 ierr = KSPSetType (ksp, KSPBCGS);
485 KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
504 ierr = KSPSetType (ksp, KSPCGS);
510 KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
529 ierr = KSPSetType (ksp, KSPTFQMR);
535 KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
554 ierr = KSPSetType (ksp, KSPTCQMR);
560 KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
579 ierr = KSPSetType (ksp, KSPCR);
585 KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
604 ierr = KSPSetType (ksp, KSPLSQR);
610 KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
629 ierr = KSPSetType (ksp, KSPPREONLY);
645 KSPSetInitialGuessNonzero (ksp, PETSC_FALSE);
654 #if DEAL_II_PETSC_VERSION_LT(3,2,0) 655 int ierr = KSPDestroy (ksp);
657 int ierr = KSPDestroy (&ksp);
670 symmetric_mode(false)
683 ierr = KSPSetType (ksp, KSPPREONLY);
698 KSPSetInitialGuessNonzero (ksp, PETSC_FALSE);
706 #ifdef PETSC_HAVE_MUMPS 719 PetscInt ival=2, icntl=7;
732 if (solver_data.get() == 0)
747 #if DEAL_II_PETSC_VERSION_LT(3, 5, 0) 748 ierr = KSPSetOperators (solver_data->ksp, A, A,
749 DIFFERENT_NONZERO_PATTERN);
751 ierr = KSPSetOperators (solver_data->ksp, A, A);
763 ierr = KSPGetPC (solver_data->ksp, & solver_data->pc);
771 ierr = PCSetType (solver_data->pc, PCCHOLESKY);
773 ierr = PCSetType (solver_data->pc, PCLU);
789 #if DEAL_II_PETSC_VERSION_GTE(3,2,0) 790 ierr = PCFactorSetMatSolverPackage (solver_data->pc, MATSOLVERMUMPS);
792 ierr = PCFactorSetMatSolverPackage (solver_data->pc, MAT_SOLVER_MUMPS);
799 ierr = PCFactorSetUpMatSolverPackage (solver_data->pc);
807 ierr = PCFactorGetMatrix(solver_data->pc, &F);
813 ierr = MatMumpsSetIcntl (F, icntl, ival);
819 ierr = KSPSetOptionsPrefix(solver_data->ksp,
prefix_name.c_str());
826 ierr = KSPSetFromOptions (solver_data->ksp);
834 ierr = KSPSolve (solver_data->ksp, b, x);
851 ierr = KSPGetIterationNumber (solver_data->ksp, &its);
853 ierr = KSPGetResidualNorm (solver_data->ksp, &rnorm);
857 #else // PETSC_HAVE_MUMPS 859 ExcMessage (
"Your PETSc installation does not include a copy of " 860 "the MUMPS package necessary for this solver. You will need to configure " 861 "PETSc so that it includes MUMPS, recompile it, and then re-configure " 862 "and recompile deal.II as well."));
873 const PetscInt iteration,
874 const PetscReal residual_norm,
875 KSPConvergedReason *reason,
876 void *solver_control_x)
881 = solver_control.
check (iteration, residual_norm);
885 case ::SolverControl::iterate:
886 *reason = KSP_CONVERGED_ITERATING;
889 case ::SolverControl::success:
890 *reason =
static_cast<KSPConvergedReason
>(1);
893 case ::SolverControl::failure:
895 *reason = KSP_DIVERGED_ITS;
897 *reason = KSP_DIVERGED_DTOL;
901 Assert (
false, ExcNotImplemented());
915 DEAL_II_NAMESPACE_CLOSE
917 #endif // DEAL_II_WITH_PETSC void solve(const MatrixBase &A, VectorBase &x, const VectorBase &b, const PreconditionerBase &preconditioner)
virtual void set_solver_type(KSP &ksp) const =0
const AdditionalData additional_data
virtual State check(const unsigned int step, const double check_value)
const AdditionalData additional_data
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const
const AdditionalData additional_data
::ExceptionBase & ExcMessage(std::string arg1)
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
virtual void set_solver_type(KSP &ksp) const
std_cxx11::shared_ptr< SolverData > solver_data
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const
#define AssertThrow(cond, exc)
SparseDirectMUMPS(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
void set_prefix(const std::string &prefix)
const MPI_Comm mpi_communicator
Stop iteration, goal reached.
bool right_preconditioning
#define Assert(cond, exc)
SolverBase(SolverControl &cn, const MPI_Comm &mpi_communicator)
static PetscErrorCode convergence_test(KSP ksp, const PetscInt iteration, const PetscReal residual_norm, KSPConvergedReason *reason, void *solver_control)
virtual void set_solver_type(KSP &ksp) const
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const
virtual void set_solver_type(KSP &ksp) const
AdditionalData(const double omega=1)
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())
SolverCGS(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
virtual void set_solver_type(KSP &ksp) const
unsigned int last_step() const
const AdditionalData additional_data
void initialize(const PreconditionerBase &preconditioner)
SolverBicgstab(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
void solve(const MatrixBase &A, VectorBase &x, const VectorBase &b)
virtual void set_solver_type(KSP &ksp) const
virtual void set_solver_type(KSP &ksp) const
SolverTCQMR(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
unsigned int max_steps() const
const AdditionalData additional_data
SolverTFQMR(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
void set_symmetric_mode(const bool flag)
virtual void set_solver_type(KSP &ksp) const
virtual void set_solver_type(KSP &ksp) const
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
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const