www.mooseframework.org
Compute2DFiniteStrain.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 
10 #include "Compute2DFiniteStrain.h"
11 
12 #include "libmesh/quadrature.h"
13 
15 
16 InputParameters
18 {
19  InputParameters params = ComputeFiniteStrain::validParams();
20  params.addClassDescription(
21  "Compute a strain increment and rotation increment for finite strains in 2D geometries.");
22 
23  MooseEnum outOfPlaneDirection("x y z", "z");
24  params.addParam<MooseEnum>(
25  "out_of_plane_direction", outOfPlaneDirection, "The direction of the out-of-plane strain.");
26  return params;
27 }
28 
29 Compute2DFiniteStrain::Compute2DFiniteStrain(const InputParameters & parameters)
30  : ComputeFiniteStrain(parameters),
31  _out_of_plane_direction(getParam<MooseEnum>("out_of_plane_direction"))
32 {
33 }
34 
35 void
37 {
38  for (unsigned int i = 0; i < 3; ++i)
39  {
40  if (_out_of_plane_direction == i)
41  {
42  _disp[i] = &_zero;
43  _grad_disp[i] = &_grad_zero;
44  }
45  else
46  {
47  _disp[i] = &coupledValue("displacements", i);
48  _grad_disp[i] = &coupledGradient("displacements", i);
49  }
50 
51  if (_fe_problem.isTransient() && i != _out_of_plane_direction)
52  _grad_disp_old[i] = &coupledGradientOld("displacements", i);
53  else
54  _grad_disp_old[i] = &_grad_zero;
55  }
56 }
57 
58 void
60 {
61  RankTwoTensor ave_Fhat;
62  Real ave_dfgrd_det = 0.0;
63 
64  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
65  {
66 
67  // Deformation gradient calculation for 2D problems
68  RankTwoTensor A((*_grad_disp[0])[_qp],
69  (*_grad_disp[1])[_qp],
70  (*_grad_disp[2])[_qp]); // Deformation gradient
71  RankTwoTensor Fbar((*_grad_disp_old[0])[_qp],
72  (*_grad_disp_old[1])[_qp],
73  (*_grad_disp_old[2])[_qp]); // Old Deformation gradient
74 
75  // Compute the displacement gradient for the out of plane direction for plane strain,
76  // generalized plane strain, or axisymmetric problems
77 
80 
81  // Gauss point deformation gradient
82  _deformation_gradient[_qp] = A;
83  _deformation_gradient[_qp].addIa(1.0);
84 
85  A -= Fbar; // very nearly A = gradU - gradUold
86 
87  Fbar.addIa(1.0); // Fbar = ( I + gradUold)
88 
89  // Incremental deformation gradient _Fhat = I + A Fbar^-1
90  _Fhat[_qp] = A * Fbar.inverse();
91  _Fhat[_qp].addIa(1.0);
92 
94  {
95  // Calculate average _Fhat for volumetric locking correction
96  ave_Fhat += _Fhat[_qp] * _JxW[_qp] * _coord[_qp];
97 
98  // Average deformation gradient
99  ave_dfgrd_det += _deformation_gradient[_qp].det() * _JxW[_qp] * _coord[_qp];
100  }
101  }
103  {
104  // needed for volumetric locking correction
105  ave_Fhat /= _current_elem_volume;
106  // average deformation gradient
107  ave_dfgrd_det /= _current_elem_volume;
108  }
109  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
110  {
112  {
113  // Finalize volumetric locking correction
114  _Fhat[_qp] *= std::cbrt(ave_Fhat.det() / _Fhat[_qp].det());
115  // Volumetric locking correction
116  _deformation_gradient[_qp] *= std::cbrt(ave_dfgrd_det / _deformation_gradient[_qp].det());
117  }
118 
119  computeQpStrain();
120  }
121 }
122 
123 void
125 {
126  if (_out_of_plane_direction != 2 && _ndisp != 3)
127  mooseError("For 2D simulations where the out-of-plane direction is x or y the number of "
128  "supplied displacements must be three.");
129  else if (_out_of_plane_direction == 2 && _ndisp != 2)
130  mooseError("For 2D simulations where the out-of-plane direction is z the number of supplied "
131  "displacements must be two.");
132 }
Compute2DFiniteStrain::displacementIntegrityCheck
virtual void displacementIntegrityCheck() override
Definition: Compute2DFiniteStrain.C:124
ComputeStrainBase::_current_elem_volume
const Real & _current_elem_volume
Definition: ComputeStrainBase.h:56
ComputeStrainBase::_disp
std::vector< const VariableValue * > _disp
Definition: ComputeStrainBase.h:41
Compute2DFiniteStrain
Compute2DFiniteStrain defines a strain increment and a rotation increment for finite strains in 2D ge...
Definition: Compute2DFiniteStrain.h:26
ComputeFiniteStrain
ComputeFiniteStrain defines a strain increment and rotation increment, for finite strains.
Definition: ComputeFiniteStrain.h:22
Compute2DFiniteStrain::computeProperties
virtual void computeProperties() override
Definition: Compute2DFiniteStrain.C:59
ComputeIncrementalStrainBase::_grad_disp_old
std::vector< const VariableGradient * > _grad_disp_old
Definition: ComputeIncrementalStrainBase.h:36
ComputeFiniteStrain::_Fhat
std::vector< RankTwoTensor > _Fhat
Definition: ComputeFiniteStrain.h:37
Compute2DFiniteStrain::initialSetup
void initialSetup() override
Definition: Compute2DFiniteStrain.C:36
Compute2DFiniteStrain.h
ComputeStrainBase::_ndisp
unsigned int _ndisp
Coupled displacement variables.
Definition: ComputeStrainBase.h:40
Compute2DFiniteStrain::Compute2DFiniteStrain
Compute2DFiniteStrain(const InputParameters &parameters)
Definition: Compute2DFiniteStrain.C:29
ComputeFiniteStrain::computeQpStrain
virtual void computeQpStrain()
Definition: ComputeFiniteStrain.C:105
ComputeIncrementalStrainBase::_deformation_gradient
MaterialProperty< RankTwoTensor > & _deformation_gradient
Definition: ComputeIncrementalStrainBase.h:42
Compute2DFiniteStrain::computeOutOfPlaneGradDisp
virtual Real computeOutOfPlaneGradDisp()=0
Computes the current out-of-plane component of the displacement gradient; as a virtual function,...
Compute2DFiniteStrain::_out_of_plane_direction
const unsigned int _out_of_plane_direction
Definition: Compute2DFiniteStrain.h:52
RankTwoTensorTempl< Real >
Compute2DFiniteStrain::computeOutOfPlaneGradDispOld
virtual Real computeOutOfPlaneGradDispOld()=0
Computes the old out-of-plane component of the displacement gradient; as a virtual function,...
ComputeFiniteStrain::validParams
static InputParameters validParams()
Definition: ComputeFiniteStrain.C:27
ComputeStrainBase::_volumetric_locking_correction
const bool _volumetric_locking_correction
Definition: ComputeStrainBase.h:55
ComputeStrainBase::_grad_disp
std::vector< const VariableGradient * > _grad_disp
Definition: ComputeStrainBase.h:42
defineLegacyParams
defineLegacyParams(Compute2DFiniteStrain)
Compute2DFiniteStrain::validParams
static InputParameters validParams()
Definition: Compute2DFiniteStrain.C:17