22#ifndef B2MATERIAL_STRESS_3D_MIXED_H_
23#define B2MATERIAL_STRESS_3D_MIXED_H_
25#include "elements/properties/b2solid_mechanics.H"
30class MaterialStress3DMixed :
virtual public SolidMechanics {
33 virtual int number_of_layer()
const {
return 1; }
37 virtual void laminate(
38 b2linalg::Vector<double, b2linalg::Vdense_constref> nodes_interpolation,
39 double& laminate_begin,
double& laminate_end)
const {
47 b2linalg::Vector<double, b2linalg::Vdense_constref> nodes_interpolation,
48 const int layer_id,
double& layer_begin,
double& layer_end)
const {
53 virtual double get_density(
const int layer_id)
const {
58 virtual void get_stress(
59 Model* model,
const bool linear,
const EquilibriumSolution equilibrium_solution,
60 const double time,
const double delta_time, GradientContainer* gradient_container,
61 SolverHints* solver_hints,
const Element* element,
const double el_coordinates[3],
63 b2linalg::Vector<double, b2linalg::Vdense_constref> nodes_interpolation,
64 const double bg_coordinates[3],
const double covariant_base[3][3],
const double volume,
65 const double deformation_gradient[3][3],
const double velocity[3],
66 const double acceleration[3],
const double interpolated_pressure,
double stress[6],
67 double& pressure,
double CUU[21],
double CUP[6],
double& CPP,
double inertia_force[3],
71 inline void eval_linear_strain(
const double F[3][3],
double E[6])
const {
72 const double f00 = F[0][0];
73 const double f01 = F[1][0];
74 const double f02 = F[2][0];
75 const double f10 = F[0][1];
76 const double f11 = F[1][1];
77 const double f12 = F[2][1];
78 const double f20 = F[0][2];
79 const double f21 = F[1][2];
80 const double f22 = F[2][2];
90 inline void eval_green_lagrange_strain(
const double F[3][3],
double E[6])
const {
91 const double f00 = F[0][0];
92 const double f01 = F[1][0];
93 const double f02 = F[2][0];
94 const double f10 = F[0][1];
95 const double f11 = F[1][1];
96 const double f12 = F[2][1];
97 const double f20 = F[0][2];
98 const double f21 = F[1][2];
99 const double f22 = F[2][2];
101 E[0] = 0.5 * (f00 * f00 + f10 * f10 + f20 * f20 - 1.0);
102 E[1] = 0.5 * (f01 * f01 + f11 * f11 + f21 * f21 - 1.0);
103 E[2] = 0.5 * (f02 * f02 + f12 * f12 + f22 * f22 - 1.0);
104 E[3] = f00 * f01 + f10 * f11 + f20 * f21;
105 E[4] = f01 * f02 + f11 * f12 + f21 * f22;
106 E[5] = f00 * f02 + f10 * f12 + f20 * f22;
109 inline double delta(
const int a,
const int b) {
return (a == b ? 1.0 : 0.0); }
111 inline void s_eq_c_mul_e(
double s[6],
const double c[21],
const double e[6]) {
112 const int ind[6][6] = {{0, 1, 2, 3, 4, 5}, {1, 6, 7, 8, 9, 10},
113 {2, 7, 11, 12, 13, 14}, {3, 8, 12, 15, 16, 17},
114 {4, 9, 13, 16, 18, 19}, {5, 19, 14, 17, 19, 20}};
116 for (
int i = 0; i < 6; ++i) {
119 const int* iind = ind[i];
120 for (
int j = 0; j < 6; ++j) { value += c[iind[j]] * e[j]; }
128 static inline void piola_2_stress_to_cauchy_stress(
129 const double F[3][3],
133 const double f00 = F[0][0];
134 const double f01 = F[1][0];
135 const double f02 = F[2][0];
136 const double f10 = F[0][1];
137 const double f11 = F[1][1];
138 const double f12 = F[2][1];
139 const double f20 = F[0][2];
140 const double f21 = F[1][2];
141 const double f22 = F[2][2];
145 const double det_inv = 1.0 / det;
147 T[0] = f00 * f00 * S[0] + f01 * f01 * S[1] + f02 * f02 * S[2] + 2 * f00 * f01 * S[3]
148 + 2 * f01 * f02 * S[4] + 2 * f02 * f00 * S[5];
150 T[1] = f10 * f10 * S[0] + f11 * f11 * S[1] + f12 * f12 * S[2] + 2 * f10 * f11 * S[3]
151 + 2 * f11 * f12 * S[4] + 2 * f12 * f10 * S[5];
153 T[2] = f20 * f20 * S[0] + f21 * f21 * S[1] + f22 * f22 * S[2] + 2 * f20 * f21 * S[3]
154 + 2 * f21 * f22 * S[4] + 2 * f22 * f20 * S[5];
156 T[3] = f00 * f10 * S[0] + f01 * f11 * S[1] + f02 * f12 * S[2]
157 + (f00 * f11 + f01 * f10) * S[3] + (f01 * f12 + f02 * f11) * S[4]
158 + (f02 * f10 + f00 * f12) * S[5];
160 T[4] = f10 * f20 * S[0] + f11 * f21 * S[1] + f12 * f22 * S[2]
161 + (f10 * f21 + f11 * f20) * S[3] + (f11 * f22 + f12 * f21) * S[4]
162 + (f12 * f20 + f10 * f22) * S[5];
164 T[5] = f20 * f00 * S[0] + f21 * f01 * S[1] + f22 * f02 * S[2]
165 + (f20 * f01 + f21 * f00) * S[3] + (f21 * f02 + f22 * f01) * S[4]
166 + (f22 * f00 + f20 * f02) * S[5];
168 for (
int i = 0; i < 6; ++i) { T[i] *= det_inv; }
#define THROW
Definition b2exception.H:198
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32
T determinant_3_3(const T a[3][3])
Definition b2tensor_calculus.H:669
GenericException< UnimplementedError_name > UnimplementedError
Definition b2exception.H:314