suanPan
ElementTemplate Class Referencefinal

The ElementTemplate class illustrates the basic formulation a typical Element class used in FEM analysis. More...

#include <ElementTemplate.h>

Inheritance diagram for ElementTemplate:
Collaboration diagram for ElementTemplate:

Public Member Functions

 ElementTemplate (unsigned, uvec &&, unsigned, double=1.)
 Here we target our ElementTemplate class to fulfill the functionality of a constant stress triangular element, viz., CPS3, in Abaqus notation. More...
 
int initialize (const shared_ptr< DomainBase > &) override
 As explained before, this method get all necessary information, which includes getting copies of Material objects and other operations, from the Domain object. More...
 
int update_status () override
 Now we handle the status update method. We get trial displacement via build-in method and pass trial strain to the material model. Then get updated stiffness and stress back to form element stiffness and resistance. More...
 
int commit_status () override
 Simply call corresponding methods in material objects. If the element itself has history variables, they should also be updated/modified in following methods. More...
 
int clear_status () override
 
int reset_status () override
 
- Public Member Functions inherited from MaterialElement2D
 MaterialElement2D (unsigned, unsigned, unsigned, uvec &&, uvec &&, bool, vector< DOF > &&={})
 
- Public Member Functions inherited from MaterialElement
 MaterialElement (unsigned, unsigned, unsigned, uvec &&, uvec &&, bool, MaterialType, vector< DOF > &&)
 
- Public Member Functions inherited from Element
 Element (unsigned, unsigned, unsigned, uvec &&, std::vector< DOF > &&)
 
 Element (unsigned, unsigned, unsigned, uvec &&, uvec &&, bool, MaterialType, std::vector< DOF > &&)
 
 Element (unsigned, unsigned, unsigned, uvec &&, uvec &&, bool, SectionType, std::vector< DOF > &&)
 
 Element (unsigned, unsigned, uvec &&)
 
 Element (unsigned, unsigned, unsigned, unsigned)
 
 Element (const Element &)=delete
 
 Element (Element &&)=delete
 
Elementoperator= (const Element &)=delete
 
Elementoperator= (Element &&)=delete
 
 ~Element () override=default
 
int initialize_base (const shared_ptr< DomainBase > &) final
 
void set_initialized (bool) const override
 
void set_symmetric (bool) const override
 
bool is_initialized () const override
 
bool is_symmetric () const override
 
bool is_nlgeom () const override
 
void update_dof_encoding () override
 
bool if_update_mass () const override
 
bool if_update_viscous () const override
 
bool if_update_nonviscous () const override
 
bool if_update_stiffness () const override
 
bool if_update_geometry () const override
 
bool allow_modify_mass () const override
 
bool allow_modify_viscous () const override
 
bool allow_modify_nonviscous () const override
 
const uvec & get_dof_encoding () const override
 
const uvec & get_node_encoding () const override
 
const std::vector< MappingDOF > & get_dof_mapping () const override
 
const uvec & get_material_tag () const override
 
const uvec & get_section_tag () const override
 
unsigned get_dof_number () const override
 
unsigned get_node_number () const override
 
unsigned get_total_number () const override
 
void clear_node_ptr () override
 
const std::vector< weak_ptr< Node > > & get_node_ptr () const override
 
vec get_incre_displacement () const override
 
vec get_incre_velocity () const override
 
vec get_incre_acceleration () const override
 
vec get_trial_displacement () const override
 
vec get_trial_velocity () const override
 
vec get_trial_acceleration () const override
 
vec get_current_displacement () const override
 
vec get_current_velocity () const override
 
vec get_current_acceleration () const override
 
const vec & get_trial_resistance () const override
 
const vec & get_current_resistance () const override
 
const vec & get_trial_damping_force () const override
 
const vec & get_current_damping_force () const override
 
const cx_mat & get_trial_nonviscous_force () const override
 
const cx_mat & get_current_nonviscous_force () const override
 
