www.mooseframework.org
ComputeLayeredCosseratElasticityTensor.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
11 #include "libmesh/utility.h"
12 #include "Function.h"
13 #include "RankTwoTensor.h"
14 
16 
19 {
21  params.addClassDescription("Computes Cosserat elasticity and flexural bending rigidity tensors "
22  "relevant for simulations with layered materials. The layering "
23  "direction is assumed to be perpendicular to the 'z' direction.");
24  params.addRequiredParam<Real>("young", "The Young's modulus");
25  params.addRequiredParam<Real>("poisson", "The Poisson's ratio");
27  "layer_thickness", "layer_thickness>=0", "The layer thickness");
29  "joint_normal_stiffness", "joint_normal_stiffness>=0", "The joint normal stiffness");
31  "joint_shear_stiffness", "joint_shear_stiffness>=0", "The joint shear stiffness");
32  return params;
33 }
34 
36  const InputParameters & parameters)
37  : ComputeElasticityTensorBase(parameters),
38  _Eijkl(RankFourTensor()),
39  _Bijkl(RankFourTensor()),
40  _Cijkl(RankFourTensor()),
41  _elastic_flexural_rigidity_tensor(
42  declareProperty<RankFourTensor>("elastic_flexural_rigidity_tensor")),
43  _compliance(declareProperty<RankFourTensor>(_base_name + "compliance_tensor"))
44 {
45  if (!isParamValid("elasticity_tensor_prefactor"))
47 
48  const Real E = getParam<Real>("young");
49  const Real nu = getParam<Real>("poisson");
50  const Real b = getParam<Real>("layer_thickness");
51  const Real kn = getParam<Real>("joint_normal_stiffness");
52  const Real ks = getParam<Real>("joint_shear_stiffness");
53 
54  // shear modulus of solid
55  const Real G = 0.5 * E / (1.0 + nu);
56  // shear modulus of jointed material
57  const Real Gprime = G * b * ks / (b * ks + G);
58 
59  const Real a0000 =
60  (b * kn > 0.0)
61  ? E / (1.0 - nu * nu - Utility::pow<2>(nu * (1.0 + nu)) / (1.0 - nu * nu + E / b / kn))
62  : E / (1.0 - nu * nu);
63  const Real a0011 = nu * a0000 / (1.0 - nu);
64  const Real a2222 =
65  (b * kn > 0.0) ? 1.0 / ((1.0 + nu) * (1.0 - 2.0 * nu) / E / (1.0 - nu) + 1.0 / b / kn) : 0.0;
66  const Real a0022 = nu * a2222 / (1.0 - nu);
67  const Real a0101 = G;
68  const Real a66 = Gprime;
69  const Real a77 = 0.5 * (G + Gprime);
70 
71  // Eijkl does not obey the usual symmetries, viz Eijkl != Ejikl, so must fill manually
72  _Eijkl(0, 0, 0, 0) = _Eijkl(1, 1, 1, 1) = a0000;
73  _Eijkl(0, 0, 1, 1) = _Eijkl(1, 1, 0, 0) = a0011;
74  _Eijkl(2, 2, 2, 2) = a2222;
75  _Eijkl(0, 0, 2, 2) = _Eijkl(1, 1, 2, 2) = _Eijkl(2, 2, 0, 0) = _Eijkl(2, 2, 1, 1) = a0022;
76  _Eijkl(0, 1, 0, 1) = _Eijkl(0, 1, 1, 0) = _Eijkl(1, 0, 0, 1) = _Eijkl(1, 0, 1, 0) = a0101;
77  _Eijkl(0, 2, 0, 2) = _Eijkl(0, 2, 2, 0) = _Eijkl(2, 0, 0, 2) = _Eijkl(1, 2, 1, 2) =
78  _Eijkl(1, 2, 2, 1) = _Eijkl(2, 1, 1, 2) = a66;
79  _Eijkl(2, 0, 2, 0) = _Eijkl(2, 1, 2, 1) = a77;
80 
81  // most of Bijkl is zero since the only nonzero moment stresses are m01 and m10.
82  // It also does not have the usual symmetries.
83  const Real D0 = E * Utility::pow<3>(b) / 12.0 / (1.0 - nu * nu); // bending rigidity of a layer
84  const Real b0101 = D0 / b * G / (2.0 * b * ks + G);
85  const Real b0110 = -nu * b0101;
86  _Bijkl(0, 1, 0, 1) = _Bijkl(1, 0, 1, 0) = b0101;
87  _Bijkl(0, 1, 1, 0) = _Bijkl(1, 0, 0, 1) = b0110;
88 
89  // The compliance tensor also does not obey the usual symmetries, and
90  // this is the main reason it is calculated here, since we can't use
91  // _Eijkl.invSymm()
92  const Real pre = (nu - 1.0) / (a0000 * (nu - 1.0) + 2.0 * a2222 * Utility::pow<2>(nu));
93  const Real cp0000 =
94  ((a2222 - a0000) * nu * nu + 2.0 * a0000 * nu - a0000) / (2.0 * a0000 * nu - a0000);
95  const Real cp0011 = -((a0000 + a2222) * nu * nu - a0000 * nu) / (2.0 * a0000 * nu - a0000);
96  _Cijkl(0, 0, 0, 0) = _Cijkl(1, 1, 1, 1) = pre * cp0000;
97  _Cijkl(0, 0, 1, 1) = _Cijkl(1, 1, 0, 0) = pre * cp0011;
98  _Cijkl(2, 2, 2, 2) = pre * a0000 / a2222;
99  _Cijkl(0, 0, 2, 2) = _Cijkl(1, 1, 2, 2) = _Cijkl(2, 2, 0, 0) = _Cijkl(2, 2, 1, 1) = -nu * pre;
100  _Cijkl(0, 1, 0, 1) = _Cijkl(0, 1, 1, 0) = _Cijkl(1, 0, 0, 1) = _Cijkl(1, 0, 1, 0) = 0.25 / a0101;
101  const Real slip = 2.0 / (G - Gprime);
102  _Cijkl(0, 2, 2, 0) = _Cijkl(2, 0, 0, 2) = _Cijkl(1, 2, 2, 1) = _Cijkl(2, 1, 1, 2) = -slip;
103  _Cijkl(0, 2, 0, 2) = _Cijkl(1, 2, 1, 2) = (G + Gprime) * slip / 2.0 / Gprime;
104  _Cijkl(2, 0, 2, 0) = _Cijkl(2, 1, 2, 1) = slip;
105 }
106 
107 void
109 {
113 
116 }
const MooseArray< Point > & _q_point
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
RankFourTensor _Cijkl
Inverse of elasticity tensor.
ComputeElasticityTensorBase the base class for computing elasticity tensors.
void issueGuarantee(const MaterialPropertyName &prop_name, Guarantee guarantee)
GenericMaterialProperty< T, is_ad > & _elasticity_tensor
ComputeLayeredCosseratElasticityTensor(const InputParameters &parameters)
ComputeLayeredCosseratElasticityTensor defines an elasticity tensor and an elastic flexural rigidity ...
void addRequiredParam(const std::string &name, const std::string &doc_string)
MaterialProperty< RankFourTensor > & _elastic_flexural_rigidity_tensor
Flexural rigidity tensor at the qps.
bool isParamValid(const std::string &name) const
static const std::string G
Definition: NS.h:151
const Function *const _prefactor_function
prefactor function to multiply the elasticity tensor with
registerMooseObject("SolidMechanicsApp", ComputeLayeredCosseratElasticityTensor)
MaterialProperty< RankFourTensor > & _compliance
Compliance tensor (_Eijkl^-1) at the qps.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void addClassDescription(const std::string &doc_string)
RankFourTensor _Eijkl
Conventional elasticity tensor.
virtual Real value(Real t, const Point &p) const