29 : assembler(assembler_),
30 m_options(defaultOptions())
42 : assembler(assembler_),
43 solVector(initFreeDoFs),
44 m_options(defaultOptions())
55 : assembler(assembler_),
56 solVector(initFreeDoFs),
57 fixedDoFs(initFixedDoFs),
58 m_options(defaultOptions())
69 initResidualNorm = 1.;
79 opt.
addInt(
"Solver",
"Linear solver to use",linear_solver::LU);
81 opt.
addInt(
"MaxIters",
"Maximum number of iterations per loop",50);
82 opt.
addReal(
"AbsTol",
"Absolute tolerance for the convergence cretiria",1e-12);
83 opt.
addReal(
"RelTol",
"Relative tolerance for the stopping criteria",1e-9);
85 opt.
addInt(
"Verbosity",
"Amount of information printed to the terminal: none, some, all",solver_verbosity::none);
86 opt.
addInt(
"IterType",
"Type of iteration: update or next/full",iteration_type::update);
101 gsInfo << status() << std::endl;
102 if (residualNorm < m_options.getReal(
"AbsTol") ||
103 updateNorm < m_options.getReal(
"AbsTol") ||
104 residualNorm/initResidualNorm < m_options.getReal(
"RelTol") ||
105 updateNorm/initUpdateNorm < m_options.getReal(
"RelTol"))
106 m_status = converged;
107 else if (numIterations == m_options.getInt(
"MaxIters"))
112 if (m_options.getInt(
"Verbosity") != solver_verbosity::none)
113 gsInfo << status() << std::endl;
120 if (numIterations == 1 && m_options.getInt(
"IterType") == iteration_type::update)
121 assembler.homogenizeFixedDofs(-1);
123 if (!assembler.assemble(solVector,fixedDoFs))
127 if (m_options.getInt(
"Solver") == linear_solver::LU)
129#ifdef GISMO_WITH_PARDISO
130 gsSparseSolver<>::PardisoLU solver(assembler.matrix());
131 solutionVector = solver.solve(assembler.rhs());
133 gsSparseSolver<>::LU solver(assembler.matrix());
134 solutionVector = solver.solve(assembler.rhs());
139#ifdef GISMO_WITH_PARDISO
140 gsSparseSolver<>::PardisoLDLT solver(assembler.matrix());
141 solutionVector = solver.solve(assembler.rhs());
143 gsSparseSolver<>::SimplicialLDLT solver(assembler.matrix());
144 solutionVector = solver.solve(assembler.rhs());
149 gsSparseSolver<>::BiCGSTABDiagonal solver(assembler.matrix());
150 solutionVector = solver.solve(assembler.rhs());
154 gsSparseSolver<>::CGDiagonal solver(assembler.matrix());
155 solutionVector = solver.solve(assembler.rhs());
158 if (m_options.getInt(
"IterType") == iteration_type::update)
160 updateNorm = solutionVector.norm();
161 residualNorm = assembler.rhs().norm();
162 solVector += solutionVector;
164 if (numIterations == 0)
166 fixedDoFs[d] += assembler.fixedDofs(d);
170 updateNorm = (solutionVector-solVector).norm();
172 solVector = solutionVector;
174 if (numIterations == 0)
175 fixedDoFs = assembler.allFixedDofs();
178 if (numIterations == 0)
180 initUpdateNorm = updateNorm;
181 initResidualNorm = residualNorm;
191 std::string statusString;
192 if (m_status == converged)
193 statusString =
"Iterative solver converged after " +
196 statusString =
"Iterative solver was interrupted after " +
199 statusString =
"Iterative solver was interrupted after " +
200 util::to_string(numIterations) +
" iteration(s) due to an invalid solution";
220 fixedDoFs[d] = ddofs[d];
227 solVecSaved = solVector;
228 ddofsSaved = fixedDoFs;
234 GISMO_ASSERT(solVecSaved.rows() == solVector.rows(),
"No state saved!");
235 solVector = solVecSaved;
236 fixedDoFs = ddofsSaved;
Extends the gsAssembler class by adding functionality necessary for a general nonlinear solver....
Definition gsBaseAssembler.h:27
bool compute()
computes update or the next solution
Definition gsIterative.hpp:117
virtual void setFixedDofs(const std::vector< gsMatrix< T > > &ddofs)
set all fixed degrees of freedom
Definition gsIterative.hpp:211
gsBaseAssembler< T > & assembler
assembler object that generates the linear system
Definition gsIterative.h:106
std::string status()
return solver status as a string
Definition gsIterative.hpp:189
gsIterative(gsBaseAssembler< T > &assembler_)
constructor without an initial guess. Assumes a zero initial guess.
Definition gsIterative.hpp:28
void recoverState()
recover solver state from saved state
Definition gsIterative.hpp:232
gsMatrix< T > solVector
solution vector
Definition gsIterative.h:108
void saveState()
save solver state
Definition gsIterative.hpp:225
void reset()
reset the solver state
Definition gsIterative.hpp:64
static gsOptionList defaultOptions()
default option list. used for initialization
Definition gsIterative.hpp:75
std::vector< gsMatrix< T > > fixedDoFs
current Dirichlet DoFs that the solution satisfies
Definition gsIterative.h:110
void solve()
solution procedure
Definition gsIterative.hpp:91
A matrix with arbitrary coefficient type and fixed or dynamic size.
Definition gsMatrix.h:41
Class which holds a list of parameters/options, and provides easy access to them.
Definition gsOptionList.h:33
void addInt(const std::string &label, const std::string &desc, const index_t &value)
Adds a option named label, with description desc and value value.
Definition gsOptionList.cpp:201
void addReal(const std::string &label, const std::string &desc, const Real &value)
Adds a option named label, with description desc and value value.
Definition gsOptionList.cpp:211
A vector with arbitrary coefficient type and fixed or dynamic size.
Definition gsVector.h:37
std::string to_string(const C &value)
Converts value to string, assuming "operator<<" defined on C.
Definition gsUtils.h:56
Base class for assemblers of gsElasticity.
#define short_t
Definition gsConfig.h:35
#define index_t
Definition gsConfig.h:32
#define GISMO_ENSURE(cond, message)
Definition gsDebug.h:102
#define gsInfo
Definition gsDebug.h:43
#define GISMO_ASSERT(cond, message)
Definition gsDebug.h:89
A class providing an iterative solver for nonlinear problems.
The G+Smo namespace, containing all definitions for the library.
@ interrupted
method successfully converged
Definition gsBaseUtils.h:100
@ working
solver was interrupted after exceeding the limit of iterations
Definition gsBaseUtils.h:101
@ bad_solution
solver working
Definition gsBaseUtils.h:102
@ next
each iteration yields an update
Definition gsBaseUtils.h:94
@ BiCGSTABDiagonal
Conjugate gradient solver with diagonal (a.k.a. Jacobi) preconditioning: iterative(!...
Definition gsBaseUtils.h:72
@ LDLT
LU decomposition: direct, no matrix requirements, robust but a bit slow, Eigen and Pardiso available.
Definition gsBaseUtils.h:70
@ CGDiagonal
Cholesky decomposition pivoting: direct, simmetric positive or negative semidefinite,...
Definition gsBaseUtils.h:71
@ all
only essential output
Definition gsBaseUtils.h:84