const vec & get_trial_inertial_force () override
 
const vec & get_current_inertial_force () override
 
const vec & get_trial_body_force () const override
 
const vec & get_current_body_force () const override
 
const vec & get_trial_traction () const override
 
const vec & get_current_traction () const override
 
const mat & get_trial_mass () const override
 
const mat & get_trial_viscous () const override
 
const mat & get_trial_nonviscous () const override
 
const mat & get_trial_stiffness () const override
 
const mat & get_trial_geometry () const override
 
const mat & get_trial_secant () const override
 
const mat & get_current_mass () const override
 
const mat & get_current_viscous () const override
 
const mat & get_current_nonviscous () const override
 
const mat & get_current_stiffness () const override
 
const mat & get_current_geometry () const override
 
const mat & get_current_secant () const override
 
const mat & get_initial_mass () const override
 
const mat & get_initial_viscous () const override
 
const mat & get_initial_nonviscous () const override
 
const mat & get_initial_stiffness () const override
 
const mat & get_initial_geometry () const override
 
const mat & get_initial_secant () const override
 
const mat & get_mass_container () const override
 
const mat & get_stiffness_container () const override
 
int clear_status () override=0
 
int commit_status () override=0
 
int reset_status () override=0
 
const vec & update_body_force (const vec &) override
 
const vec & update_traction (const vec &) override
 
std::vector< vec > record (OutputType) override
 
double get_strain_energy () const override
 
double get_complementary_energy () const override
 
double get_kinetic_energy () const override
 
double get_viscous_energy () const override
 
double get_nonviscous_energy () const override
 
const vec & get_momentum () const override
 
double get_momentum_component (DOF) const override
 
double get_characteristic_length () const override
 
mat compute_shape_function (const mat &, unsigned) const override
 
- Public Member Functions inherited from ElementBase
 ElementBase (const unsigned T)
 
 ElementBase (const ElementBase &)=delete
 
 ElementBase (ElementBase &&)=delete
 
ElementBaseoperator= (const ElementBase &)=delete
 
ElementBaseoperator= (ElementBase &&)=delete
 
 ~ElementBase () override=default
 
virtual int initialize_base (const shared_ptr< DomainBase > &)=0
 
virtual int initialize (const shared_ptr< DomainBase > &)=0
 
virtual void set_initialized (bool) const =0
 
virtual void set_symmetric (bool) const =0
 
virtual bool is_initialized () const =0
 
virtual bool is_symmetric () const =0
 
virtual bool is_nlgeom () const =0
 
virtual void update_dof_encoding ()=0
 
virtual bool if_update_mass () const =0
 
virtual bool if_update_viscous () const =0
 
virtual bool if_update_nonviscous () const =0
 
virtual bool if_update_stiffness () const =0
 
virtual bool if_update_geometry () const =0
 
virtual bool allow_modify_mass () const =0
 
virtual bool allow_modify_viscous () const =0
 
virtual bool allow_modify_nonviscous () const =0
 
virtual const uvec & get_dof_encoding () const =0
 
virtual const uvec & get_node_encoding () const =0
 
virtual const std::vector< MappingDOF > & get_dof_mapping () const =0
 
virtual const uvec & get_material_tag () const =0
 
virtual const uvec & get_section_tag () const =0
 
virtual unsigned get_dof_number () const =0
 
virtual unsigned get_node_number () const =0
 
virtual unsigned get_total_number () const =0
 
virtual void clear_node_ptr ()=0
 
virtual const std::vector< weak_ptr< Node > > & get_node_ptr () const =0
 
virtual vec get_incre_displacement () const =0
 
virtual vec get_incre_velocity () const =0
 
virtual vec get_incre_acceleration () const =0
 
virtual vec get_trial_displacement () const =0
 
virtual vec get_trial_velocity () const =0
 
virtual vec get_trial_acceleration () const =0
 
virtual vec get_current_displacement () const =0
 
