15 #include "../config/config.hpp"
22 #ifdef MFEM_USE_SUITESPARSE
93 const double damping=1.0);
101 const double damping=1.0);
111 const double damping;
141 void SLI(
const Operator &A,
const Vector &
b, Vector &x,
142 int print_iter = 0,
int max_num_iter = 1000,
143 double RTOLERANCE = 1e-12,
double ATOLERANCE = 1e-24);
146 void SLI(
const Operator &A, Solver &B,
const Vector &
b, Vector &x,
147 int print_iter = 0,
int max_num_iter = 1000,
148 double RTOLERANCE = 1e-12,
double ATOLERANCE = 1e-24);
173 void CG(
const Operator &A,
const Vector &
b, Vector &x,
174 int print_iter = 0,
int max_num_iter = 1000,
175 double RTOLERANCE = 1e-12,
double ATOLERANCE = 1e-24);
178 void PCG(
const Operator &A, Solver &B,
const Vector &
b, Vector &x,
179 int print_iter = 0,
int max_num_iter = 1000,
180 double RTOLERANCE = 1e-12,
double ATOLERANCE = 1e-24);
221 int GMRES(
const Operator &A, Vector &x,
const Vector &
b, Solver &M,
222 int &max_iter,
int m,
double &tol,
double atol,
int printit);
225 void GMRES(
const Operator &A, Solver &B,
const Vector &
b, Vector &x,
226 int print_iter = 0,
int max_num_iter = 1000,
int m = 50,
227 double rtol = 1e-12,
double atol = 1e-24);
252 int BiCGSTAB(
const Operator &A, Vector &x,
const Vector &
b, Solver &M,
253 int &max_iter,
double &tol,
double atol,
int printit);
256 void BiCGSTAB(
const Operator &A, Solver &B,
const Vector &
b, Vector &x,
257 int print_iter = 0,
int max_num_iter = 1000,
258 double rtol = 1e-12,
double atol = 1e-24);
287 void MINRES(
const Operator &A,
const Vector &
b, Vector &x,
int print_it = 0,
288 int max_it = 1000,
double rtol = 1e-12,
double atol = 1e-24);
291 void MINRES(
const Operator &A, Solver &B,
const Vector &
b, Vector &x,
292 int print_it = 0,
int max_it = 1000,
293 double rtol = 1e-12,
double atol = 1e-24);
337 int aGMRES(
const Operator &A, Vector &x,
const Vector &
b,
338 const Operator &M,
int &max_iter,
339 int m_max,
int m_min,
int m_step,
double cf,
340 double &tol,
double &atol,
int printit);
376 { MFEM_ABORT(
"The objective gradient is not implemented."); }
414 { MFEM_ABORT(
"Not meaningful for this solver."); }
416 { MFEM_ABORT(
"Not meaningful for this solver."); }
577 #ifdef MFEM_USE_SUITESPARSE
592 mutable double Info[UMFPACK_INFO];
649 #endif // MFEM_USE_SUITESPARSE
653 #endif // MFEM_SOLVERS
const Vector * GetInequalityVec_Hi() const
Conjugate gradient method.
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.
int GetNumIterations() const
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.
void SetSize(int s)
Resize the vector to size s.
virtual void ProcessNewState(const Vector &x) const
This method can be overloaded in derived classes to perform computations that need knowledge of the n...
NewtonSolver(MPI_Comm _comm)
T * GetData()
Returns the data.
void Mult(const Vector &x, Vector &y) const
Operator application: y=A(x).
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
Direct sparse solver using KLU.
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 ...
UMFPackSolver(SparseMatrix &A, bool _use_long_ints=false)
Factorize the given SparseMatrix using the defaults. For larger matrices, if the solver fails...
void SetOperator(const Operator &op)
const Operator * GetC() const
Reordering
The reordering method used by the BlockILU factorization.
virtual double CalcObjective(const Vector &x) const =0
Objective F(x). In parallel, the result should be reduced over tasks.
void add(const Vector &v1, const Vector &v2, Vector &v)
virtual ~OptimizationSolver()
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).
FGMRESSolver(MPI_Comm _comm)
Direct sparse solver using UMFPACK.
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
Operator application: y=A(x).
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
void SetLinearConstraint(const Vector &_w, double _a)
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
void SetPrintLevel(int print_lvl)
const Vector * GetBoundsVec_Lo() const
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
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)
void median(const Vector &lo, const Vector &hi)
v = median(v,lo,hi) entrywise. Implementation assumes lo <= hi.
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)
void print_iteration(int it, double r, double l) const
void Setup(const Vector &diag)
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
BiCGSTABSolver(MPI_Comm _comm)
const Vector * GetBoundsVec_Hi() const
SLBQPOptimizer(MPI_Comm _comm)
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.
OperatorJacobiSmoother(const BilinearForm &a, const Array< int > &ess_tdof_list, const double damping=1.0)
void SetPrintLevel(int print_lvl)
Set the print level field in the Control data member.
Stationary linear iteration: x <- x + B (b - A x)
void SetInequalityConstraint(const Vector &dl, const Vector &dh)
void SetEqualityConstraint(const Vector &c)
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
void SetAbsTol(double atol)
void SetRelTol(double rtol)
double Control[UMFPACK_CONTROL]
Abstract base class for iterative solver.
OptimizationSolver(MPI_Comm _comm)
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).
SLISolver(MPI_Comm _comm)
GMRESSolver(MPI_Comm _comm)
const Vector * GetEqualityVec() const
virtual void SetOptimizationProblem(const OptimizationProblem &prob)
void SetBounds(const Vector &_lo, const Vector &_hi)
const Operator * GetD() const
Abstract solver for OptimizationProblems.
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 &xt, Vector &x) const =0
Operator application: y=A(x).
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.
virtual void Mult(const Vector &xt, Vector &x) const
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.
MINRESSolver(MPI_Comm _comm)
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)
const OptimizationProblem * problem
Rank 3 tensor (array of matrices)
virtual void SetOptimizationProblem(const OptimizationProblem &prob)
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.
const Operator * C
Not owned, some can remain unused (NULL).
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.