LCOV - code coverage report
Current view: top level - src/materials - ComputeLayeredCosseratElasticityTensor.C (source / functions) Hit Total Coverage
Test: idaholab/moose tensor_mechanics: d6b47a Lines: 65 68 95.6 %
Date: 2024-02-27 11:53:14 Functions: 3 3 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       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             : 
      10             : #include "ComputeLayeredCosseratElasticityTensor.h"
      11             : #include "libmesh/utility.h"
      12             : #include "Function.h"
      13             : #include "RankTwoTensor.h"
      14             : 
      15             : registerMooseObject("TensorMechanicsApp", ComputeLayeredCosseratElasticityTensor);
      16             : 
      17             : InputParameters
      18         456 : ComputeLayeredCosseratElasticityTensor::validParams()
      19             : {
      20         456 :   InputParameters params = ComputeElasticityTensorBase::validParams();
      21         456 :   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         912 :   params.addRequiredParam<Real>("young", "The Young's modulus");
      25         912 :   params.addRequiredParam<Real>("poisson", "The Poisson's ratio");
      26         912 :   params.addRequiredRangeCheckedParam<Real>(
      27             :       "layer_thickness", "layer_thickness>=0", "The layer thickness");
      28         912 :   params.addRequiredRangeCheckedParam<Real>(
      29             :       "joint_normal_stiffness", "joint_normal_stiffness>=0", "The joint normal stiffness");
      30         912 :   params.addRequiredRangeCheckedParam<Real>(
      31             :       "joint_shear_stiffness", "joint_shear_stiffness>=0", "The joint shear stiffness");
      32         456 :   return params;
      33           0 : }
      34             : 
      35         342 : ComputeLayeredCosseratElasticityTensor::ComputeLayeredCosseratElasticityTensor(
      36         342 :     const InputParameters & parameters)
      37             :   : ComputeElasticityTensorBase(parameters),
      38         342 :     _Eijkl(RankFourTensor()),
      39         342 :     _Bijkl(RankFourTensor()),
      40         342 :     _Cijkl(RankFourTensor()),
      41         342 :     _elastic_flexural_rigidity_tensor(
      42         342 :         declareProperty<RankFourTensor>("elastic_flexural_rigidity_tensor")),
      43         684 :     _compliance(declareProperty<RankFourTensor>(_base_name + "compliance_tensor"))
      44             : {
      45         684 :   if (!isParamValid("elasticity_tensor_prefactor"))
      46         648 :     issueGuarantee(_elasticity_tensor_name, Guarantee::CONSTANT_IN_TIME);
      47             : 
      48         684 :   const Real E = getParam<Real>("young");
      49         684 :   const Real nu = getParam<Real>("poisson");
      50         684 :   const Real b = getParam<Real>("layer_thickness");
      51         684 :   const Real kn = getParam<Real>("joint_normal_stiffness");
      52         684 :   const Real ks = getParam<Real>("joint_shear_stiffness");
      53             : 
      54             :   // shear modulus of solid
      55         342 :   const Real G = 0.5 * E / (1.0 + nu);
      56             :   // shear modulus of jointed material
      57         342 :   const Real Gprime = G * b * ks / (b * ks + G);
      58             : 
      59             :   const Real a0000 =
      60         342 :       (b * kn > 0.0)
      61         342 :           ? E / (1.0 - nu * nu - Utility::pow<2>(nu * (1.0 + nu)) / (1.0 - nu * nu + E / b / kn))
      62           0 :           : E / (1.0 - nu * nu);
      63         342 :   const Real a0011 = nu * a0000 / (1.0 - nu);
      64             :   const Real a2222 =
      65         342 :       (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         342 :   const Real a0022 = nu * a2222 / (1.0 - nu);
      67             :   const Real a0101 = G;
      68             :   const Real a66 = Gprime;
      69         342 :   const Real a77 = 0.5 * (G + Gprime);
      70             : 
      71             :   // Eijkl does not obey the usual symmetries, viz Eijkl != Ejikl, so must fill manually
      72         342 :   _Eijkl(0, 0, 0, 0) = _Eijkl(1, 1, 1, 1) = a0000;
      73         342 :   _Eijkl(0, 0, 1, 1) = _Eijkl(1, 1, 0, 0) = a0011;
      74         342 :   _Eijkl(2, 2, 2, 2) = a2222;
      75         342 :   _Eijkl(0, 0, 2, 2) = _Eijkl(1, 1, 2, 2) = _Eijkl(2, 2, 0, 0) = _Eijkl(2, 2, 1, 1) = a0022;
      76         342 :   _Eijkl(0, 1, 0, 1) = _Eijkl(0, 1, 1, 0) = _Eijkl(1, 0, 0, 1) = _Eijkl(1, 0, 1, 0) = a0101;
      77         342 :   _Eijkl(0, 2, 0, 2) = _Eijkl(0, 2, 2, 0) = _Eijkl(2, 0, 0, 2) = _Eijkl(1, 2, 1, 2) =
      78         342 :       _Eijkl(1, 2, 2, 1) = _Eijkl(2, 1, 1, 2) = a66;
      79         342 :   _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         342 :   const Real D0 = E * Utility::pow<3>(b) / 12.0 / (1.0 - nu * nu); // bending rigidity of a layer
      84         342 :   const Real b0101 = D0 / b * G / (2.0 * b * ks + G);
      85         342 :   const Real b0110 = -nu * b0101;
      86         342 :   _Bijkl(0, 1, 0, 1) = _Bijkl(1, 0, 1, 0) = b0101;
      87         342 :   _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         342 :   const Real pre = (nu - 1.0) / (a0000 * (nu - 1.0) + 2.0 * a2222 * Utility::pow<2>(nu));
      93         342 :   const Real cp0000 =
      94         342 :       ((a2222 - a0000) * nu * nu + 2.0 * a0000 * nu - a0000) / (2.0 * a0000 * nu - a0000);
      95         342 :   const Real cp0011 = -((a0000 + a2222) * nu * nu - a0000 * nu) / (2.0 * a0000 * nu - a0000);
      96         342 :   _Cijkl(0, 0, 0, 0) = _Cijkl(1, 1, 1, 1) = pre * cp0000;
      97         342 :   _Cijkl(0, 0, 1, 1) = _Cijkl(1, 1, 0, 0) = pre * cp0011;
      98         342 :   _Cijkl(2, 2, 2, 2) = pre * a0000 / a2222;
      99         342 :   _Cijkl(0, 0, 2, 2) = _Cijkl(1, 1, 2, 2) = _Cijkl(2, 2, 0, 0) = _Cijkl(2, 2, 1, 1) = -nu * pre;
     100         342 :   _Cijkl(0, 1, 0, 1) = _Cijkl(0, 1, 1, 0) = _Cijkl(1, 0, 0, 1) = _Cijkl(1, 0, 1, 0) = 0.25 / a0101;
     101         342 :   const Real slip = 2.0 / (G - Gprime);
     102         342 :   _Cijkl(0, 2, 2, 0) = _Cijkl(2, 0, 0, 2) = _Cijkl(1, 2, 2, 1) = _Cijkl(2, 1, 1, 2) = -slip;
     103         342 :   _Cijkl(0, 2, 0, 2) = _Cijkl(1, 2, 1, 2) = (G + Gprime) * slip / 2.0 / Gprime;
     104         342 :   _Cijkl(2, 0, 2, 0) = _Cijkl(2, 1, 2, 1) = slip;
     105         342 : }
     106             : 
     107             : void
     108      140528 : ComputeLayeredCosseratElasticityTensor::computeQpElasticityTensor()
     109             : {
     110      140528 :   _elasticity_tensor[_qp] = _Eijkl;
     111      140528 :   _elastic_flexural_rigidity_tensor[_qp] = _Bijkl;
     112      140528 :   _compliance[_qp] = _Cijkl;
     113             : 
     114      140528 :   if (_prefactor_function)
     115           0 :     _compliance[_qp] /= _prefactor_function->value(_t, _q_point[_qp]);
     116      140528 : }

Generated by: LCOV version 1.14