virtual vec get_current_velocity () const =0
 
virtual vec get_current_acceleration () const =0
 
virtual const vec & get_trial_resistance () const =0
 
virtual const vec & get_current_resistance () const =0
 
virtual const vec & get_trial_damping_force () const =0
 
virtual const vec & get_current_damping_force () const =0
 
virtual const cx_mat & get_trial_nonviscous_force () const =0
 
virtual const cx_mat & get_current_nonviscous_force () const =0
 
virtual const vec & get_trial_inertial_force ()=0
 
virtual const vec & get_current_inertial_force ()=0
 
virtual const vec & get_trial_body_force () const =0
 
virtual const vec & get_current_body_force () const =0
 
virtual const vec & get_trial_traction () const =0
 
virtual const vec & get_current_traction () const =0
 
virtual const mat & get_trial_mass () const =0
 
virtual const mat & get_trial_viscous () const =0
 
virtual const mat & get_trial_nonviscous () const =0
 
virtual const mat & get_trial_stiffness () const =0
 
virtual const mat & get_trial_geometry () const =0
 
virtual const mat & get_trial_secant () const =0
 
virtual const mat & get_current_mass () const =0
 
virtual const mat & get_current_viscous () const =0
 
virtual const mat & get_current_nonviscous () const =0
 
virtual const mat & get_current_stiffness () const =0
 
virtual const mat & get_current_geometry () const =0
 
virtual const mat & get_current_secant () const =0
 
virtual const mat & get_initial_mass () const =0
 
virtual const mat & get_initial_viscous () const =0
 
virtual const mat & get_initial_nonviscous () const =0
 
virtual const mat & get_initial_stiffness () const =0
 
virtual const mat & get_initial_geometry () const =0
 
virtual const mat & get_initial_secant () const =0
 
virtual const mat & get_mass_container () const =0
 
virtual const mat & get_stiffness_container () const =0
 
virtual int update_status ()=0
 
virtual int clear_status ()=0
 
virtual int commit_status ()=0
 
virtual int reset_status ()=0
 
virtual const vec & update_body_force (const vec &)=0
 
virtual const vec & update_traction (const vec &)=0
 
virtual std::vector< vec > record (OutputType)=0
 
virtual double get_strain_energy () const =0
 
virtual double get_complementary_energy () const =0
 
virtual double get_kinetic_energy () const =0
 
virtual double get_viscous_energy () const =0
 
virtual double get_nonviscous_energy () const =0
 
virtual const vec & get_momentum () const =0
 
virtual double get_momentum_component (DOF) const =0
 
virtual double get_characteristic_length () const =0
 
virtual mat compute_shape_function (const mat &, unsigned) const =0
 
- Public Member Functions inherited from Tag
 Tag (unsigned=0)
 
 Tag (const Tag &)=default
 
 Tag (Tag &&)=default
 
Tagoperator= (const Tag &)=delete
 
Tagoperator= (Tag &&)=delete
 
virtual ~Tag ()=default
 
void set_tag (unsigned) const
 
unsigned get_tag () const
 
void enable ()
 
void disable ()
 
void guard ()
 
void unguard ()
 
bool is_active () const
 
bool is_guarded () const
 
virtual void print ()
 

Additional Inherited Members

- Protected Member Functions inherited from Element
mat get_coordinate (unsigned) const override
 generate a matrix that contains coordinates of connected nodes More...
 
vec get_node_incre_resistance () const override
 
vec get_node_trial_resistance () const override
 
vec get_node_current_resistance () const override
 
std::vector< shared_ptr< Material > > get_material (const shared_ptr< DomainBase > &) const override
 
std::vector< shared_ptr< Section > > get_section (const shared_ptr< DomainBase > &) const override
 
virtual mat get_coordinate (unsigned) const =0
 
virtual vec get_node_incre_resistance () const =0
 
virtual vec get_node_trial_resistance () const =0
 
