11 #include "libmesh/utility.h"
13 #include "RankTwoTensor.h"
23 params.addClassDescription(
"Computes Cosserat elasticity and flexural bending rigidity tensors "
24 "relevant for simulations with layered materials. The layering "
25 "direction is assumed to be perpendicular to the 'z' direction.");
26 params.addRequiredParam<Real>(
"young",
"The Young's modulus");
27 params.addRequiredParam<Real>(
"poisson",
"The Poisson's ratio");
28 params.addRequiredRangeCheckedParam<Real>(
29 "layer_thickness",
"layer_thickness>=0",
"The layer thickness");
30 params.addRequiredRangeCheckedParam<Real>(
31 "joint_normal_stiffness",
"joint_normal_stiffness>=0",
"The joint normal stiffness");
32 params.addRequiredRangeCheckedParam<Real>(
33 "joint_shear_stiffness",
"joint_shear_stiffness>=0",
"The joint shear stiffness");
38 const InputParameters & parameters)
43 _elastic_flexural_rigidity_tensor(
44 declareProperty<
RankFourTensor>(
"elastic_flexural_rigidity_tensor")),
45 _compliance(declareProperty<
RankFourTensor>(_base_name +
"compliance_tensor"))
47 if (!isParamValid(
"elasticity_tensor_prefactor"))
50 const Real E = getParam<Real>(
"young");
51 const Real nu = getParam<Real>(
"poisson");
52 const Real b = getParam<Real>(
"layer_thickness");
53 const Real kn = getParam<Real>(
"joint_normal_stiffness");
54 const Real ks = getParam<Real>(
"joint_shear_stiffness");
57 const Real G = 0.5 * E / (1.0 + nu);
59 const Real Gprime = G * b * ks / (b * ks + G);
63 ? E / (1.0 - nu * nu - Utility::pow<2>(nu * (1.0 + nu)) / (1.0 - nu * nu + E / b / kn))
64 : E / (1.0 - nu * nu);
65 const Real a0011 = nu * a0000 / (1.0 - nu);
67 (b * kn > 0.0) ? 1.0 / ((1.0 + nu) * (1.0 - 2.0 * nu) / E / (1.0 - nu) + 1.0 / b / kn) : 0.0;
68 const Real a0022 = nu * a2222 / (1.0 - nu);
70 const Real a66 = Gprime;
71 const Real a77 = 0.5 * (G + Gprime);
76 _Eijkl(2, 2, 2, 2) = a2222;
77 _Eijkl(0, 0, 2, 2) =
_Eijkl(1, 1, 2, 2) =
_Eijkl(2, 2, 0, 0) =
_Eijkl(2, 2, 1, 1) = a0022;
78 _Eijkl(0, 1, 0, 1) =
_Eijkl(0, 1, 1, 0) =
_Eijkl(1, 0, 0, 1) =
_Eijkl(1, 0, 1, 0) = a0101;
79 _Eijkl(0, 2, 0, 2) =
_Eijkl(0, 2, 2, 0) =
_Eijkl(2, 0, 0, 2) =
_Eijkl(1, 2, 1, 2) =
85 const Real D0 = E * Utility::pow<3>(b) / 12.0 / (1.0 - nu * nu);
86 const Real b0101 = D0 / b * G / (2.0 * b * ks + G);
87 const Real b0110 = -nu * b0101;
94 const Real pre = (nu - 1.0) / (a0000 * (nu - 1.0) + 2.0 * a2222 * Utility::pow<2>(nu));
96 ((a2222 - a0000) * nu * nu + 2.0 * a0000 * nu - a0000) / (2.0 * a0000 * nu - a0000);
97 const Real cp0011 = -((a0000 + a2222) * nu * nu - a0000 * nu) / (2.0 * a0000 * nu - a0000);
100 _Cijkl(2, 2, 2, 2) = pre * a0000 / a2222;
101 _Cijkl(0, 0, 2, 2) =
_Cijkl(1, 1, 2, 2) =
_Cijkl(2, 2, 0, 0) =
_Cijkl(2, 2, 1, 1) = -nu * pre;
102 _Cijkl(0, 1, 0, 1) =
_Cijkl(0, 1, 1, 0) =
_Cijkl(1, 0, 0, 1) =
_Cijkl(1, 0, 1, 0) = 0.25 / a0101;
103 const Real slip = 2.0 / (G - Gprime);
104 _Cijkl(0, 2, 2, 0) =
_Cijkl(2, 0, 0, 2) =
_Cijkl(1, 2, 2, 1) =
_Cijkl(2, 1, 1, 2) = -slip;
105 _Cijkl(0, 2, 0, 2) =
_Cijkl(1, 2, 1, 2) = (G + Gprime) * slip / 2.0 / Gprime;