www.mooseframework.org
ADCompute2DFiniteStrain.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 
12 #include "libmesh/quadrature.h"
13 
15 
16 template <ComputeStage compute_stage>
17 InputParameters
19 {
20  InputParameters params = ADComputeFiniteStrain<compute_stage>::validParams();
21  params.addClassDescription(
22  "Compute a strain increment and rotation increment for finite strains in 2D geometries.");
23 
24  MooseEnum outOfPlaneDirection("x y z", "z");
25  params.addParam<MooseEnum>(
26  "out_of_plane_direction", outOfPlaneDirection, "The direction of the out-of-plane strain.");
27  return params;
28 }
29 
30 template <ComputeStage compute_stage>
32  : ADComputeFiniteStrain<compute_stage>(parameters),
33  _out_of_plane_direction(getParam<MooseEnum>("out_of_plane_direction"))
34 {
35 }
36 
37 template <ComputeStage compute_stage>
38 void
40 {
41  for (unsigned int i = 0; i < 3; ++i)
42  {
43  if (_out_of_plane_direction == i)
44  {
45  _disp[i] = &adZeroValue();
46  _grad_disp[i] = &adZeroGradient();
47  }
48  else
49  {
50  _disp[i] = &adCoupledValue("displacements", i);
51  _grad_disp[i] = &adCoupledGradient("displacements", i);
52  }
53 
54  if (_fe_problem.isTransient() && i != _out_of_plane_direction)
55  _grad_disp_old[i] = &coupledGradientOld("displacements", i);
56  else
57  _grad_disp_old[i] = &_grad_zero;
58  }
59 }
60 
61 template <ComputeStage compute_stage>
62 void
64 {
65  ADRankTwoTensor ave_Fhat;
66 
67  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
68  {
69  // Deformation gradient calculation for 2D problems
70  ADRankTwoTensor A((*_grad_disp[0])[_qp],
71  (*_grad_disp[1])[_qp],
72  (*_grad_disp[2])[_qp]); // Deformation gradient
73  RankTwoTensor Fbar((*_grad_disp_old[0])[_qp],
74  (*_grad_disp_old[1])[_qp],
75  (*_grad_disp_old[2])[_qp]); // Old Deformation gradient
76 
77  // Compute the displacement gradient for the out of plane direction for plane strain,
78  // generalized plane strain, or axisymmetric problems
79  A(_out_of_plane_direction, _out_of_plane_direction) = computeOutOfPlaneGradDisp();
80  Fbar(_out_of_plane_direction, _out_of_plane_direction) = computeOutOfPlaneGradDispOld();
81 
82  A -= Fbar; // very nearly A = gradU - gradUold
83 
84  Fbar.addIa(1.0); // Fbar = ( I + gradUold)
85 
86  // Incremental deformation gradient _Fhat = I + A Fbar^-1
87  _Fhat[_qp] = A * Fbar.inverse();
88  _Fhat[_qp].addIa(1.0);
89 
90  // Calculate average _Fhat for volumetric locking correction
91  if (_volumetric_locking_correction)
92  ave_Fhat += _Fhat[_qp] * _JxW[_qp] * _coord[_qp];
93  }
94 
95  if (_volumetric_locking_correction)
96  ave_Fhat /= _current_elem_volume;
97 
98  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
99  {
100  // Finalize volumetric locking correction
101  if (_volumetric_locking_correction)
102  _Fhat[_qp] *= std::cbrt(ave_Fhat.det() / _Fhat[_qp].det());
103 
104  computeQpStrain();
105  }
106 }
107 
108 template <ComputeStage compute_stage>
109 void
111 {
112  if (_out_of_plane_direction != 2 && _ndisp != 3)
113  mooseError("For 2D simulations where the out-of-plane direction is x or y the number of "
114  "supplied displacements must be three.");
115  else if (_out_of_plane_direction == 2 && _ndisp != 2)
116  mooseError("For 2D simulations where the out-of-plane direction is z the number of supplied "
117  "displacements must be two.");
118 }
119 
120 // explicit instantiation is required for AD base classes
ADCompute2DFiniteStrain::computeProperties
virtual void computeProperties() override
Definition: ADCompute2DFiniteStrain.C:63
ADCompute2DFiniteStrain::displacementIntegrityCheck
virtual void displacementIntegrityCheck() override
Definition: ADCompute2DFiniteStrain.C:110
ADCompute2DFiniteStrain::ADCompute2DFiniteStrain
ADCompute2DFiniteStrain(const InputParameters &parameters)
Definition: ADCompute2DFiniteStrain.C:31
ADCompute2DFiniteStrain::validParams
static InputParameters validParams()
Definition: ADCompute2DFiniteStrain.C:18
ADComputeFiniteStrain::validParams
static InputParameters validParams()
Definition: ADComputeFiniteStrain.C:28
ADCompute2DFiniteStrain.h
ADComputeFiniteStrain
ADComputeFiniteStrain defines a strain increment and rotation increment, for finite strains.
Definition: ADComputeFiniteStrain.h:21
adBaseClass
adBaseClass(ADCompute2DFiniteStrain)
ADCompute2DFiniteStrain
ADCompute2DFiniteStrain defines a strain increment and a rotation increment for finite strains in 2D ...
Definition: ADCompute2DFiniteStrain.h:21
RankTwoTensorTempl< Real >
ADCompute2DFiniteStrain::initialSetup
void initialSetup() override
Definition: ADCompute2DFiniteStrain.C:39
defineADLegacyParams
defineADLegacyParams(ADCompute2DFiniteStrain)