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