virtual vec get_node_current_resistance () const =0
 
virtual std::vector< shared_ptr< Material > > get_material (const shared_ptr< DomainBase > &) const =0
 
virtual std::vector< shared_ptr< Section > > get_section (const shared_ptr< DomainBase > &) const =0
 
 ElementBase (const unsigned T)
 
 ElementBase (const ElementBase &)=delete
 
 ElementBase (ElementBase &&)=delete
 
ElementBaseoperator= (const ElementBase &)=delete
 
ElementBaseoperator= (ElementBase &&)=delete
 
 ~ElementBase () override=default
 
virtual int initialize_base (const shared_ptr< DomainBase > &)=0
 
virtual int initialize (const shared_ptr< DomainBase > &)=0
 
virtual void set_initialized (bool) const =0
 
virtual void set_symmetric (bool) const =0
 
virtual bool is_initialized () const =0
 
virtual bool is_symmetric () const =0
 
virtual bool is_nlgeom () const =0
 
virtual void update_dof_encoding ()=0
 
virtual bool if_update_mass () const =0
 
virtual bool if_update_viscous () const =0
 
virtual bool if_update_nonviscous () const =0
 
virtual bool if_update_stiffness () const =0
 
virtual bool if_update_geometry () const =0
 
virtual bool allow_modify_mass () const =0
 
virtual bool allow_modify_viscous () const =0
 
virtual bool allow_modify_nonviscous () const =0
 
virtual const uvec & get_dof_encoding () const =0
 
virtual const uvec & get_node_encoding () const =0
 
virtual const std::vector< MappingDOF > & get_dof_mapping () const =0
 
virtual const uvec & get_material_tag () const =0
 
virtual const uvec & get_section_tag () const =0
 
virtual unsigned get_dof_number () const =0
 
virtual unsigned get_node_number () const =0
 
virtual unsigned get_total_number () const =0
 
virtual void clear_node_ptr ()=0
 
virtual const std::vector< weak_ptr< Node > > & get_node_ptr () const =0
 
virtual vec get_incre_displacement () const =0
 
virtual vec get_incre_velocity () const =0
 
virtual vec get_incre_acceleration () const =0
 
virtual vec get_trial_displacement () const =0
 
virtual vec get_trial_velocity () const =0
 
virtual vec get_trial_acceleration () const =0
 
virtual vec get_current_displacement () const =0
 
virtual vec get_current_velocity () const =0
 
virtual vec get_current_acceleration () const =0
 
virtual const vec & get_trial_resistance () const =0
 
virtual const vec & get_current_resistance () const =0
 
virtual const vec & get_trial_damping_force () const =0
 
virtual const vec & get_current_damping_force () const =0
 
virtual const cx_mat & get_trial_nonviscous_force () const =0
 
virtual const cx_mat & get_current_nonviscous_force () const =0
 
virtual const vec & get_trial_inertial_force ()=0
 
virtual const vec & get_current_inertial_force ()=0
 
virtual const vec & get_trial_body_force () const =0
 
virtual const vec & get_current_body_force () const =0
 
virtual const vec & get_trial_traction () const =0
 
virtual const vec & get_current_traction () const =0
 
virtual const mat & get_trial_mass () const =0
 
virtual const mat & get_trial_viscous () const =0
 
virtual const mat & get_trial_nonviscous () const =0
 
virtual const mat & get_trial_stiffness () const =0
 
virtual const mat & get_trial_geometry () const =0
 
virtual const mat & get_trial_secant () const =0
 
virtual const mat & get_current_mass () const =0
 
virtual const mat & get_current_viscous () const =0
 
virtual const mat & get_current_nonviscous () const =0
 
virtual const mat & get_current_stiffness () const =0
 
virtual const mat & get_current_geometry () const =0
 
virtual const mat & get_current_secant () const =0
 
virtual const mat & get_initial_mass () const =0
 
virtual const mat & get_initial_viscous () const =0
 
