www.mooseframework.org
NonlinearRZ.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 "NonlinearRZ.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  _grad_disp_r(coupledGradient("disp_r")),
25  _grad_disp_z(coupledGradient("disp_z")),
26  _grad_disp_r_old(coupledGradientOld("disp_r")),
27  _grad_disp_z_old(coupledGradientOld("disp_z")),
28  _disp_r(coupledValue("disp_r")),
29  _disp_r_old(coupledValueOld("disp_r")),
30  _volumetric_locking_correction(
31  _solid_model.getParamTempl<bool>("volumetric_locking_correction"))
32 {
33 }
34 
36 
38 
40 
41 void
42 NonlinearRZ::computeIncrementalDeformationGradient(std::vector<ColumnMajorMatrix> & Fhat)
43 {
44  // A = grad(u(k+1) - u(k))
45  // Fbar = 1 + grad(u(k))
46  // Fhat = 1 + A*(Fbar^-1)
47  ColumnMajorMatrix A;
48  ColumnMajorMatrix Fbar;
49  ColumnMajorMatrix Fbar_inverse;
50  ColumnMajorMatrix Fhat_average;
51  Real volume(0);
52 
53  _Fbar.resize(_solid_model.qrule()->n_points());
54 
55  for (unsigned qp = 0; qp < _solid_model.qrule()->n_points(); ++qp)
56  {
59 
60  A -= Fbar;
61 
62  Fbar.addDiag(1);
63 
64  _Fbar[qp] = Fbar;
65 
66  // Get Fbar^(-1)
67  // Computing the inverse is generally a bad idea.
68  // It's better to compute LU factors. For now at least, we'll take
69  // a direct route.
70 
71  invertMatrix(Fbar, Fbar_inverse);
72 
73  Fhat[qp] = A * Fbar_inverse;
74  Fhat[qp].addDiag(1);
75 
77  {
78  // Now include the contribution for the integration of Fhat over the element
79  Fhat_average += Fhat[qp] * _solid_model.JxW(qp) * _solid_model.q_point(qp)(0);
80 
81  volume += _solid_model.JxW(qp) *
82  _solid_model.q_point(qp)(0); // Accumulate original configuration volume
83  }
84  }
85 
87  {
88  // Check for the case when Materials are being reinit by a SideIntegralPP
89  // active on the axis of rotation on a solid axisymmetric model
90  // where the r coordinate will be zero
91  if (volume != 0.0)
92  Fhat_average /= volume;
93  else
94  Fhat_average *= 0.0;
95  const Real det_Fhat_average(detMatrix(Fhat_average));
96 
97  // Finalize volumetric locking correction
98  for (unsigned qp = 0; qp < _solid_model.qrule()->n_points(); ++qp)
99  {
100  const Real det_Fhat(detMatrix(Fhat[qp]));
101  const Real factor(std::cbrt(det_Fhat_average / det_Fhat));
102 
103  Fhat[qp] *= factor;
104  }
105  }
106  // Moose::out << "Fhat(0,0)" << Fhat[0](0,0) << std::endl;
107 }
108 
110 
111 void
112 NonlinearRZ::computeDeformationGradient(unsigned int qp, ColumnMajorMatrix & F)
113 {
114  mooseAssert(F.n() == 3 && F.m() == 3, "computeDefGrad requires 3x3 matrix");
115 
116  F(0, 0) = _grad_disp_r[qp](0) + 1;
117  F(0, 1) = _grad_disp_r[qp](1);
118  F(0, 2) = 0;
119  F(1, 0) = _grad_disp_z[qp](0);
120  F(1, 1) = _grad_disp_z[qp](1) + 1;
121  F(1, 2) = 0;
122  F(2, 0) = 0;
123  F(2, 1) = 0;
124  F(2, 2) =
125  (_solid_model.q_point(qp)(0) != 0.0 ? _disp_r[qp] / _solid_model.q_point(qp)(0) : 0.0) + 1;
126 }
127 
129 
130 void
131 NonlinearRZ::fillMatrix(unsigned int qp,
132  const VariableGradient & grad_r,
133  const VariableGradient & grad_z,
134  const VariableValue & u,
135  ColumnMajorMatrix & A) const
136 {
137  mooseAssert(A.n() == 3 && A.m() == 3, "computeDefGrad requires 3x3 matrix");
138 
139  A(0, 0) = grad_r[qp](0);
140  A(0, 1) = grad_r[qp](1);
141  A(0, 2) = 0;
142  A(1, 0) = grad_z[qp](0);
143  A(1, 1) = grad_z[qp](1);
144  A(1, 2) = 0;
145  A(2, 0) = 0;
146  A(2, 1) = 0;
147  A(2, 2) = (_solid_model.q_point(qp)(0) != 0.0 ? u[qp] / _solid_model.q_point(qp)(0) : 0.0);
148 }
149 
151 
152 Real
153 NonlinearRZ::volumeRatioOld(unsigned int qp) const
154 {
155  ColumnMajorMatrix Fnm1T;
157  Fnm1T.addDiag(1);
158 
159  return detMatrix(Fnm1T);
160 }
161 
163 }
SolidMechanics::NonlinearRZ::_grad_disp_r
const VariableGradient & _grad_disp_r
Definition: NonlinearRZ.h:29
SymmIsotropicElasticityTensor.h
SolidMechanics::Nonlinear::_Fbar
std::vector< ColumnMajorMatrix > _Fbar
Definition: Nonlinear.h:48
SolidMechanics::NonlinearRZ::_grad_disp_z_old
const VariableGradient & _grad_disp_z_old
Definition: NonlinearRZ.h:32
NonlinearRZ.h
SolidMechanics::NonlinearRZ::computeIncrementalDeformationGradient
virtual void computeIncrementalDeformationGradient(std::vector< ColumnMajorMatrix > &Fhat)
Definition: NonlinearRZ.C:42
SolidMechanics::Nonlinear::Fhat
const std::vector< ColumnMajorMatrix > & Fhat() const
Definition: Nonlinear.h:33
SolidMechanics
Definition: AxisymmetricRZ.h:16
SolidModel::q_point
const Point & q_point(unsigned i) const
Definition: SolidModel.h:56
SolidMechanics::NonlinearRZ::volumeRatioOld
virtual Real volumeRatioOld(unsigned qp) const
Definition: NonlinearRZ.C:153
SolidMechanics::NonlinearRZ::computeDeformationGradient
virtual void computeDeformationGradient(unsigned int qp, ColumnMajorMatrix &F)
Definition: NonlinearRZ.C:112
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::NonlinearRZ::~NonlinearRZ
virtual ~NonlinearRZ()
Definition: NonlinearRZ.C:37
SolidMechanics::NonlinearRZ::_disp_r
const VariableValue & _disp_r
Definition: NonlinearRZ.h:33
SolidMechanics::NonlinearRZ::NonlinearRZ
NonlinearRZ(SolidModel &solid_model, const std::string &name, const InputParameters &parameters)
Definition: NonlinearRZ.C:20
SolidMechanics::NonlinearRZ::_disp_r_old
const VariableValue & _disp_r_old
Definition: NonlinearRZ.h:34
SolidMechanics::Element::_solid_model
SolidModel & _solid_model
Definition: Element.h:74
SolidMechanics::NonlinearRZ::_grad_disp_z
const VariableGradient & _grad_disp_z
Definition: NonlinearRZ.h:30
SolidMechanics::Element::detMatrix
static Real detMatrix(const ColumnMajorMatrix &A)
Definition: Element.C:31
SolidMechanics::NonlinearRZ::_grad_disp_r_old
const VariableGradient & _grad_disp_r_old
Definition: NonlinearRZ.h:31
SolidMechanics::NonlinearRZ::_volumetric_locking_correction
const bool _volumetric_locking_correction
Definition: NonlinearRZ.h:47
SolidMechanics::NonlinearRZ::fillMatrix
virtual void fillMatrix(unsigned int qp, const VariableGradient &grad_r, const VariableGradient &grad_z, const VariableValue &u, ColumnMajorMatrix &A) const
Definition: NonlinearRZ.C:131
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
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