www.mooseframework.org
ADStressDivergenceRZTensors.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 "Assembly.h"
12 #include "RankTwoTensor.h"
13 #include "ElasticityTensorTools.h"
14 #include "libmesh/quadrature.h"
15 
17 
19 
20 template <ComputeStage compute_stage>
21 InputParameters
23 {
25  params.addClassDescription(
26  "Calculate stress divergence for an axisymmetric problem in cylindrical coordinates.");
27  params.addRequiredRangeCheckedParam<unsigned int>(
28  "component",
29  "component < 2",
30  "An integer corresponding to the direction the variable this kernel acts in. (0 "
31  "refers to the radial and 1 to the axial displacement.)");
32  params.set<bool>("use_displaced_mesh") = true;
33  return params;
34 }
35 
36 template <ComputeStage compute_stage>
38  const InputParameters & parameters)
39  : ADStressDivergenceTensors<compute_stage>(parameters)
40 {
41 }
42 
43 template <ComputeStage compute_stage>
44 void
46 {
47  if (getBlockCoordSystem() != Moose::COORD_RZ)
48  mooseError("The coordinate system in the Problem block must be set to RZ for axisymmetric "
49  "geometries.");
50 }
51 
52 template <ComputeStage compute_stage>
53 ADReal
55 {
56  ADReal div = 0.0;
57  if (_component == 0)
58  {
59  div = _grad_test[_i][_qp](0) * _stress[_qp](0, 0) +
60  (_test[_i][_qp] / _ad_q_point[_qp](0)) * _stress[_qp](2, 2) +
61  _grad_test[_i][_qp](1) * _stress[_qp](0, 1); // stress_{rz}
62 
63  // volumetric locking correction
64  if (_volumetric_locking_correction)
65  div += (_avg_grad_test[_i] - _grad_test[_i][_qp](0) - _test[_i][_qp] / _ad_q_point[_qp](0)) *
66  (_stress[_qp].trace()) / 3.0;
67  }
68  else if (_component == 1)
69  {
70  div = _grad_test[_i][_qp](1) * _stress[_qp](1, 1) +
71  _grad_test[_i][_qp](0) * _stress[_qp](1, 0); // stress_{zr}
72 
73  // volumetric locking correction
74  if (_volumetric_locking_correction)
75  div += (_avg_grad_test[_i] - _grad_test[_i][_qp](1)) * (_stress[_qp].trace()) / 3.0;
76  }
77  else
78  mooseError("Invalid component for this AxisymmetricRZ problem.");
79 
80  return div;
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  {
101  if (_component == 0)
102  _avg_grad_test[_i] +=
103  (_grad_test[_i][_qp](_component) + _test[_i][_qp] / _ad_q_point[_qp](0)) *
104  _ad_JxW[_qp] * _ad_coord[_qp];
105  else
106  _avg_grad_test[_i] += _grad_test[_i][_qp](_component) * _ad_JxW[_qp] * _ad_coord[_qp];
107  }
108  _avg_grad_test[_i] /= ad_current_elem_volume;
109  }
110 }
ADStressDivergenceTensors
ADStressDivergenceTensors is the automatic differentiation version of StressDivergenceTensors.
Definition: ADStressDivergenceTensors.h:26
ADStressDivergenceRZTensors::computeQpResidual
ADReal computeQpResidual() override
Definition: ADStressDivergenceRZTensors.C:54
ADStressDivergenceRZTensors::initialSetup
void initialSetup() override
Definition: ADStressDivergenceRZTensors.C:45
ADStressDivergenceRZTensors.h
ADStressDivergenceTensors::validParams
static InputParameters validParams()
Definition: ADStressDivergenceTensors.C:20
ADStressDivergenceRZTensors::ADStressDivergenceRZTensors
ADStressDivergenceRZTensors(const InputParameters &parameters)
Definition: ADStressDivergenceRZTensors.C:37
ElasticityTensorTools.h
ADStressDivergenceRZTensors
ADStressDivergenceRZTensors is the automatic differentiation version of StressDivergenceRZTensors.
Definition: ADStressDivergenceRZTensors.h:16
registerADMooseObject
registerADMooseObject("TensorMechanicsApp", ADStressDivergenceRZTensors)
ADStressDivergenceRZTensors::validParams
static InputParameters validParams()
Definition: ADStressDivergenceRZTensors.C:22
defineADLegacyParams
defineADLegacyParams(ADStressDivergenceRZTensors)
ADStressDivergenceRZTensors::precalculateResidual
void precalculateResidual() override
Definition: ADStressDivergenceRZTensors.C:85