b2api
B2000++ API Reference Manual, VERSION 4.6
 
Loading...
Searching...
No Matches
b2element.H
1//------------------------------------------------------------------------
2// b2element.H --
3//
4//
5// written by Mathias Doreille
6// Thomas Blome <thomas.blome@dlr.de>
7//
8// Copyright (c) 2004-2012,2016,2017 SMR Engineering & Development SA
9// 2502 Bienne, Switzerland
10//
11// Copyright (c) 2023 Deutsches Zentrum für Luft- und Raumfahrt (DLR) e.V.
12// Linder Höhe, 51147 Köln
13//
14// All Rights Reserved. Proprietary source code. The contents of
15// this file may not be disclosed to third parties, copied or
16// duplicated in any form, in whole or in part, without the prior
17// written permission of SMR.
18//------------------------------------------------------------------------
19
20#ifndef B2ELEMENT_H_
21#define B2ELEMENT_H_
22
23#include <type_traits>
24
25#include "b2ppconfig.h"
27#include "utils/b2csda.H"
28#include "utils/b2exception.H"
29#include "utils/b2linear_algebra.H"
30#include "utils/b2object.H"
31#include "utils/b2type.H"
32
50namespace b2000 {
51
52class Node;
53class Case;
54class GradientContainer;
55class SolverHints;
56class Model;
57class Domain;
58class RTable;
59
60namespace solver {
61template <typename T, typename MATRIX_FORMAT>
62class TypedSolver;
63}
64
65namespace element {
66extern Module module;
67}
68
71class ElementProperty : public Object {
72public:
74 static type_t type;
75
76 virtual void set_model_and_case(Model& model, Case& case_) {}
77
78 virtual ElementProperty* copy() {
80 return nullptr;
81 }
82
83 const std::string& get_object_name() const override {
84 static const std::string defaut = "<unknown object name>";
85 return defaut;
86 }
87
88 virtual void set_object_name(const std::string& name) {}
89};
90
98template <typename T>
99class Field : public Object {
100public:
123 virtual void get_value(
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 {
131 }
132
138 virtual bool get_multiply_with_density() const { return false; }
139};
140
156class Element : public DegreesOfFreedom {
157public:
163 Element() = default;
164
171 explicit Element(const bool symmetric) : symmetric_{symmetric} {}
172
174
175 ~Element() override = default;
176
177 Element(const Element&) = delete;
178 Element(const Element&&) = delete;
179 Element& operator=(const Element&) = delete;
180 Element& operator=(const Element&&) = delete;
181
195 size_t get_id() const { return id; }
196
200 void set_id(size_t id_) { id = id_; }
201
206 int get_elem_type_number() const { return elno_; }
207
213 void set_elem_type_number(int elno) { elno_ = elno; }
214
220 const std::string& get_object_name() const override { return object_name; }
221
227 void set_object_name(const std::string& name) { object_name = name; }
228
230
249 int get_number_of_dof() const override { return 0; }
250
279 size_t set_global_dof_numbering(size_t index) override { return index; }
280
302 std::pair<size_t, size_t> get_global_dof_numbering() const override {
303 return std::pair<size_t, size_t>(0, 0);
304 }
305
307 [[deprecated]] virtual void get_dof_numbering(b2linalg::Index& dof_numbering) {
308 dof_numbering.resize(0);
309 }
310
312
327 virtual std::pair<int, Node* const*> get_nodes() const {
328 return std::pair<int, Node* const*>(0, nullptr);
329 }
330
409 virtual void set_nodes(std::pair<int, Node* const*> nodes) {}
410
417 virtual const ElementProperty* get_property() const { return nullptr; }
418
465 virtual void set_property(ElementProperty* property) {}
466
474 virtual void set_additional_properties(const RTable& rtable) {}
475
491 virtual void init(Model& model) {}
492
494
515 virtual std::pair<size_t, Element**> get_subelements() {
516 return std::pair<size_t, Element**>(0, nullptr);
517 }
518
533 class iterator {
534 friend class Element;
535
536 public:
540 if (element != nullptr) { return *element; }
541 return **sstart;
542 }
543
544 const Element& operator*() const {
545 if (element != nullptr) { return *element; }
546 return **sstart;
547 }
548
550 void operator++() {
551 if (element != nullptr) {
552 std::pair<size_t, Element**> s = element->get_subelements();
553 if (s.second != 0) {
554 sstart = s.second;
555 send = s.second + s.first;
556 }
557 element = nullptr;
558 } else if (sstart < send) {
559 if (++sstart == send) { sstart = send = nullptr; }
560 }
561 }
562
563 bool operator==(const iterator& o) const {
564 return element == o.element && sstart == o.sstart;
565 }
566
567 bool operator!=(const iterator& o) const {
568 return element != o.element || sstart != o.sstart;
569 }
570
571 private:
572 iterator() : element(nullptr), sstart(nullptr), send(nullptr) {}
573
574 iterator(Element& element_) : element(&element_), sstart(nullptr), send(nullptr) {}
575
576 Element* element;
577 Element** sstart;
578 Element** send;
579 };
580
583 iterator begin() { return iterator(*this); }
584
586 iterator end() const { return iterator(); }
587
589
608 zero = 0,
609
612
616
619 nonlinear = 3
620 };
621
670 virtual const std::vector<VariableInfo> get_value_info() const {
671 return std::vector<VariableInfo>();
672 }
673
688 virtual std::pair<int, VariableInfo> get_constraint_info() {
689 return std::pair<int, VariableInfo>(0, zero);
690 }
691
712 virtual int edge_field_order(const int edge_id, const std::string& field_name) {
714 return 0;
715 }
716
726 virtual bool edge_field_linear_on_dof(const int edge_id, const std::string& field_name) {
728 return false;
729 }
730
749 const int edge_id, const std::string& field_name,
750 b2linalg::Vector<double, b2linalg::Vdense>& sub_nodes) {
752 return 0;
753 }
754
770 virtual void edge_geom(
771 const int edge_id, const double internal_coor, b2linalg::Vector<double>& geom,
772 b2linalg::Vector<double>& d_geom_d_icoor) {
774 }
776
797 virtual int face_field_order(const int face_id, const std::string& field_name) {
799 return 0;
800 }
801
816 virtual bool face_field_linear_on_dof(const int face_id, const std::string& field_name) {
818 return false;
819 }
820
825 struct Triangle {
826 Triangle(int n1, int n2, int n3) {
827 node[0] = n1;
828 node[1] = n2;
829 node[2] = n3;
830 }
831 size_t node[3];
832 };
833
854 const int face_id, const std::string& field_name,
855 b2linalg::Matrix<double, b2linalg::Mrectangle>& sub_nodes,
856 std::vector<Triangle>& sub_faces) {
858 return 0;
859 }
860
876 virtual void face_geom(
877 const int face_id,
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) {
882 }
883
885
901 virtual int body_field_order(const std::string& field_name) {
903 return 0;
904 }
905
915 virtual bool body_field_linear_on_dof(const std::string& field_name) {
917 return 0;
918 }
919
924 struct Tetrahedral {
925 int node[4];
926 };
927
945 const std::string& field_name, b2linalg::Matrix<double, b2linalg::Mrectangle>& sub_nodes,
946 std::vector<Tetrahedral>& sub_volumes) {
948 return 0;
949 }
950
963 virtual void body_geom(
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) {
968 }
969
1000 virtual std::pair<int, int> get_state_buffer_size() const { return std::pair<int, int>(0, 0); }
1001
1011 virtual std::pair<int*, double*> get_state_buffer(std::pair<int*, double*> buffers) const {
1012 return buffers;
1013 }
1014
1027 virtual std::pair<const int*, const double*> set_state_buffer(
1028 std::pair<const int*, const double*> buffers) {
1029 return buffers;
1030 }
1031
1032 bool is_symmetric() const { return symmetric_; }
1033
1035
1037 static std::vector<bool> d_value_d_dof_flags_null;
1038
1040 static type_t type;
1041
1042protected:
1043 const bool symmetric_{true};
1044
1045private:
1046 size_t id{};
1047 std::string object_name{"???"};
1048 int elno_;
1049};
1050
1053template <typename T>
1054class TypedElement : public Element {
1055public:
1057
1058 TypedElement() = default;
1059
1060 explicit TypedElement(const bool symmetric) : Element{symmetric} {}
1061
1096 virtual void get_constraint(
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) {
1103 }
1104
1136 virtual void edge_field_value(
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) {
1144 }
1145
1176 virtual void face_field_value(
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) {
1185 }
1186
1210 virtual void body_field_value(
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) {
1219 }
1220
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); }
1265 }
1266
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); }
1304 }
1305
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) {
1341 }
1342
1360 virtual void get_axe_aligned_bounding_box(
1361 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof, int dim, double* min,
1362 double* max) {
1364 }
1365
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) {
1380 // Define variables to use deprecated interface get_value().
1381 b2000::Model& model{solver.GetModel()}; // Make this constant (TB).
1382 const bool is_linear{solver.IsLinear()};
1383 const EquilibriumSolution equilibrium_solution{false}; // Über solver abfragen (TB).
1384 const double time{solver.GetTime()};
1385 const double step_size{solver.GetStepSize()};
1386 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof{solver.GetDof()};
1387
1388 std::vector<bool> matrix_flags{
1389 true /*k*/, false /*d*/, false /*m*/};
1390
1391 if (solver.IsDamped()) { matrix_flags[1] = true; }
1392 if (solver.IsDynamic()) { matrix_flags[2] = true; }
1393
1395 [[likely]] if (symmetric_) {
1396 std::vector<b2linalg::Matrix<T, b2linalg::Mpacked>> matrix_sym{matrix_flags.size()};
1397
1399 this->get_value(
1400 model, is_linear, equilibrium_solution, time, step_size, dof,
1401 nullptr /*GradientContainer*/, nullptr /*SolverHints**/, index, f_eff,
1402 matrix_flags, matrix_sym, b2linalg::Vector<T, b2linalg::Vdense>::null);
1403
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);
1407
1408 k_eff = mat_dyn;
1409 // f_eff += vec_dyn;
1410 } else {
1411 k_eff = matrix_sym[0];
1412 // k_eff += matrix_sym[0]; //!< Return proper stiffness matrix.
1413 }
1414 } else {
1416 std::vector<b2linalg::Matrix<T, b2linalg::Mrectangle>> matrix_unsym{
1417 matrix_flags.size()};
1418
1420 this->get_value(
1421 model, is_linear, equilibrium_solution, time, step_size, dof,
1422 nullptr /*GradientContainer*/, nullptr /*SolverHints**/, index, f_eff,
1423 matrix_flags, matrix_unsym, b2linalg::Vector<T, b2linalg::Vdense>::null);
1424
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);
1428
1429 k_eff = mat_dyn;
1430 // f_eff += vec_dyn;
1431 } else {
1432 k_eff = matrix_unsym[0];
1433 }
1434 }
1435 };
1436
1445 template <typename MATRIX_FORMAT>
1446 b2linalg::Matrix<T, typename MATRIX_FORMAT::dense> AssembleElementEffectiveMatrix(
1447 const solver::TypedSolver<T, MATRIX_FORMAT>& solver, b2linalg::Index& index) {
1448 // Define variables to use deprecated interface get_value().
1449 b2000::Model& model{solver.GetModel()}; // Make this constant (TB).
1450 const bool is_linear{solver.IsLinear()};
1451 const EquilibriumSolution equilibrium_solution{false}; // Über solver abfragen (TB).
1452 const double time{solver.GetTime()};
1453 const double step_size{solver.GetStepSize()};
1454 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof{solver.GetDof()};
1455
1456 b2linalg::Matrix<T, typename MATRIX_FORMAT::dense> k_eff;
1457
1458 std::vector<bool> stiffness{true};
1459
1460 // If the element is symmetric use local matrix_sym matrix.
1461 [[likely]] if (symmetric_) {
1462 std::vector<b2linalg::Matrix<T, b2linalg::Mpacked>> matrix_sym{stiffness.size()};
1463
1464 this->get_value(
1465 model, is_linear, equilibrium_solution, time, step_size, dof,
1466 nullptr /*GradientContainer*/, nullptr /*SolverHints**/, index,
1467 b2linalg::Vector<T, b2linalg::Vdense>::null,
1469 b2linalg::Vector<T, b2linalg::Vdense>::null);
1470
1471 k_eff = matrix_sym[0];
1472 } else {
1473 // If the element is unsymmetric use matrix_unsym.
1474 std::vector<b2linalg::Matrix<T, b2linalg::Mrectangle>> matrix_unsym{stiffness.size()};
1475
1476 this->get_value(
1477 model, is_linear, equilibrium_solution, time, step_size, dof,
1478 nullptr /*GradientContainer*/, nullptr /*SolverHints**/, index,
1479 b2linalg::Vector<T, b2linalg::Vdense>::null,
1481 b2linalg::Vector<T, b2linalg::Vdense>::null);
1482
1483 k_eff = matrix_unsym[0];
1484 }
1485
1486 return k_eff;
1487 };
1488
1496 template <typename MATRIX_FORMAT>
1497 T ComputeElementError(const solver::TypedSolver<T, MATRIX_FORMAT>& solver) {
1499 T result{};
1500 return result;
1501 };
1502
1511 template <typename MATRIX_FORMAT>
1512 b2linalg::Vector<T, b2linalg::Vdense> AssembleElementEffectiveVector(
1513 const solver::TypedSolver<T, MATRIX_FORMAT>& solver, b2linalg::Index index) {
1514 // Define variables to use deprecated interface get_value().
1515 b2000::Model& model{solver.GetModel()}; // Make this constant (TB).
1516 const bool is_linear{solver.IsLinear()};
1517 const EquilibriumSolution equilibrium_solution{false}; // Über solver abfragen (TB).
1518 const double time{solver.GetTime()};
1519 const double step_size{solver.GetStepSize()};
1520 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof{solver.GetDof()};
1521
1522 b2linalg::Vector<T, b2linalg::Vdense> f_eff{};
1523
1524 std::vector<b2linalg::Matrix<T, typename MATRIX_FORMAT::dense>>
1525 dummy{}; // Größe richtig? (TB)
1526
1527 this->get_value(
1528 model, is_linear, equilibrium_solution, time, step_size, dof,
1529 nullptr /*GradientContainer*/, nullptr /*SolverHints**/, index, f_eff,
1531 b2linalg::Vector<T, b2linalg::Vdense>::null);
1532
1533 return f_eff;
1534 };
1535
1543 template <typename MATRIX_FORMAT>
1545 const solver::TypedSolver<T, MATRIX_FORMAT>& solver,
1546 GradientContainer* const gradient_container) {
1547 b2000::Model& model{solver.GetModel()}; // Make this constant (TB).
1548 const bool is_linear{solver.IsLinear()};
1549 const EquilibriumSolution equilibrium_solution{false}; // Über solver abfragen (TB).
1550 const double time{solver.GetTime()};
1551 const double step_size{solver.GetStepSize()};
1552
1553 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof{solver.GetDof()};
1554
1555 std::vector<b2linalg::Matrix<T, typename MATRIX_FORMAT::dense>> dummy{};
1556 b2linalg::Index index;
1557
1558 this->get_value(
1559 model, is_linear, equilibrium_solution, time, step_size, dof, gradient_container,
1560 nullptr /*SolverHints**/, index, b2linalg::Vector<T, b2linalg::Vdense>::null,
1562 b2linalg::Vector<T, b2linalg::Vdense>::null);
1563 };
1564
1619 virtual void get_value(
1620 Model& model, const bool linear, const EquilibriumSolution equilibrium_solution,
1621 const double time, const double delta_time,
1622 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
1623 GradientContainer* gradient_container, SolverHints* solver_hints,
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));
1632 }
1633 if (!d_value_d_time.is_null()) { d_value_d_time.resize(0); }
1634 }
1635
1640 virtual void get_value(
1641 Model& model, const bool linear, const EquilibriumSolution equilibrium_solution,
1642 const double time, const double delta_time,
1643 const b2linalg::Matrix<T, b2linalg::Mrectangle_constref>& dof,
1644 GradientContainer* gradient_container, SolverHints* solver_hints,
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;
1652 copy_m(dof, 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));
1659 }
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);
1664 } else {
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));
1668 }
1669 if (!d_value_d_time.is_null()) { d_value_d_time.resize(0); }
1670 }
1671 }
1672
1673 static type_t type;
1674 static std::vector<b2linalg::Matrix<T, b2linalg::Mrectangle>> d_value_d_dof_null;
1675};
1676
1677template <typename T>
1678std::vector<b2linalg::Matrix<T>> TypedElement<T>::d_value_d_dof_null;
1679
1683template <typename T>
1685 "TYPED_VALUE_ELEMENT", type_name<T>(), StringList(), element::module, &Element::type);
1686
1687} // namespace b2000
1688
1689#endif // B2_ELEMENT_H_
#define THROW
Definition b2exception.H:198
Definition b2case.H:110
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 b2model.H:69
Definition b2object.H:340
Definition b2object.H:456
Definition b2rtable.H:427
Definition b2solver.H:168
Definition b2util.H:54
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
Definition b2type.H:72