suanPan
Loading...
Searching...
No Matches
Material.h
Go to the documentation of this file.
1/*******************************************************************************
2 * Copyright (C) 2017-2025 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 "ParameterType.h"
32
33#include <Domain/Tag.h>
34#include <array>
35
36using pod2 = std::array<double, 2>;
37using pod6 = std::array<double, 6>;
38
39enum class MaterialType : unsigned {
40 D0 = 0,
41 D1 = 1,
42 D2 = 3,
43 D3 = 6,
44 DS = 10,
45 OS = 3
46};
47
48enum class PlaneType : unsigned {
49 S = 1,
50 E = 2,
51 A = 3,
52 N = 0
53};
54
55class DomainBase;
56enum class OutputType;
57
61
64
67
68 mat initial_couple_stiffness{}; // stiffness matrix
69 mat current_couple_stiffness{}; // stiffness matrix
70 mat trial_couple_stiffness{}; // stiffness matrix
71};
72
74 const double density = 0.;
77
78 const double tolerance = 1E-14;
79 const double characteristic_length = -1.;
80
81 vec current_strain{}; // current status
82 vec current_strain_rate{}; // current status
83 vec current_strain_acc{}; // current status
84 vec current_stress{}; // current status
85 // vec current_stress_rate{}; // current status
86
87 vec trial_strain{}; // trial status
88 vec trial_strain_rate{}; // trial status
89 vec trial_strain_acc{}; // trial status
90 vec trial_stress{}; // trial status
91 // vec trial_stress_rate{}; // trial status
92
93 vec incre_strain{}; // incremental status
94 vec incre_strain_rate{}; // incremental status
95 vec incre_strain_acc{}; // incremental status
96 vec incre_stress{}; // incremental 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 Tag {
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 explicit Material(
129 unsigned = 0, // tag
130 MaterialType = MaterialType::D0, // material type
131 double = 0. // density
132 );
133 Material(const Material&) = default;
134 Material(Material&&) = delete; // move forbidden
135 Material& operator=(const Material&) = delete; // assign forbidden
136 Material& operator=(Material&&) = delete; // assign forbidden
137
138 ~Material() override = default;
139
140 [[nodiscard]] double get_density() const;
141 [[nodiscard]] MaterialType get_material_type() const;
142 [[nodiscard]] PlaneType get_plane_type() const;
143
144 int initialize_base(const shared_ptr<DomainBase>&);
145
146 virtual int initialize(const shared_ptr<DomainBase>&) = 0;
147 virtual void initialize_couple(const shared_ptr<DomainBase>&);
148
149 virtual void initialize_history(unsigned);
150 virtual void set_initial_history(const vec&);
151
152 void set_initialized(bool) const;
153 void set_symmetric(bool) const;
154 void set_support_couple(bool) const;
155 [[nodiscard]] bool is_initialized() const;
156 [[nodiscard]] bool is_symmetric() const;
157 [[nodiscard]] bool is_support_couple() const;
158
159 void set_characteristic_length(double) const;
160 [[nodiscard]] double get_characteristic_length() const;
161
162 [[nodiscard]] virtual double get_parameter(ParameterType) const;
163
164 virtual const vec& get_trial_strain();
165 virtual const vec& get_trial_strain_rate();
166 virtual const vec& get_trial_strain_acc();
167 virtual const vec& get_trial_stress();
168 virtual const mat& get_trial_stiffness();
169 virtual const mat& get_trial_secant();
170 virtual const mat& get_trial_damping();
171 virtual const mat& get_trial_inertial();
172
173 virtual const vec& get_current_strain();
174 virtual const vec& get_current_strain_rate();
175 virtual const vec& get_current_strain_acc();
176 virtual const vec& get_current_stress();
177 virtual const mat& get_current_stiffness();
178 virtual const mat& get_current_secant();
179 virtual const mat& get_current_damping();
180 virtual const mat& get_current_inertial();
181
182 [[nodiscard]] virtual const vec& get_initial_history() const;
183 [[nodiscard]] virtual const mat& get_initial_stiffness() const;
184 [[nodiscard]] virtual const mat& get_initial_damping() const;
185 [[nodiscard]] virtual const mat& get_initial_inertial() const;
186
187 virtual const vec& get_trial_curvature();
188 virtual const vec& get_trial_couple_stress();
189 virtual const mat& get_trial_couple_stiffness();
190
191 virtual const vec& get_current_curvature();
192 virtual const vec& get_current_couple_stress();
193 virtual const mat& get_current_couple_stiffness();
194
195 [[nodiscard]] virtual const mat& get_initial_couple_stiffness() const;
196
197 virtual unique_ptr<Material> get_copy() = 0;
198
199 int update_incre_status(double);
200 int update_incre_status(double, double);
201 int update_incre_status(double, double, double);
202 int update_trial_status(double);
203 int update_trial_status(double, double);
204 int update_trial_status(double, double, double);
205
206 virtual int update_incre_status(const vec&);
207 virtual int update_incre_status(const vec&, const vec&);
208 virtual int update_incre_status(const vec&, const vec&, const vec&);
209 virtual int update_trial_status(const vec&);
210 virtual int update_trial_status(const vec&, const vec&);
211 virtual int update_trial_status(const vec&, const vec&, const vec&);
212
213 int update_couple_incre_status(double);
214 int update_couple_incre_status(double, double);
215 int update_couple_incre_status(double, double, double);
216 int update_couple_trial_status(double);
217 int update_couple_trial_status(double, double);
218 int update_couple_trial_status(double, double, double);
219
220 virtual int update_couple_incre_status(const vec&);
221 virtual int update_couple_incre_status(const vec&, const vec&);
222 virtual int update_couple_incre_status(const vec&, const vec&, const vec&);
223 virtual int update_couple_trial_status(const vec&);
224 virtual int update_couple_trial_status(const vec&, const vec&);
225 virtual int update_couple_trial_status(const vec&, const vec&, const vec&);
226
227 virtual int clear_status() = 0;
228 virtual int commit_status() = 0;
229 virtual int reset_status() = 0;
230
231 virtual int clear_couple_status();
232 virtual int commit_couple_status();
233 virtual int reset_couple_status();
234
235 virtual std::vector<vec> record(OutputType);
236};
237
238namespace suanpan {
239 unique_ptr<Material> make_copy(const shared_ptr<Material>&);
240 unique_ptr<Material> make_copy(const unique_ptr<Material>&);
241} // namespace suanpan
242
243#endif
244
OutputType
Definition OutputType.h:23
ParameterType
Definition ParameterType.h:21
The DomainBase class is a template.
Definition DomainBase.h:104
A Material abstract base class.
Definition Material.h:116
virtual const vec & get_trial_couple_stress()
Definition Material.cpp:127
virtual const vec & get_current_strain_acc()
Definition Material.cpp:105
friend void ConstantCoupleStiffness(DataCoupleMaterial *)
Definition Material.cpp:319
friend void ConstantInertial(DataMaterial *)
Definition Material.cpp:314
int update_couple_incre_status(double)
Definition Material.cpp:172
virtual int reset_couple_status()
Definition Material.cpp:285
virtual const mat & get_current_couple_stiffness()
Definition Material.cpp:135
virtual int commit_status()=0
Definition Material.cpp:231
virtual void initialize_couple(const shared_ptr< DomainBase > &)
Definition Material.cpp:51
virtual int commit_couple_status()
Definition Material.cpp:277
double get_characteristic_length() const
Definition Material.cpp:75
PlaneType get_plane_type() const
Definition Material.cpp:31
virtual int clear_couple_status()
Definition Material.cpp:265
virtual int initialize(const shared_ptr< DomainBase > &)=0
virtual const mat & get_current_stiffness()
Definition Material.cpp:109
virtual int clear_status()=0
Definition Material.cpp:199
virtual const vec & get_trial_strain()
Definition Material.cpp:79
virtual std::vector< vec > record(OutputType)
Definition Material.cpp:293
virtual const mat & get_initial_couple_stiffness() const
Definition Material.cpp:137
friend void ConstantDamping(DataMaterial *)
Definition Material.cpp:309
~Material() override=default
virtual const vec & get_trial_stress()
Definition Material.cpp:85
virtual int reset_status()=0
Definition Material.cpp:248
virtual const vec & get_current_strain()
Definition Material.cpp:101
Material(const Material &)=default
virtual const mat & get_initial_stiffness() const
Definition Material.cpp:119
void set_support_couple(bool) const
Definition Material.cpp:65
virtual const mat & get_trial_couple_stiffness()
Definition Material.cpp:129
bool is_support_couple() const
Definition Material.cpp:71
friend void PureWrapper(Material *)
Definition Material.cpp:324
virtual const mat & get_current_damping()
Definition Material.cpp:113
Material(Material &&)=delete
virtual const mat & get_current_inertial()
Definition Material.cpp:115
virtual const mat & get_trial_inertial()
Definition Material.cpp:99
virtual unique_ptr< Material > get_copy()=0
Definition Material.cpp:139
virtual const mat & get_initial_damping() const
Definition Material.cpp:121
Material & operator=(const Material &)=delete
virtual const vec & get_initial_history() const
Definition Material.cpp:117
virtual const vec & get_current_couple_stress()
Definition Material.cpp:133
MaterialType get_material_type() const
Definition Material.cpp:29
virtual const vec & get_trial_curvature()
Definition Material.cpp:125
bool is_symmetric() const
Definition Material.cpp:69
bool is_initialized() const
Definition Material.cpp:67
void set_symmetric(bool) const
Definition Material.cpp:63
friend void ConstantStiffness(DataMaterial *)
Definition Material.cpp:304
virtual const mat & get_trial_damping()
Definition Material.cpp:97
int update_trial_status(double)
Definition Material.cpp:147
virtual void initialize_history(unsigned)
Definition Material.cpp:53
int update_couple_trial_status(double)
Definition Material.cpp:178
Material & operator=(Material &&)=delete
virtual const mat & get_trial_stiffness()
Definition Material.cpp:87
int update_incre_status(double)
Definition Material.cpp:141
virtual const mat & get_trial_secant()
Definition Material.cpp:89
virtual const vec & get_current_stress()
Definition Material.cpp:107
void set_characteristic_length(double) const
Definition Material.cpp:73
virtual void set_initial_history(const vec &)
Definition Material.cpp:59
virtual const vec & get_current_strain_rate()
Definition Material.cpp:103
void set_initialized(bool) const
Definition Material.cpp:61
virtual double get_parameter(ParameterType) const
Definition Material.cpp:77
int initialize_base(const shared_ptr< DomainBase > &)
Definition Material.cpp:33
virtual const vec & get_current_curvature()
Definition Material.cpp:131
double get_density() const
Definition Material.cpp:27
virtual const vec & get_trial_strain_rate()
Definition Material.cpp:81
virtual const mat & get_initial_inertial() const
Definition Material.cpp:123
virtual const vec & get_trial_strain_acc()
Definition Material.cpp:83
virtual const mat & get_current_secant()
Definition Material.cpp:111
A base Tag class.
Definition Tag.h:38
std::array< double, 2 > pod2
Definition Material.h:36
std::array< double, 6 > pod6
Definition Material.h:37
MaterialType
Definition Material.h:39
PlaneType
Definition Material.h:48
Definition MatrixModifier.hpp:36
unique_ptr< Material > make_copy(const shared_ptr< Material > &)
Definition Material.cpp:370
Definition Material.h:58
mat current_couple_stiffness
Definition Material.h:69
vec trial_curvature
Definition Material.h:62
vec incre_couple_stress
Definition Material.h:66
mat trial_couple_stiffness
Definition Material.h:70
vec incre_curvature
Definition Material.h:65
vec current_couple_stress
Definition Material.h:60
mat initial_couple_stiffness
Definition Material.h:68
vec current_curvature
Definition Material.h:59
vec trial_couple_stress
Definition Material.h:63
Definition Material.h:73
mat current_inertial
Definition Material.h:112
vec trial_strain_acc
Definition Material.h:89
vec current_strain
Definition Material.h:81
vec incre_stress
Definition Material.h:96
mat initial_stiffness
Definition Material.h:103
const double density
Definition Material.h:74
mat initial_inertial
Definition Material.h:111
const double characteristic_length
Definition Material.h:79
const MaterialType material_type
Definition Material.h:75
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:94
vec incre_strain_acc
Definition Material.h:95
vec current_stress
Definition Material.h:84
const PlaneType plane_type
Definition Material.h:76
vec trial_strain
Definition Material.h:87
vec trial_stress
Definition Material.h:90
mat trial_stiffness
Definition Material.h:105
mat current_stiffness
Definition Material.h:104
vec current_strain_rate
Definition Material.h:82
vec current_strain_acc
Definition Material.h:83
vec incre_strain
Definition Material.h:93
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:88
const double tolerance
Definition Material.h:78