25#include "b2ppconfig.h"
29#include "utils/b2linear_algebra.H"
54class GradientContainer;
61template <
typename T,
typename MATRIX_FORMAT>
76 virtual void set_model_and_case(
Model& model,
Case& case_) {}
84 static const std::string defaut =
"<unknown object name>";
88 virtual void set_object_name(
const std::string& name) {}
124 const b2linalg::Vector<double, b2linalg::Vdense_constref>& lcoor,
125 const b2linalg::Vector<T, b2linalg::Vdense_constref>& coor,
126 const b2linalg::Vector<T, b2linalg::Vdense_constref>& coor_deformed,
127 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& d_coor_d_lcoor,
128 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& d_coor_deformed_d_lcoor,
129 b2linalg::Vector<T, b2linalg::Vdense>& value)
const {
171 explicit Element(
const bool symmetric) : symmetric_{symmetric} {}
303 return std::pair<size_t, size_t>(0, 0);
308 dof_numbering.resize(0);
327 virtual std::pair<int, Node* const*>
get_nodes()
const {
328 return std::pair<int, Node* const*>(0,
nullptr);
409 virtual void set_nodes(std::pair<int, Node* const*> nodes) {}
516 return std::pair<size_t, Element**>(0,
nullptr);
540 if (element !=
nullptr) {
return *element; }
545 if (element !=
nullptr) {
return *element; }
551 if (element !=
nullptr) {
555 send = s.second + s.first;
558 }
else if (sstart < send) {
559 if (++sstart == send) { sstart = send =
nullptr; }
563 bool operator==(
const iterator& o)
const {
564 return element == o.element && sstart == o.sstart;
567 bool operator!=(
const iterator& o)
const {
568 return element != o.element || sstart != o.sstart;
572 iterator() : element(nullptr), sstart(nullptr), send(nullptr) {}
574 iterator(Element& element_) : element(&element_), sstart(nullptr), send(nullptr) {}
671 return std::vector<VariableInfo>();
689 return std::pair<int, VariableInfo>(0,
zero);
749 const int edge_id,
const std::string& field_name,
750 b2linalg::Vector<double, b2linalg::Vdense>& sub_nodes) {
771 const int edge_id,
const double internal_coor, b2linalg::Vector<double>& geom,
772 b2linalg::Vector<double>& d_geom_d_icoor) {
854 const int face_id,
const std::string& field_name,
855 b2linalg::Matrix<double, b2linalg::Mrectangle>& sub_nodes,
856 std::vector<Triangle>& sub_faces) {
878 const b2linalg::Vector<double, b2linalg::Vdense_constref>& internal_coor,
879 b2linalg::Vector<double>& geom,
880 b2linalg::Matrix<double, b2linalg::Mrectangle>& d_geom_d_icoor) {
945 const std::string& field_name, b2linalg::Matrix<double, b2linalg::Mrectangle>& sub_nodes,
946 std::vector<Tetrahedral>& sub_volumes) {
964 const b2linalg::Vector<double, b2linalg::Vdense_constref>& internal_coor,
965 b2linalg::Vector<double>& geom,
966 b2linalg::Matrix<double, b2linalg::Mrectangle>& d_geom_d_icoor) {
1028 std::pair<const int*, const double*> buffers) {
1032 bool is_symmetric()
const {
return symmetric_; }
1037 static std::vector<bool> d_value_d_dof_flags_null;
1043 const bool symmetric_{
true};
1047 std::string object_name{
"???"};
1053template <
typename T>
1097 Model& model,
const bool linear,
const double time,
1098 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
1099 b2linalg::Index& dof_numbering, b2linalg::Vector<T, b2linalg::Vdense>& constraint,
1100 b2linalg::Matrix<T, b2linalg::Mcompressed_col>& trans_d_constraint_d_dof,
1101 b2linalg::Vector<T, b2linalg::Vdense>& d_constraint_d_time) {
1137 const int edge_id,
const std::string& field_name,
const double internal_coor,
1138 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
const double time,
1139 b2linalg::Vector<T, b2linalg::Vdense>& value,
1140 b2linalg::Vector<T, b2linalg::Vdense>& d_value_d_icoor, b2linalg::Index& dof_numbering,
1141 b2linalg::Matrix<T, b2linalg::Mrectangle>& d_value_d_dof,
1142 b2linalg::Index& d_value_d_dof_dep_col = b2linalg::Index::null) {
1177 const int face_id,
const std::string& field_name,
1178 const b2linalg::Vector<double, b2linalg::Vdense_constref>& internal_coor,
1179 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
const double time,
1180 b2linalg::Vector<T, b2linalg::Vdense>& value,
1181 b2linalg::Matrix<T, b2linalg::Mrectangle>& d_value_d_icoor,
1182 b2linalg::Index& dof_numbering, b2linalg::Matrix<T, b2linalg::Mrectangle>& d_value_d_dof,
1183 b2linalg::Index& d_value_d_dof_dep_col) {
1211 const std::string& field_name,
1212 const b2linalg::Vector<double, b2linalg::Vdense_constref>& internal_coor,
1213 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
const double time,
1214 b2linalg::Vector<T, b2linalg::Vdense>& value,
1215 b2linalg::Matrix<T, b2linalg::Mrectangle>& d_value_d_icoor,
1216 b2linalg::Index& dof_numbering,
1217 b2linalg::Matrix<T, b2linalg::Mrectangle>& d_value_d_dof) {
1257 const b2linalg::Vector<T, b2linalg::Vdense_constref>& dof,
1258 const b2linalg::Vector<T, b2linalg::Vdense_constref>& dofdot,
1259 const b2linalg::Vector<T, b2linalg::Vdense_constref>& dofdotdot,
const Field<T>& f,
1260 b2linalg::Index& dof_numbering, b2linalg::Vector<T, b2linalg::Vdense>& discretised_field,
1261 b2linalg::Matrix<T, b2linalg::Mpacked>& d_discretised_field_d_dof) {
1262 if (!dof_numbering.is_null()) { dof_numbering.resize(0); }
1263 if (!discretised_field.is_null()) { discretised_field.resize(0); }
1264 if (!d_discretised_field_d_dof.is_null()) { d_discretised_field_d_dof.resize(0); }
1295 const b2linalg::Vector<T, b2linalg::Vdense_constref>& dof,
1296 const b2linalg::Vector<T, b2linalg::Vdense_constref>& dofdot,
1297 const b2linalg::Vector<T, b2linalg::Vdense_constref>& dofdotdot,
const Field<T>& field,
1298 int face, b2linalg::Index& dof_numbering,
1299 b2linalg::Vector<T, b2linalg::Vdense>& discretised_field,
1300 b2linalg::Matrix<T, b2linalg::Mpacked>& d_discretised_field_d_dof) {
1301 if (!dof_numbering.is_null()) { dof_numbering.resize(0); }
1302 if (!discretised_field.is_null()) { discretised_field.resize(0); }
1303 if (!d_discretised_field_d_dof.is_null()) { d_discretised_field_d_dof.resize(0); }
1334 const b2linalg::Vector<T, b2linalg::Vdense_constref>& dof,
1335 const b2linalg::Vector<T, b2linalg::Vdense_constref>& dofdot,
1336 const b2linalg::Vector<T, b2linalg::Vdense_constref>& dofdotdot,
const Field<T>& f,
1337 int edge, b2linalg::Index& dof_numbering,
1338 b2linalg::Vector<T, b2linalg::Vdense>& discretised_field,
1339 b2linalg::Matrix<T, b2linalg::Mpacked>& d_discretised_field_d_dof) {
1360 virtual void get_axe_aligned_bounding_box(
1361 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
int dim,
double* min,
1375 template <
typename MATRIX_FORMAT>
1377 const solver::TypedSolver<T, MATRIX_FORMAT>& solver,
1378 b2linalg::Matrix<T, typename MATRIX_FORMAT::dense>& k_eff,
1379 b2linalg::Vector<T, b2linalg::Vdense>& f_eff, b2linalg::Index& index) {
1382 const bool is_linear{solver.IsLinear()};
1384 const double time{solver.GetTime()};
1385 const double step_size{solver.GetStepSize()};
1386 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof{solver.GetDof()};
1388 std::vector<bool> matrix_flags{
1389 true ,
false ,
false };
1391 if (solver.IsDamped()) { matrix_flags[1] =
true; }
1392 if (solver.IsDynamic()) { matrix_flags[2] =
true; }
1395 [[likely]]
if (symmetric_) {
1396 std::vector<b2linalg::Matrix<T, b2linalg::Mpacked>> matrix_sym{matrix_flags.size()};
1400 model, is_linear, equilibrium_solution, time, step_size, dof,
1401 nullptr ,
nullptr , index, f_eff,
1402 matrix_flags, matrix_sym, b2linalg::Vector<T, b2linalg::Vdense>::null);
1404 if (solver.IsDamped() || solver.IsDynamic()) {
1405 auto [mat_dyn, vec_dyn] = solver.GetTimeIntegrator()->GetEffectiveElementSystem(
1406 matrix_sym[0], matrix_sym[1], matrix_sym[2], dof, index);
1411 k_eff = matrix_sym[0];
1416 std::vector<b2linalg::Matrix<T, b2linalg::Mrectangle>> matrix_unsym{
1417 matrix_flags.size()};
1421 model, is_linear, equilibrium_solution, time, step_size, dof,
1422 nullptr ,
nullptr , index, f_eff,
1423 matrix_flags, matrix_unsym, b2linalg::Vector<T, b2linalg::Vdense>::null);
1425 if (solver.IsDamped() || solver.IsDynamic()) {
1426 auto [mat_dyn, vec_dyn] = solver.GetTimeIntegrator()->GetEffectiveElementSystem(
1427 matrix_unsym[0], matrix_unsym[1], matrix_unsym[2], dof, index);
1432 k_eff = matrix_unsym[0];
1445 template <
typename MATRIX_FORMAT>
1447 const solver::TypedSolver<T, MATRIX_FORMAT>& solver, b2linalg::Index& index) {
1450 const bool is_linear{solver.IsLinear()};
1452 const double time{solver.GetTime()};
1453 const double step_size{solver.GetStepSize()};
1454 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof{solver.GetDof()};
1456 b2linalg::Matrix<T, typename MATRIX_FORMAT::dense> k_eff;
1458 std::vector<bool> stiffness{
true};
1461 [[likely]]
if (symmetric_) {
1462 std::vector<b2linalg::Matrix<T, b2linalg::Mpacked>> matrix_sym{stiffness.size()};
1465 model, is_linear, equilibrium_solution, time, step_size, dof,
1466 nullptr ,
nullptr , index,
1467 b2linalg::Vector<T, b2linalg::Vdense>::null,
1469 b2linalg::Vector<T, b2linalg::Vdense>::null);
1471 k_eff = matrix_sym[0];
1474 std::vector<b2linalg::Matrix<T, b2linalg::Mrectangle>> matrix_unsym{stiffness.size()};
1477 model, is_linear, equilibrium_solution, time, step_size, dof,
1478 nullptr ,
nullptr , index,
1479 b2linalg::Vector<T, b2linalg::Vdense>::null,
1481 b2linalg::Vector<T, b2linalg::Vdense>::null);
1483 k_eff = matrix_unsym[0];
1496 template <
typename MATRIX_FORMAT>
1511 template <
typename MATRIX_FORMAT>
1513 const solver::TypedSolver<T, MATRIX_FORMAT>& solver, b2linalg::Index index) {
1516 const bool is_linear{solver.IsLinear()};
1518 const double time{solver.GetTime()};
1519 const double step_size{solver.GetStepSize()};
1520 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof{solver.GetDof()};
1522 b2linalg::Vector<T, b2linalg::Vdense> f_eff{};
1524 std::vector<b2linalg::Matrix<T, typename MATRIX_FORMAT::dense>>
1528 model, is_linear, equilibrium_solution, time, step_size, dof,
1529 nullptr ,
nullptr , index, f_eff,
1531 b2linalg::Vector<T, b2linalg::Vdense>::null);
1543 template <
typename MATRIX_FORMAT>
1545 const solver::TypedSolver<T, MATRIX_FORMAT>& solver,
1548 const bool is_linear{solver.IsLinear()};
1550 const double time{solver.GetTime()};
1551 const double step_size{solver.GetStepSize()};
1553 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof{solver.GetDof()};
1555 std::vector<b2linalg::Matrix<T, typename MATRIX_FORMAT::dense>> dummy{};
1556 b2linalg::Index index;
1559 model, is_linear, equilibrium_solution, time, step_size, dof, gradient_container,
1560 nullptr , index, b2linalg::Vector<T, b2linalg::Vdense>::null,
1562 b2linalg::Vector<T, b2linalg::Vdense>::null);
1621 const double time,
const double delta_time,
1622 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
1624 b2linalg::Index& dof_numbering, b2linalg::Vector<T, b2linalg::Vdense>& value,
1625 const std::vector<bool>& d_value_d_dof_flags,
1626 std::vector<b2linalg::Matrix<T, b2linalg::Mrectangle>>& d_value_d_dof,
1627 b2linalg::Vector<T, b2linalg::Vdense>& d_value_d_time) {
1628 dof_numbering.clear();
1629 if (!value.is_null()) { value.resize(0); }
1630 for (
size_t i = 0; i != d_value_d_dof.size(); ++i) {
1631 d_value_d_dof[i].resize(
size_t(0),
size_t(0));
1633 if (!d_value_d_time.is_null()) { d_value_d_time.resize(0); }
1642 const double time,
const double delta_time,
1643 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
1645 b2linalg::Index& dof_numbering, b2linalg::Vector<T, b2linalg::Vdense>& value,
1646 const std::vector<bool>& d_value_d_dof_flags,
1647 std::vector<b2linalg::Matrix<T, b2linalg::Mpacked>>& d_value_d_dof,
1648 b2linalg::Vector<T, b2linalg::Vdense>& d_value_d_time) {
1649 dof_numbering.clear();
1650 if constexpr (std::is_same<T, b2000::csda<double>>::value) {
1651 b2linalg::Matrix<double, b2linalg::Mrectangle> r_dof;
1653 b2linalg::Vector<double, b2linalg::Vdense> r_value;
1654 std::vector<b2linalg::Matrix<T, b2linalg::Mpacked>> r_d_value_d_dof;
1655 b2linalg::Vector<double, b2linalg::Vdense> r_d_value_d_time;
1656 if (!value.is_null()) { r_value.resize(0); }
1657 for (
size_t i = 0; i != r_d_value_d_dof.size(); ++i) {
1658 r_d_value_d_dof[i].resize(
size_t(0),
size_t(0));
1660 if (!r_d_value_d_time.is_null()) { r_d_value_d_time.resize(0); }
1661 copy_v(r_value, value);
1662 copy_vm(r_d_value_d_dof, d_value_d_dof);
1663 copy_v(r_d_value_d_time, d_value_d_time);
1665 if (!value.is_null()) { value.resize(0); }
1666 for (
size_t i = 0; i != d_value_d_dof.size(); ++i) {
1667 d_value_d_dof[i].resize(
size_t(0),
size_t(0));
1669 if (!d_value_d_time.is_null()) { d_value_d_time.resize(0); }
1674 static std::vector<b2linalg::Matrix<T, b2linalg::Mrectangle>> d_value_d_dof_null;
1677template <
typename T>
1683template <
typename T>
1685 "TYPED_VALUE_ELEMENT", type_name<T>(),
StringList(), element::module, &Element::type);
#define THROW
Definition b2exception.H:198
Definition b2degrees_of_freedom.H:57
Definition b2element.H:71
const std::string & get_object_name() const override
Definition b2element.H:83
Definition b2element.H:533
void operator++()
Definition b2element.H:550
Element & operator*()
Definition b2element.H:539
Defines the complete interface for Element instances (C++ representations of Finite Elements).
Definition b2element.H:156
virtual void face_geom(const int face_id, const b2linalg::Vector< double, b2linalg::Vdense_constref > &internal_coor, b2linalg::Vector< double > &geom, b2linalg::Matrix< double, b2linalg::Mrectangle > &d_geom_d_icoor)
Definition b2element.H:876
virtual std::pair< size_t, Element ** > get_subelements()
Definition b2element.H:515
virtual void init(Model &model)
Definition b2element.H:491
virtual void set_additional_properties(const RTable &rtable)
Definition b2element.H:474
virtual std::pair< int, Node *const * > get_nodes() const
Definition b2element.H:327
virtual int face_field_polynomial_sub_face(const int face_id, const std::string &field_name, b2linalg::Matrix< double, b2linalg::Mrectangle > &sub_nodes, std::vector< Triangle > &sub_faces)
Definition b2element.H:853
virtual void get_dof_numbering(b2linalg::Index &dof_numbering)
Definition b2element.H:307
iterator begin()
Definition b2element.H:583
virtual bool edge_field_linear_on_dof(const int edge_id, const std::string &field_name)
Definition b2element.H:726
void set_id(size_t id_)
Definition b2element.H:200
virtual void edge_geom(const int edge_id, const double internal_coor, b2linalg::Vector< double > &geom, b2linalg::Vector< double > &d_geom_d_icoor)
Definition b2element.H:770
VariableInfo
Definition b2element.H:606
@ zero
Definition b2element.H:608
@ constant
Definition b2element.H:611
@ nonlinear
Definition b2element.H:619
@ linear
Definition b2element.H:615
virtual int edge_field_order(const int edge_id, const std::string &field_name)
Definition b2element.H:712
virtual int body_field_order(const std::string &field_name)
Definition b2element.H:901
virtual const ElementProperty * get_property() const
Definition b2element.H:417
const std::string & get_object_name() const override
Definition b2element.H:220
virtual int face_field_order(const int face_id, const std::string &field_name)
Definition b2element.H:797
virtual bool body_field_linear_on_dof(const std::string &field_name)
Definition b2element.H:915
virtual std::pair< int, int > get_state_buffer_size() const
Definition b2element.H:1000
iterator end() const
Definition b2element.H:586
virtual int edge_field_polynomial_sub_edge(const int edge_id, const std::string &field_name, b2linalg::Vector< double, b2linalg::Vdense > &sub_nodes)
Definition b2element.H:748
Element(const bool symmetric)
Sets the symmetry property of this element. Call this constructor if your newly defined element is no...
Definition b2element.H:171
virtual std::pair< int *, double * > get_state_buffer(std::pair< int *, double * > buffers) const
Definition b2element.H:1011
size_t get_id() const
Definition b2element.H:195
virtual void body_geom(const b2linalg::Vector< double, b2linalg::Vdense_constref > &internal_coor, b2linalg::Vector< double > &geom, b2linalg::Matrix< double, b2linalg::Mrectangle > &d_geom_d_icoor)
Definition b2element.H:963
int get_number_of_dof() const override
Definition b2element.H:249
virtual bool face_field_linear_on_dof(const int face_id, const std::string &field_name)
Definition b2element.H:816
void set_object_name(const std::string &name)
Definition b2element.H:227
void set_elem_type_number(int elno)
Definition b2element.H:213
virtual void set_property(ElementProperty *property)
Definition b2element.H:465
virtual std::pair< int, VariableInfo > get_constraint_info()
Definition b2element.H:688
virtual const std::vector< VariableInfo > get_value_info() const
Definition b2element.H:670
std::pair< size_t, size_t > get_global_dof_numbering() const override
Definition b2element.H:302
size_t set_global_dof_numbering(size_t index) override
Definition b2element.H:279
virtual std::pair< const int *, const double * > set_state_buffer(std::pair< const int *, const double * > buffers)
Definition b2element.H:1027
virtual void set_nodes(std::pair< int, Node *const * > nodes)
Definition b2element.H:409
virtual int body_field_polynomial_sub_volume(const std::string &field_name, b2linalg::Matrix< double, b2linalg::Mrectangle > &sub_nodes, std::vector< Tetrahedral > &sub_volumes)
Definition b2element.H:944
int get_elem_type_number() const
Definition b2element.H:206
Definition b2element.H:99
virtual bool get_multiply_with_density() const
Definition b2element.H:138
virtual void get_value(const b2linalg::Vector< double, b2linalg::Vdense_constref > &lcoor, const b2linalg::Vector< T, b2linalg::Vdense_constref > &coor, const b2linalg::Vector< T, b2linalg::Vdense_constref > &coor_deformed, const b2linalg::Matrix< T, b2linalg::Mrectangle_constref > &d_coor_d_lcoor, const b2linalg::Matrix< T, b2linalg::Mrectangle_constref > &d_coor_deformed_d_lcoor, b2linalg::Vector< T, b2linalg::Vdense > &value) const
Definition b2element.H:123
Definition b2solution.H:54
Definition b2object.H:340
Definition b2object.H:456
Definition b2rtable.H:427
Definition b2solver.H:168
Definition b2element.H:1054
virtual void get_value(Model &model, const bool linear, const EquilibriumSolution equilibrium_solution, const double time, const double delta_time, const b2linalg::Matrix< T, b2linalg::Mrectangle_constref > &dof, GradientContainer *gradient_container, SolverHints *solver_hints, b2linalg::Index &dof_numbering, b2linalg::Vector< T, b2linalg::Vdense > &value, const std::vector< bool > &d_value_d_dof_flags, std::vector< b2linalg::Matrix< T, b2linalg::Mrectangle > > &d_value_d_dof, b2linalg::Vector< T, b2linalg::Vdense > &d_value_d_time)
Compute the internal forces and their derivatives of the element.
Definition b2element.H:1619
virtual void field_edge_integration(const b2linalg::Vector< T, b2linalg::Vdense_constref > &dof, const b2linalg::Vector< T, b2linalg::Vdense_constref > &dofdot, const b2linalg::Vector< T, b2linalg::Vdense_constref > &dofdotdot, const Field< T > &f, int edge, b2linalg::Index &dof_numbering, b2linalg::Vector< T, b2linalg::Vdense > &discretised_field, b2linalg::Matrix< T, b2linalg::Mpacked > &d_discretised_field_d_dof)
Definition b2element.H:1333
virtual void edge_field_value(const int edge_id, const std::string &field_name, const double internal_coor, const b2linalg::Matrix< T, b2linalg::Mrectangle_constref > &dof, const double time, b2linalg::Vector< T, b2linalg::Vdense > &value, b2linalg::Vector< T, b2linalg::Vdense > &d_value_d_icoor, b2linalg::Index &dof_numbering, b2linalg::Matrix< T, b2linalg::Mrectangle > &d_value_d_dof, b2linalg::Index &d_value_d_dof_dep_col=b2linalg::Index::null)
Definition b2element.H:1136
b2linalg::Vector< T, b2linalg::Vdense > AssembleElementEffectiveVector(const solver::TypedSolver< T, MATRIX_FORMAT > &solver, b2linalg::Index index)
Assembles the element effective vector.
Definition b2element.H:1512
virtual void face_field_value(const int face_id, const std::string &field_name, const b2linalg::Vector< double, b2linalg::Vdense_constref > &internal_coor, const b2linalg::Matrix< T, b2linalg::Mrectangle_constref > &dof, const double time, b2linalg::Vector< T, b2linalg::Vdense > &value, b2linalg::Matrix< T, b2linalg::Mrectangle > &d_value_d_icoor, b2linalg::Index &dof_numbering, b2linalg::Matrix< T, b2linalg::Mrectangle > &d_value_d_dof, b2linalg::Index &d_value_d_dof_dep_col)
Definition b2element.H:1176
void AssembleElementEffectiveSystem(const solver::TypedSolver< T, MATRIX_FORMAT > &solver, b2linalg::Matrix< T, typename MATRIX_FORMAT::dense > &k_eff, b2linalg::Vector< T, b2linalg::Vdense > &f_eff, b2linalg::Index &index)
Assembles the element effective matrix and vector.
Definition b2element.H:1376
virtual void field_face_integration(const b2linalg::Vector< T, b2linalg::Vdense_constref > &dof, const b2linalg::Vector< T, b2linalg::Vdense_constref > &dofdot, const b2linalg::Vector< T, b2linalg::Vdense_constref > &dofdotdot, const Field< T > &field, int face, b2linalg::Index &dof_numbering, b2linalg::Vector< T, b2linalg::Vdense > &discretised_field, b2linalg::Matrix< T, b2linalg::Mpacked > &d_discretised_field_d_dof)
Definition b2element.H:1294
virtual void field_volume_integration(const b2linalg::Vector< T, b2linalg::Vdense_constref > &dof, const b2linalg::Vector< T, b2linalg::Vdense_constref > &dofdot, const b2linalg::Vector< T, b2linalg::Vdense_constref > &dofdotdot, const Field< T > &f, b2linalg::Index &dof_numbering, b2linalg::Vector< T, b2linalg::Vdense > &discretised_field, b2linalg::Matrix< T, b2linalg::Mpacked > &d_discretised_field_d_dof)
Definition b2element.H:1256
void ComputeElementGradient(const solver::TypedSolver< T, MATRIX_FORMAT > &solver, GradientContainer *const gradient_container)
Compute the gradients for post-processing.
Definition b2element.H:1544
b2linalg::Matrix< T, typename MATRIX_FORMAT::dense > AssembleElementEffectiveMatrix(const solver::TypedSolver< T, MATRIX_FORMAT > &solver, b2linalg::Index &index)
Assembles the element effective matrix.
Definition b2element.H:1446
static type_t type
Element interface typed by the dof.
Definition b2element.H:1673
virtual void body_field_value(const std::string &field_name, const b2linalg::Vector< double, b2linalg::Vdense_constref > &internal_coor, const b2linalg::Matrix< T, b2linalg::Mrectangle_constref > &dof, const double time, b2linalg::Vector< T, b2linalg::Vdense > &value, b2linalg::Matrix< T, b2linalg::Mrectangle > &d_value_d_icoor, b2linalg::Index &dof_numbering, b2linalg::Matrix< T, b2linalg::Mrectangle > &d_value_d_dof)
Definition b2element.H:1210
virtual void get_value(Model &model, const bool linear, const EquilibriumSolution equilibrium_solution, const double time, const double delta_time, const b2linalg::Matrix< T, b2linalg::Mrectangle_constref > &dof, GradientContainer *gradient_container, SolverHints *solver_hints, b2linalg::Index &dof_numbering, b2linalg::Vector< T, b2linalg::Vdense > &value, const std::vector< bool > &d_value_d_dof_flags, std::vector< b2linalg::Matrix< T, b2linalg::Mpacked > > &d_value_d_dof, b2linalg::Vector< T, b2linalg::Vdense > &d_value_d_time)
Compute the internal forces and their derivatives of the element.
Definition b2element.H:1640
virtual void get_constraint(Model &model, const bool linear, const double time, const b2linalg::Matrix< T, b2linalg::Mrectangle_constref > &dof, b2linalg::Index &dof_numbering, b2linalg::Vector< T, b2linalg::Vdense > &constraint, b2linalg::Matrix< T, b2linalg::Mcompressed_col > &trans_d_constraint_d_dof, b2linalg::Vector< T, b2linalg::Vdense > &d_constraint_d_time)
Definition b2element.H:1096
T ComputeElementError(const solver::TypedSolver< T, MATRIX_FORMAT > &solver)
TODO.
Definition b2element.H:1497
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32
GenericException< UnimplementedError_name > UnimplementedError
Definition b2exception.H:314
Definition b2element.H:924
Definition b2element.H:825