20#ifndef B2DYNAMIC_NONLINEAR_SOLVER_H_
21#define B2DYNAMIC_NONLINEAR_SOLVER_H_
23#include "b2dynamic_nonlinear_utile.H"
24#include "b2ppconfig.h"
33namespace b2000::solver {
35template <
typename T,
typename MATRIX_FORMAT>
36class DynamicNonLinearSolver :
public Solver {
38 using mrbc_t = TypedModelReductionBoundaryCondition<T>;
39 using type_t = ObjectTypeComplete<DynamicNonLinearSolver, Solver::type_t>;
41 DynamicNonLinearSolver()
42 : residue_function(0),
43 implicit_parameter(nullptr),
44 explicit_parameter(nullptr),
47 ~DynamicNonLinearSolver()
override {
48 if (residue_function) { residue_function->decref_or_free(); }
49 if (implicit_parameter) { implicit_parameter->decref_or_free(); }
50 if (explicit_parameter) { explicit_parameter->decref_or_free(); }
51 if (bdf_solver) { bdf_solver->decref_or_free(); }
54 void solve()
override {
55 while (solve_iteration()) { ; }
58 bool solve_iteration()
override {
59 if (
case_ ==
nullptr) { solve_init(); }
62 res = bdf_solver->next();
64 SolutionDynamicNonlinear<T>& solution =
66 solution.terminate_stage(
false);
68 solution.terminate_case(
false, attributes);
74 .terminate_case(
true, attributes);
77 if (
case_ ==
nullptr) {
return false; }
88 if (case_iterator.get() ==
nullptr) {
92 case_ = case_iterator->next();
93 if (
case_ ==
nullptr) {
return; }
95 Exception() <<
"The dynamic nonlinear solver must have a case that contains at least "
96 "one stage but the case "
102 if (residue_function) { residue_function->decref_or_free(); }
103 if (implicit_parameter) { implicit_parameter->decref_or_free(); }
104 if (explicit_parameter) { explicit_parameter->decref_or_free(); }
105 if (bdf_solver) { bdf_solver->decref_or_free(); }
107 b2linalg::Matrix<T, b2linalg::Mrectangle> dof;
110 std::string domain_state_id;
113 .get_dynamic_initial_condition_value(dof, time, stage, domain_state_id);
117 std::string residue_function_name =
case_->
get_string(
"RESIDUE_FUNCTION_TYPE",
"ORDER_N");
118 if (residue_function_name !=
"") { residue_function_name +=
"_DYNAMIC_RESIDUE_FUNCTION"; }
119 residue_function_name += type_name<T, MATRIX_FORMAT>();
120 typename DynamicResidueFunction<T, MATRIX_FORMAT>::type_t* residue_function_type =
121 DynamicResidueFunction<T, MATRIX_FORMAT>::type.get_subtype(
122 residue_function_name, solver::module);
123 residue_function = residue_function_type->new_object(allocator);
124 residue_function->set_case(
case_);
127 std::string implicit_parameter_name =
129 if (implicit_parameter_name !=
"") { implicit_parameter_name +=
"_PARAMETER"; }
130 NordsieckParameter::type_t* implicit_parameter_type =
131 NordsieckParameter::type.get_subtype(implicit_parameter_name, solver::module);
132 implicit_parameter = implicit_parameter_type->new_object(allocator);
133 implicit_parameter->set_attribute(*
case_);
135 std::string explicit_parameter_name =
137 if (explicit_parameter_name !=
"") { explicit_parameter_name +=
"_PARAMETER"; }
138 NordsieckParameter::type_t* explicit_parameter_type =
139 NordsieckParameter::type.get_subtype(explicit_parameter_name, solver::module);
140 explicit_parameter = explicit_parameter_type->new_object(allocator);
141 explicit_parameter->set_attribute(*
case_);
143 mrbc_t& mrbc =
dynamic_cast<mrbc_t&
>(
145 "TypedModelReductionBoundaryConditionListComponent" + type_name<T>())));
146 b2linalg::Matrix<T, b2linalg::Mrectangle> dof_red(
147 mrbc.get_size(
false, b2linalg::Vector<T, b2linalg::Vdense>::null, time), dof.size2());
148 mrbc.get_nonlinear_inverse_value(dof, time, dof_red);
150 bdf_solver = NordsieckSolver<T, MATRIX_FORMAT>::type.new_object(allocator);
152 *
model_, residue_function, implicit_parameter, explicit_parameter, dof_red, time,
156 CaseList::case_iterator case_iterator;
160 DynamicResidueFunction<T, MATRIX_FORMAT>* residue_function;
161 NordsieckParameter* implicit_parameter;
162 NordsieckParameter* explicit_parameter;
163 NordsieckSolver<T, MATRIX_FORMAT>* bdf_solver;
166template <
typename T,
typename MATRIX_FORMAT>
167typename DynamicNonLinearSolver<T, MATRIX_FORMAT>::type_t
168 DynamicNonLinearSolver<T, MATRIX_FORMAT>::type(
169 "DynamicNonLinearSolver", type_name<T, MATRIX_FORMAT>(),
170 StringList(
"DYNAMIC_NONLINEAR",
"TRANSIENT_NONLINEAR"), b2000::solver::module,
#define THROW
Definition b2exception.H:198
Interface to C++ representations of FE solvers.
virtual void set_stage(int stage)=0
virtual std::string get_id() const =0
virtual size_t get_number_of_stage() const =0
virtual std::string get_string(const std::string &key) const =0
virtual void load_state(const std::string &state_id)=0
virtual Solution & get_solution()=0
virtual CaseList & get_case_list()=0
virtual void set_case(Case &case_)=0
virtual InitialCondition & get_initial_condition()=0
virtual Domain & get_domain()=0
virtual ModelReductionBoundaryCondition & get_model_reduction_boundary_condition(ObjectTypeIncomplete< ModelReductionBoundaryCondition > *bc_type)=0
Case * case_
This also.
Definition b2solver.H:93
Model * model_
Definition b2solver.H:91