Defines the complete interface for Element instances (C++ representations of Finite Elements). More...
#include "b2element.H"
Classes | |
class | iterator |
struct | Tetrahedral |
struct | Triangle |
Element response | |
Implementations for elements with internal forces need to override the get_value_info() and get_value() functions, implementation for elements with constraints (e.g. rigid-body and coupling elements) need to override the get_constraint_info() and get_constraint() functions. Elements may have at the same time internal forces and constraints. Note that TypedEssentialBoundaryCondition provides an alternative method for specifying constraints. | |
enum | VariableInfo { zero = 0 , constant = 1 , linear = 2 , nonlinear = 3 } |
virtual const std::vector< VariableInfo > | get_value_info () const |
virtual std::pair< int, VariableInfo > | get_constraint_info () |
Constructor | |
Element objects are constructed by the Domain object, using the default constructor. | |
Element (const bool symmetric) | |
Sets the symmetry property of this element. Call this constructor if your newly defined element is not symmetric. | |
Element Identifiers and Names | |
Derived classes should not override these functions. The set-functions are called by the Domain object. | |
size_t | get_id () const |
void | set_id (size_t id_) |
int | get_elem_type_number () const |
void | set_elem_type_number (int elno) |
const std::string & | get_object_name () const override |
void | set_object_name (const std::string &name) |
Element-internal degrees-of-freedom | |
Elements without internal dof's do not need to override these functions. | |
int | get_number_of_dof () const override |
size_t | set_global_dof_numbering (size_t index) override |
std::pair< size_t, size_t > | get_global_dof_numbering () const override |
virtual void | get_dof_numbering (b2linalg::Index &dof_numbering) |
Nodes, ElementProperty, and initialization | |
Implementations must override these functions. | |
virtual std::pair< int, Node *const * > | get_nodes () const |
virtual void | set_nodes (std::pair< int, Node *const * > nodes) |
virtual const ElementProperty * | get_property () const |
virtual void | set_property (ElementProperty *property) |
virtual void | set_additional_properties (const RTable &rtable) |
virtual void | init (Model &model) |
Sub-elements | |
These functions do not need not be overwritten for most implementations. Sub-elements are useful for elements with a large number of degrees-of-freedom and a sparse element stiffness matrix. In this case, it is computationally more effective to execute the assembly by means of sub-elements, where the number of dofs for each sub-element are small. Sub-elements should be created in the init() function and destroyed in the destructor. | |
virtual std::pair< size_t, Element ** > | get_subelements () |
iterator | begin () |
iterator | end () const |
Functions to integrate along edges | |
Elements that support edge integrations should override these functions. Note that, while shell element edges are actually surfaces, integration by means of the edge_* functions is performed along the reference surface. | |
virtual int | edge_field_order (const int edge_id, const std::string &field_name) |
virtual bool | edge_field_linear_on_dof (const int edge_id, const std::string &field_name) |
virtual int | edge_field_polynomial_sub_edge (const int edge_id, const std::string &field_name, b2linalg::Vector< double, b2linalg::Vdense > &sub_nodes) |
virtual void | edge_geom (const int edge_id, const double internal_coor, b2linalg::Vector< double > &geom, b2linalg::Vector< double > &d_geom_d_icoor) |
Functions to integrate over faces | |
Elements that support face integration (e.g. traction forces) should override these functions. Solid elements have faces, and the sides of shell elements and the upper and lower and reference surfaces of shell elements are considered faces, too. | |
virtual int | face_field_order (const int face_id, const std::string &field_name) |
virtual bool | face_field_linear_on_dof (const int face_id, const std::string &field_name) |
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) |
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) |
Functions to integrate over the element volume | |
Elements that support volume integration (e.g. body forces) should override these functions. | |
virtual int | body_field_order (const std::string &field_name) |
virtual bool | body_field_linear_on_dof (const std::string &field_name) |
virtual int | body_field_polynomial_sub_volume (const std::string &field_name, b2linalg::Matrix< double, b2linalg::Mrectangle > &sub_nodes, std::vector< Tetrahedral > &sub_volumes) |
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) |
Save and restore element state | |
Elements without need for restart functionality need not override these functions. These functions are called by the Domain::save_state() and Domain::load_state() functions, which themselves are called by the nonlinear Solver(s). The element state comprises the path-dependent state of all ElementProperty objects owned by the Element plus the path-dependent state of the Element itself (e.g. configuration of the last converged solution for elements using the Update Lagrange formulation). There are two buffers: One for integer numbers, and one for floating-point numbers. Elements write to and read from both buffers. The Domain object then writes/reads the buffers to/from the database as positional datasets "STATE.GLOB.*". The builtin B2000++ elements do not implement these functions and therefore, do not support restart when used in conjunction with path-dependent ElementProperty instances (the elements themselves are Total-Lagrangian, thus path-independent). | |
virtual std::pair< int, int > | get_state_buffer_size () const |
virtual std::pair< int *, double * > | get_state_buffer (std::pair< int *, double * > buffers) const |
virtual std::pair< const int *, const double * > | set_state_buffer (std::pair< const int *, const double * > buffers) |
Additional Inherited Members | |
![]() | |
virtual | ~Object () |
![]() | |
static ObjectType | type |
Defines the complete interface for Element instances (C++ representations of Finite Elements).
How the element response varies in function of a variable.
|
inlineexplicit |
Sets the symmetry property of this element. Call this constructor if your newly defined element is not symmetric.
symmetric | either true or false |
|
inline |
Returns an iterator over the element and its subelements.
|
inlinevirtual |
field_name | The field name. |
Solid elements depend linearly on the dof. Shell elements depend in nonlinear fashion on the dof.
|
inlinevirtual |
field_name | The field name. Usually, the integration order is independent of the field name. |
|
inlinevirtual |
Sub-divide the face into tetrahedron (sub-volumes) and compute the element-internal coordinates of the sub-volume vertices. For tetrahedral elements, specifying one tetrahedron is sufficient. Hexahedral elements can be subdivided in 5 or 6 tetrahedrons.
field_name | The field name. |
sub_nodes | A matrix (3 x n) containing the element-internal coordinates of the n sub-nodes (output). |
sub_volumes | A vector of Tetrahedral structs with the connectivities of the sub-volume (output). |
|
inlinevirtual |
Compute the body geometry at a specified integration point.
internal_coor | The element-internal coordinates of the integration point (input). |
geom | The branch-global coordinates of the integration point (vector, output). |
d_geom_d_icoor | The derivatives of the branch-global coordinates w.r.t. the internal coordinates; this is the transposed of the Jacobian matrix (matrix, output). |
|
inlinevirtual |
edge_id | The edge number, starting at 1, according to the B2000++ conventions. |
field_name | The field name. |
Reimplemented in b2000::ElementCFDHeat2DFieldL2Constant< FLUX, AXISYMMETRIC >.
|
inlinevirtual |
edge_id | The edge number, starting at 1, according to the B2000++ conventions. |
field_name | The field name. Usually, the integration order is independent of the field name. |
Reimplemented in b2000::ElementCFDHeat2DFieldL2Constant< FLUX, AXISYMMETRIC >.
|
inlinevirtual |
Sub-divide the edge into polynomial sub-edges and compute the edge-internal coordinates of the nodes at the sub-edge boundaries. Most elements should put [-1, +1] (one sub-edge).
edge_id | The edge number, starting at 1, according to the B2000++ conventions. |
field_name | The field name. |
sub_nodes | A vector containing the edge-internal coordinates of the sub-nodes. The coordinates must be strictly increasing, and the first sub-node must be at -1, and the last sub-node must be at +1. |
Reimplemented in b2000::ElementCFDHeat2DFieldL2Constant< FLUX, AXISYMMETRIC >.
|
inlinevirtual |
Compute the edge geometry at a specified integration point.
edge_id | The edge number, starting at 1, according to the B2000++ conventions (input). |
internal_coor | The edge-internal coordinate (from -1 to +1) of the integration point (input). |
geom | The branch-global coordinates of the integration point (vector, output). |
d_geom_d_icoor | The derivatives of the branch-global coordinates w.r.t. the internal coordinate; this is the edge tangential vector (vector, output). |
Reimplemented in b2000::ElementCFDHeat2DFieldL2Constant< FLUX, AXISYMMETRIC >.
|
inline |
Returns the 'end' iterator.
|
inlinevirtual |
face_id | The face number, starting at 1, according to the B2000++ conventions. |
field_name | The field name. |
Solid elements depend linearly on the dof. Shell elements depend in nonlinear fashion on the side faces and on the lower and upper surfaces. Their reference surface depends linearly on the dof.
Reimplemented in b2000::ElementCFD3DField< SHAPE, EULER >, and b2000::SuperElement< T, MATRIX_TYPE >.
|
inlinevirtual |
face_id | The face number, starting at 1, according to the B2000++ conventions. |
field_name | The field name. Usually, the integration order is independent of the field name. |
Reimplemented in b2000::SuperElement< T, MATRIX_TYPE >, and b2000::ElementCFD3DField< SHAPE, EULER >.
|
inlinevirtual |
Sub-divide the face into triangular facets (sub-faces) and compute the face-internal coordinates of the sub-face vertices. For triangular faces, one triangle is sufficient. Quadrilateral faces can be sub-divided into two triangular facets.
face_id | The face number, starting at 1, according to the B2000++ conventions (input). |
field_name | The field name. |
sub_nodes | A matrix (2 x n) containing the face-internal coordinates of the n sub-nodes (output). |
sub_faces | A vector of Triangle structs with the connectivities of the sub-faces (output). |
Reimplemented in b2000::SuperElement< T, MATRIX_TYPE >.
|
inlinevirtual |
Compute the face geometry at a specified integration point.
face_id | The face number, starting at 1, according to the B2000++ conventions (input). |
internal_coor | The face-internal coordinates of the integration point (input). |
geom | The branch-global coordinates of the integration point (vector, output). |
d_geom_d_icoor | The derivatives of the branch-global coordinates w.r.t. the internal coordinates; these are the tangential vectors (matrix, output). |
Reimplemented in b2000::SuperElement< T, MATRIX_TYPE >, and b2000::ElementCFD3DField< SHAPE, EULER >.
|
inlinevirtual |
Must be overridden for elements with constraints. Return information about the constraints specified by the element.
todo: not all elements override this function.
In B2000++, elements are allowed, in addition to evaluate first and second variations (e.g. internal force vector and stiffness matrix), to specify constraints between dof's. This is useful for e.g. rigid-body elements or interface elements.
|
inlinevirtual |
|
inline |
|
inlineoverridevirtual |
Elements without internal dof's do not need to override this function.
The variable internal_dof_index is a member of the element class and was set in set_global_dof_numbering().
Reimplemented from b2000::DegreesOfFreedom.
Reimplemented in b2000::SuperElement< T, MATRIX_TYPE >, and b2000::ElementCFDHeat2DFieldL2Constant< FLUX, AXISYMMETRIC >.
|
inline |
|
inlinevirtual |
Must be overridden.
Reimplemented in b2000::SuperElement< T, MATRIX_TYPE >, b2000::ElementCFD3DField< SHAPE, EULER >, and b2000::ElementCFDHeat2DFieldL2Constant< FLUX, AXISYMMETRIC >.
|
inlineoverridevirtual |
Elements without internal dof's do not need to override this function.
A Finite Element with 4 internal dof's would return 4.
Reimplemented from b2000::DegreesOfFreedom.
Reimplemented in b2000::SuperElement< T, MATRIX_TYPE >, and b2000::ElementCFDHeat2DFieldL2Constant< FLUX, AXISYMMETRIC >.
|
inlineoverridevirtual |
Reimplemented from b2000::Object.
|
inlinevirtual |
Must be overridden. This implementation returns a 0-pointer.
Reimplemented in b2000::SuperElement< T, MATRIX_TYPE >, and b2000::ElementCFD3DField< SHAPE, EULER >.
|
inlinevirtual |
Write the element state into buffers.
buffers | A pair of pointers to an integer array and to a floating-point array. The buffer sizes of the arrays correspond to get_state_buffer_size(). |
|
inlinevirtual |
Return the state buffers size in integer and double to store the state data of the element.
|
inlinevirtual |
Returns an array of pointers to sub-elements. By default, no sub-elements are present.
|
inlinevirtual |
Must be overridden for elements with internal forces.
todo: not all elements override this function.
With "variable", the dof's and their time derivatives are meant. By default, the element specifies no response. Thus, this function must be overridden by elements producing a response in function of the dof's and/or their time derivatives. Elements formulating constraints only (such as rigid-body elements) do not need to override this function.
For stress elements, the variables are the displacements, the velocities, and the accelerations. A fully nonlinear element with support for stiffness, viscosity, and inertia effects specify:
whereas a stress element supporting only linear analysis without any viscosity and inertia effects specify:
Nonlinear heat elements specify:
Reimplemented in b2000::SuperElement< T, MATRIX_TYPE >.
|
inlinevirtual |
Initialisation of the element. This method is called by the Domain object, after set_nodes() and set_property(). This implementation performs no operation.
This allows for setting up private data structures that depend on the nodes and on the property.
|
inlinevirtual |
Set additional element properties. Work-around until the new element properties are implemented. This implementation performs no operation.
rtable | A relational table containing the element definition as read from database. |
|
inline |
This function is used to set the element type Nr. read from MemCom database. In the database file, the element type Nr. is stored as ITYP under ETAB table. ITYP is set in b2ip_branch.C and elno is stored as ITYP in b2ip_elements.C. It is used to create the element object.
|
inlineoverridevirtual |
Elements without internal dof's do not need to override this function.
Set the global degree-of-freedom numbers of the degrees-of-freedom belonging to the entity.
index | The index into the global solution vector of the first degree-of-freedom of the entity. |
A Finite Element with 4 internal dof's:
The variable internal_dof_index is a member of the element class.
Reimplemented from b2000::DegreesOfFreedom.
Reimplemented in b2000::SuperElement< T, MATRIX_TYPE >, and b2000::ElementCFDHeat2DFieldL2Constant< FLUX, AXISYMMETRIC >.
|
inline |
This function is called by the Domain object. In B2000++, internal element identifiers start from 0 and are consecutive.
|
inlinevirtual |
Must be overridden. Set the nodes of the element. This function is called by the Domain object.
todo: not all elements override this function!
nodes | A pair (first, second) with first being the number of nodes, and second a pointer to a const array containing pointers to the Node instances. The length of the array corresponds to the number of nodes. |
Implementations should verify the number of nodes. The checking of the correct node type is optional.
It is recommended to perform a dynamic cast to the exact node type, this allows the use of the get_coor_s() and get_dof_numbering_s() functions without the overhead of the virtual functions Node::get_coor() and DegreesOfFreedom::get_global_dof_numbering().
A quadrilateral 2D stress element named Q4.S.2D.EXAMPLE. It has 3 coordinates (the Z-coordinate set to 0) and displacement dof's in X- and Y-direction. The following using statement gives the alias NodeType for the exact Node type:
The class has an array of NodeType pointers.
This array is initialized in the set_nodes() function:
The code to retrieve the coordinates of all 4 nodes of the element, without the overhead of virtual functions could then look like this:
The dof_numbering index vector (as given in the get_value(), get_constraint(), etc. functions) can then be initialized without the overhead of virtual functions:
Reimplemented in b2000::SuperElement< T, MATRIX_TYPE >, b2000::ElementCFD3DField< SHAPE, EULER >, and b2000::ElementCFDHeat2DFieldL2Constant< FLUX, AXISYMMETRIC >.
|
inline |
This function is called by the Domain object. In B2000++, the naming is "branch.eid", where 'branch' is the branch number and 'eid' is the element number as specified in the MDL input file and corresponding to the EID field in the ETAB.branch dataset of the database.
|
inlinevirtual |
Must be overridden. Set the element property. This function is called by the Domain object. This implementation performs no operation.
todo: not all elements override this function!
property | A pointer to the ElementProperty instance. |
ElementProperty instances contain material parameters and additional element properties (such as the thickness for shell elements).
Depending on the type of element (stress, heat-transfer, 2D, 3D, etc.), the appropriate property class should be used. The Domain object constructs a "generic" property object for each defined material, and passes a pointer to the Element instance by calling the set_property() function. The implementation of set_property() must perform a dynamic cast to the desired property class and check the result.
An element with 4 nodes and type Q4.S.2D.EXAMPLE. The class has a private variable for storing the pointer to the property. In this case, the element is a 2D stress element, and accordingly, the property class is SolidMechanics2D.
The function is implemented as follows:
Reimplemented in b2000::SuperElement< T, MATRIX_TYPE >, and b2000::ElementCFD3DField< SHAPE, EULER >.
|
inlinevirtual |
Initialize the element state from buffers (for restart). Actual implementations may need to perform further initializations of the internal state (e.g. re-computation of Jacobian matrices).
buffers | A pair of pointers to an integer array and to a floating-point array. The buffer sizes of the arrays correspond to get_state_buffer_size(). |