www.mooseframework.org
Nonlinear3D.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 "Nonlinear3D.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_x(coupledGradient("disp_x")),
25  _grad_disp_y(coupledGradient("disp_y")),
26  _grad_disp_z(coupledGradient("disp_z")),
27  _grad_disp_x_old(coupledGradientOld("disp_x")),
28  _grad_disp_y_old(coupledGradientOld("disp_y")),
29  _grad_disp_z_old(coupledGradientOld("disp_z")),
30  _volumetric_locking_correction(
31  _solid_model.getParamTempl<bool>("volumetric_locking_correction"))
32 {
33 }
34 
36 
38 
40 
41 void
42 Nonlinear3D::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);
80 
81  volume += _solid_model.JxW(qp); // Accumulate original configuration volume
82  }
83  }
84 
86  {
87  Fhat_average /= volume;
88  const Real det_Fhat_average(detMatrix(Fhat_average));
89 
90  // Finalize volumetric locking correction
91  for (unsigned qp = 0; qp < _solid_model.qrule()->n_points(); ++qp)
92  {
93  const Real det_Fhat(detMatrix(Fhat[qp]));
94  const Real factor(std::cbrt(det_Fhat_average / det_Fhat));
95 
96  Fhat[qp] *= factor;
97  }
98  }
99  // Moose::out << "Fhat(0,0)" << Fhat[0](0,0) << std::endl;
100 }
101 
103 
104 void
105 Nonlinear3D::computeDeformationGradient(unsigned int qp, ColumnMajorMatrix & F)
106 {
107  mooseAssert(F.n() == 3 && F.m() == 3, "computeDefGrad requires 3x3 matrix");
108 
109  F(0, 0) = _grad_disp_x[qp](0) + 1;
110  F(0, 1) = _grad_disp_x[qp](1);
111  F(0, 2) = _grad_disp_x[qp](2);
112  F(1, 0) = _grad_disp_y[qp](0);
113  F(1, 1) = _grad_disp_y[qp](1) + 1;
114  F(1, 2) = _grad_disp_y[qp](2);
115  F(2, 0) = _grad_disp_z[qp](0);
116  F(2, 1) = _grad_disp_z[qp](1);
117  F(2, 2) = _grad_disp_z[qp](2) + 1;
118 }
119 
121 
122 Real
123 Nonlinear3D::volumeRatioOld(unsigned int qp) const
124 {
125  ColumnMajorMatrix Fnm1T(_grad_disp_x_old[qp], _grad_disp_y_old[qp], _grad_disp_z_old[qp]);
126  Fnm1T(0, 0) += 1;
127  Fnm1T(1, 1) += 1;
128  Fnm1T(2, 2) += 1;
129 
130  return detMatrix(Fnm1T);
131 }
132 
134 }
SolidMechanics::Nonlinear3D::volumeRatioOld
virtual Real volumeRatioOld(unsigned qp) const
Definition: Nonlinear3D.C:123
SymmIsotropicElasticityTensor.h
SolidMechanics::Nonlinear::_Fbar
std::vector< ColumnMajorMatrix > _Fbar
Definition: Nonlinear.h:48
SolidMechanics::Nonlinear3D::_grad_disp_x_old
const VariableGradient & _grad_disp_x_old
Definition: Nonlinear3D.h:37
SolidMechanics::Nonlinear3D::_grad_disp_z_old
const VariableGradient & _grad_disp_z_old
Definition: Nonlinear3D.h:39
SolidMechanics::Nonlinear3D::_grad_disp_x
const VariableGradient & _grad_disp_x
Definition: Nonlinear3D.h:34
Nonlinear3D.h
SolidMechanics::Nonlinear3D::computeDeformationGradient
virtual void computeDeformationGradient(unsigned int qp, ColumnMajorMatrix &F)
Definition: Nonlinear3D.C:105
SolidMechanics::Nonlinear::Fhat
const std::vector< ColumnMajorMatrix > & Fhat() const
Definition: Nonlinear.h:33
SolidMechanics
Definition: AxisymmetricRZ.h:16
SolidMechanics::Nonlinear3D::_grad_disp_y
const VariableGradient & _grad_disp_y
Definition: Nonlinear3D.h:35
SolidMechanics::Element::fillMatrix
void fillMatrix(unsigned int qp, const VariableGradient &grad_x, const VariableGradient &grad_y, const VariableGradient &grad_z, ColumnMajorMatrix &A)
Definition: Element.C:228
SolidMechanics::Nonlinear3D::_volumetric_locking_correction
const bool _volumetric_locking_correction
Definition: Nonlinear3D.h:46
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::Nonlinear3D::~Nonlinear3D
virtual ~Nonlinear3D()
Definition: Nonlinear3D.C:37
SolidMechanics::Nonlinear3D::_grad_disp_z
const VariableGradient & _grad_disp_z
Definition: Nonlinear3D.h:36
SolidMechanics::Element::_solid_model
SolidModel & _solid_model
Definition: Element.h:74
SolidMechanics::Nonlinear3D::computeIncrementalDeformationGradient
virtual void computeIncrementalDeformationGradient(std::vector< ColumnMajorMatrix > &Fhat)
Definition: Nonlinear3D.C:42
SolidMechanics::Element::detMatrix
static Real detMatrix(const ColumnMajorMatrix &A)
Definition: Element.C:31
SolidMechanics::Nonlinear3D::_grad_disp_y_old
const VariableGradient & _grad_disp_y_old
Definition: Nonlinear3D.h:38
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::Nonlinear3D::Nonlinear3D
Nonlinear3D(SolidModel &solid_model, const std::string &name, const InputParameters &parameters)
Definition: Nonlinear3D.C:20
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