21#ifndef B2BOUNDARY_CONDITION_DATABASE_H_
22#define B2BOUNDARY_CONDITION_DATABASE_H_
28#include "b2model_database.H"
29#include "b2ppconfig.h"
30#include "elements/smr/b2element_continuum_integrate.H"
33#include "model_imp/b2boundary_condition_component.H"
34#include "model_imp/b2heat_radiation_component.H"
35#include "model_imp/b2hnode.H"
36#include "utils/b2database.H"
37#include "utils/b2linear_algebra.H"
40#include "utils/b2subprocess.H"
42namespace b2000::b2dbv3 {
44struct bc_type_properties {
45 bool is_symmetric =
false;
46 bool is_complex =
false;
49 bc_type_properties(
bool is_symmetric,
bool is_complex,
bool is_csda)
50 : is_symmetric(is_symmetric), is_complex(is_complex), is_csda(is_csda) {}
53std::string bc_type_name(std::string basename, bc_type_properties properties);
55template <
typename T,
typename MATRIX_TYPE>
56class NBC_NBC :
public TypedNaturalBoundaryConditionComponent<T, MATRIX_TYPE> {
58 NBC_NBC() : scalef(nullptr), model(nullptr), subcase_id(0) {}
61 const std::string& id_, TimeFunction* scalef_,
b2000::Model& model_,
62 const b2000::Case& case_,
const int subcase_id_)
override {
66 subcase_id = subcase_id_;
71 std::string get_id()
const override {
return id; }
73 int get_subcase_id()
const override {
return subcase_id; }
79 void add_linear_nbc_value(
80 double sfactor, b2linalg::Vector<T, b2linalg::Vdense_ref> value_,
81 b2linalg::Matrix<T, MATRIX_TYPE>& d_value_d_dof)
83 init_lazy(b2linalg::Vector<T, b2linalg::Vdense_ref>::null, 1);
84 if (!value_.is_null()) { value_ +=
static_cast<T
>(scalef->value(sfactor)) * value; }
87 void add_nonlinear_nbc_value(
88 const b2linalg::Vector<T, b2linalg::Vdense_constref>& dof,
double time,
89 EquilibriumSolution equal, b2linalg::Vector<T, b2linalg::Vdense_ref> value_,
90 b2linalg::Matrix<T, MATRIX_TYPE>& d_value_d_dof,
91 b2linalg::Vector<T, b2linalg::Vdense_ref> d_value_d_time,
92 SolverHints* solver_hints)
override {
94 if (!value_.is_null()) { value_ +=
static_cast<T
>(scalef->value(time)) * value; }
95 if (!d_value_d_time.is_null()) {
96 d_value_d_time +=
static_cast<T
>(scalef->d_value(time)) * value;
100 typedef ObjectTypeComplete<
101 NBC_NBC,
typename TypedNaturalBoundaryConditionComponent<T, MATRIX_TYPE>::type_t>
106 virtual void init_lazy(
const b2linalg::Vector<T, b2linalg::Vdense_constref>& dof,
double time);
108 TimeFunction* scalef;
110 b2linalg::Vector<T, b2linalg::Vcompressed> value;
114template <
typename T,
typename MATRIX_TYPE>
115typename NBC_NBC<T, MATRIX_TYPE>::type_t NBC_NBC<T, MATRIX_TYPE>::type(
116 "NBC_NBC", type_name<T, MATRIX_TYPE>(), StringList(), b2000::b2dbv3::module,
117 &b2000::TypedNaturalBoundaryConditionComponent<T, MATRIX_TYPE>::type);
119template <
typename T,
typename MATRIX_TYPE>
120class NBC_NBC_EEDGE :
public NBC_NBC<T, MATRIX_TYPE> {
123 const std::string& id_, TimeFunction* scalef_,
b2000::Model& model_,
124 const b2000::Case& case_,
const int subcase_id_)
override;
128 void add_nonlinear_nbc_value(
129 const b2linalg::Vector<T, b2linalg::Vdense_constref>& dof,
double time,
130 EquilibriumSolution equal, b2linalg::Vector<T, b2linalg::Vdense_ref> value_,
131 b2linalg::Matrix<T, MATRIX_TYPE>& d_value_d_dof,
132 b2linalg::Vector<T, b2linalg::Vdense_ref> d_value_d_time,
133 SolverHints* solver_hints)
override;
135 typedef ObjectTypeComplete<NBC_NBC_EEDGE, typename NBC_NBC<T, MATRIX_TYPE>::type_t> type_t;
142 void init_lazy(
const b2linalg::Vector<T, b2linalg::Vdense_constref>& dof,
double time)
override;
145template <
typename T,
typename MATRIX_TYPE>
146typename NBC_NBC_EEDGE<T, MATRIX_TYPE>::type_t NBC_NBC_EEDGE<T, MATRIX_TYPE>::type(
147 "NBC_NBC_EEDGE", type_name<T, MATRIX_TYPE>(), StringList(), b2000::b2dbv3::module,
148 &b2000::TypedNaturalBoundaryConditionComponent<T, MATRIX_TYPE>::type);
150template <
typename T,
typename MATRIX_TYPE>
151class NBC_NBC_EFACE :
public NBC_NBC<T, MATRIX_TYPE> {
154 const std::string& id_, TimeFunction* scalef_,
b2000::Model& model_,
155 const b2000::Case& case_,
const int subcase_id_)
override;
159 typedef ObjectTypeComplete<NBC_NBC_EFACE, typename NBC_NBC<T, MATRIX_TYPE>::type_t> type_t;
164 void init_lazy(
const b2linalg::Vector<T, b2linalg::Vdense_constref>& dof,
double time)
override;
167template <
typename T,
typename MATRIX_TYPE>
168typename NBC_NBC_EFACE<T, MATRIX_TYPE>::type_t NBC_NBC_EFACE<T, MATRIX_TYPE>::type(
169 "NBC_NBC_EFACE", type_name<T, MATRIX_TYPE>(), StringList(), b2000::b2dbv3::module,
170 &b2000::TypedNaturalBoundaryConditionComponent<T, MATRIX_TYPE>::type);
172template <
typename T,
typename MATRIX_TYPE>
173class NBC_NBC_EBODY :
public NBC_NBC<T, MATRIX_TYPE> {
176 const std::string& id_, TimeFunction* scalef_,
b2000::Model& model_,
177 const b2000::Case& case_,
const int subcase_id_)
override;
181 typedef ObjectTypeComplete<NBC_NBC_EBODY, typename NBC_NBC<T, MATRIX_TYPE>::type_t> type_t;
186 void init_lazy(
const b2linalg::Vector<T, b2linalg::Vdense_constref>& dof,
double time)
override;
189template <
typename T,
typename MATRIX_TYPE>
190typename NBC_NBC_EBODY<T, MATRIX_TYPE>::type_t NBC_NBC_EBODY<T, MATRIX_TYPE>::type(
191 "NBC_NBC_EBODY", type_name<T, MATRIX_TYPE>(), StringList(), b2000::b2dbv3::module,
192 &b2000::TypedNaturalBoundaryConditionComponent<T, MATRIX_TYPE>::type);
194template <
typename T,
typename MATRIX_TYPE>
195class EBC_LINC :
public TypedAffineModelReductionBoundaryConditionComponent<T> {
197 EBC_LINC() : constant_and_init(false), scalef(nullptr), model(nullptr) {}
200 const std::string& id_, TimeFunction* scalef_,
b2000::Model& model_,
201 const b2000::Case& case_,
const int subcase_id_)
override {
202 constant_and_init =
false;
210 std::string get_id()
const override {
return id; }
212 int get_subcase_id()
const override {
return 0; }
214 size_t get_size()
override {
219 double get_scale(
double time)
override {
return scalef->value(time); }
221 double get_d_scale(
double time,
int order)
override {
return scalef->d_value(time, order); }
223 std::string get_name_of_entry(
size_t pos)
override;
225 void add_linear_value(
226 b2linalg::Vector<T, b2linalg::Vdense_ref> value_,
227 b2linalg::Matrix<T, MATRIX_TYPE>& d_value_d_dof_trans_)
override {
229 if (!value_.is_null()) { value_ = value; }
230 if (!d_value_d_dof_trans_.is_null()) {
231 d_value_d_dof_trans_.push_back(
232 0,
static_cast<b2linalg::Matrix<T, MATRIX_TYPE>
>(d_value_d_dof_trans));
236 typedef ObjectTypeComplete<
237 EBC_LINC,
typename TypedAffineModelReductionBoundaryConditionComponent<T>::type_t>
244 bool constant_and_init;
246 TimeFunction* scalef;
248 b2linalg::Vector<double, b2linalg::Vdense> value;
249 b2linalg::Matrix<double, b2linalg::Mcompressed_col> d_value_d_dof_trans;
252template <
typename T,
typename MATRIX_TYPE>
253typename EBC_LINC<T, MATRIX_TYPE>::type_t EBC_LINC<T, MATRIX_TYPE>::type(
254 "EBC_LINC", type_name<T, MATRIX_TYPE>(), StringList(), b2000::b2dbv3::module,
255 &b2000::TypedAffineModelReductionBoundaryConditionComponent<T>::type);
257template <
typename T,
typename MATRIX_TYPE>
258class EBC_EBC :
public TypedAffineModelReductionBoundaryConditionComponent<T> {
260 EBC_EBC() : constant_and_init(false), scalef(nullptr), model(nullptr) {}
263 const std::string& id_, TimeFunction* scalef_,
b2000::Model& model_,
264 const b2000::Case& case_,
const int subcase_id_)
override {
265 constant_and_init =
false;
273 std::string get_id()
const override {
return id; }
275 int get_subcase_id()
const override {
return 0; }
277 size_t get_size()
override {
282 std::string get_name_of_entry(
size_t pos)
override;
284 double get_scale(
double time)
override {
return scalef->value(time); }
286 double get_d_scale(
double time,
int order)
override {
return scalef->d_value(time, order); }
288 void add_linear_value(
289 b2linalg::Vector<T, b2linalg::Vdense_ref> value_,
290 b2linalg::Matrix<T, MATRIX_TYPE>& d_value_d_dof_trans_)
override {
292 if (!value_.is_null()) { value_ = value; }
293 if (!d_value_d_dof_trans_.is_null()) {
294 d_value_d_dof_trans_.push_back(
295 0,
static_cast<b2linalg::Matrix<T, MATRIX_TYPE>
>(d_value_d_dof_trans));
299 typedef ObjectTypeComplete<
300 EBC_EBC,
typename TypedAffineModelReductionBoundaryConditionComponent<T>::type_t>
306 bool constant_and_init;
308 TimeFunction* scalef;
310 b2linalg::Vector<double, b2linalg::Vdense> value;
311 b2linalg::Matrix<double, b2linalg::Mcompressed_col> d_value_d_dof_trans;
314template <
typename T,
typename MATRIX_TYPE>
315typename EBC_EBC<T, MATRIX_TYPE>::type_t EBC_EBC<T, MATRIX_TYPE>::type(
316 "EBC_EBC", type_name<T, MATRIX_TYPE>(), StringList(), b2000::b2dbv3::module,
317 &b2000::TypedAffineModelReductionBoundaryConditionComponent<T>::type);
319template <
typename T,
typename MATRIX_TYPE>
320class EBC_JOIN :
public TypedAffineModelReductionBoundaryConditionComponent<T> {
322 EBC_JOIN() : constant_and_init(false), scalef(nullptr), model(nullptr) {}
325 const std::string& id_, TimeFunction* scalef_,
b2000::Model& model_,
326 const b2000::Case& case_,
const int subcase_id_)
override {
327 constant_and_init =
false;
333 std::string get_id()
const override {
return id; }
335 int get_subcase_id()
const override {
return 0; }
339 size_t get_size()
override {
341 return d_value_d_dof_trans.size2();
344 std::string get_name_of_entry(
size_t pos)
override;
346 double get_scale(
double time)
override {
return scalef->value(time); }
348 double get_d_scale(
double time,
int order)
override {
return scalef->d_value(time, order); }
350 void add_linear_value(
351 b2linalg::Vector<T, b2linalg::Vdense_ref> value_,
352 b2linalg::Matrix<T, MATRIX_TYPE>& d_value_d_dof_trans_)
override {
354 if (!d_value_d_dof_trans_.is_null()) {
355 d_value_d_dof_trans_.push_back(
356 0,
static_cast<b2linalg::Matrix<T, MATRIX_TYPE>
>(d_value_d_dof_trans));
360 typedef ObjectTypeComplete<
361 EBC_JOIN,
typename TypedAffineModelReductionBoundaryConditionComponent<T>::type_t>
367 bool constant_and_init;
369 TimeFunction* scalef;
371 b2linalg::Matrix<double, b2linalg::Mcompressed_col> d_value_d_dof_trans;
373template <
typename T,
typename MATRIX_TYPE>
374typename EBC_JOIN<T, MATRIX_TYPE>::type_t EBC_JOIN<T, MATRIX_TYPE>::type(
375 "EBC_JOIN", type_name<T, MATRIX_TYPE>(), StringList(), b2000::b2dbv3::module,
376 &b2000::TypedAffineModelReductionBoundaryConditionComponent<T>::type);
378template <
typename T,
typename MATRIX_TYPE>
379class NBC_TABULATED :
public TypedNaturalBoundaryConditionComponent<T, MATRIX_TYPE> {
381 NBC_TABULATED() : model(nullptr), subcase_id(0) {}
384 const std::string& id_, TimeFunction* scalef_,
b2000::Model& model_,
385 const b2000::Case& case_,
const int subcase_id_)
override {
388 subcase_id = subcase_id_;
391 std::string get_id()
const override {
return id; }
393 int get_subcase_id()
const override {
return subcase_id; }
399 void add_nonlinear_nbc_value(
400 const b2linalg::Vector<T, b2linalg::Vdense_constref>& dof,
double time,
401 EquilibriumSolution equal, b2linalg::Vector<T, b2linalg::Vdense_ref> value_,
402 b2linalg::Matrix<T, MATRIX_TYPE>& d_value_d_dof,
403 b2linalg::Vector<T, b2linalg::Vdense_ref> d_value_d_time,
404 SolverHints* solver_hints)
override {
405 double f = init_lazy(time);
406 if (!value_.is_null()) {
407 value_ +=
static_cast<T
>(f) * value1;
408 value_ +=
static_cast<T
>(1 - f) * value2;
410 if (!d_value_d_time.is_null()) {
411 f = 1 / (equal_range.second->first - equal_range.first->first);
412 d_value_d_time +=
static_cast<T
>(-f) * value1;
413 d_value_d_time +=
static_cast<T
>(f) * value2;
417 typedef ObjectTypeComplete<
418 NBC_TABULATED,
typename TypedNaturalBoundaryConditionComponent<T, MATRIX_TYPE>::type_t>
423 double init_lazy(
double time);
424 void load(
int cycle, b2linalg::Vector<T, b2linalg::Vcompressed>& v);
428 std::map<double, int> list_set_time_to_cycle;
429 std::pair<std::map<double, int>::const_iterator, std::map<double, int>::const_iterator>
431 b2linalg::Vector<T, b2linalg::Vcompressed> value1;
432 b2linalg::Vector<T, b2linalg::Vcompressed> value2;
435template <
typename T,
typename MATRIX_TYPE>
436typename NBC_TABULATED<T, MATRIX_TYPE>::type_t NBC_TABULATED<T, MATRIX_TYPE>::type(
437 "NBC_TABULATED", type_name<T, MATRIX_TYPE>(), StringList(), b2000::b2dbv3::module,
438 &b2000::TypedNaturalBoundaryConditionComponent<T, MATRIX_TYPE>::type);
440class NBC_RadiationHeat :
public b2000::NBC_RadiationHeat {
442 typedef ObjectTypeComplete<
443 NBC_RadiationHeat, TypedNaturalBoundaryConditionComponent<double>::type_t>
Interface to C++ representations of FE solvers.
virtual void set_case(Case &case_)=0
Type
Definition b2boundary_condition.H:49
@ constant
Definition b2boundary_condition.H:55