suanPan
|
The ElementTemplate class illustrates the basic formulation a typical Element class used in FEM analysis. More...
#include <ElementTemplate.h>
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 | |
Element & | operator= (const Element &)=delete |
Element & | operator= (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 | |
ElementBase & | operator= (const ElementBase &)=delete |
ElementBase & | operator= (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 | |
Tag & | operator= (const Tag &)=delete |
Tag & | operator= (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 | |
ElementBase & | operator= (const ElementBase &)=delete |
ElementBase & | operator= (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 | |
Tag & | operator= (const Tag &)=delete |
Tag & | operator= (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. |
The ElementTemplate class illustrates the basic formulation a typical Element class used in FEM analysis.
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:
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.
|
overridevirtual |
Implements Element.
|
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.
|
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.
|
overridevirtual |
Implements Element.
|
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.