22#ifndef B2MATERIAL_STRESS_2D_MIXED_H_
23#define B2MATERIAL_STRESS_2D_MIXED_H_
25#include "elements/properties/b2solid_mechanics.H"
30class MaterialStress2DMixed :
virtual public SolidMechanics {
33 virtual int number_of_layer()
const {
return 1; }
37 virtual void laminate(
38 const b2linalg::Vector<double, b2linalg::Vdense_constref> nodes_interpolation,
39 double& laminate_begin,
double& laminate_end)
const {
47 const 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 const b2linalg::Vector<double, b2linalg::Vdense_constref> nodes_interpolation,
64 const double bg_coordinates[3],
const double covariant_base[2][2],
const double volume,
65 const double deformation_gradient[2][2],
const double velocity[2],
66 const double acceleration[2],
const double interpolated_pressure,
double stress[3],
67 double& pressure,
double CUU[6],
double CUP[3],
double& CPP,
double inertia_force[2],
71 inline void eval_linear_strain(
const double F[2][2],
double E[3])
const {
72 const double f00 = F[0][0];
73 const double f01 = F[1][0];
74 const double f10 = F[0][1];
75 const double f11 = F[1][1];
82 inline void eval_green_lagrange_strain(
const double F[2][2],
double E[3])
const {
83 const double f00 = F[0][0];
84 const double f01 = F[1][0];
85 const double f10 = F[0][1];
86 const double f11 = F[1][1];
88 E[0] = 0.5 * (f00 * f00 + f10 * f10 - 1.0);
89 E[1] = 0.5 * (f01 * f01 + f11 * f11 - 1.0);
90 E[2] = f00 * f01 + f10 * f11;
93 inline double delta(
const int a,
const int b) {
return (a == b ? 1.0 : 0.0); }
95 inline void s_eq_c_mul_e(
double s[3],
const double c[6],
const double e[3]) {
96 const int ind[3][3] = {{0, 1, 2}, {1, 3, 4}, {2, 4, 5}};
97 for (
int i = 0; i < 3; ++i) {
100 const int* iind = ind[i];
101 for (
int j = 0; j < 3; ++j) { value += c[iind[j]] * e[j]; }
109 static inline void piola_2_stress_to_cauchy_stress(
110 const double F[2][2],
114 const double f00 = F[0][0];
115 const double f01 = F[1][0];
116 const double f10 = F[0][1];
117 const double f11 = F[1][1];
121 const double det_inv = 1.0 / det;
123 T[0] = f00 * f00 * S[0] + f01 * f01 * S[1] + 2 * f00 * f01 * S[2];
125 T[1] = f10 * f10 * S[0] + f11 * f11 * S[1] + 2 * f10 * f11 * S[2];
127 T[2] = f00 * f10 * S[0] + f01 * f11 * S[1] + (f00 * f11 + f01 * f10) * S[2];
129 for (
int i = 0; i < 3; ++i) { T[i] *= det_inv; }
132 static inline void expand_strain_or_stress_2d_to_3d(
const double t2d[3],
double t3d[6]) {
#define THROW
Definition b2exception.H:198
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32
T determinant_2_2(const T a[2][2])
Definition b2tensor_calculus.H:683
GenericException< UnimplementedError_name > UnimplementedError
Definition b2exception.H:314