suanPan
🧮 An Open Source, Parallel and Heterogeneous Finite Element Analysis Framework
Loading...
Searching...
No Matches
Node.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 ******************************************************************************/
38#ifndef NODE_H
39#define NODE_H
40
41#include <Domain/Tag.h>
42
43class DomainBase;
44enum class OutputType;
45
46struct NodeData {
47 unsigned num_dof{0u}; // number of DoFs
48
49 vec coordinate; // coordinates of the node
50
51 uvec original_dof; // original indices
52 uvec reordered_dof; // renumbered indices
53
54 vec current_resistance; // current resistance
55 vec current_damping_force; // current damping force
56 vec current_nonviscous_force; // current damping force
57 vec current_inertial_force; // current inertial force
58 vec current_displacement; // current displacement
59 vec current_velocity; // current velocity
60 vec current_acceleration; // current acceleration
61
62 vec incre_resistance; // incremental resistance
63 vec incre_damping_force; // incremental damping force
64 vec incre_nonviscous_force; // incremental damping force
65 vec incre_inertial_force; // incremental inertial force
66 vec incre_displacement; // incremental displacement
67 vec incre_velocity; // incremental velocity
68 vec incre_acceleration; // incremental acceleration
69
70 vec trial_resistance; // trial resistance
71 vec trial_damping_force; // trial damping force
72 vec trial_nonviscous_force; // trial damping force
73 vec trial_inertial_force; // trial inertial force
74 vec trial_displacement; // trial displacement
75 vec trial_velocity; // trial velocity
76 vec trial_acceleration; // trial acceleration
77};
78
79class Node final : protected NodeData, public UniqueTag {
80public:
81 enum class DOF : std::uint8_t {
82 NONE,
83 U1, // displacement in x direction
84 U2, // displacement in y direction
85 U3, // displacement in z direction
86 UR1, // rotation in x direction
87 UR2, // rotation in y direction
88 UR3, // rotation in z direction
89 FU1, // fluid displacement
90 FU2, // fluid displacement
91 FU3, // fluid displacement
92 FUR1, // fluid rotation
93 FUR2, // fluid rotation
94 FUR3, // fluid rotation
95 RADIAL, // radius direction in axis-symmetric problem
96 AXIAL, // axial direction in axis-symmetric problem or single section elements
97 RS, // strong axis rotation
98 RW, // weak axis rotation
99 DAMAGE, // damage
100 PRESSURE, // pressure
101 TEMPERATURE, // temperature
102 WARP // warping
103 };
104
105private:
106 std::mutex node_mutex;
107
108 std::vector<DOF> dof_identifier;
109
110public:
111 Node(unsigned, vec&&);
112
113 void initialize(const shared_ptr<DomainBase>&);
114
115 void deinitialize();
116
117 void ensure_dof(unsigned, const std::vector<DOF>&);
118 [[nodiscard]] bool validate_dof(const std::vector<DOF>&) const;
119 [[nodiscard]] std::vector<uword> get_dof(const std::vector<DOF>&) const;
120
121 void set_original_dof(unsigned&);
122 [[nodiscard]] const uvec& get_original_dof() const;
123
124 void set_reordered_dof(const uvec&);
125 [[nodiscard]] const uvec& get_reordered_dof() const;
126
127 [[nodiscard]] const vec& get_coordinate() const;
128
129 [[nodiscard]] const vec& get_current_resistance() const;
130 [[nodiscard]] const vec& get_current_damping_force() const;
131 [[nodiscard]] const vec& get_current_nonviscous_force() const;
132 [[nodiscard]] const vec& get_current_inertial_force() const;
133 [[nodiscard]] const vec& get_current_displacement() const;
134 [[nodiscard]] const vec& get_current_velocity() const;
135 [[nodiscard]] const vec& get_current_acceleration() const;
136
137 [[nodiscard]] const vec& get_incre_resistance() const;
138 [[nodiscard]] const vec& get_incre_damping_force() const;
139 [[nodiscard]] const vec& get_incre_nonviscous_force() const;
140 [[nodiscard]] const vec& get_incre_inertial_force() const;
141 [[nodiscard]] const vec& get_incre_displacement() const;
142 [[nodiscard]] const vec& get_incre_velocity() const;
143 [[nodiscard]] const vec& get_incre_acceleration() const;
144
145 [[nodiscard]] const vec& get_trial_resistance() const;
146 [[nodiscard]] const vec& get_trial_damping_force() const;
147 [[nodiscard]] const vec& get_trial_nonviscous_force() const;
148 [[nodiscard]] const vec& get_trial_inertial_force() const;
149 [[nodiscard]] const vec& get_trial_displacement() const;
150 [[nodiscard]] const vec& get_trial_velocity() const;
151 [[nodiscard]] const vec& get_trial_acceleration() const;
152
153 [[nodiscard]] vec get_current_resistance(unsigned) const;
154 [[nodiscard]] vec get_current_damping_force(unsigned) const;
155 [[nodiscard]] vec get_current_nonviscous_force(unsigned) const;
156 [[nodiscard]] vec get_current_inertial_force(unsigned) const;
157 [[nodiscard]] vec get_current_displacement(unsigned) const;
158 [[nodiscard]] vec get_current_velocity(unsigned) const;
159 [[nodiscard]] vec get_current_acceleration(unsigned) const;
160
161 [[nodiscard]] vec get_incre_resistance(unsigned) const;
162 [[nodiscard]] vec get_incre_damping_force(unsigned) const;
163 [[nodiscard]] vec get_incre_nonviscous_force(unsigned) const;
164 [[nodiscard]] vec get_incre_inertial_force(unsigned) const;
165 [[nodiscard]] vec get_incre_displacement(unsigned) const;
166 [[nodiscard]] vec get_incre_velocity(unsigned) const;
167 [[nodiscard]] vec get_incre_acceleration(unsigned) const;
168
169 [[nodiscard]] vec get_trial_resistance(unsigned) const;
170 [[nodiscard]] vec get_trial_damping_force(unsigned) const;
171 [[nodiscard]] vec get_trial_nonviscous_force(unsigned) const;
172 [[nodiscard]] vec get_trial_inertial_force(unsigned) const;
173 [[nodiscard]] vec get_trial_displacement(unsigned) const;
174 [[nodiscard]] vec get_trial_velocity(unsigned) const;
175 [[nodiscard]] vec get_trial_acceleration(unsigned) const;
176
177 [[nodiscard]] vec initial_position(unsigned) const;
178 [[nodiscard]] vec current_position(unsigned) const;
179 [[nodiscard]] vec trial_position(unsigned) const;
180
181 const vec& update_current_resistance(vec&&);
182 const vec& update_current_damping_force(vec&&);
183 const vec& update_current_nonviscous_force(vec&&);
184 const vec& update_current_inertial_force(vec&&);
185 const vec& update_current_displacement(vec&&);
186 const vec& update_current_velocity(vec&&);
187 const vec& update_current_acceleration(vec&&);
188
189 const vec& update_incre_resistance(vec&&);
190 const vec& update_incre_damping_force(vec&&);
191 const vec& update_incre_nonviscous_force(vec&&);
192 const vec& update_incre_inertial_force(vec&&);
193 const vec& update_incre_displacement(vec&&);
194 const vec& update_incre_velocity(vec&&);
195 const vec& update_incre_acceleration(vec&&);
196
197 const vec& update_trial_resistance(vec&&);
198 const vec& update_trial_damping_force(vec&&);
199 const vec& update_trial_nonviscous_force(vec&&);
200 const vec& update_trial_inertial_force(vec&&);
201 const vec& update_trial_displacement(vec&&);
202 const vec& update_trial_velocity(vec&&);
203 const vec& update_trial_acceleration(vec&&);
204
205 void update_current_status(const vec&);
206 void update_current_status(const vec&, const vec&);
207 void update_current_status(const vec&, const vec&, const vec&);
208
209 void update_incre_status(const vec&);
210 void update_incre_status(const vec&, const vec&);
211 void update_incre_status(const vec&, const vec&, const vec&);
212
213 void update_trial_status(const vec&);
214 void update_trial_status(const vec&, const vec&);
215 void update_trial_status(const vec&, const vec&, const vec&);
216
217 void commit_status();
218 void reset_status();
219 void clear_status();
220
221 [[nodiscard]] std::vector<vec> record(OutputType) const;
222
223 void print() override;
224};
225
226namespace suanpan {
227#if defined(__GNUC__) && (__GNUC__ < 12)
228 inline
229#else
230 constexpr inline
231#endif
232 std::vector<Node::DOF>
233 translational(const unsigned dimension) {
234 return 2u == dimension ? std::vector{Node::DOF::U1, Node::DOF::U2} : std::vector{Node::DOF::U1, Node::DOF::U2, Node::DOF::U3};
235 }
236
237#if defined(__GNUC__) && (__GNUC__ < 12)
238 inline
239#else
240 constexpr inline
241#endif
242 std::vector<Node::DOF>
243 mechanical(const unsigned dimension) {
245 }
246} // namespace suanpan
247
248#endif
249
OutputType
Definition OutputType.h:23
The DomainBase class is a template.
Definition DomainBase.h:94
The Node class holds the number of DoFs, coordinate, displacement, velocity and acceleration.
Definition Node.h:79
const vec & update_trial_velocity(vec &&)
Definition Node.cpp:309
const vec & get_incre_damping_force() const
Definition Node.cpp:121
const vec & update_trial_nonviscous_force(vec &&)
Definition Node.cpp:291
vec trial_position(unsigned) const
Definition Node.cpp:193
const vec & update_trial_resistance(vec &&)
Definition Node.cpp:279
const vec & update_trial_inertial_force(vec &&)
Definition Node.cpp:297
const vec & get_coordinate() const
Definition Node.cpp:103
DOF
Definition Node.h:81
const uvec & get_original_dof() const
Definition Node.cpp:97
const vec & get_trial_acceleration() const
Definition Node.cpp:145
const vec & get_trial_resistance() const
Definition Node.cpp:133
const vec & get_incre_resistance() const
Definition Node.cpp:119
const vec & get_trial_damping_force() const
Definition Node.cpp:135
const vec & update_trial_damping_force(vec &&)
Definition Node.cpp:285
const vec & get_current_nonviscous_force() const
Definition Node.cpp:109
const vec & get_trial_nonviscous_force() const
Definition Node.cpp:137
const vec & update_current_displacement(vec &&)
Definition Node.cpp:219
void print() override
Definition Node.cpp:472
const vec & update_current_damping_force(vec &&)
Definition Node.cpp:201
const vec & get_incre_inertial_force() const
Definition Node.cpp:125
void update_trial_status(const vec &)
Definition Node.cpp:345
const vec & update_trial_acceleration(vec &&)
Definition Node.cpp:315
void update_current_status(const vec &)
Definition Node.cpp:321
const vec & update_incre_damping_force(vec &&)
Definition Node.cpp:243
const vec & get_incre_nonviscous_force() const
Definition Node.cpp:123
vec initial_position(unsigned) const
Definition Node.cpp:189
void set_reordered_dof(const uvec &)
Definition Node.cpp:99
const vec & update_current_inertial_force(vec &&)
Definition Node.cpp:213
const vec & update_incre_nonviscous_force(vec &&)
Definition Node.cpp:249
const vec & update_current_velocity(vec &&)
Definition Node.cpp:225
const vec & update_incre_resistance(vec &&)
Definition Node.cpp:237
const uvec & get_reordered_dof() const
Definition Node.cpp:101
const vec & get_incre_velocity() const
Definition Node.cpp:129
void reset_status()
Definition Node.cpp:388
const vec & get_current_resistance() const
Definition Node.cpp:105
const vec & update_current_resistance(vec &&)
Definition Node.cpp:195
const vec & update_current_nonviscous_force(vec &&)
Definition Node.cpp:207
const vec & get_incre_displacement() const
Definition Node.cpp:127
const vec & get_trial_inertial_force() const
Definition Node.cpp:139
const vec & get_current_displacement() const
Definition Node.cpp:113
void deinitialize()
Definition Node.cpp:56
const vec & get_trial_displacement() const
Definition Node.cpp:141
void clear_status()
Definition Node.cpp:419
bool validate_dof(const std::vector< DOF > &) const
Definition Node.cpp:73
void commit_status()
Definition Node.cpp:357
const vec & update_incre_acceleration(vec &&)
Definition Node.cpp:273
std::vector< vec > record(OutputType) const
Definition Node.cpp:457
const vec & get_current_velocity() const
Definition Node.cpp:115
const vec & update_current_acceleration(vec &&)
Definition Node.cpp:231
const vec & get_current_acceleration() const
Definition Node.cpp:117
const vec & update_incre_displacement(vec &&)
Definition Node.cpp:261
const vec & get_current_damping_force() const
Definition Node.cpp:107
const vec & update_trial_displacement(vec &&)
Definition Node.cpp:303
const vec & get_trial_velocity() const
Definition Node.cpp:143
const vec & get_current_inertial_force() const
Definition Node.cpp:111
void ensure_dof(unsigned, const std::vector< DOF > &)
Definition Node.cpp:61
vec current_position(unsigned) const
Definition Node.cpp:191
std::vector< uword > get_dof(const std::vector< DOF > &) const
Definition Node.cpp:80
const vec & update_incre_inertial_force(vec &&)
Definition Node.cpp:255
void set_original_dof(unsigned &)
Definition Node.cpp:92
const vec & get_incre_acceleration() const
Definition Node.cpp:131
void initialize(const shared_ptr< DomainBase > &)
This method should be called after elements are set. Elements will set the minimum number of DoFs for...
Definition Node.cpp:31
const vec & update_incre_velocity(vec &&)
Definition Node.cpp:267
void update_incre_status(const vec &)
Definition Node.cpp:333
Label objects that cannot be copied.
Definition Tag.h:88
Definition SparseMatMAGMA.hpp:43
constexpr std::vector< Node::DOF > translational(const unsigned dimension)
Definition Node.h:233
constexpr std::vector< Node::DOF > mechanical(const unsigned dimension)
Definition Node.h:243
Definition Node.h:46
unsigned num_dof
Definition Node.h:47
vec incre_displacement
Definition Node.h:66
vec trial_damping_force
Definition Node.h:71
vec incre_resistance
Definition Node.h:62
vec trial_nonviscous_force
Definition Node.h:72
vec current_resistance
Definition Node.h:54
vec incre_inertial_force
Definition Node.h:65
vec current_damping_force
Definition Node.h:55
vec current_displacement
Definition Node.h:58
vec trial_acceleration
Definition Node.h:76
vec current_velocity
Definition Node.h:59
vec current_acceleration
Definition Node.h:60
vec trial_inertial_force
Definition Node.h:73
vec trial_displacement
Definition Node.h:74
vec trial_velocity
Definition Node.h:75
vec current_inertial_force
Definition Node.h:57
uvec original_dof
Definition Node.h:51
vec incre_nonviscous_force
Definition Node.h:64
vec incre_velocity
Definition Node.h:67
vec coordinate
Definition Node.h:49
vec incre_damping_force
Definition Node.h:63
uvec reordered_dof
Definition Node.h:52
vec current_nonviscous_force
Definition Node.h:56
vec incre_acceleration
Definition Node.h:68
vec trial_resistance
Definition Node.h:70