24template <
typename F,
typename LS = utils::SolverDefault,
typename UF = utils::UpdateDefault,
25 typename IDBCF = utils::IDBCForceDefault>
38template <
typename LS = utils::SolverDefault,
typename UF = utils::UpdateDefault,
39 typename IDBCF = utils::IDBCForceDefault>
50 template <
typename UF2>
60 template <
typename IDBCF2>
90template <
typename IDBCF>
95template <
typename LS,
typename UF>
99template <
typename LS,
typename UF,
typename IDBCF>
111template <
typename F,
typename NRConfig>
112requires traits::isSpecialization<NewtonRaphsonWithSubsidiaryFunctionConfig, std::remove_cvref_t<NRConfig>>::value
115 using UF = std::remove_cvref_t<NRConfig>::UpdateFunction;
116 using IDBCF = std::remove_cvref_t<NRConfig>::IDBCForceFunction;
117 auto solverFactory = []<
class F2, class LS2, class UF2, class IDBCF2>(F2&& f2, LS2&& ls, UF2&& uf, IDBCF2&& if_) {
118 return std::make_shared<NewtonRaphsonWithSubsidiaryFunction<std::remove_cvref_t<F2>, std::remove_cvref_t<LS2>,
119 std::remove_cvref_t<UF2>, std::remove_cvref_t<IDBCF2>>>(
120 f2, std::forward<LS2>(ls), std::forward<UF2>(uf), std::forward<IDBCF2>(if_));
123 if constexpr (std::remove_cvref_t<F>::nDerivatives == 2) {
125 solverFactory(derivative(f), std::forward<NRConfig>(config).linearSolver,
126 std::forward<NRConfig>(config).updateFunction, std::forward<NRConfig>(config).idbcForceFunction);
127 solver->setup(config.parameters);
130 static_assert(std::remove_cvref_t<F>::nDerivatives >= 1,
131 "The number of derivatives in the differentiable function have to be more than 0");
133 solverFactory(f, std::forward<NRConfig>(config).linearSolver, std::forward<NRConfig>(config).updateFunction,
134 std::forward<NRConfig>(config).idbcForceFunction);
136 solver->setup(std::forward<NRConfig>(config).parameters);
152template <
typename F,
typename LS,
typename UF,
typename IDBCF>
159 using Domain =
typename SignatureTraits::Domain;
177 template <
typename LS2 = LS,
typename UF2 = UF,
typename IDBCF2 = IDBCF>
181 jacobianFunction_{derivative(residualFunction_)},
182 linearSolver_{std::forward<LS2>(linearSolver)},
203 template <
typename Subs
idiaryType>
205 "The solve method returns information of the solution process. You should store this information and check if "
212 .
domain = req, .correction = correction_, .information = solverInformation};
215 solverInformation.success =
true;
217 auto& lambda = req.parameter();
218 auto& x = req.globalSolution();
225 auto lambdaDummy = lambda;
229 decltype(
auto) rx = residualFunction_(req);
230 const auto Fext0 = (-rx).eval();
231 lambda = lambdaDummy;
234 rx = residualFunction_(req);
235 decltype(
auto) Ax = jacobianFunction_(req);
237 Eigen::VectorXd deltaD;
238 deltaD.resizeLike(rx);
241 subsidiaryArgs.
dfdDD.resizeLike(Fext0);
243 subsidiaryFunction(req, *
this, subsidiaryArgs);
244 auto rNorm = sqrt(rx.dot(rx));
245 solverInformation.residualNorm =
static_cast<double>(rNorm);
246 decltype(rNorm) dNorm;
249 linearSolver_.analyzePattern(Ax);
251 Eigen::MatrixX2<double> residual2d, sol2d;
254 while (rNorm > settings_.
tol && iter < settings_.
maxIter) {
258 residual2d.resize(rx.rows(), 2);
259 sol2d.resize(rx.rows(), 2);
260 if constexpr (not std::same_as<IDBCForceFunction, utils::IDBCForceDefault>)
261 residual2d << -rx, Fext0 - (idbcForceFunction_(req));
263 residual2d << -rx, Fext0;
266 linearSolver_.factorize(Ax);
267 linearSolver_.solve(sol2d, residual2d);
269 sol2d = linearSolver_(residual2d, Ax);
272 const auto& deltaDR = sol2d.col(0).eval();
273 const auto& deltaDL = sol2d.col(1).eval();
275 const double deltalambda = (-subsidiaryArgs.
f - subsidiaryArgs.
dfdDD.dot(deltaDR)) /
277 deltaD = deltaDR + deltalambda * deltaDL;
278 correction_ = deltaD;
282 updateFunction_(x, deltaD);
283 subsidiaryArgs.
DD += deltaD;
285 lambda += deltalambda;
286 subsidiaryArgs.
Dlambda += deltalambda;
288 if constexpr (not std::same_as<IDBCForceFunction, utils::IDBCForceDefault>)
289 req.syncParameterAndGlobalSolution(updateFunction_);
291 dNorm = sqrt(deltaD.dot(deltaD) + deltalambda * deltalambda);
292 solverInformation.correctionNorm =
static_cast<double>(dNorm);
294 rx = residualFunction_(req);
295 Ax = jacobianFunction_(req);
296 subsidiaryFunction(req, *
this, subsidiaryArgs);
298 rNorm = sqrt(rx.dot(rx) + subsidiaryArgs.
f * subsidiaryArgs.
f);
299 solverInformation.residualNorm =
static_cast<double>(rNorm);
306 solverInformation.iterations = iter;
311 solverInformation.success =
false;
312 solverInformation.iterations = iter;
313 if (solverInformation.success)
315 return solverInformation;
328 const auto&
residual()
const {
return residualFunction_; }
344 typename DifferentiableFunction::Derivative jacobianFunction_;
345 std::remove_cvref_t<CorrectionType> correction_;
361template <
typename F,
typename LS = utils::SolverDefault,
typename UF = utils::UpdateDefault,
362 typename IDBCF = utils::IDBCForceDefault>
364 IDBCF&& idbcForceFunction = {}) {
365 return std::make_shared<NewtonRaphsonWithSubsidiaryFunction<F, LS, UF, IDBCF>>(
366 f, std::forward<LS>(linearSolver), std::move(updateFunction), std::move(idbcForceFunction));
369template <
typename F,
typename LS = utils::SolverDefault,
typename UF = utils::UpdateDefault,
370 typename IDBCF = utils::IDBCForceDefault>
372 IDBCF&& idbcForceFunction = {})
374 std::remove_cvref_t<IDBCF>>;
Implementation of the observer design pattern with broadcasters.
Enums for observer messages.
Implementation of the solver information returned by the nonlinear solvers.
Base for all nonlinear solvers.
State for all nonlinear solvers.
Defines structures and methods related to subsidiary functions for control routines.
Definition: assemblermanipulatorbuildingblocks.hh:22
LinearSolverTemplate< double > LinearSolver
Definition: linearsolver.hh:235
::value auto createNonlinearSolver(NRConfig &&config, F &&f)
Function to create a NewtonRaphson solver instance.
Definition: newtonraphson.hh:106
NonLinearSolverMessages
Enum class defining non-linear solver-related messages.
Definition: broadcastermessages.hh:22
NewtonRaphsonWithSubsidiaryFunction(const F &f, LS &&linearSolver={}, UF &&updateFunction={}, IDBCF &&idbcForceFunction={}) -> NewtonRaphsonWithSubsidiaryFunction< F, std::remove_cvref_t< LS >, std::remove_cvref_t< UF >, std::remove_cvref_t< IDBCF > >
auto makeNewtonRaphsonWithSubsidiaryFunction(const F &f, LS &&linearSolver={}, UF &&updateFunction={}, IDBCF &&idbcForceFunction={})
Function to create a NewtonRaphson with subsidiary function solver instance.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:363
Structure containing arguments for subsidiary functions.
Definition: pathfollowingfunctions.hh:49
double Dlambda
The increment in the load factor.
Definition: pathfollowingfunctions.hh:52
double dfdDlambda
The derivative of the subsidiary function with respect to Dlambda.
Definition: pathfollowingfunctions.hh:55
double f
The value of the subsidiary function.
Definition: pathfollowingfunctions.hh:53
Eigen::VectorX< double > dfdDD
The derivative of the subsidiary function with respect to DD.
Definition: pathfollowingfunctions.hh:54
Eigen::VectorX< double > DD
The vector representing the solution increment.
Definition: pathfollowingfunctions.hh:51
Newton-Raphson solver with subsidiary function.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:154
auto & residual()
Access the residual function.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:322
typename SignatureTraits::Domain Domain
Type representing the parameter vector of the Function.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:159
NonLinearSolverInformation solve(Domain &req, SubsidiaryType &&subsidiaryFunction, SubsidiaryArgs &subsidiaryArgs)
Solve the nonlinear system using the Newton-Raphson method with subsidiary function.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:207
UF UpdateFunction
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:166
const UpdateFunction & updateFunction() const
Access the update function.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:334
IDBCF IDBCForceFunction
Type representing the force function to handle inhomogeneous Dirichlet BCs.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:168
NewtonRaphsonWithSubsidiaryFunctionSettings Settings
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:156
static constexpr bool isLinearSolver
Type representing the update function.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:163
F DifferentiableFunction
Type of the non-linear operator.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:167
const IDBCForceFunction & idbcForceFunction() const
Access the force function calculating internal forces due to inhomogeneous Dirichlet BCs.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:340
void setup(const Settings &settings)
Setup the Newton-Raphson solver with subsidiary function.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:191
NewtonRaphsonWithSubsidiaryFunction(const DifferentiableFunction &residual, LS2 &&linearSolver={}, UF2 &&updateFunction={}, IDBCF2 &&idbcForceFunction={})
Constructor for NewtonRaphsonWithSubsidiaryFunction.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:178
const auto & residual() const
Access the function.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:328
typename SignatureTraits::template Range< 0 > CorrectionType
Type of the correction of x += deltaX.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:160
typename F::Traits SignatureTraits
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:157
typename SignatureTraits::template Range< 1 > JacobianType
Compile-time boolean indicating if the linear solver satisfies the non-linear solver concept.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:162
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:29
double tol
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:30
int maxIter
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:31
Settings for the Newton-Raphson solver with subsidiary function.
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:41
UF UpdateFunction
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:43
auto rebindIDBCForceFunction(IDBCF2 &&idbcForceFunction) const
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:61
IDBCF idbcForceFunction
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:48
LS LinearSolver
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:42
IDBCF IDBCForceFunction
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:44
auto rebindUpdateFunction(UF2 &&updateFunction) const
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:51
UF updateFunction
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:47
NewtonRaphsonWithSubsidiaryFunctionSettings parameters
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:45
LS linearSolver
Definition: newtonraphsonwithscalarsubsidiaryfunction.hh:46
Base for all nonlinear solvers. Defines the message interface that can be broadcasted to listeners.
Definition: nonlinearsolverbase.hh:24
State for nonlinear solvers.
Definition: nonlinearsolverstate.hh:24
const Domain & domain
Definition: nonlinearsolverstate.hh:28
Information about the result of a non-linear solver.
Definition: solverinfos.hh:21
void notify(NonLinearSolverMessages message, const State &data)
This calls all the registered functions.
Definition: broadcaster.hh:61
Default functor for solving operations.
Definition: defaultfunctions.hh:28
Default functor for updating operations.
Definition: defaultfunctions.hh:65
Concept to check if a linear solver implements all the needed functions for given vector and matrix t...
Definition: utils/concepts.hh:226