www.mooseframework.org
NonlinearPlaneStrain.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 "NonlinearPlaneStrain.h"
11 #include "SolidModel.h"
12 #include "Problem.h"
14 
15 #include "libmesh/quadrature.h"
16 
17 namespace SolidMechanics
18 {
19 
21  const std::string & name,
22  const InputParameters & parameters)
23  : Nonlinear(solid_model, name, parameters),
24  ScalarCoupleable(&solid_model),
25  _grad_disp_x(coupledGradient("disp_x")),
26  _grad_disp_y(coupledGradient("disp_y")),
27  _have_strain_zz(isCoupled("strain_zz")),
28  _strain_zz(_have_strain_zz ? coupledValue("strain_zz") : _zero),
29  _have_scalar_strain_zz(isCoupledScalar("scalar_strain_zz")),
30  _scalar_strain_zz(_have_scalar_strain_zz ? coupledScalarValue("scalar_strain_zz") : _zero),
31  _grad_disp_x_old(coupledGradientOld("disp_x")),
32  _grad_disp_y_old(coupledGradientOld("disp_y")),
33  _strain_zz_old(_have_strain_zz ? coupledValueOld("strain_zz") : _zero),
34  _scalar_strain_zz_old(_have_scalar_strain_zz ? coupledScalarValueOld("scalar_strain_zz")
35  : _zero),
36  _volumetric_locking_correction(
37  _solid_model.getParamTempl<bool>("volumetric_locking_correction"))
38 {
39 }
40 
42 
44 
46 
47 void
49 {
50  // A = grad(u(k+1) - u(k))
51  // Fbar = 1 + grad(u(k))
52  // Fhat = 1 + A*(Fbar^-1)
53  ColumnMajorMatrix A;
54  ColumnMajorMatrix Fbar;
55  ColumnMajorMatrix Fbar_inverse;
56  ColumnMajorMatrix Fhat_average;
57  Real volume(0);
58 
59  _Fbar.resize(_solid_model.qrule()->n_points());
60 
61  for (unsigned qp = 0; qp < _solid_model.qrule()->n_points(); ++qp)
62  {
63  Real strain_zz, strain_zz_old;
64  if (_have_strain_zz)
65  {
66  strain_zz = _strain_zz[qp];
67  strain_zz_old = _strain_zz_old[qp];
68  }
69  else if (_have_scalar_strain_zz && _scalar_strain_zz.size() > 0)
70  {
71  strain_zz = _scalar_strain_zz[qp];
72  strain_zz_old = _scalar_strain_zz_old[qp];
73  }
74  else
75  {
76  strain_zz = 0.0;
77  strain_zz_old = 0.0;
78  }
79 
80  fillMatrix(qp, _grad_disp_x, _grad_disp_y, strain_zz, A);
81  fillMatrix(qp, _grad_disp_x_old, _grad_disp_y_old, strain_zz_old, Fbar);
82 
83  A -= Fbar;
84 
85  Fbar.addDiag(1);
86 
87  _Fbar[qp] = Fbar;
88 
89  // Get Fbar^(-1)
90  // Computing the inverse is generally a bad idea.
91  // It's better to compute LU factors. For now at least, we'll take
92  // a direct route.
93 
94  invertMatrix(Fbar, Fbar_inverse);
95 
96  Fhat[qp] = A * Fbar_inverse;
97  Fhat[qp].addDiag(1);
98 
100  {
101  // Now include the contribution for the integration of Fhat over the element
102  Fhat_average += Fhat[qp] * _solid_model.JxW(qp);
103 
104  volume += _solid_model.JxW(qp); // Accumulate original configuration volume
105  }
106  }
107 
109  {
110  Fhat_average /= volume;
111  const Real det_Fhat_average(detMatrix(Fhat_average));
112 
113  // Finalize volumetric locking correction
114  for (unsigned qp = 0; qp < _solid_model.qrule()->n_points(); ++qp)
115  {
116  const Real det_Fhat(detMatrix(Fhat[qp]));
117  const Real factor(std::cbrt(det_Fhat_average / det_Fhat));
118 
119  Fhat[qp] *= factor;
120  }
121  }
122  // Moose::out << "Fhat(0,0)" << Fhat[0](0,0) << std::endl;
123 }
124 
126 
127 void
128 NonlinearPlaneStrain::computeDeformationGradient(unsigned int qp, ColumnMajorMatrix & F)
129 {
130  mooseAssert(F.n() == 3 && F.m() == 3, "computeDefGrad requires 3x3 matrix");
131 
132  F(0, 0) = _grad_disp_x[qp](0) + 1;
133  F(0, 1) = _grad_disp_x[qp](1);
134  F(0, 2) = 0;
135  F(1, 0) = _grad_disp_y[qp](0);
136  F(1, 1) = _grad_disp_y[qp](1) + 1;
137  F(1, 2) = 0;
138  F(2, 0) = 0;
139  F(2, 1) = 0;
140  if (_have_strain_zz)
141  F(2, 2) = _strain_zz[qp] + 1;
142  else if (_have_scalar_strain_zz && _scalar_strain_zz.size() > 0)
143  F(2, 2) = _scalar_strain_zz[qp] + 1;
144  else
145  F(2, 2) = 1;
146 }
147 
149 
150 void
152  const VariableGradient & grad_x,
153  const VariableGradient & grad_y,
154  const Real & strain_zz,
155  ColumnMajorMatrix & A) const
156 {
157  mooseAssert(A.n() == 3 && A.m() == 3, "computeDefGrad requires 3x3 matrix");
158 
159  A(0, 0) = grad_x[qp](0);
160  A(0, 1) = grad_x[qp](1);
161  A(0, 2) = 0;
162  A(1, 0) = grad_y[qp](0);
163  A(1, 1) = grad_y[qp](1);
164  A(1, 2) = 0;
165  A(2, 0) = 0;
166  A(2, 1) = 0;
167  A(2, 2) = strain_zz;
168 }
169 
171 
172 Real
174 {
175  Real strain_zz_old;
176  if (_have_strain_zz)
177  strain_zz_old = _strain_zz_old[qp];
178  else if (_have_scalar_strain_zz && _scalar_strain_zz.size() > 0)
179  strain_zz_old = _scalar_strain_zz_old[qp];
180  else
181  strain_zz_old = 0.0;
182 
183  ColumnMajorMatrix Fnm1T;
184  fillMatrix(qp, _grad_disp_x_old, _grad_disp_y_old, strain_zz_old, Fnm1T);
185  Fnm1T.addDiag(1);
186 
187  return detMatrix(Fnm1T);
188 }
189 
191 }
SolidMechanics::NonlinearPlaneStrain::fillMatrix
virtual void fillMatrix(unsigned int qp, const VariableGradient &grad_x, const VariableGradient &grad_y, const Real &strain_zz, ColumnMajorMatrix &A) const
Definition: NonlinearPlaneStrain.C:151
SolidMechanics::NonlinearPlaneStrain::_grad_disp_y
const VariableGradient & _grad_disp_y
Definition: NonlinearPlaneStrain.h:31
SolidMechanics::NonlinearPlaneStrain::volumeRatioOld
virtual Real volumeRatioOld(unsigned qp) const
Definition: NonlinearPlaneStrain.C:173
SolidMechanics::NonlinearPlaneStrain::_have_strain_zz
bool _have_strain_zz
Definition: NonlinearPlaneStrain.h:32
SolidMechanics::NonlinearPlaneStrain::_volumetric_locking_correction
const bool _volumetric_locking_correction
Definition: NonlinearPlaneStrain.h:53
SolidMechanics::NonlinearPlaneStrain::_grad_disp_x
const VariableGradient & _grad_disp_x
Definition: NonlinearPlaneStrain.h:30
SolidMechanics::NonlinearPlaneStrain::computeDeformationGradient
virtual void computeDeformationGradient(unsigned int qp, ColumnMajorMatrix &F)
Definition: NonlinearPlaneStrain.C:128
SymmIsotropicElasticityTensor.h
SolidMechanics::Nonlinear::_Fbar
std::vector< ColumnMajorMatrix > _Fbar
Definition: Nonlinear.h:48
SolidMechanics::NonlinearPlaneStrain::_strain_zz_old
const VariableValue & _strain_zz_old
Definition: NonlinearPlaneStrain.h:39
SolidMechanics::Nonlinear::Fhat
const std::vector< ColumnMajorMatrix > & Fhat() const
Definition: Nonlinear.h:33
SolidMechanics
Definition: AxisymmetricRZ.h:16
SolidMechanics::NonlinearPlaneStrain::~NonlinearPlaneStrain
virtual ~NonlinearPlaneStrain()
Definition: NonlinearPlaneStrain.C:43
SolidModel
SolidModel is the base class for all this module's solid mechanics material models.
Definition: SolidModel.h:33
name
const std::string name
Definition: Setup.h:21
SolidMechanics::NonlinearPlaneStrain::_have_scalar_strain_zz
bool _have_scalar_strain_zz
Definition: NonlinearPlaneStrain.h:34
SolidMechanics::Element::_solid_model
SolidModel & _solid_model
Definition: Element.h:74
SolidMechanics::NonlinearPlaneStrain::_strain_zz
const VariableValue & _strain_zz
Definition: NonlinearPlaneStrain.h:33
SolidMechanics::Element::detMatrix
static Real detMatrix(const ColumnMajorMatrix &A)
Definition: Element.C:31
SolidMechanics::NonlinearPlaneStrain::computeIncrementalDeformationGradient
virtual void computeIncrementalDeformationGradient(std::vector< ColumnMajorMatrix > &Fhat)
Definition: NonlinearPlaneStrain.C:48
SolidMechanics::NonlinearPlaneStrain::_scalar_strain_zz
const VariableValue & _scalar_strain_zz
Definition: NonlinearPlaneStrain.h:35
SolidMechanics::NonlinearPlaneStrain::_grad_disp_y_old
const VariableGradient & _grad_disp_y_old
Definition: NonlinearPlaneStrain.h:38
SolidMechanics::NonlinearPlaneStrain::NonlinearPlaneStrain
NonlinearPlaneStrain(SolidModel &solid_model, const std::string &name, const InputParameters &parameters)
Definition: NonlinearPlaneStrain.C:20
SolidMechanics::NonlinearPlaneStrain::_grad_disp_x_old
const VariableGradient & _grad_disp_x_old
Definition: NonlinearPlaneStrain.h:37
SolidModel.h
SolidMechanics::Nonlinear
Nonlinear is the base class for all large strain/rotation models.
Definition: Nonlinear.h:24
SolidModel::qrule
const QBase * qrule()
Definition: SolidModel.h:55
NonlinearPlaneStrain.h
SolidMechanics::NonlinearPlaneStrain::_scalar_strain_zz_old
const VariableValue & _scalar_strain_zz_old
Definition: NonlinearPlaneStrain.h:40
SolidMechanics::Element::invertMatrix
static void invertMatrix(const ColumnMajorMatrix &A, ColumnMajorMatrix &Ainv)
Definition: Element.C:52
SolidModel::JxW
Real JxW(unsigned i) const
Definition: SolidModel.h:57