suanPan
🧮 An Open Source, Parallel and Heterogeneous Finite Element Analysis Framework
Loading...
Searching...
No Matches
Element.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 ELEMENT_H
29#define ELEMENT_H
30
31#include <Element/Distributed.h>
32#include <Element/ElementBase.h>
33
34enum class MaterialType : unsigned;
35enum class SectionType : unsigned;
36
37// struct StateElement {
38// mat mass{};
39// mat damping{};
40// mat stiffness{};
41// mat geometry{};
42//
43// vec resistance{};
44// vec damping_force{};
45// vec inertial_force{};
46//
47// vec body_force{};
48// vec traction{};
49// };
50
52 const uvec node_encoding; // node encoding
53 const uvec material_tag; // material tags
54 const uvec section_tag; // section tags
55
56 const bool nlgeom = false; // nonlinear geometry switch
57
58 bool update_mass = true; // flag to indicate if update matrix
59 bool update_viscous = true; // flag to indicate if update matrix
60 bool update_nonviscous = true; // flag to indicate if update matrix
61 bool update_stiffness = true; // flag to indicate if update matrix
62 bool update_geometry = true; // flag to indicate if update matrix
63
64 bool modify_mass = true; // flag to indicate if modify matrix
65 bool modify_viscous = true; // flag to indicate if modify matrix
66 bool modify_nonviscous = true; // flag to indicate if modify matrix
67
68 uvec dof_encoding{}; // DoF encoding vector
69
70 mat initial_mass{}; // mass matrix
71 mat trial_mass{}; // mass matrix
72 mat current_mass{}; // mass matrix
73
74 mat initial_viscous{}; // viscous damping matrix
75 mat trial_viscous{}; // viscous damping matrix
76 mat current_viscous{}; // viscous damping matrix
77
78 mat initial_nonviscous{}; // nonviscous damping matrix
79 mat trial_nonviscous{}; // nonviscous damping matrix
80 mat current_nonviscous{}; // nonviscous damping matrix
81
82 mat initial_stiffness{}; // stiffness matrix
83 mat trial_stiffness{}; // stiffness matrix
84 mat current_stiffness{}; // stiffness matrix
85
86 mat initial_geometry{}; // geometry matrix
87 mat trial_geometry{}; // geometry matrix
88 mat current_geometry{}; // geometry matrix
89
90 vec trial_resistance{}; // resistance vector
91 vec current_resistance{}; // resistance vector
92 vec trial_viscous_force{}; // viscous damping force
93 vec current_viscous_force{}; // viscous damping force
94 cx_mat trial_nonviscous_force{}; // nonviscous damping force
95 cx_mat current_nonviscous_force{}; // nonviscous damping force
96 vec trial_inertial_force{}; // inertial force
97 vec current_inertial_force{}; // inertial force
98
103
105 mat traction{};
106
107 mat stiffness_container{}; // universal container to accommodate matrix based on modified stiffness matrix
108 mat mass_container{}; // universal container to accommodate matrix based on modified mass matrix
109
110 double strain_energy = 0.;
111 double kinetic_energy = 0.;
112 double viscous_energy = 0.;
113 double nonviscous_energy = 0.;
115 vec momentum{};
116
117 const double characteristic_length = 1.;
118};
119
120class Element : protected DataElement, public ElementBase, public Distributed {
121 const unsigned num_node; // number of nodes
122 const unsigned num_dof; // number of DoFs
123 const unsigned num_size = num_dof * num_node; // number of size
124
125 const bool initialized = false;
126 const bool symmetric = false;
127 const bool use_group = false;
128 const unsigned use_other = 0;
129
130 const MaterialType material_type;
131 const SectionType section_type;
132
133 const std::vector<Node::DOF> dof_identifier;
134
135 std::vector<MappingDOF> dof_mapping;
136
137 friend void ConstantMass(DataElement*);
138 friend void ConstantDamping(DataElement*);
139 friend void ConstantStiffness(DataElement*);
140 friend void ConstantGeometry(DataElement*);
141
142 void update_strain_energy() override;
143 void update_kinetic_energy() override;
144 void update_viscous_energy() override;
145 void update_nonviscous_energy() override;
146 void update_complementary_energy() override;
147 void update_momentum() override;
148
149 void validate() const;
150
151protected:
152 std::vector<std::weak_ptr<Node>> node_ptr; // node pointers
153
154 [[nodiscard]] vec get_node_incre_resistance() const override;
155 [[nodiscard]] vec get_node_trial_resistance() const override;
156 [[nodiscard]] vec get_node_current_resistance() const override;
157
158 [[nodiscard]] std::vector<shared_ptr<Material>> get_material(const shared_ptr<DomainBase>&) const override;
159 [[nodiscard]] std::vector<shared_ptr<Section>> get_section(const shared_ptr<DomainBase>&) const override;
160
161public:
162 Element(
163 unsigned, // tag
164 unsigned, // number of nodes
165 unsigned, // number of dofs
166 uvec&&, // node encoding
167 std::vector<Node::DOF>&& // dof identifier
168 );
169 Element(
170 unsigned, // tag
171 unsigned, // number of nodes
172 unsigned, // number of dofs
173 uvec&&, // node encoding
174 uvec&&, // material tags
175 bool, // nonlinear geometry switch
176 MaterialType, // material type for internal check
177 std::vector<Node::DOF>&& // dof identifier
178 );
179 Element(
180 unsigned, // tag
181 unsigned, // number of nodes
182 unsigned, // number of dofs
183 uvec&&, // node encoding
184 uvec&&, // section tags
185 bool, // nonlinear geometry switch
186 SectionType, // section type for internal check
187 std::vector<Node::DOF>&& // dof identifier
188 );
189 Element(
190 unsigned, // tag
191 unsigned, // number of dofs
192 uvec&&, // group encoding
193 std::vector<Node::DOF>&& // dof identifier
194 );
195 Element(
196 unsigned, // tag
197 unsigned, // number of dofs
198 unsigned, // other element tag
199 unsigned, // node tag
200 std::vector<Node::DOF>&& // dof identifier
201 );
202
203 int initialize_base(const shared_ptr<DomainBase>&) final;
204
205 void set_initialized(bool) const override;
206 void set_symmetric(bool) const override;
207 [[nodiscard]] bool is_initialized() const override;
208 [[nodiscard]] bool is_symmetric() const override;
209 [[nodiscard]] bool is_nlgeom() const override;
210
211 [[nodiscard]] Type type() const override;
212
213 void update_dof_encoding() override;
214
215 [[nodiscard]] bool if_update_mass() const override;
216 [[nodiscard]] bool if_update_viscous() const override;
217 [[nodiscard]] bool if_update_nonviscous() const override;
218 [[nodiscard]] bool if_update_stiffness() const override;
219 [[nodiscard]] bool if_update_geometry() const override;
220
221 [[nodiscard]] bool allow_modify_mass() const override;
222 [[nodiscard]] bool allow_modify_viscous() const override;
223 [[nodiscard]] bool allow_modify_nonviscous() const override;
224
225 [[nodiscard]] const uvec& get_dof_encoding() const override;
226 [[nodiscard]] const uvec& get_node_encoding() const override;
227
228 [[nodiscard]] const std::vector<Node::DOF>& get_dof_identifier() const override;
229 [[nodiscard]] const std::vector<MappingDOF>& get_dof_mapping() const override;
230
231 [[nodiscard]] bool validate_dof(const std::vector<Node::DOF>&) const override;
232 [[nodiscard]] uvec index_of(const std::vector<Node::DOF>&) const override;
233
234 [[nodiscard]] const uvec& get_material_tag() const override;
235 [[nodiscard]] const uvec& get_section_tag() const override;
236
237 [[nodiscard]] unsigned get_dof_number() const override;
238 [[nodiscard]] unsigned get_node_number() const override;
239 [[nodiscard]] unsigned get_total_number() const override;
240
241 void clear_node_ptr() override;
242 [[nodiscard]] const std::vector<std::weak_ptr<Node>>& get_node_ptr() const override;
243
244 [[nodiscard]] mat get_coordinate() const override;
245 [[nodiscard]] mat get_coordinate(unsigned) const override;
246
247 [[nodiscard]] vec get_incre_displacement() const override;
248 [[nodiscard]] vec get_incre_velocity() const override;
249 [[nodiscard]] vec get_incre_acceleration() const override;
250 [[nodiscard]] vec get_trial_displacement() const override;
251 [[nodiscard]] vec get_trial_velocity() const override;
252 [[nodiscard]] vec get_trial_acceleration() const override;
253 [[nodiscard]] vec get_current_displacement() const override;
254 [[nodiscard]] vec get_current_velocity() const override;
255 [[nodiscard]] vec get_current_acceleration() const override;
256
257 [[nodiscard]] const vec& get_trial_resistance() const override;
258 [[nodiscard]] const vec& get_current_resistance() const override;
259 [[nodiscard]] const vec& get_trial_damping_force() const override;
260 [[nodiscard]] const vec& get_current_damping_force() const override;
261 [[nodiscard]] const cx_mat& get_trial_nonviscous_force() const override;
262 [[nodiscard]] const cx_mat& get_current_nonviscous_force() const override;
263 [[nodiscard]] const vec& get_trial_inertial_force() override;
264 [[nodiscard]] const vec& get_current_inertial_force() override;
265
266 [[nodiscard]] const vec& get_trial_body_force() const override;
267 [[nodiscard]] const vec& get_current_body_force() const override;
268 [[nodiscard]] const vec& get_trial_traction() const override;
269 [[nodiscard]] const vec& get_current_traction() const override;
270
271 [[nodiscard]] const mat& get_trial_mass() const override;
272 [[nodiscard]] const mat& get_trial_viscous() const override;
273 [[nodiscard]] const mat& get_trial_nonviscous() const override;
274 [[nodiscard]] const mat& get_trial_stiffness() const override;
275 [[nodiscard]] const mat& get_trial_geometry() const override;
276 [[nodiscard]] const mat& get_trial_secant() const override;
277
278 [[nodiscard]] const mat& get_current_mass() const override;
279 [[nodiscard]] const mat& get_current_viscous() const override;
280 [[nodiscard]] const mat& get_current_nonviscous() const override;
281 [[nodiscard]] const mat& get_current_stiffness() const override;
282 [[nodiscard]] const mat& get_current_geometry() const override;
283 [[nodiscard]] const mat& get_current_secant() const override;
284
285 [[nodiscard]] const mat& get_initial_mass() const override;
286 [[nodiscard]] const mat& get_initial_viscous() const override;
287 [[nodiscard]] const mat& get_initial_nonviscous() const override;
288 [[nodiscard]] const mat& get_initial_stiffness() const override;
289 [[nodiscard]] const mat& get_initial_geometry() const override;
290 [[nodiscard]] const mat& get_initial_secant() const override;
291
292 [[nodiscard]] const mat& get_mass_container() const override;
293 [[nodiscard]] const mat& get_stiffness_container() const override;
294
295 int clear_status() override = 0;
296 int commit_status() override = 0;
297 int reset_status() override = 0;
298
299 const vec& update_body_force(const vec&) override;
300 const vec& update_traction(const vec&) override;
301
302 [[nodiscard]] std::vector<vec> record(OutputType) const override;
303
304 [[nodiscard]] double get_strain_energy() const override;
305 [[nodiscard]] double get_complementary_energy() const override;
306 [[nodiscard]] double get_kinetic_energy() const override;
307 [[nodiscard]] double get_viscous_energy() const override;
308 [[nodiscard]] double get_nonviscous_energy() const override;
309 [[nodiscard]] const vec& get_momentum() const override;
310
311 [[nodiscard]] double get_characteristic_length() const override;
312 [[nodiscard]] double get(Parameter) const override;
313
314 [[nodiscard]] mat compute_shape_function(const mat&, unsigned) const override;
315};
316
317#endif
318
OutputType
Definition OutputType.h:23
Definition Distributed.h:23
A ElementBase class.
Definition ElementBase.h:42
Parameter
Definition ElementBase.h:64
Type
Definition ElementBase.h:59
A Element class.
Definition Element.h:120
friend void ConstantGeometry(DataElement *)
Definition Element.cpp:44
std::vector< shared_ptr< Section > > get_section(const shared_ptr< DomainBase > &) const override
Definition Element.cpp:139
uvec index_of(const std::vector< Node::DOF > &) const override
Definition Element.cpp:337
const vec & get_current_resistance() const override
Definition Element.cpp:496
std::vector< vec > record(OutputType) const override
Definition Element.cpp:633
const std::vector< Node::DOF > & get_dof_identifier() const override
Definition Element.cpp:326
void update_dof_encoding() override
Definition Element.cpp:290
std::vector< shared_ptr< Material > > get_material(const shared_ptr< DomainBase > &) const override
Definition Element.cpp:133
unsigned get_dof_number() const override
Definition Element.cpp:349
const mat & get_initial_mass() const override
Definition Element.cpp:548
unsigned get_node_number() const override
Definition Element.cpp:351
const std::vector< std::weak_ptr< Node > > & get_node_ptr() const override
Definition Element.cpp:357
const mat & get_current_viscous() const override
Definition Element.cpp:538
bool allow_modify_nonviscous() const override
Definition Element.cpp:320
const uvec & get_node_encoding() const override
Definition Element.cpp:324
const vec & get_current_traction() const override
Definition Element.cpp:522
bool validate_dof(const std::vector< Node::DOF > &) const override
Definition Element.cpp:330
const uvec & get_dof_encoding() const override
Definition Element.cpp:322
const vec & get_current_inertial_force() override
Definition Element.cpp:511
void clear_node_ptr() override
Definition Element.cpp:355
const vec & get_trial_body_force() const override
Definition Element.cpp:516
vec get_node_current_resistance() const override
Definition Element.cpp:120
const mat & get_trial_stiffness() const override
Definition Element.cpp:530
const vec & get_current_damping_force() const override
Definition Element.cpp:500
friend void ConstantDamping(DataElement *)
Definition Element.cpp:32
double get(Parameter) const override
Definition Element.cpp:649
vec get_current_velocity() const override
Definition Element.cpp:468
vec get_trial_velocity() const override
Definition Element.cpp:429
const mat & get_stiffness_container() const override
Definition Element.cpp:562
vec get_current_acceleration() const override
Definition Element.cpp:481
const mat & get_initial_stiffness() const override
Definition Element.cpp:554
const vec & get_current_body_force() const override
Definition Element.cpp:518
double get_characteristic_length() const override
Definition Element.cpp:647
const vec & get_trial_inertial_force() override
Definition Element.cpp:506
bool if_update_viscous() const override
Definition Element.cpp:308
const cx_mat & get_trial_nonviscous_force() const override
Definition Element.cpp:502
vec get_incre_acceleration() const override
Definition Element.cpp:403
bool is_symmetric() const override
Definition Element.cpp:284
bool if_update_stiffness() const override
Definition Element.cpp:312
int initialize_base(const shared_ptr< DomainBase > &) final
Definition Element.cpp:192
const std::vector< MappingDOF > & get_dof_mapping() const override
Definition Element.cpp:328
const vec & get_momentum() const override
Definition Element.cpp:645
const vec & get_trial_damping_force() const override
Definition Element.cpp:498
vec get_current_displacement() const override
Definition Element.cpp:455
friend void ConstantMass(DataElement *)
Definition Element.cpp:26
Type type() const override
Definition Element.cpp:288
const mat & get_initial_secant() const override
Definition Element.cpp:558
double get_nonviscous_energy() const override
Definition Element.cpp:643
const mat & get_current_geometry() const override
Definition Element.cpp:544
const mat & get_initial_viscous() const override
Definition Element.cpp:550
bool is_nlgeom() const override
Definition Element.cpp:286
const mat & get_current_mass() const override
Definition Element.cpp:536
vec get_trial_acceleration() const override
Definition Element.cpp:442
unsigned get_total_number() const override
Definition Element.cpp:353
const mat & get_trial_geometry() const override
Definition Element.cpp:532
int reset_status() override=0
Definition Element.cpp:615
bool allow_modify_viscous() const override
Definition Element.cpp:318
const mat & get_trial_nonviscous() const override
Definition Element.cpp:528
vec get_trial_displacement() const override
Definition Element.cpp:416
double get_viscous_energy() const override
Definition Element.cpp:641
friend void ConstantStiffness(DataElement *)
Definition Element.cpp:38
const mat & get_trial_secant() const override
Definition Element.cpp:534
vec get_incre_velocity() const override
Definition Element.cpp:390
const vec & update_body_force(const vec &) override
Definition Element.cpp:629
int clear_status() override=0
Definition Element.cpp:564
double get_strain_energy() const override
Definition Element.cpp:635
const mat & get_initial_nonviscous() const override
Definition Element.cpp:552
bool if_update_mass() const override
Definition Element.cpp:306
void set_initialized(bool) const override
Definition Element.cpp:278
const vec & get_trial_resistance() const override
Definition Element.cpp:494
vec get_node_trial_resistance() const override
Definition Element.cpp:107
bool allow_modify_mass() const override
Definition Element.cpp:316
bool is_initialized() const override
Definition Element.cpp:282
const mat & get_trial_mass() const override
Definition Element.cpp:524
const cx_mat & get_current_nonviscous_force() const override
Definition Element.cpp:504
mat get_coordinate() const override
Definition Element.cpp:359
const uvec & get_material_tag() const override
Definition Element.cpp:345
vec get_incre_displacement() const override
Definition Element.cpp:377
double get_complementary_energy() const override
Definition Element.cpp:637
vec get_node_incre_resistance() const override
Definition Element.cpp:94
const mat & get_current_nonviscous() const override
Definition Element.cpp:540
const mat & get_trial_viscous() const override
Definition Element.cpp:526
const vec & get_trial_traction() const override
Definition Element.cpp:520
const mat & get_initial_geometry() const override
Definition Element.cpp:556
const mat & get_current_stiffness() const override
Definition Element.cpp:542
int commit_status() override=0
Definition Element.cpp:595
const mat & get_current_secant() const override
Definition Element.cpp:546
mat compute_shape_function(const mat &, unsigned) const override
Definition Element.cpp:651
double get_kinetic_energy() const override
Definition Element.cpp:639
bool if_update_nonviscous() const override
Definition Element.cpp:310
bool if_update_geometry() const override
Definition Element.cpp:314
std::vector< std::weak_ptr< Node > > node_ptr
Definition Element.h:152
const mat & get_mass_container() const override
Definition Element.cpp:560
const uvec & get_section_tag() const override
Definition Element.cpp:347
void set_symmetric(bool) const override
Definition Element.cpp:280
const vec & update_traction(const vec &) override
Definition Element.cpp:631
MaterialType
Definition Material.h:37
SectionType
Definition Section.h:33
Definition Element.h:51
bool modify_nonviscous
Definition Element.h:66
cx_mat trial_nonviscous_force
Definition Element.h:94
vec trial_traction
Definition Element.h:101
uvec dof_encoding
Definition Element.h:68
bool update_stiffness
Definition Element.h:61
mat traction
Definition Element.h:105
mat trial_stiffness
Definition Element.h:83
bool update_geometry
Definition Element.h:62
bool modify_viscous
Definition Element.h:65
double nonviscous_energy
Definition Element.h:113
vec current_body_force
Definition Element.h:100
const uvec section_tag
Definition Element.h:54
mat trial_mass
Definition Element.h:71
bool update_mass
Definition Element.h:58
double complementary_energy
Definition Element.h:114
mat initial_viscous
Definition Element.h:74
cx_mat current_nonviscous_force
Definition Element.h:95
mat current_viscous
Definition Element.h:76
double viscous_energy
Definition Element.h:112
vec current_resistance
Definition Element.h:91
mat initial_nonviscous
Definition Element.h:78
mat stiffness_container
Definition Element.h:107
vec momentum
Definition Element.h:115
vec trial_body_force
Definition Element.h:99
bool update_viscous
Definition Element.h:59
vec current_viscous_force
Definition Element.h:93
mat initial_stiffness
Definition Element.h:82
const double characteristic_length
Definition Element.h:117
const bool nlgeom
Definition Element.h:56
vec current_inertial_force
Definition Element.h:97
mat mass_container
Definition Element.h:108
vec trial_viscous_force
Definition Element.h:92
const uvec node_encoding
Definition Element.h:52
double strain_energy
Definition Element.h:110
bool update_nonviscous
Definition Element.h:60
mat trial_viscous
Definition Element.h:75
mat body_force
Definition Element.h:104
const uvec material_tag
Definition Element.h:53
mat current_nonviscous
Definition Element.h:80
mat initial_geometry
Definition Element.h:86
vec trial_inertial_force
Definition Element.h:96
mat trial_geometry
Definition Element.h:87
mat current_mass
Definition Element.h:72
mat current_geometry
Definition Element.h:88
mat current_stiffness
Definition Element.h:84
vec trial_resistance
Definition Element.h:90
mat trial_nonviscous
Definition Element.h:79
bool modify_mass
Definition Element.h:64
vec current_traction
Definition Element.h:102
mat initial_mass
Definition Element.h:70
double kinetic_energy
Definition Element.h:111