15 #include "../config/config.hpp"
24 #ifdef MFEM_USE_SUITESPARSE
116 MPI_Comm comm = MPI_COMM_NULL;
173 bool final=
false)
const;
265 {
return dot_prod_type == 0 ? MPI_COMM_NULL : comm; }
293 const double damping=1.0);
306 const double damping=1.0);
331 const double damping;
335 bool use_abs_diag =
false;
341 const bool allow_updates;
362 int order,
double max_eig_estimate);
368 int order,
double max_eig_estimate);
380 int order, MPI_Comm comm = MPI_COMM_NULL,
381 int power_iterations = 10,
382 double power_tolerance = 1e-8);
388 int order, MPI_Comm comm = MPI_COMM_NULL,
389 int power_iterations = 10,
390 double power_tolerance = 1e-8);
394 int order,
int power_iterations = 10,
395 double power_tolerance = 1e-8);
401 int order,
int power_iterations = 10,
402 double power_tolerance = 1e-8);
420 double max_eig_estimate;
427 mutable Vector helperVector;
454 void SLI(
const Operator &A,
const Vector &
b, Vector &x,
455 int print_iter = 0,
int max_num_iter = 1000,
456 double RTOLERANCE = 1e-12,
double ATOLERANCE = 1e-24);
459 void SLI(
const Operator &A, Solver &B,
const Vector &
b, Vector &x,
460 int print_iter = 0,
int max_num_iter = 1000,
461 double RTOLERANCE = 1e-12,
double ATOLERANCE = 1e-24);
486 void CG(
const Operator &A,
const Vector &
b, Vector &x,
487 int print_iter = 0,
int max_num_iter = 1000,
488 double RTOLERANCE = 1e-12,
double ATOLERANCE = 1e-24);
491 void PCG(
const Operator &A, Solver &B,
const Vector &
b, Vector &x,
492 int print_iter = 0,
int max_num_iter = 1000,
493 double RTOLERANCE = 1e-12,
double ATOLERANCE = 1e-24);
534 int GMRES(
const Operator &A, Vector &x,
const Vector &
b, Solver &M,
535 int &max_iter,
int m,
double &tol,
double atol,
int printit);
538 void GMRES(
const Operator &A, Solver &B,
const Vector &
b, Vector &x,
539 int print_iter = 0,
int max_num_iter = 1000,
int m = 50,
540 double rtol = 1e-12,
double atol = 1e-24);
565 int BiCGSTAB(
const Operator &A, Vector &x,
const Vector &
b, Solver &M,
566 int &max_iter,
double &tol,
double atol,
int printit);
569 void BiCGSTAB(
const Operator &A, Solver &B,
const Vector &
b, Vector &x,
570 int print_iter = 0,
int max_num_iter = 1000,
571 double rtol = 1e-12,
double atol = 1e-24);
600 void MINRES(
const Operator &A,
const Vector &
b, Vector &x,
int print_it = 0,
601 int max_it = 1000,
double rtol = 1e-12,
double atol = 1e-24);
604 void MINRES(
const Operator &A, Solver &B,
const Vector &
b, Vector &x,
605 int print_it = 0,
int max_it = 1000,
606 double rtol = 1e-12,
double atol = 1e-24);
642 const double fnorm)
const;
649 const double fnorm)
const;
690 const double rtol0 = 0.5,
691 const double rtol_max = 0.9,
692 const double alpha = 0.5 * (1.0 +
sqrt(5.0)),
693 const double gamma = 1.0);
706 for (
int i = 0; i <
skArray.Size(); i++)
718 for (
int i = 0; i <
m; i++)
751 { MFEM_WARNING(
"L-BFGS won't use the given preconditioner."); }
753 { MFEM_WARNING(
"L-BFGS won't use the given solver."); }
763 int aGMRES(
const Operator &A, Vector &x,
const Vector &
b,
764 const Operator &M,
int &max_iter,
765 int m_max,
int m_min,
int m_step,
double cf,
766 double &tol,
double &atol,
int printit);
802 { MFEM_ABORT(
"The objective gradient is not implemented."); }
840 { MFEM_ABORT(
"Not meaningful for this solver."); }
842 { MFEM_ABORT(
"Not meaningful for this solver."); }
1018 bool final)
override;
1022 #ifdef MFEM_USE_SUITESPARSE
1094 #endif // MFEM_USE_SUITESPARSE
1103 std::unique_ptr<DenseMatrixInverse[]> block_solvers;
1121 bool ownA,
bool ownS0,
bool ownS1)
1122 :
Solver(A_->
NumRows()), A(A_, ownA), S0(S0_, ownS0), S1(S1_, ownS1) { }
1140 void Mult(
const Vector &x,
Vector &y,
bool transpose)
const;
1143 bool op_is_symmetric =
true,
bool own_aux_map =
false);
1149 #endif // MFEM_USE_MPI
1153 #endif // MFEM_SOLVERS
const Array< int > * ess_dofs_list
Not owned.
MINRESSolver(MPI_Comm comm_)
const Vector * GetInequalityVec_Hi() const
GMRESSolver(MPI_Comm comm_)
Conjugate gradient method.
OpType * As() const
Return the Operator pointer statically cast to a specified OpType. Similar to the method Get()...
HypreSmoother & GetSmoother()
virtual void MultTranspose(const Vector &b, Vector &x) const
Action of the transpose operator: y=A^t(x). The default behavior in class Operator is to generate an ...
double Info[UMFPACK_INFO]
void Mult(const Vector &b, Vector &x) const
Solve the system LUx = b, where L and U are the block ILU factors.
Chebyshev accelerated smoothing with given vector, no matrix necessary.
int GetNumIterations() const
MPI_Comm GetComm() const
Return the associated MPI communicator, or MPI_COMM_NULL if no communicator is set.
Array< Vector * > ykArray
void SetPositiveDiagonal(bool pos_diag=true)
Replace diagonal entries with their absolute values.
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
virtual void Mult(const Vector &x, Vector &y) const
Operator application: y=A(x).
void SetHistorySize(int dim)
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
void SetSize(int s)
Resize the vector to size s.
void Monitor(int it, double norm, const Vector &r, const Vector &x, bool final=false) const
virtual void ProcessNewState(const Vector &x) const
This method can be overloaded in derived classes to perform computations that need knowledge of the n...
bool summary
A summary of the solver process will be reported after the last iteration to mfem::out.
bool first_and_last
Information about the first and last iteration will be printed to mfem::out.
OperatorJacobiSmoother(const double damping=1.0)
Default constructor: the diagonal will be computed by subsequent calls to SetOperator() using the Ope...
Pointer to an Operator of a specified type.
~OperatorChebyshevSmoother()
class IterativeSolver * iter_solver
The last IterativeSolver to which this monitor was attached.
T * GetData()
Returns the data.
void Mult(const Vector &x, Vector &y) const
Operator application: y=A(x).
void InitializeStorageVectors()
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
Direct sparse solver using KLU.
bool errors
If a fatal problem has been detected the failure will be reported to mfem::err.
virtual void Mult(const Vector &x, Vector &y) const =0
Operator application: y=A(x).
virtual void SetSolver(Solver &solver)
Set the linear solver for inverting the Jacobian.
virtual void MultTranspose(const Vector &b, Vector &x) const
Action of the transpose operator: y=A^t(x). The default behavior in class Operator is to generate an ...
void SetOperator(const Operator &op)
UMFPackSolver(SparseMatrix &A, bool use_long_ints_=false)
Factorize the given SparseMatrix using the defaults. For larger matrices, if the solver fails...
const Operator * GetC() const
bool GetConverged() const
Reordering
The reordering method used by the BlockILU factorization.
virtual ~IterativeSolverMonitor()
ResidualBCMonitor(const Array< int > &ess_dofs_list_)
int print_level
(DEPRECATED) Legacy print level definition, which is left for compatibility with custom iterative sol...
virtual void SetOperator(const Operator &op)
Set/update the solver for the given operator.
PrintLevel()=default
Initializes the print level to suppress.
virtual double CalcObjective(const Vector &x) const =0
Objective F(x). In parallel, the result should be reduced over tasks.
SLISolver(MPI_Comm comm_)
void add(const Vector &v1, const Vector &v2, Vector &v)
virtual ~OptimizationSolver()
void MultTranspose(const Vector &x, Vector &y) const
Action of the transpose operator: y=A^t(x). The default behavior in class Operator is to generate an ...
double Norm(const Vector &x) const
double GetFinalNorm() const
int BiCGSTAB(const Operator &A, Vector &x, const Vector &b, Solver &M, int &max_iter, double &tol, double atol, int printit)
BiCGSTAB method. (tolerances are squared)
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
virtual void SetOperator(const Operator &op) override
Also calls SetOperator for the preconditioner if there is one.
Direct sparse solver using UMFPACK.
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
virtual void SetPrintLevel(int print_lvl)
Legacy method to set the level of verbosity of the solver output.
const Vector * GetBoundsVec_Lo() const
double solve(double l, const Vector &xt, Vector &x, int &nclip) const
Solve QP at fixed lambda.
int GetNumConstraints() const
void MINRES(const Operator &A, const Vector &b, Vector &x, int print_it, int max_it, double rtol, double atol)
MINRES method without preconditioner. (tolerances are squared)
Jacobi smoothing for a given bilinear form (no matrix necessary).
~OperatorJacobiSmoother()
void SetMaxIter(int max_it)
OperatorChebyshevSmoother(const Operator &oper_, const Vector &d, const Array< int > &ess_tdof_list, int order, double max_eig_estimate)
void SetLinearConstraint(const Vector &w_, double a_)
void median(const Vector &lo, const Vector &hi)
v = median(v,lo,hi) entrywise. Implementation assumes lo <= hi.
DirectSubBlockSolver(const SparseMatrix &A, const SparseMatrix &block_dof)
void SetKDim(int dim)
Set the number of iteration to perform between restarts, default is 50.
Newton's method for solving F(x)=b for a given operator F.
void CG(const Operator &A, const Vector &b, Vector &x, int print_iter, int max_num_iter, double RTOLERANCE, double ATOLERANCE)
Conjugate gradient method. (tolerances are squared)
PrintLevel & Iterations()
void print_iteration(int it, double r, double l) const
void Setup(const Vector &diag)
Parallel smoothers in hypre.
void PCG(const Operator &A, Solver &B, const Vector &b, Vector &x, int print_iter, int max_num_iter, double RTOLERANCE, double ATOLERANCE)
Preconditioned conjugate gradient method. (tolerances are squared)
virtual void SetOperator(const Operator &op)
Set/update the solver for the given operator.
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
double Dot(const Vector &x, const Vector &y) const
Array< Vector * > skArray
PrintLevel & FirstAndLast()
void SetIterativeSolver(const IterativeSolver &solver)
This method is invoked by IterativeSolver::SetMonitor, informing the monitor which IterativeSolver is...
virtual void SetOperator(const Operator &op)
Set/update the solver for the given operator.
const Vector * GetBoundsVec_Hi() const
BlockILU(int block_size_, Reordering reordering_=Reordering::MINIMUM_DISCARDED_FILL, int k_fill_=0)
virtual void Mult(const Vector &b, Vector &x) const
Solve the nonlinear system with right-hand side b.
void SetPrintLevel(int print_lvl)
Set the print level field in the Control data member.
void AdaptiveLinRtolPostSolve(const Vector &x, const Vector &b, const int it, const double fnorm) const
Method for the adaptive linear solver rtol invoked after the linear solve.
Stationary linear iteration: x <- x + B (b - A x)
void SetInequalityConstraint(const Vector &dl, const Vector &dh)
void SetEqualityConstraint(const Vector &c)
Abstract base class for an iterative solver monitor.
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
void SetOperator(const Operator &op_)
Set/update the solver for the given operator.
ProductSolver(Operator *A_, Solver *S0_, Solver *S1_, bool ownA, bool ownS0, bool ownS1)
void SetAbsTol(double atol)
virtual void MultTranspose(const Vector &x, Vector &y) const
Action of the transpose operator: y=A^t(x). The default behavior in class Operator is to generate an ...
PrintLevel print_options
Output behavior for the iterative solver.
void SetRelTol(double rtol)
double Control[UMFPACK_CONTROL]
Monitor that checks whether the residual is zero at a given set of dofs.
Abstract base class for iterative solver.
UMFPackSolver(bool use_long_ints_=false)
For larger matrices, if the solver fails, set the parameter use_long_ints_ = true.
virtual void Mult(const Vector &b, Vector &x) const
Solve the nonlinear system with right-hand side b.
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
int NumRows() const
Get the number of rows (size of output) of the Operator. Synonym with Height().
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
void DeleteStorageVectors()
void SetAdaptiveLinRtol(const int type=2, const double rtol0=0.5, const double rtol_max=0.9, const double alpha=0.5 *(1.0+sqrt(5.0)), const double gamma=1.0)
Enable adaptive linear solver relative tolerance algorithm.
int max_iter
Limit for the number of iterations the solver is allowed to do.
LBFGSSolver(MPI_Comm comm_)
virtual void SetSolver(Solver &solver)
Set the linear solver for inverting the Jacobian.
static int GuessLegacyPrintLevel(PrintLevel)
Use some heuristics to guess a legacy print level corresponding to the given PrintLevel.
const Vector * GetEqualityVec() const
FGMRESSolver(MPI_Comm comm_)
virtual void SetOptimizationProblem(const OptimizationProblem &prob)
void SetMonitor(IterativeSolverMonitor &m)
Set the iterative solver monitor.
const Operator * GetD() const
Abstract solver for OptimizationProblems.
double rel_tol
Relative tolerance.
virtual double ComputeScalingFactor(const Vector &x, const Vector &b) const
This method can be overloaded in derived classes to implement line search algorithms.
OptimizationProblem(int insize, const Operator *C_, const Operator *D_)
In parallel, insize is the number of the local true dofs.
void SetSolutionBounds(const Vector &xl, const Vector &xh)
const Vector * GetInequalityVec_Lo() const
virtual void Mult(const Vector &x, Vector &y) const
Operator application: y=A(x).
AuxSpaceSmoother(const HypreParMatrix &op, HypreParMatrix *aux_map, bool op_is_symmetric=true, bool own_aux_map=false)
void Mult(const Vector &x, Vector &y) const
Operator application: y=A(x).
FDualNumber< tbase > sqrt(const FDualNumber< tbase > &f)
sqrt([dual number])
virtual void Mult(const Vector &xt, Vector &x) const =0
Operator application: y=A(x).
BiCGSTABSolver(MPI_Comm comm_)
void SetOperator(const Operator &op)
Recompute the diagonal using the method AssembleDiagonal of the given new Operator, op.
SLBQPOptimizer(MPI_Comm comm_)
void AdaptiveLinRtolPreSolve(const Vector &x, const int it, const double fnorm) const
Method for the adaptive linear solver rtol invoked before the linear solve.
PrintLevel FromLegacyPrintLevel(int)
Convert a legacy print level integer to a PrintLevel object.
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
virtual void Mult(const Vector &xt, Vector &x) const
void MultTranspose(const Vector &x, Vector &y) const
Action of the transpose operator: y=A^t(x). The default behavior in class Operator is to generate an ...
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
virtual void CalcObjectiveGrad(const Vector &x, Vector &grad) const
The result grad is expected to enter with the correct size.
void MonitorResidual(int it, double norm, const Vector &r, bool final) override
Monitor the residual vector r.
virtual void MultTranspose(const Vector &x, Vector &y) const
Action of the transpose operator: y=A^t(x). The default behavior in class Operator is to generate an ...
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
virtual void MonitorSolution(int it, double norm, const Vector &x, bool final)
Monitor the solution vector x.
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
KLUSolver(SparseMatrix &A)
int aGMRES(const Operator &A, Vector &x, const Vector &b, const Operator &M, int &max_iter, int m_max, int m_min, int m_step, double cf, double &tol, double &atol, int printit)
bool warnings
If a non-fatal problem has been detected some context-specific information will be reported to mfem::...
bool iterations
Detailed information about each iteration will be reported to mfem::out.
OptimizationSolver(MPI_Comm comm_)
virtual void SetOperator(const Operator &op)
Set/update the solver for the given operator.
const OptimizationProblem * problem
Wrapper for hypre's ParCSR matrix class.
Block diagonal solver for A, each block is inverted by direct solver.
void SetBounds(const Vector &lo_, const Vector &hi_)
Rank 3 tensor (array of matrices)
virtual void SetOptimizationProblem(const OptimizationProblem &prob)
NewtonSolver(MPI_Comm comm_)
IterativeSolverMonitor * monitor
virtual void Mult(const Vector &x, Vector &y) const
Operator application: y=A(x).
virtual void MonitorResidual(int it, double norm, const Vector &r, bool final)
Monitor the residual vector r.
int width
Dimension of the input / number of columns in the matrix.
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
Settings for the output behavior of the IterativeSolver.
const Operator * C
Not owned, some can remain unused (NULL).
double abs_tol
Absolute tolerance.
void SLI(const Operator &A, const Vector &b, Vector &x, int print_iter, int max_num_iter, double RTOLERANCE, double ATOLERANCE)
Stationary linear iteration. (tolerances are squared)
int GMRES(const Operator &A, Vector &x, const Vector &b, Solver &M, int &max_iter, int m, double &tol, double atol, int printit)
GMRES method. (tolerances are squared)
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
virtual void SetOperator(const Operator &op)
Factorize the given Operator op which must be a SparseMatrix.