suanPan
🧮 An Open Source, Parallel and Heterogeneous Finite Element Analysis Framework
Loading...
Searching...
No Matches
Material.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 MATERIAL_H
29#define MATERIAL_H
30
31#include <Domain/Tag.h>
32#include <array>
33
34using pod2 = std::array<double, 2>;
35using pod6 = std::array<double, 6>;
36
37enum class MaterialType : unsigned {
38 D0 = 0,
39 D1 = 1,
40 D2 = 3,
41 D3 = 6,
42 DS = 10,
43 OS = 3
44};
45
46enum class PlaneType : unsigned {
47 S = 1,
48 E = 2,
49 A = 3,
50 N = 0
51};
52
53class DomainBase;
54enum class OutputType;
55
59
62
65
66 mat initial_couple_stiffness{}; // stiffness matrix
67 mat current_couple_stiffness{}; // stiffness matrix
68 mat trial_couple_stiffness{}; // stiffness matrix
69};
70
72 const double density = 0.;
75
76 const double tolerance = 1E-14;
77 const double characteristic_length = -1.;
78
79 vec current_strain{}; // current status
80 vec trial_strain{}; // trial status
81 vec incre_strain{}; // incremental status
82
83 vec current_strain_rate{}; // current status
84 vec trial_strain_rate{}; // trial status
85 vec incre_strain_rate{}; // incremental status
86
87 vec current_strain_acc{}; // current status
88 vec trial_strain_acc{}; // trial status
89 vec incre_strain_acc{}; // incremental status
90
91 vec current_stress{}; // current status
92 vec trial_stress{}; // trial status
93 vec incre_stress{}; // incremental status
94
95 // vec current_stress_rate{}; // current status
96 // vec trial_stress_rate{}; // trial status
97 // vec incre_stress_rate{}; // incremental status
98
99 vec initial_history{}; // initial status
100 vec current_history{}; // current status
101 vec trial_history{}; // trial status
102
103 mat initial_stiffness{}; // stiffness matrix
104 mat current_stiffness{}; // stiffness matrix
105 mat trial_stiffness{}; // stiffness matrix
106
107 mat initial_damping{}; // damping matrix
108 mat current_damping{}; // damping matrix
109 mat trial_damping{}; // damping matrix
110
111 mat initial_inertial{}; // inertial matrix
112 mat current_inertial{}; // inertial matrix
113 mat trial_inertial{}; // inertial matrix
114};
115
116class Material : protected DataMaterial, protected DataCoupleMaterial, public CopyableTag {
117 const bool initialized = false;
118 const bool symmetric = false;
119 const bool support_couple = false; // indicate if the material supports couple stress theory
120
121 friend void ConstantStiffness(DataMaterial*);
122 friend void ConstantDamping(DataMaterial*);
123 friend void ConstantInertial(DataMaterial*);
125 friend void PureWrapper(Material*);
126
127public:
128 enum class Parameter {
129 ELASTIC,
130 POISSON,
131 SHEAR,
132 BULK,
135 };
136
137 explicit Material(
138 unsigned = 0, // tag
139 MaterialType = MaterialType::D0, // material type
140 double = 0. // density
141 );
142
143 [[nodiscard]] double get_density() const;
144 [[nodiscard]] MaterialType get_material_type() const;
145 [[nodiscard]] PlaneType get_plane_type() const;
146
147 int initialize_base(const shared_ptr<DomainBase>&);
148
149 virtual int initialize(const shared_ptr<DomainBase>&) = 0;
150 virtual void initialize_couple(const shared_ptr<DomainBase>&);
151
152 virtual void initialize_history(unsigned);
153 virtual void set_initial_history(const vec&);
154
155 void set_initialized(bool) const;
156 void set_symmetric(bool) const;
157 void set_support_couple(bool) const;
158 [[nodiscard]] bool is_initialized() const;
159 [[nodiscard]] bool is_symmetric() const;
160 [[nodiscard]] bool is_support_couple() const;
161
162 void set_characteristic_length(double) const;
163 [[nodiscard]] double get_characteristic_length() const;
164
165 [[nodiscard]] virtual double get(Parameter) const;
166
167 virtual const vec& get_trial_strain();
168 virtual const vec& get_trial_strain_rate();
169 virtual const vec& get_trial_strain_acc();
170 virtual const vec& get_trial_stress();
171 virtual const mat& get_trial_stiffness();
172 virtual const mat& get_trial_secant();
173 virtual const mat& get_trial_damping();
174 virtual const mat& get_trial_inertial();
175
176 virtual const vec& get_current_strain();
177 virtual const vec& get_current_strain_rate();
178 virtual const vec& get_current_strain_acc();
179 virtual const vec& get_current_stress();
180 virtual const mat& get_current_stiffness();
181 virtual const mat& get_current_secant();
182 virtual const mat& get_current_damping();
183 virtual const mat& get_current_inertial();
184
185 [[nodiscard]] virtual const vec& get_initial_history() const;
186 [[nodiscard]] virtual const mat& get_initial_stiffness() const;
187 [[nodiscard]] virtual const mat& get_initial_damping() const;
188 [[nodiscard]] virtual const mat& get_initial_inertial() const;
189
190 virtual const vec& get_trial_curvature();
191 virtual const vec& get_trial_couple_stress();
192 virtual const mat& get_trial_couple_stiffness();
193
194 virtual const vec& get_current_curvature();
195 virtual const vec& get_current_couple_stress();
196 virtual const mat& get_current_couple_stiffness();
197
198 [[nodiscard]] virtual const mat& get_initial_couple_stiffness() const;
199
200 virtual unique_ptr<Material> unique_copy() = 0;
201
202 int update_incre_status(double);
203 int update_incre_status(double, double);
204 int update_incre_status(double, double, double);
205 int update_trial_status(double);
206 int update_trial_status(double, double);
207 int update_trial_status(double, double, double);
208
209 virtual int update_incre_status(const vec&);
210 virtual int update_incre_status(const vec&, const vec&);
211 virtual int update_incre_status(const vec&, const vec&, const vec&);
212 virtual int update_trial_status(const vec&);
213 virtual int update_trial_status(const vec&, const vec&);
214 virtual int update_trial_status(const vec&, const vec&, const vec&);
215
216 int update_couple_incre_status(double);
217 int update_couple_incre_status(double, double);
218 int update_couple_incre_status(double, double, double);
219 int update_couple_trial_status(double);
220 int update_couple_trial_status(double, double);
221 int update_couple_trial_status(double, double, double);
222
223 virtual int update_couple_incre_status(const vec&);
224 virtual int update_couple_incre_status(const vec&, const vec&);
225 virtual int update_couple_incre_status(const vec&, const vec&, const vec&);
226 virtual int update_couple_trial_status(const vec&);
227 virtual int update_couple_trial_status(const vec&, const vec&);
228 virtual int update_couple_trial_status(const vec&, const vec&, const vec&);
229
230 virtual int clear_status() = 0;
231 virtual int commit_status() = 0;
232 virtual int reset_status() = 0;
233
234 virtual int clear_couple_status();
235 virtual int commit_couple_status();
236 virtual int reset_couple_status();
237
238 [[nodiscard]] virtual std::vector<vec> record(OutputType) const;
239
240protected:
241 class prop {
242 const double e, v;
243
244 public:
245 prop(const double E, const double P)
246 : e(E)
247 , v(P) {}
248
249 double operator()(const Parameter P) const {
250 switch(P) {
252 return e;
254 return v;
255 case Parameter::SHEAR:
256 return e / (2. + 2. * v);
257 case Parameter::BULK:
258 return e / (3. - 6. * v);
261 default:
262 return 0.;
263 }
264 }
265 };
266};
267
268namespace suanpan {
269 unique_ptr<Material> unique_copy(const shared_ptr<Material>&);
270} // namespace suanpan
271
272#endif
273
OutputType
Definition OutputType.h:23
Label objects that can be copied.
Definition Tag.h:73
The DomainBase class is a template.
Definition DomainBase.h:96
Definition Material.h:241
prop(const double E, const double P)
Definition Material.h:245
double operator()(const Parameter P) const
Definition Material.h:249
A Material abstract base class.
Definition Material.h:116
virtual const vec & get_trial_couple_stress()
Definition Material.cpp:128
virtual const vec & get_current_strain_acc()
Definition Material.cpp:106
friend void ConstantCoupleStiffness(DataCoupleMaterial *)
Definition Material.cpp:320
friend void ConstantInertial(DataMaterial *)
Definition Material.cpp:315
int update_couple_incre_status(double)
Definition Material.cpp:173
virtual int reset_couple_status()
Definition Material.cpp:286
virtual const mat & get_current_couple_stiffness()
Definition Material.cpp:136
virtual int commit_status()=0
Definition Material.cpp:232
virtual void initialize_couple(const shared_ptr< DomainBase > &)
Definition Material.cpp:52
virtual int commit_couple_status()
Definition Material.cpp:278
double get_characteristic_length() const
Definition Material.cpp:76
PlaneType get_plane_type() const
Definition Material.cpp:32
virtual int clear_couple_status()
Definition Material.cpp:266
virtual int initialize(const shared_ptr< DomainBase > &)=0
virtual const mat & get_current_stiffness()
Definition Material.cpp:110
virtual int clear_status()=0
Definition Material.cpp:200
virtual const vec & get_trial_strain()
Definition Material.cpp:80
virtual const mat & get_initial_couple_stiffness() const
Definition Material.cpp:138
friend void ConstantDamping(DataMaterial *)
Definition Material.cpp:310
virtual std::vector< vec > record(OutputType) const
Definition Material.cpp:294
virtual const vec & get_trial_stress()
Definition Material.cpp:86
virtual int reset_status()=0
Definition Material.cpp:249
virtual const vec & get_current_strain()
Definition Material.cpp:102
virtual const mat & get_initial_stiffness() const
Definition Material.cpp:120
void set_support_couple(bool) const
Definition Material.cpp:66
virtual const mat & get_trial_couple_stiffness()
Definition Material.cpp:130
bool is_support_couple() const
Definition Material.cpp:72
friend void PureWrapper(Material *)
Definition Material.cpp:325
virtual unique_ptr< Material > unique_copy()=0
Definition Material.cpp:140
virtual const mat & get_current_damping()
Definition Material.cpp:114
virtual const mat & get_current_inertial()
Definition Material.cpp:116
virtual const mat & get_trial_inertial()
Definition Material.cpp:100
virtual const mat & get_initial_damping() const
Definition Material.cpp:122
virtual const vec & get_initial_history() const
Definition Material.cpp:118
virtual double get(Parameter) const
Definition Material.cpp:78
virtual const vec & get_current_couple_stress()
Definition Material.cpp:134
MaterialType get_material_type() const
Definition Material.cpp:30
virtual const vec & get_trial_curvature()
Definition Material.cpp:126
bool is_symmetric() const
Definition Material.cpp:70
bool is_initialized() const
Definition Material.cpp:68
void set_symmetric(bool) const
Definition Material.cpp:64
friend void ConstantStiffness(DataMaterial *)
Definition Material.cpp:305
virtual const mat & get_trial_damping()
Definition Material.cpp:98
int update_trial_status(double)
Definition Material.cpp:148
virtual void initialize_history(unsigned)
Definition Material.cpp:54
int update_couple_trial_status(double)
Definition Material.cpp:179
virtual const mat & get_trial_stiffness()
Definition Material.cpp:88
int update_incre_status(double)
Definition Material.cpp:142
virtual const mat & get_trial_secant()
Definition Material.cpp:90
virtual const vec & get_current_stress()
Definition Material.cpp:108
void set_characteristic_length(double) const
Definition Material.cpp:74
virtual void set_initial_history(const vec &)
Definition Material.cpp:60
virtual const vec & get_current_strain_rate()
Definition Material.cpp:104
void set_initialized(bool) const
Definition Material.cpp:62
int initialize_base(const shared_ptr< DomainBase > &)
Definition Material.cpp:34
virtual const vec & get_current_curvature()
Definition Material.cpp:132
double get_density() const
Definition Material.cpp:28
Parameter
Definition Material.h:128
virtual const vec & get_trial_strain_rate()
Definition Material.cpp:82
virtual const mat & get_initial_inertial() const
Definition Material.cpp:124
virtual const vec & get_trial_strain_acc()
Definition Material.cpp:84
virtual const mat & get_current_secant()
Definition Material.cpp:112
std::array< double, 2 > pod2
Definition Material.h:34
std::array< double, 6 > pod6
Definition Material.h:35
MaterialType
Definition Material.h:37
PlaneType
Definition Material.h:46
Definition SparseMatMAGMA.hpp:43
unique_ptr< Material > unique_copy(const shared_ptr< Material > &)
Definition Material.cpp:371
Definition Material.h:56
mat current_couple_stiffness
Definition Material.h:67
vec trial_curvature
Definition Material.h:60
vec incre_couple_stress
Definition Material.h:64
mat trial_couple_stiffness
Definition Material.h:68
vec incre_curvature
Definition Material.h:63
vec current_couple_stress
Definition Material.h:58
mat initial_couple_stiffness
Definition Material.h:66
vec current_curvature
Definition Material.h:57
vec trial_couple_stress
Definition Material.h:61
Definition Material.h:71
mat current_inertial
Definition Material.h:112
vec trial_strain_acc
Definition Material.h:88
vec current_strain
Definition Material.h:79
vec incre_stress
Definition Material.h:93
mat initial_stiffness
Definition Material.h:103
const double density
Definition Material.h:72
mat initial_inertial
Definition Material.h:111
const double characteristic_length
Definition Material.h:77
const MaterialType material_type
Definition Material.h:73
vec current_history
Definition Material.h:100
mat current_damping
Definition Material.h:108
mat trial_damping
Definition Material.h:109
mat trial_inertial
Definition Material.h:113
vec incre_strain_rate
Definition Material.h:85
vec incre_strain_acc
Definition Material.h:89
vec current_stress
Definition Material.h:91
const PlaneType plane_type
Definition Material.h:74
vec trial_strain
Definition Material.h:80
vec trial_stress
Definition Material.h:92
mat trial_stiffness
Definition Material.h:105
mat current_stiffness
Definition Material.h:104
vec current_strain_rate
Definition Material.h:83
vec current_strain_acc
Definition Material.h:87
vec incre_strain
Definition Material.h:81
vec trial_history
Definition Material.h:101
mat initial_damping
Definition Material.h:107
vec initial_history
Definition Material.h:99
vec trial_strain_rate
Definition Material.h:84
const double tolerance
Definition Material.h:76