virtual const mat & get_initial_nonviscous () const =0
 
virtual const mat & get_initial_stiffness () const =0
 
virtual const mat & get_initial_geometry () const =0
 
virtual const mat & get_initial_secant () const =0
 
virtual const mat & get_mass_container () const =0
 
virtual const mat & get_stiffness_container () const =0
 
virtual int update_status ()=0
 
virtual int clear_status ()=0
 
virtual int commit_status ()=0
 
virtual int reset_status ()=0
 
virtual const vec & update_body_force (const vec &)=0
 
virtual const vec & update_traction (const vec &)=0
 
virtual std::vector< vec > record (OutputType)=0
 
virtual double get_strain_energy () const =0
 
virtual double get_complementary_energy () const =0
 
virtual double get_kinetic_energy () const =0
 
virtual double get_viscous_energy () const =0
 
virtual double get_nonviscous_energy () const =0
 
virtual const vec & get_momentum () const =0
 
virtual double get_momentum_component (DOF) const =0
 
virtual double get_characteristic_length () const =0
 
virtual mat compute_shape_function (const mat &, unsigned) const =0
 
- Protected Member Functions inherited from Tag
 Tag (unsigned=0)
 
 Tag (const Tag &)=default
 
 Tag (Tag &&)=default
 
Tagoperator= (const Tag &)=delete
 
Tagoperator= (Tag &&)=delete
 
virtual ~Tag ()=default
 
void set_tag (unsigned) const
 
unsigned get_tag () const
 
void enable ()
 
void disable ()
 
void guard ()
 
void unguard ()
 
bool is_active () const
 
bool is_guarded () const
 
virtual void print ()
 
- Protected Attributes inherited from Element
std::vector< weak_ptr< Node > > node_ptr
 
- Protected Attributes inherited from DataElement
const uvec node_encoding
 
const uvec material_tag
 
const uvec section_tag
 
const bool nlgeom = false
 
bool update_mass = true
 
bool update_viscous = true
 
bool update_nonviscous = true
 
bool update_stiffness = true
 
bool update_geometry = true
 
bool modify_mass = true
 
bool modify_viscous = true
 
bool modify_nonviscous = true
 
uvec dof_encoding {}
 
mat initial_mass {}
 
mat initial_viscous {}
 
mat initial_nonviscous {}
 
mat initial_stiffness {}
 
mat initial_geometry {}
 
mat trial_mass {}
 
mat trial_viscous {}
 
mat trial_nonviscous {}
 
mat trial_stiffness {}
 
mat trial_geometry {}
 
mat current_mass {}
 
mat current_viscous {}
 
mat current_nonviscous {}
 
mat current_stiffness {}
 
mat current_geometry {}
 
vec trial_resistance {}
 
vec current_resistance {}
 
vec trial_viscous_force {}
 
vec current_viscous_force {}
 
cx_mat trial_nonviscous_force {}
 
cx_mat current_nonviscous_force {}
 
vec trial_inertial_force {}
 
vec current_inertial_force {}
 
vec trial_body_force {}
 
vec current_body_force {}
 
vec trial_traction {}
 
vec current_traction {}
 
mat body_force {}
 
mat traction {}
 
mat stiffness_container {}
 
mat mass_container {}
 
double strain_energy = 0.
 
double kinetic_energy = 0.
 
double viscous_energy = 0.
 
double nonviscous_energy = 0.
 
double complementary_energy = 0.
 
vec momentum {}
 
const double characteristic_length = 1.
 

Detailed Description

The ElementTemplate class illustrates the basic formulation a typical Element class used in FEM analysis.

Author
tlc
Date
05/01/2020
Version
0.1.3

Constructor & Destructor Documentation

◆ ElementTemplate()

ElementTemplate::ElementTemplate ( unsigned  T,
uvec &&  NT,
unsigned  MT,
double  TH = 1. 
)

