iMSTK
Interactive Medical Simulation Toolkit
imstkNonLinearSolver.h
1 /*
2 ** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
3 ** iMSTK is distributed under the Apache License, Version 2.0.
4 ** See accompanying NOTICE for details.
5 */
6 
7 #pragma once
8 
9 #include "imstkNonLinearSystem.h"
10 #include "imstkMath.h"
11 #include "imstkSolverBase.h"
12 
13 #include <array>
14 #include <functional>
15 
16 namespace imstk
17 {
23 template<typename SystemMatrix>
25 {
26 public:
27  using JacobianType = std::function<const SystemMatrix& (const Vectord&)>;
28  using UpdateIterateType = std::function<void (const Vectord&, Vectord&)>;
29  using FunctionType = NonLinearSystem<SparseMatrixd>::VectorFunctionType;
30 
32  ~NonLinearSolver() override = default;
33 
37  virtual void solveGivenState(Vectord& x) = 0;
38  virtual void solve() override = 0;
39 
46  double armijo(const Vectord& dx, Vectord& x, const double previousFnorm);
47 
58  void parabolicModel(const std::array<double, 3>& fnorm,
59  std::array<double, 3>& lambda);
60 
66  void setSigma(const std::array<double, 2>& newSigma);
67  const std::array<double, 2>& getSigma() const;
68 
74  void setAlpha(const double newAlpha);
75  double getAlpha() const;
76 
82  void setArmijoMax(const size_t newArmijoMax);
83  size_t getArmijoMax() const;
84 
90  void setSystem(std::shared_ptr<NonLinearSystem<SystemMatrix>> newSystem);
91  std::shared_ptr<NonLinearSystem<SystemMatrix>> getSystem() const;
92 
98  void setUpdateIterate(const UpdateIterateType& newUpdateIterate)
99  {
100  m_updateIterate = newUpdateIterate;
101  }
102 
106  virtual void setToFullyImplicit()
107  {
108  m_isSemiImplicit = false;
109  }
110 
114  virtual void setToSemiImplicit()
115  {
116  m_isSemiImplicit = true;
117  }
118 
119 protected:
120  std::array<double, 2> m_sigma;
121  double m_alpha;
122  size_t m_armijoMax;
123 
124  std::shared_ptr<NonLinearSystem<SystemMatrix>> m_nonLinearSystem;
125  UpdateIterateType m_updateIterate;
126  bool m_isSemiImplicit = false;
127 };
128 } // namespace imstk
UpdateIterateType m_updateIterate
Update iteration function.
bool m_isSemiImplicit
Semi-Implicit solver.
virtual void solveGivenState(Vectord &x)=0
Main solve routine.
size_t m_armijoMax
Maximum number of step length reductions.
void setAlpha(const double newAlpha)
Set/Get Alpha. Parameter to measure sufficient decrease in the line search.
virtual void setToSemiImplicit()
Set the Newton solver to be fully implicit.
virtual void setToFullyImplicit()
Set the Newton solver to be fully implicit.
Compound Geometry.
void parabolicModel(const std::array< double, 3 > &fnorm, std::array< double, 3 > &lambda)
Three-point safeguarded parabolic model for a line search. Upon return lambda[0] will contain the new...
double m_alpha
Parameter to measure decrease.
Base class for a multi-variable nonlinear system.
void setSigma(const std::array< double, 2 > &newSigma)
Set/Get Sigma. Safeguard parameter for the the line search method.
void setUpdateIterate(const UpdateIterateType &newUpdateIterate)
Set a customized iterate update function.
double armijo(const Vectord &dx, Vectord &x, const double previousFnorm)
Backtracking line search method based on the Armijo-Goldstein condition.
void setSystem(std::shared_ptr< NonLinearSystem< SystemMatrix >> newSystem)
Sets the system. System of nonlinear equations.
Base class for solvers.
std::array< double, 2 > m_sigma
Safeguarding bounds for the line search.
Base class for non-linear solvers.
void setArmijoMax(const size_t newArmijoMax)
Set/Get ArmijoMax. Maximum number of step length reductions.
std::shared_ptr< NonLinearSystem< SystemMatrix > > m_nonLinearSystem
System of non-linear equations.