suanPan
🧮 An Open Source, Parallel and Heterogeneous Finite Element Analysis Framework
Loading...
Searching...
No Matches
ElementBase.h
Go to the documentation of this file.
1/*******************************************************************************
2 * Copyright (C) 2017-2026 Theodore Chang
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 ******************************************************************************/
28#ifndef ELEMENTBASE_H
29#define ELEMENTBASE_H
30
31#include <Domain/Node.h>
32#include <Domain/Tag.h>
33#include <Element/MappingDOF.h>
35#include <Recorder/OutputType.h>
36
37class Node;
38class DomainBase;
39class Material;
40class Section;
41
42class ElementBase : public UniqueTag, public vtkBase {
43 virtual void update_strain_energy() = 0;
44 virtual void update_kinetic_energy() = 0;
45 virtual void update_viscous_energy() = 0;
46 virtual void update_nonviscous_energy() = 0;
47 virtual void update_complementary_energy() = 0;
48 virtual void update_momentum() = 0;
49
50protected:
51 [[nodiscard]] virtual vec get_node_incre_resistance() const = 0;
52 [[nodiscard]] virtual vec get_node_trial_resistance() const = 0;
53 [[nodiscard]] virtual vec get_node_current_resistance() const = 0;
54
55 [[nodiscard]] virtual std::vector<shared_ptr<Material>> get_material(const shared_ptr<DomainBase>&) const = 0;
56 [[nodiscard]] virtual std::vector<shared_ptr<Section>> get_section(const shared_ptr<DomainBase>&) const = 0;
57
58public:
59 enum class Type : std::uint8_t {
60 FEM,
61 DEM
62 };
63
64 enum class Parameter : std::uint8_t {
65 ELASTIC,
66 POISSON,
67 RADIUS,
68 MASS,
69 INERTIA,
71 };
72
73 explicit ElementBase(const unsigned T)
74 : UniqueTag(T) {}
75
76 virtual int initialize_base(const shared_ptr<DomainBase>&) = 0;
77 virtual int initialize(const shared_ptr<DomainBase>&) = 0;
78
79 virtual void set_initialized(bool) const = 0;
80 virtual void set_symmetric(bool) const = 0;
81 [[nodiscard]] virtual bool is_initialized() const = 0;
82 [[nodiscard]] virtual bool is_symmetric() const = 0;
83 [[nodiscard]] virtual bool is_nlgeom() const = 0;
84
85 [[nodiscard]] virtual Type type() const = 0;
86
87 virtual void update_dof_encoding() = 0;
88
89 [[nodiscard]] virtual bool if_update_mass() const = 0;
90 [[nodiscard]] virtual bool if_update_viscous() const = 0;
91 [[nodiscard]] virtual bool if_update_nonviscous() const = 0;
92 [[nodiscard]] virtual bool if_update_stiffness() const = 0;
93 [[nodiscard]] virtual bool if_update_geometry() const = 0;
94
95 [[nodiscard]] virtual bool allow_modify_mass() const = 0;
96 [[nodiscard]] virtual bool allow_modify_viscous() const = 0;
97 [[nodiscard]] virtual bool allow_modify_nonviscous() const = 0;
98
99 [[nodiscard]] virtual const uvec& get_dof_encoding() const = 0;
100 [[nodiscard]] virtual const uvec& get_node_encoding() const = 0;
101
102 [[nodiscard]] virtual const std::vector<Node::DOF>& get_dof_identifier() const = 0;
103 [[nodiscard]] virtual const std::vector<MappingDOF>& get_dof_mapping() const = 0;
104
105 [[nodiscard]] virtual bool validate_dof(const std::vector<Node::DOF>&) const = 0;
106 [[nodiscard]] virtual uvec index_of(const std::vector<Node::DOF>&) const = 0;
107
108 [[nodiscard]] virtual const uvec& get_material_tag() const = 0;
109 [[nodiscard]] virtual const uvec& get_section_tag() const = 0;
110
111 [[nodiscard]] virtual unsigned get_dof_number() const = 0;
112 [[nodiscard]] virtual unsigned get_node_number() const = 0;
113 [[nodiscard]] virtual unsigned get_total_number() const = 0;
114
115 virtual void clear_node_ptr() = 0;
116 [[nodiscard]] virtual const std::vector<std::weak_ptr<Node>>& get_node_ptr() const = 0;
117
118 [[nodiscard]] virtual mat get_coordinate() const = 0;
119 [[nodiscard]] virtual mat get_coordinate(unsigned) const = 0;
120
121 [[nodiscard]] virtual vec get_incre_displacement() const = 0;
122 [[nodiscard]] virtual vec get_incre_velocity() const = 0;
123 [[nodiscard]] virtual vec get_incre_acceleration() const = 0;
124 [[nodiscard]] virtual vec get_trial_displacement() const = 0;
125 [[nodiscard]] virtual vec get_trial_velocity() const = 0;
126 [[nodiscard]] virtual vec get_trial_acceleration() const = 0;
127 [[nodiscard]] virtual vec get_current_displacement() const = 0;
128 [[nodiscard]] virtual vec get_current_velocity() const = 0;
129 [[nodiscard]] virtual vec get_current_acceleration() const = 0;
130
131 [[nodiscard]] virtual const vec& get_trial_resistance() const = 0;
132 [[nodiscard]] virtual const vec& get_current_resistance() const = 0;
133 [[nodiscard]] virtual const vec& get_trial_damping_force() const = 0;
134 [[nodiscard]] virtual const vec& get_current_damping_force() const = 0;
135 [[nodiscard]] virtual const cx_mat& get_trial_nonviscous_force() const = 0;
136 [[nodiscard]] virtual const cx_mat& get_current_nonviscous_force() const = 0;
137 [[nodiscard]] virtual const vec& get_trial_inertial_force() = 0;
138 [[nodiscard]] virtual const vec& get_current_inertial_force() = 0;
139
140 [[nodiscard]] virtual const vec& get_trial_body_force() const = 0;
141 [[nodiscard]] virtual const vec& get_current_body_force() const = 0;
142 [[nodiscard]] virtual const vec& get_trial_traction() const = 0;
143 [[nodiscard]] virtual const vec& get_current_traction() const = 0;
144
145 [[nodiscard]] virtual const mat& get_trial_mass() const = 0;
146 [[nodiscard]] virtual const mat& get_trial_viscous() const = 0;
147 [[nodiscard]] virtual const mat& get_trial_nonviscous() const = 0;
148 [[nodiscard]] virtual const mat& get_trial_stiffness() const = 0;
149 [[nodiscard]] virtual const mat& get_trial_geometry() const = 0;
150 [[nodiscard]] virtual const mat& get_trial_secant() const = 0;
151
152 [[nodiscard]] virtual const mat& get_current_mass() const = 0;
153 [[nodiscard]] virtual const mat& get_current_viscous() const = 0;
154 [[nodiscard]] virtual const mat& get_current_nonviscous() const = 0;
155 [[nodiscard]] virtual const mat& get_current_stiffness() const = 0;
156 [[nodiscard]] virtual const mat& get_current_geometry() const = 0;
157 [[nodiscard]] virtual const mat& get_current_secant() const = 0;
158
159 [[nodiscard]] virtual const mat& get_initial_mass() const = 0;
160 [[nodiscard]] virtual const mat& get_initial_viscous() const = 0;
161 [[nodiscard]] virtual const mat& get_initial_nonviscous() const = 0;
162 [[nodiscard]] virtual const mat& get_initial_stiffness() const = 0;
163 [[nodiscard]] virtual const mat& get_initial_geometry() const = 0;
164 [[nodiscard]] virtual const mat& get_initial_secant() const = 0;
165
166 [[nodiscard]] virtual const mat& get_mass_container() const = 0;
167 [[nodiscard]] virtual const mat& get_stiffness_container() const = 0;
168
169 virtual int update_status() = 0;
170 virtual int clear_status() = 0;
171 virtual int commit_status() = 0;
172 virtual int reset_status() = 0;
173
174 virtual const vec& update_body_force(const vec&) = 0;
175 virtual const vec& update_traction(const vec&) = 0;
176
177 [[nodiscard]] virtual std::vector<vec> record(OutputType) const = 0;
178
179 [[nodiscard]] virtual double get_strain_energy() const = 0;
180 [[nodiscard]] virtual double get_complementary_energy() const = 0;
181 [[nodiscard]] virtual double get_kinetic_energy() const = 0;
182 [[nodiscard]] virtual double get_viscous_energy() const = 0;
183 [[nodiscard]] virtual double get_nonviscous_energy() const = 0;
184 [[nodiscard]] virtual const vec& get_momentum() const = 0;
185
186 [[nodiscard]] virtual double get_characteristic_length() const = 0;
187
188 [[nodiscard]] virtual double get(Parameter) const = 0;
189
190 [[nodiscard]] virtual mat compute_shape_function(const mat&, unsigned) const = 0;
191};
192
193#endif
194
OutputType
Definition OutputType.h:23
The DomainBase class is a template.
Definition DomainBase.h:94
A ElementBase class.
Definition ElementBase.h:42
virtual void update_dof_encoding()=0
virtual vec get_current_velocity() const =0
virtual const mat & get_current_mass() const =0
virtual bool is_initialized() const =0
virtual bool validate_dof(const std::vector< Node::DOF > &) const =0
virtual const mat & get_current_viscous() const =0
virtual const cx_mat & get_current_nonviscous_force() const =0
virtual const uvec & get_node_encoding() const =0
virtual double get_characteristic_length() const =0
virtual const vec & get_trial_traction() const =0
virtual const mat & get_initial_mass() const =0
virtual bool if_update_geometry() const =0
virtual vec get_node_trial_resistance() const =0
virtual unsigned get_total_number() const =0
virtual int initialize(const shared_ptr< DomainBase > &)=0
virtual mat compute_shape_function(const mat &, unsigned) const =0
Parameter
Definition ElementBase.h:64
virtual const mat & get_mass_container() const =0
virtual vec get_incre_displacement() const =0
virtual int reset_status()=0
virtual bool allow_modify_viscous() const =0
virtual double get_viscous_energy() const =0
virtual double get_kinetic_energy() const =0
virtual const mat & get_trial_viscous() const =0
virtual std::vector< shared_ptr< Section > > get_section(const shared_ptr< DomainBase > &) const =0
virtual const mat & get_initial_stiffness() const =0
virtual const uvec & get_dof_encoding() const =0
virtual void clear_node_ptr()=0
virtual bool if_update_nonviscous() const =0
virtual bool allow_modify_mass() const =0
virtual vec get_trial_acceleration() const =0
virtual const mat & get_current_nonviscous() const =0
virtual double get(Parameter) const =0
virtual double get_nonviscous_energy() const =0
virtual vec get_trial_displacement() const =0
virtual bool if_update_mass() const =0
virtual const vec & get_trial_inertial_force()=0
virtual const uvec & get_material_tag() const =0
virtual const vec & get_current_damping_force() const =0
virtual const mat & get_trial_stiffness() const =0
virtual const mat & get_trial_nonviscous() const =0
Type
Definition ElementBase.h:59
virtual vec get_incre_velocity() const =0
virtual void set_initialized(bool) const =0
virtual std::vector< vec > record(OutputType) const =0
virtual double get_complementary_energy() const =0
virtual const uvec & get_section_tag() const =0
virtual const mat & get_current_secant() const =0
virtual bool if_update_stiffness() const =0
virtual const std::vector< std::weak_ptr< Node > > & get_node_ptr() const =0
virtual const vec & get_current_inertial_force()=0
virtual int update_status()=0
virtual const vec & get_current_body_force() const =0
virtual const mat & get_initial_nonviscous() const =0
virtual uvec index_of(const std::vector< Node::DOF > &) const =0
virtual vec get_current_displacement() const =0
virtual const mat & get_trial_geometry() const =0
ElementBase(const unsigned T)
Definition ElementBase.h:73
virtual int initialize_base(const shared_ptr< DomainBase > &)=0
virtual void set_symmetric(bool) const =0
virtual const mat & get_initial_viscous() const =0
virtual const std::vector< MappingDOF > & get_dof_mapping() const =0
virtual const mat & get_current_geometry() const =0
virtual const mat & get_trial_secant() const =0
virtual bool is_nlgeom() const =0
virtual const vec & get_trial_resistance() const =0
virtual unsigned get_node_number() const =0
virtual const mat & get_current_stiffness() const =0
virtual const mat & get_initial_geometry() const =0
virtual const vec & get_momentum() const =0
virtual unsigned get_dof_number() const =0
virtual bool if_update_viscous() const =0
virtual int commit_status()=0
virtual vec get_node_current_resistance() const =0
virtual const vec & update_traction(const vec &)=0
virtual int clear_status()=0
virtual const vec & get_current_traction() const =0
virtual const vec & get_trial_damping_force() const =0
virtual vec get_node_incre_resistance() const =0
virtual vec get_trial_velocity() const =0
virtual mat get_coordinate() const =0
virtual const vec & get_current_resistance() const =0
virtual vec get_current_acceleration() const =0
virtual bool allow_modify_nonviscous() const =0
virtual const mat & get_initial_secant() const =0
virtual const mat & get_stiffness_container() const =0
virtual std::vector< shared_ptr< Material > > get_material(const shared_ptr< DomainBase > &) const =0
virtual const cx_mat & get_trial_nonviscous_force() const =0
virtual Type type() const =0
virtual const vec & get_trial_body_force() const =0
virtual vec get_incre_acceleration() const =0
virtual double get_strain_energy() const =0
virtual bool is_symmetric() const =0
virtual mat get_coordinate(unsigned) const =0
virtual const vec & update_body_force(const vec &)=0
virtual const mat & get_trial_mass() const =0
virtual const std::vector< Node::DOF > & get_dof_identifier() const =0
A Material abstract base class.
Definition Material.h:114
The Node class holds the number of DoFs, coordinate, displacement, velocity and acceleration.
Definition Node.h:79
A Section class.
Definition Section.h:77
Label objects that cannot be copied.
Definition Tag.h:88
The vtkBase class.
Definition vtkBase.h:41