www.mooseframework.org
ADComputeIsotropicElasticityTensorShell.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 "RankFourTensor.h"
12 
13 #include "libmesh/quadrature.h"
14 #include "libmesh/utility.h"
15 #include "libmesh/enum_quadrature_type.h"
16 #include "libmesh/fe_type.h"
17 #include "libmesh/string_to_enum.h"
18 #include "libmesh/quadrature_gauss.h"
19 
21 
24  ADMaterial,
25  params.addClassDescription("Compute a plane stress isotropic elasticity tensor.");
26  params.addRequiredRangeCheckedParam<Real>("poissons_ratio",
27  "poissons_ratio >= -1.0 & poissons_ratio < 0.5",
28  "Poisson's ratio for the material.");
29  params.addRequiredRangeCheckedParam<Real>("youngs_modulus",
30  "youngs_modulus > 0.0",
31  "Young's modulus of the material.");
32  params.addRequiredParam<std::string>("through_thickness_order",
33  "Quadrature order in out of plane direction"););
34 
35 template <ComputeStage compute_stage>
37  const InputParameters & parameters)
38  : ADMaterial<compute_stage>(parameters),
39  _poissons_ratio(getParam<Real>("poissons_ratio")),
40  _youngs_modulus(getParam<Real>("youngs_modulus"))
41 {
42  _Cijkl.fillSymmetricIsotropicEandNu(_youngs_modulus, _poissons_ratio);
43 
44  // correction for plane stress
45  _Cijkl(0, 0, 0, 0) = _youngs_modulus / (1.0 - _poissons_ratio * _poissons_ratio);
46  _Cijkl(1, 1, 1, 1) = _Cijkl(0, 0, 0, 0);
47  _Cijkl(0, 0, 1, 1) = _Cijkl(0, 0, 0, 0) * _poissons_ratio;
48  _Cijkl(1, 1, 0, 0) = _Cijkl(0, 0, 1, 1);
49  _Cijkl(0, 0, 2, 2) = 0.0;
50  _Cijkl(1, 1, 2, 2) = 0.0;
51  _Cijkl(2, 2, 2, 2) = 0.0;
52  _Cijkl(2, 2, 0, 0) = 0.0;
53  _Cijkl(2, 2, 1, 1) = 0.0;
54 
55  // get number of quadrature points along thickness based on order
56  std::unique_ptr<QGauss> t_qrule = libmesh_make_unique<QGauss>(
57  1, Utility::string_to_enum<Order>(getParam<std::string>("through_thickness_order")));
58  _t_points = t_qrule->get_points();
59  _elasticity_tensor.resize(_t_points.size());
60  _ge.resize(_t_points.size());
61  for (unsigned int t = 0; t < _t_points.size(); ++t)
62  {
64  &declareADProperty<RankFourTensor>("elasticity_tensor_t_points_" + std::to_string(t));
65  _ge[t] = &getADMaterialProperty<RankTwoTensor>("ge_t_points_" + std::to_string(t));
66  }
67 }
68 
69 template <ComputeStage compute_stage>
70 void
72 {
73  for (unsigned int t = 0; t < _t_points.size(); ++t)
74  {
75  (*_elasticity_tensor[t])[_qp].zero();
76  // compute contravariant elasticity tensor
77  for (unsigned int i = 0; i < 3; ++i)
78  for (unsigned int j = 0; j < 3; ++j)
79  for (unsigned int k = 0; k < 3; ++k)
80  for (unsigned int l = 0; l < 3; ++l)
81  for (unsigned int m = 0; m < 3; ++m)
82  for (unsigned int n = 0; n < 3; ++n)
83  for (unsigned int o = 0; o < 3; ++o)
84  for (unsigned int p = 0; p < 3; ++p)
85  (*_elasticity_tensor[t])[_qp](i, j, k, l) +=
86  (*_ge[t])[_qp](i, m) * (*_ge[t])[_qp](j, n) * (*_ge[t])[_qp](k, o) *
87  (*_ge[t])[_qp](l, p) * _Cijkl(m, n, o, p);
88  }
89 }
ADComputeIsotropicElasticityTensorShell::_youngs_modulus
Real _youngs_modulus
Definition: ADComputeIsotropicElasticityTensorShell.h:39
ADComputeIsotropicElasticityTensorShell::_Cijkl
RankFourTensor _Cijkl
Individual elasticity tensor.
Definition: ADComputeIsotropicElasticityTensorShell.h:42
ADComputeIsotropicElasticityTensorShell.h
ADComputeIsotropicElasticityTensorShell::_elasticity_tensor
std::vector< ADMaterialProperty(RankFourTensor) * > _elasticity_tensor
Material property elasticity tensor.
Definition: ADComputeIsotropicElasticityTensorShell.h:48
ADComputeIsotropicElasticityTensorShell::ADComputeIsotropicElasticityTensorShell
ADComputeIsotropicElasticityTensorShell(const InputParameters &parameters)
Definition: ADComputeIsotropicElasticityTensorShell.C:36
ADComputeIsotropicElasticityTensorShell::_ge
std::vector< const ADMaterialProperty(RankTwoTensor) * > _ge
Material property for ge matrix.
Definition: ADComputeIsotropicElasticityTensorShell.h:51
ADComputeIsotropicElasticityTensorShell::_t_points
std::vector< Point > _t_points
Quadrature points along thickness.
Definition: ADComputeIsotropicElasticityTensorShell.h:45
ADComputeIsotropicElasticityTensorShell
Definition: ADComputeIsotropicElasticityTensorShell.h:18
ADComputeIsotropicElasticityTensorShell::_poissons_ratio
Real _poissons_ratio
Lame' paramters.
Definition: ADComputeIsotropicElasticityTensorShell.h:37
ADComputeIsotropicElasticityTensorShell::computeQpProperties
virtual void computeQpProperties() override
Definition: ADComputeIsotropicElasticityTensorShell.C:71
defineADValidParams
defineADValidParams(ADComputeIsotropicElasticityTensorShell, ADMaterial, params.addClassDescription("Compute a plane stress isotropic elasticity tensor.");params.addRequiredRangeCheckedParam< Real >("poissons_ratio", "poissons_ratio >= -1.0 & poissons_ratio < 0.5", "Poisson's ratio for the material.");params.addRequiredRangeCheckedParam< Real >("youngs_modulus", "youngs_modulus > 0.0", "Young's modulus of the material.");params.addRequiredParam< std::string >("through_thickness_order", "Quadrature order in out of plane direction");)
registerADMooseObject
registerADMooseObject("TensorMechanicsApp", ADComputeIsotropicElasticityTensorShell)