www.mooseframework.org
ADStressDivergenceTensors.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 "RankTwoTensor.h"
12 #include "libmesh/quadrature.h"
13 
15 
17 
18 template <ComputeStage compute_stage>
19 InputParameters
21 {
22  InputParameters params = ADKernel<compute_stage>::validParams();
23  params.addClassDescription("Stress divergence kernel with automatic differentiation for the "
24  "Cartesian coordinate system");
25  params.addRequiredParam<unsigned int>("component",
26  "An integer corresponding to the direction "
27  "the variable this kernel acts in. (0 for x, "
28  "1 for y, 2 for z)");
29  params.addRequiredCoupledVar("displacements",
30  "The string of displacements suitable for the problem statement");
31  params.addParam<std::string>("base_name", "Material property base name");
32  params.set<bool>("use_displaced_mesh") = false;
33  params.addParam<bool>("volumetric_locking_correction",
34  false,
35  "Set to false to turn off volumetric locking correction");
36  return params;
37 }
38 
39 template <ComputeStage compute_stage>
41  const InputParameters & parameters)
42  : ADKernel<compute_stage>(parameters),
43  _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
44  _stress(getADMaterialProperty<RankTwoTensor>(_base_name + "stress")),
45  _component(getParam<unsigned int>("component")),
46  _ndisp(coupledComponents("displacements")),
47  _disp_var(_ndisp),
48  _avg_grad_test(),
49  _volumetric_locking_correction(getParam<bool>("volumetric_locking_correction"))
50 {
51  for (unsigned int i = 0; i < _ndisp; ++i)
52  // the next line should be _disp_var[i] = coupled("displacements", i);
53  // but the Coupleable:: is required to avoid triggering an internal Intel compiler bug
54  _disp_var[i] = Coupleable::coupled("displacements", i);
55 
56  // Error if volumetric locking correction is turned on for 1D problems
58  mooseError("Volumetric locking correction should be set to false for 1-D problems.");
59 }
60 
61 template <ComputeStage compute_stage>
62 void
64 {
65  if (getBlockCoordSystem() != Moose::COORD_XYZ)
66  mooseError(
67  "The coordinate system in the Problem block must be set to XYZ for cartesian geometries.");
68 }
69 
70 template <ComputeStage compute_stage>
71 ADReal
73 {
74  ADReal residual = _stress[_qp].row(_component) * _grad_test[_i][_qp];
75 
76  // volumetric locking correction
77  if (_volumetric_locking_correction)
78  residual += (_avg_grad_test[_i] - _grad_test[_i][_qp](_component)) / 3.0 * _stress[_qp].trace();
79 
80  return residual;
81 }
82 
83 template <ComputeStage compute_stage>
84 void
86 {
87  if (!_volumetric_locking_correction)
88  return;
89 
90  ADReal ad_current_elem_volume = 0.0;
91  for (unsigned int qp = 0; qp < _qrule->n_points(); qp++)
92  ad_current_elem_volume += _ad_JxW[qp] * _ad_coord[qp];
93 
94  // Calculate volume averaged value of shape function derivative
95  _avg_grad_test.resize(_test.size());
96  for (_i = 0; _i < _test.size(); ++_i)
97  {
98  _avg_grad_test[_i] = 0.0;
99  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
100  _avg_grad_test[_i] += _grad_test[_i][_qp](_component) * _ad_JxW[_qp] * _ad_coord[_qp];
101 
102  _avg_grad_test[_i] /= ad_current_elem_volume;
103  }
104 }
105 
106 // explicit instantiation is required for AD base classes
ADStressDivergenceTensors.h
ADStressDivergenceTensors
ADStressDivergenceTensors is the automatic differentiation version of StressDivergenceTensors.
Definition: ADStressDivergenceTensors.h:26
ADStressDivergenceTensors::_volumetric_locking_correction
const bool _volumetric_locking_correction
Flag for volumetric locking correction.
Definition: ADStressDivergenceTensors.h:64
ADStressDivergenceTensors::computeQpResidual
ADReal computeQpResidual() override
Definition: ADStressDivergenceTensors.C:72
defineADLegacyParams
defineADLegacyParams(ADStressDivergenceTensors)
ADStressDivergenceTensors::_ndisp
const unsigned int _ndisp
Coupled displacement variables.
Definition: ADStressDivergenceTensors.h:57
ADStressDivergenceTensors::precalculateResidual
void precalculateResidual() override
Definition: ADStressDivergenceTensors.C:85
ADStressDivergenceTensors::validParams
static InputParameters validParams()
Definition: ADStressDivergenceTensors.C:20
ADStressDivergenceTensors::_disp_var
std::vector< unsigned int > _disp_var
Definition: ADStressDivergenceTensors.h:58
ADStressDivergenceTensors::initialSetup
void initialSetup() override
Definition: ADStressDivergenceTensors.C:63
validParams
InputParameters validParams()
adBaseClass
adBaseClass(ADStressDivergenceTensors)
ADStressDivergenceTensors::ADStressDivergenceTensors
ADStressDivergenceTensors(const InputParameters &parameters)
Definition: ADStressDivergenceTensors.C:40
RankTwoTensorTempl< Real >
registerADMooseObject
registerADMooseObject("TensorMechanicsApp", ADStressDivergenceTensors)