Here we target our ElementTemplate class to fulfill the functionality of a constant stress triangular element, viz., CPS3, in Abaqus notation.

The example element is derived from the MaterialElement2D class, hence it is a 2D element using material models (instead of sections).

The constructor of MaterialElement2D class asks for six parameters:

  • Unique Element Object Tag (T)
  • Number of Nodes (NN)
  • Number of DoFs (ND)
  • Node Encoding Tags (NT)
  • Material Tag (MT)
  • Nonlinear Switch (F)

In our example, CT and F will be constants, NN is 3 and ND is 2. So we have three parameters plus thickness for our derived element. Except for initializing private member variables, we do not have to do anything. All other initializations will be handled by the Element and Domain class. As simple as this.

Member Function Documentation

◆ clear_status()

int ElementTemplate::clear_status ( )
overridevirtual

Implements Element.

◆ commit_status()

int ElementTemplate::commit_status ( )
overridevirtual

Simply call corresponding methods in material objects. If the element itself has history variables, they should also be updated/modified in following methods.

Implements Element.

◆ initialize()

int ElementTemplate::initialize ( const shared_ptr< DomainBase > &  D)
overridevirtual

As explained before, this method get all necessary information, which includes getting copies of Material objects and other operations, from the Domain object.

Please note that we do not have to check the existence of any objects which are used in the element. The validity of the connected node objects and the material models is checked in the base initialisation before calling this method. The execution of this initialize() method automatically implies that this is a valid Element object with valid material model.

The displacement mode is

\begin{gather}\phi=\begin{bmatrix}1&x&y\end{bmatrix}.\end{gather}

The strain matrix is calculated as

\begin{gather}B=\partial{}N=\partial{}\left(\phi{}C^{-1}\right),\end{gather}

where

\begin{gather}C=\begin{bmatrix}1&x_i&y_i\\1&x_j&y_j\\1&x_k&y_k\end{bmatrix}.\end{gather}

One can also initialize stiffness matrix and/or other build-in matrices from Element class (check the definition for details) in the initialize() method. However, this it not necessary, as the Solver will always call update_status() method with a zero trial displacement to update current stiffness and resistance before running iterations.

As CPS3 is a constant stress/strain element, one integration point at the center of the element is enough. Hence we only have one material model defined. First we get a reference of the Material object from the Domain and then call the get_copy() method to get a local copy. Direct assignment is allowed, the move semantics will automatically be invoked. There is no need to check if the material model is a 2D one. The validation is done in base Element class initialisation.

The node pointers are handled in the base Element class, we do not have to set it manually. Now we could fill in the ele_coor matrix. The area/natural coordinate is another version of implementation. Please refer to FEM textbooks for theories. This will be used for the computation of the shape function.

The area is half of the determinant of the above matrix. The area of 2D polygons can also be computed by the shoelace function.

A standard way to construct the strain mat is to derive from the partial derivative of the shape function N. For CP3, as it is a constant stress/strain element, the derivatives are constants which can be directly obtained from above matrix.

We use function ConstantMass() to indicate the mass matrix will not change so that trial_mass, current_mass and initial_mass matrices can point to the same memory location. This avoids unnecessary allocation of memory. It is not compulsory to call ConstantMass(), ConstantStiffness() and ConstantDamping() but highly recommended to do so when one or some matrices indeed remain unchanged for the whole analysis.

Implements ElementBase.

◆ reset_status()

int ElementTemplate::reset_status ( )
overridevirtual

Implements Element.

◆ update_status()

int ElementTemplate::update_status ( )
overridevirtual

Now we handle the status update method. We get trial displacement via build-in method and pass trial strain to the material model. Then get updated stiffness and stress back to form element stiffness and resistance.

For a static analysis, stiffness and resistance have to be formulated. Apart from this, there is nothing you have to do. They will be send to global assembler by methods in base Element class, which can also be overridden to be customized.

Implements ElementBase.

Here is the call graph for this function:

The documentation for this class was generated from the following files: