21#ifndef B2_MATERIAL_UTIL_H_
22#define B2_MATERIAL_UTIL_H_
29#include "utils/b2linear_algebra.H"
30#include "utils/b2rtable.H"
43inline void set_field_value_strain(
46 const T strain_storage[6] = {strain[0], strain[1], strain[2],
47 T(.5) * strain[3], T(.5) * strain[4], T(.5) * strain[5]};
52inline void set_field_value_shell_strain(
55 const T strain_storage[8] = {
56 strain[0], strain[1], strain[2], strain[3],
57 strain[4], strain[5], T(.5) * strain[6], T(.5) * strain[7],
63inline void set_field_value_strain_2(
66 const T strain_normal) {
67 const T strain_storage[6] = {strain_2d[0], strain_2d[1], strain_normal,
68 T(.5) * strain_2d[2], T(0), T(0)};
73inline void set_field_value_stress_2(
76 const T stress_normal) {
77 const T stress_storage[6] = {stress_2d[0], stress_2d[1], stress_normal,
78 stress_2d[2], T(0), T(0)};
84namespace b2000 {
namespace b2dbv3 {
170 assert(material_ref != 0);
171 std::copy(&material_ref[0][0], &material_ref[0][0] + 9, &
M[0][0]);
178 assert(covariant_base != 0);
180 b2000::get_base_opposite_variance(
G,
G_d);
214 const bool planestress,
const T strain[6],
const T temperature,
const T alpha[6]) {
221 if (alpha != 0 && temperature != 0) {
262 const T stress_mat[6],
263 const T d_stress_d_strain_mat[21], T stress[6], T d_stress_d_strain[21]) {
264 if (d_stress_d_strain != 0) {
265 assert(d_stress_d_strain_mat != 0);
266 transform_constitutive_tensor_from_base_A_ov_to_base_B(
267 M,
G_d, d_stress_d_strain_mat, d_stress_d_strain);
273 if (stress_mat != 0) {
277 assert(d_stress_d_strain_mat != 0);
278 b2linalg::Matrix<T, b2linalg::Mlower_packed_constref> C_mat(6, d_stress_d_strain_mat);
280 b2linalg::Vector<T, b2linalg::Vdense_ref> s_mat(6,
stress_pk2_mat);
281 s_mat = C_mat * e_mat;
284 if (stress != 0) { transform_stress_from_I_to_base_B(
G_d,
stress_pk2_bg, stress); }
304 const bool linear,
const T displacement_gradient[3][3],
307 if (failure_criterion !=
nullptr) {
308 if (failure_criterion->
get_type() == FailureCriterion::STRESS) {
317 if (gradient_container ==
nullptr) {
return; }
320 if (!linear && displacement_gradient != 0) {
321 T deformation_gradient[3][3] = {};
328 &displacement_gradient[0][0], &displacement_gradient[0][0] + 9,
329 &deformation_gradient[0][0]);
331 deformation_gradient[0][0] += 1;
332 deformation_gradient[1][1] += 1;
333 deformation_gradient[2][2] += 1;
336 T deformation_gradient_aligned_ortho[3][3];
338 deformation_gradient,
M, deformation_gradient_aligned_ortho);
339 b2000::transform_stress_from_base_A_ov_to_I(
342 transform_stress_from_base_A_ov_to_I(
356 "e1x.e1y.e1z.e2x.e2y.e2z.e3x.e3y.e3z",
357 "Material base vectors, undeformed configuration",
375 "Exx.Eyy.Ezz.Exy.Eyz.Exz",
376 "Green-Lagrange/linear strain, global reference frame, no thermal expansion",
384 set_field_value_strain(gradient_container, descr,
strain_gl_bg);
391 "Exx.Eyy.Ezz.Exy.Eyz.Exz",
392 "Green-Lagrange/linear strain, material reference frame, no thermal expansion",
400 set_field_value_strain(gradient_container, descr,
strain_gl_mat);
407 "Exx.Eyy.Ezz.Exy.Eyz.Exz",
408 "Green-Lagrange/linear strain, global reference frame, thermal expansion",
423 "STRAIN_MECHANICAL_MATERIAL",
424 "Exx.Eyy.Ezz.Exy.Eyz.Exz",
425 "Green-Lagrange/linear strain, material reference frame, thermal expansion",
440 "Sxx.Syy.Szz.Sxy.Syz.Sxz",
441 "Cauchy/linear stress, global reference frame",
456 "Sxx.Syy.Szz.Sxy.Syz.Sxz",
457 "Cauchy/linear stress, material reference frame",
473 "Sxx.Syy.Szz.Sxy.Syz.Sxz",
474 "Second-Piola Kirchhoff stress, global reference frame",
489 "STRESS_PK2_MATERIAL",
490 "Sxx.Syy.Szz.Sxy.Syz.Sxz",
491 "Second-Piola Kirchhoff stress in the material reference frame",
506 "Elastic.Kinetic.RateDissipated.Dissipated",
507 "Free elastic, kinetic, rate of dissipated energy and "
508 "dissipated energy, per unit volume, in the undeformed "
519 const T e[4] = {0.5 * es, 0, 0, 0};
587 assert(material_ref != 0);
588 std::copy(&material_ref[0][0], &material_ref[0][0] + 9, &
M[0][0]);
595 assert(covariant_base != 0);
597 get_base_opposite_variance(
G,
G_d);
625 void set_strain(
const T strain[8],
const T temperature,
const T alpha[8]) {
629 b2000::transform_shell_strain_from_base_A_to_base_B(
G,
M, strain,
strain_gl_mat);
631 if (alpha != 0 && temperature != 0) {
672 const T stress_mat[8],
673 const T d_stress_d_strain_mat[36], T stress[8], T d_stress_d_strain[36]) {
674 if (d_stress_d_strain != 0) {
675 assert(d_stress_d_strain_mat != 0);
676 transform_shell_constitutive_tensor_from_base_A_ov_to_base_B(
677 M,
G_d, d_stress_d_strain_mat, d_stress_d_strain);
683 if (stress_mat != 0) {
687 assert(d_stress_d_strain_mat != 0);
688 b2linalg::Matrix<T, b2linalg::Mlower_packed_constref> C_mat(8, d_stress_d_strain_mat);
690 b2linalg::Vector<T, b2linalg::Vdense_ref> s_mat(8,
stress_pk2_mat);
691 s_mat = C_mat * e_mat;
721 if (gradient_container ==
nullptr) {
return; }
729 "e1x.e1y.e1z.e2x.e2y.e2z.e3x.e3y.e3z",
730 "Material base vectors, undeformed configuration",
747 "STRAIN_SHELL_MATERIAL",
748 "Mxx.Myy.Mxy.Bxx.Byy.Bxy.Tyz.Txz",
749 "Green-Lagrange/linear strain, material reference "
750 "frame, no thermal expansion",
758 set_field_value_shell_strain(gradient_container, descr,
strain_gl_mat);
763 "STRESS_SHELL_MATERIAL",
764 "Mxx.Myy.Mxy.Bxx.Byy.Bxy.Tyz.Txz",
765 "Second Piola-Kirchhoff/linear stress, material "
766 "reference frame, no thermal expansion",
872 assert(material_ref != 0);
873 std::copy(&material_ref[0][0], &material_ref[0][0] + 4, &
M[0][0]);
879 assert(covariant_base != 0);
881 b2000::get_base_opposite_variance(
G,
G_d);
914 void set_strain(
const T strain[3],
const T temperature,
const T alpha[3]) {
956 const T stress_mat[3],
957 const T d_stress_d_strain_mat[6], T stress[3], T d_stress_d_strain[6]) {
958 if (d_stress_d_strain) {
959 assert(d_stress_d_strain_mat != 0);
960 transform_constitutive_tensor_from_base_A_ov_to_base_B(
961 M,
G_d, d_stress_d_strain_mat, d_stress_d_strain);
967 if (stress_mat != 0) {
971 assert(d_stress_d_strain_mat != 0);
972 b2linalg::Matrix<T, b2linalg::Mlower_packed_constref> C_mat(3, d_stress_d_strain_mat);
974 b2linalg::Vector<T, b2linalg::Vdense_ref> s_mat(3,
stress_pk2_mat);
975 s_mat = C_mat * e_mat;
978 if (stress != 0) { transform_stress_from_I_to_base_B(
G_d,
stress_pk2_bg, stress); }
998 const bool linear,
const T displacement_gradient[2][2],
1001 if (failure_criterion) {
1002 if (failure_criterion->
get_type() == FailureCriterion::STRESS) {
1003 const T stress_pk2_mat_6[6] = {
1006 failure_criterion->
process_stress(stress_pk2_mat_6, gradient_container);
1008 const T strain_gl_mat_6[6] = {
1011 failure_criterion->
process_strain(strain_gl_mat_6,
false, gradient_container);
1015 if (!gradient_container) {
return; }
1018 if (!linear && displacement_gradient) {
1019 T deformation_gradient[2][2] = {};
1024 &displacement_gradient[0][0], &displacement_gradient[0][0] + 4,
1025 &deformation_gradient[0][0]);
1027 deformation_gradient[0][0] += 1;
1028 deformation_gradient[1][1] += 1;
1031 T deformation_gradient_aligned_ortho[2][2];
1033 deformation_gradient,
M, deformation_gradient_aligned_ortho);
1034 b2000::transform_stress_from_base_A_ov_to_I(
1037 b2000::transform_stress_from_base_A_ov_to_I(
1051 "e1x.e1y.e1z.e2x.e2y.e2z.e3x.e3y.e3z",
1052 "Material base vectors, undeformed configuration",
1060 T mbase_3_3[3][3] = {
1061 {
M[0][0],
M[0][1], 0.},
1062 {
M[1][0],
M[1][1], 0.},
1075 "Exx.Eyy.Ezz.Exy.Eyz.Exz",
1076 "Green-Lagrange/linear strain, global reference "
1077 "frame, no thermal expansion",
1092 "Exx.Eyy.Ezz.Exy.Eyz.Exz",
1093 "Green-Lagrange/linear strain, material reference "
1094 "frame, no thermal expansion",
1108 "STRAIN_MECHANICAL",
1109 "Exx.Eyy.Ezz.Exy.Eyz.Exz",
1110 "Green-Lagrange/linear strain, global reference "
1111 "frame, thermal expansion",
1126 "STRAIN_MECHANICAL_MATERIAL",
1127 "Exx.Eyy.Ezz.Exy.Eyz.Exz",
1128 "Green-Lagrange/linear strain, material reference "
1129 "frame, thermal expansion",
1137 set_field_value_strain_2(
1145 "Sxx.Syy.Szz.Sxy.Syz.Sxz",
1146 "Cauchy/linear stress, global reference frame",
1154 set_field_value_stress_2(
1162 "Sxx.Syy.Szz.Sxy.Syz.Sxz",
1163 "Cauchy/linear stress, material reference frame",
1172 set_field_value_stress_2(
1180 "Sxx.Syy.Szz.Sxy.Syz.Sxz",
1181 "Second-Piola Kirchhoff stress, global reference frame",
1196 "STRESS_PK2_MATERIAL",
1197 "Sxx.Syy.Szz.Sxy.Syz.Sxz",
1198 "Second-Piola Kirchhoff stress, material reference frame",
1213 "Elastic.Kinetic.RateDissipated.Dissipated",
1214 "Free elastic, kinetic, rate of dissipated energy and "
1215 "dissipated energy, per unit volume, in the undeformed "
1233template <
typename T>
1235 std::string not_supported;
1239 T d_stress_d_strain_mat[21];
1243 LayerData() : isotropic(
true), orthotropic(
false), anisotropic(
false), density(0) {
1244 std::fill_n(d_stress_d_strain_mat, 21, 0.);
1245 std::fill_n(alpha, 6, 0.);
1248 void init_25d(
const RTable& rtable,
const std::string& prefix =
"") {
1249 const std::string sub_type = rtable.
get_string(prefix +
"SUBTYPE");
1250 isotropic = (sub_type ==
"ISOTROPIC");
1251 orthotropic = (sub_type ==
"ORTHOTROPIC" || sub_type ==
"ORTHOTROPIC25D");
1252 anisotropic = (sub_type ==
"ANISOTROPIC");
1254 const T sh = rtable.
get<T>(prefix +
"SHEAR_CORRECTION_FACTOR", T(5) / T(6));
1259 d_stress_d_strain_mat[0] = rtable.
get<T>(prefix +
"C1111", 0.);
1260 d_stress_d_strain_mat[1] = rtable.
get<T>(prefix +
"C1122", 0.);
1261 d_stress_d_strain_mat[2] = rtable.
get<T>(prefix +
"C1133", 0.);
1262 d_stress_d_strain_mat[3] = rtable.
get<T>(prefix +
"C1112", 0.);
1263 d_stress_d_strain_mat[4] = rtable.
get<T>(prefix +
"C1123", 0.);
1264 d_stress_d_strain_mat[5] = rtable.
get<T>(prefix +
"C1113", 0.);
1265 d_stress_d_strain_mat[6] = rtable.
get<T>(prefix +
"C2222", 0.);
1266 d_stress_d_strain_mat[7] = rtable.
get<T>(prefix +
"C2233", 0.);
1267 d_stress_d_strain_mat[8] = rtable.
get<T>(prefix +
"C2212", 0.);
1268 d_stress_d_strain_mat[9] = rtable.
get<T>(prefix +
"C2223", 0.);
1269 d_stress_d_strain_mat[10] = rtable.
get<T>(prefix +
"C2213", 0.);
1270 d_stress_d_strain_mat[11] = rtable.
get<T>(prefix +
"C3333", 0.);
1271 d_stress_d_strain_mat[12] = rtable.
get<T>(prefix +
"C3312", 0.);
1272 d_stress_d_strain_mat[13] = rtable.
get<T>(prefix +
"C3323", 0.);
1273 d_stress_d_strain_mat[14] = rtable.
get<T>(prefix +
"C3313", 0.);
1274 d_stress_d_strain_mat[15] = rtable.
get<T>(prefix +
"C1212", 0.);
1275 d_stress_d_strain_mat[16] = rtable.
get<T>(prefix +
"C1223", 0.);
1276 d_stress_d_strain_mat[17] = rtable.
get<T>(prefix +
"C1213", 0.);
1277 d_stress_d_strain_mat[18] = rtable.
get<T>(prefix +
"C2323", 0.);
1278 d_stress_d_strain_mat[19] = rtable.
get<T>(prefix +
"C2313", 0.);
1279 d_stress_d_strain_mat[20] = rtable.
get<T>(prefix +
"C1313", 0.);
1280 }
else if (isotropic || orthotropic) {
1286 e1 = rtable.
get<T>(prefix +
"E1");
1287 e2 = rtable.
get<T>(prefix +
"E2");
1288 e3 = rtable.
get<T>(prefix +
"E3", e2);
1289 nu12 = rtable.
get<T>(prefix +
"NU12");
1290 nu13 = rtable.
get<T>(prefix +
"NU13", nu12);
1291 nu23 = rtable.
get<T>(prefix +
"NU23", nu13);
1292 g12 = rtable.
get<T>(prefix +
"G12");
1293 g23 = rtable.
get<T>(prefix +
"G23", g12);
1294 g13 = rtable.
get<T>(prefix +
"G13", g12);
1296 e1 = e2 = e3 = rtable.
get<T>(prefix +
"E");
1297 nu12 = nu23 = nu13 = rtable.
get<T>(prefix +
"NU");
1298 g12 = g23 = g13 = rtable.
get<T>(prefix +
"G", e1 / (T(2) * (T(1) + nu12)));
1302 std::fill_n(d_stress_d_strain_mat, 21, T(0));
1304 const T c11 = T(1) / e1;
1305 const T c22 = T(1) / e2;
1306 const T c12 = -nu12 * c11;
1307 const T inv_det = T(1) / (c11 * c22 - c12 * c12);
1308 d_stress_d_strain_mat[0] = c22 * inv_det;
1309 d_stress_d_strain_mat[1] = -c12 * inv_det;
1310 d_stress_d_strain_mat[6] = c11 * inv_det;
1312 d_stress_d_strain_mat[15] = g12;
1313 d_stress_d_strain_mat[18] = g23 * sh;
1314 d_stress_d_strain_mat[20] = g13 * sh;
1316 std::ostringstream o;
1318 <<
" cannot be used with shell elements.";
1319 not_supported = o.str();
1323 const T alpha_r = rtable.
get<T>(prefix +
"ALPHA", T(0));
1324 alpha[0] = rtable.
get<T>(prefix +
"ALPHA11", alpha_r);
1325 alpha[1] = rtable.
get<T>(prefix +
"ALPHA22", alpha_r);
1327 const T alpha12 = rtable.
get<T>(prefix +
"ALPHA12", T(0));
1328 alpha[3] = T(2) * alpha12;
1329 alpha[4] = T(2) * rtable.
get<T>(prefix +
"ALPHA23", T(0));
1330 alpha[5] = T(2) * rtable.
get<T>(prefix +
"ALPHA13", T(0));
1332 density = rtable.
get<T>(prefix +
"DENSITY", T(0));
Interface to C++ representations of FE solvers.
Definition b2solution.H:54
virtual void set_field_value(const FieldDescription &descr, const int *value)
Definition b2solution.H:146
virtual bool compute_field_value(const std::string &name) const
Definition b2solution.H:221
Definition b2rtable.H:427
T get(const std::string &key) const
Definition b2rtable.H:647
std::string get_string(const std::string &key) const
Definition b2rtable.H:633
std::string errmsg_context
Will be pre-pended to error messages.
Definition b2rtable.H:430
Definition b2failure_criterion.H:42
virtual double process_strain(const double strain_mat[6], const bool engineering, b2000::GradientContainer *gradient_container) const
Definition b2failure_criterion.H:87
virtual double process_stress(const double stress_mat[6], b2000::GradientContainer *gradient_container) const
Definition b2failure_criterion.H:60
virtual int get_type() const =0
Returns STRAIN or STRESS.
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32
void set_identity_3_3(T1 a[3][3])
Definition b2tensor_calculus.H:511
void inner_product_2_2_NT(const T a[2][2], const T b[2][2], T c[2][2])
Definition b2tensor_calculus.H:863
void inner_product_3_3_NN(const T a[3][3], const T b[3][3], T c[3][3])
Definition b2tensor_calculus.H:808
T determinant_3_3(const T a[3][3])
Definition b2tensor_calculus.H:669
void set_identity_2_2(T1 a[2][2])
Definition b2tensor_calculus.H:518
void copy_2_2(const T1 a[2][2], T1 b[2][2])
Definition b2tensor_calculus.H:539
void inner_product_3_3_NT(const T a[3][3], const T b[3][3], T c[3][3])
Definition b2tensor_calculus.H:848
void inner_product_2_2_NN(const T a[2][2], const T b[2][2], T c[2][2])
Definition b2tensor_calculus.H:838
void copy_3_3(const T1 a[3][3], T1 b[3][3])
Definition b2tensor_calculus.H:525
T dot_3(const T a[3], const T b[3])
Definition b2tensor_calculus.H:328
T determinant_2_2(const T a[2][2])
Definition b2tensor_calculus.H:683
Definition b2solution.H:71
std::string name
Definition b2solution.H:73
Definition b2material_util.H:785
T strain_gl_mat[3]
Definition b2material_util.H:821
T G[2][2]
Definition b2material_util.H:802
T stress_cauchy_bg[3]
Definition b2material_util.H:844
ElasticityHelper2D(const T material_ref[2][2], const T covariant_base[2][2])
Definition b2material_util.H:864
T strain_gl_mat_te[3]
Definition b2material_util.H:826
T stress_normal
Definition b2material_util.H:852
bool has_thermal_expansion
Whether STRAIN_MECHANICAL fields will be written.
Definition b2material_util.H:787
T G_d[2][2]
Definition b2material_util.H:806
T M[2][2]
Material reference frame. Is initialized in the constructor.
Definition b2material_util.H:794
T stress_pk2_bg[3]
Definition b2material_util.H:835
void set_stress_and_or_d_stress_d_strain_mat(const T stress_mat[3], const T d_stress_d_strain_mat[6], T stress[3], T d_stress_d_strain[6])
Definition b2material_util.H:955
bool has_covariant_base
Definition b2material_util.H:798
T strain_gl_bg[3]
Definition b2material_util.H:811
T stress_pk2_mat[3]
Definition b2material_util.H:840
T strain_gl_bg_te[3]
Definition b2material_util.H:816
T stress_cauchy_mat[3]
Definition b2material_util.H:848
void set_strain(const T strain[3], const T temperature, const T alpha[3])
Definition b2material_util.H:914
T failure_index
Definition b2material_util.H:856
void store(const bool linear, const T displacement_gradient[2][2], const FailureCriterion *failure_criterion, b2000::GradientContainer *gradient_container)
Definition b2material_util.H:997
bool has_material_ref
Definition b2material_util.H:791
T strain_normal
Definition b2material_util.H:830
Definition b2material_util.H:531
bool has_material_ref
Definition b2material_util.H:537
T G_d[3][3]
Definition b2material_util.H:553
T failure_index
Definition b2material_util.H:572
void store(const bool linear, const b2dbv3::FailureCriterion *failure_criterion, b2000::GradientContainer *gradient_container)
Definition b2material_util.H:708
void set_strain(const T strain[8], const T temperature, const T alpha[8])
Definition b2material_util.H:625
T strain_gl_mat_te[8]
Definition b2material_util.H:563
T M[3][3]
Definition b2material_util.H:541
T stress_pk2_mat[8]
Definition b2material_util.H:568
T G[3][3]
Definition b2material_util.H:549
void set_stress_and_or_d_stress_d_strain_mat(const T stress_mat[8], const T d_stress_d_strain_mat[36], T stress[8], T d_stress_d_strain[36])
Definition b2material_util.H:671
T strain_gl_mat[8]
Definition b2material_util.H:558
ElasticityHelperShellResultants(const T material_ref[3][3], const T covariant_base[3][3])
Definition b2material_util.H:580
bool has_thermal_expansion
Whether STRAIN_MECHANICAL fields will be written.
Definition b2material_util.H:533
bool has_covariant_base
Definition b2material_util.H:545
Definition b2material_util.H:91
T G[3][3]
Definition b2material_util.H:109
bool has_material_ref
Definition b2material_util.H:97
T strain_gl_bg_te[6]
Definition b2material_util.H:123
T stress_pk2_bg[6]
Definition b2material_util.H:138
void set_stress_and_or_d_stress_d_strain_mat(const T stress_mat[6], const T d_stress_d_strain_mat[21], T stress[6], T d_stress_d_strain[21])
Definition b2material_util.H:261
T strain_gl_bg[6]
Definition b2material_util.H:118
T M[3][3]
Definition b2material_util.H:101
T strain_gl_mat_te[6]
Definition b2material_util.H:133
T strain_gl_mat[6]
Definition b2material_util.H:128
T stress_cauchy_bg[6]
Definition b2material_util.H:147
T failure_index
Definition b2material_util.H:155
bool has_covariant_base
Definition b2material_util.H:105
bool has_thermal_expansion
Whether STRAIN_MECHANICAL fields will be written.
Definition b2material_util.H:93
void set_strain(const bool planestress, const T strain[6], const T temperature, const T alpha[6])
Definition b2material_util.H:213
ElasticityHelper(const T material_ref[3][3], const T covariant_base[3][3])
Definition b2material_util.H:163
void store(const bool linear, const T displacement_gradient[3][3], const FailureCriterion *failure_criterion, b2000::GradientContainer *gradient_container)
Definition b2material_util.H:303
T G_d[3][3]
Definition b2material_util.H:113
T stress_pk2_mat[6]
Definition b2material_util.H:143
T stress_cauchy_mat[6]
Definition b2material_util.H:151
Definition b2material_util.H:1234