www.mooseframework.org
Public Member Functions | Static Public Member Functions | Public Attributes | Protected Types | Protected Member Functions | Protected Attributes | List of all members
SolidMechanics::NonlinearPlaneStrain Class Reference

NonlinearPlaneStrain is a class for large deformation plane strain. More...

#include <NonlinearPlaneStrain.h>

Inheritance diagram for SolidMechanics::NonlinearPlaneStrain:
[legend]

Public Member Functions

 NonlinearPlaneStrain (SolidModel &solid_model, const std::string &name, const InputParameters &parameters)
 
virtual ~NonlinearPlaneStrain ()
 
const ColumnMajorMatrix & incrementalRotation () const
 
const std::vector< ColumnMajorMatrix > & Fhat () const
 
virtual unsigned int getNumKnownCrackDirs () const
 
void fillMatrix (unsigned int qp, const VariableGradient &grad_x, const VariableGradient &grad_y, const VariableGradient &grad_z, ColumnMajorMatrix &A)
 

Static Public Member Functions

static Real detMatrix (const ColumnMajorMatrix &A)
 
static void invertMatrix (const ColumnMajorMatrix &A, ColumnMajorMatrix &Ainv)
 
static void rotateSymmetricTensor (const ColumnMajorMatrix &R, const RealTensorValue &T, RealTensorValue &result)
 
static void rotateSymmetricTensor (const ColumnMajorMatrix &R, const SymmTensor &T, SymmTensor &result)
 
static void unrotateSymmetricTensor (const ColumnMajorMatrix &R, const SymmTensor &T, SymmTensor &result)
 
static void polarDecompositionEigen (const ColumnMajorMatrix &Fhat, ColumnMajorMatrix &Rhat, SymmTensor &strain_increment)
 

Public Attributes

const VariableGradient & _grad_disp_x
 
const VariableGradient & _grad_disp_y
 
bool _have_strain_zz
 
const VariableValue & _strain_zz
 
bool _have_scalar_strain_zz
 
const VariableValue & _scalar_strain_zz
 
const VariableGradient & _grad_disp_x_old
 
const VariableGradient & _grad_disp_y_old
 
const VariableValue & _strain_zz_old
 
const VariableValue & _scalar_strain_zz_old
 

Protected Types

enum  DecompMethod { RashidApprox = 0, Eigen = 1 }
 

Protected Member Functions

virtual void computeDeformationGradient (unsigned int qp, ColumnMajorMatrix &F)
 
virtual void fillMatrix (unsigned int qp, const VariableGradient &grad_x, const VariableGradient &grad_y, const Real &strain_zz, ColumnMajorMatrix &A) const
 
virtual Real volumeRatioOld (unsigned qp) const
 
virtual void computeIncrementalDeformationGradient (std::vector< ColumnMajorMatrix > &Fhat)
 
virtual void init ()
 
virtual void computeStrain (const unsigned qp, const SymmTensor &total_strain_old, SymmTensor &total_strain_new, SymmTensor &strain_increment)
 
virtual void finalizeStress (std::vector< SymmTensor *> &t)
 Rotate stress to current configuration. More...
 
void computeStrainIncrement (const ColumnMajorMatrix &Fhat, SymmTensor &strain_increment)
 
void computePolarDecomposition (const ColumnMajorMatrix &Fhat)
 
void computeStrainAndRotationIncrement (const ColumnMajorMatrix &Fhat, SymmTensor &strain_increment)
 

Protected Attributes

const bool _volumetric_locking_correction
 
DecompMethod _decomp_method
 
ColumnMajorMatrix _incremental_rotation
 
ColumnMajorMatrix _Uhat
 
std::vector< ColumnMajorMatrix > _Fhat
 
std::vector< ColumnMajorMatrix > _Fbar
 
ColumnMajorMatrix _F
 
SolidModel_solid_model
 

Detailed Description

NonlinearPlaneStrain is a class for large deformation plane strain.

Definition at line 22 of file NonlinearPlaneStrain.h.

Member Enumeration Documentation

◆ DecompMethod

enum SolidMechanics::Nonlinear::DecompMethod
protectedinherited
Enumerator
RashidApprox 
Eigen 

Definition at line 37 of file Nonlinear.h.

Constructor & Destructor Documentation

◆ NonlinearPlaneStrain()

SolidMechanics::NonlinearPlaneStrain::NonlinearPlaneStrain ( SolidModel solid_model,
const std::string &  name,
const InputParameters &  parameters 
)

Definition at line 20 of file NonlinearPlaneStrain.C.

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(_solid_model.getParam<bool>("volumetric_locking_correction"))
37 {
38 }
Nonlinear(SolidModel &solid_model, const std::string &name, const InputParameters &parameters)
Definition: Nonlinear.C:20
const std::string name
Definition: Setup.h:22
SolidModel & _solid_model
Definition: Element.h:75
const VariableGradient & _grad_disp_y_old
const VariableGradient & _grad_disp_x_old

◆ ~NonlinearPlaneStrain()

SolidMechanics::NonlinearPlaneStrain::~NonlinearPlaneStrain ( )
virtual

Definition at line 42 of file NonlinearPlaneStrain.C.

42 {}

Member Function Documentation

◆ computeDeformationGradient()

void SolidMechanics::NonlinearPlaneStrain::computeDeformationGradient ( unsigned int  qp,
ColumnMajorMatrix &  F 
)
protectedvirtual

Reimplemented from SolidMechanics::Element.

Definition at line 127 of file NonlinearPlaneStrain.C.

128 {
129  mooseAssert(F.n() == 3 && F.m() == 3, "computeDefGrad requires 3x3 matrix");
130 
131  F(0, 0) = _grad_disp_x[qp](0) + 1;
132  F(0, 1) = _grad_disp_x[qp](1);
133  F(0, 2) = 0;
134  F(1, 0) = _grad_disp_y[qp](0);
135  F(1, 1) = _grad_disp_y[qp](1) + 1;
136  F(1, 2) = 0;
137  F(2, 0) = 0;
138  F(2, 1) = 0;
139  if (_have_strain_zz)
140  F(2, 2) = _strain_zz[qp] + 1;
141  else if (_have_scalar_strain_zz && _scalar_strain_zz.size() > 0)
142  F(2, 2) = _scalar_strain_zz[qp] + 1;
143  else
144  F(2, 2) = 1;
145 }

◆ computeIncrementalDeformationGradient()

void SolidMechanics::NonlinearPlaneStrain::computeIncrementalDeformationGradient ( std::vector< ColumnMajorMatrix > &  Fhat)
protectedvirtual

Implements SolidMechanics::Nonlinear.

Definition at line 47 of file NonlinearPlaneStrain.C.

48 {
49  // A = grad(u(k+1) - u(k))
50  // Fbar = 1 + grad(u(k))
51  // Fhat = 1 + A*(Fbar^-1)
52  ColumnMajorMatrix A;
53  ColumnMajorMatrix Fbar;
54  ColumnMajorMatrix Fbar_inverse;
55  ColumnMajorMatrix Fhat_average;
56  Real volume(0);
57 
58  _Fbar.resize(_solid_model.qrule()->n_points());
59 
60  for (unsigned qp = 0; qp < _solid_model.qrule()->n_points(); ++qp)
61  {
62  Real strain_zz, strain_zz_old;
63  if (_have_strain_zz)
64  {
65  strain_zz = _strain_zz[qp];
66  strain_zz_old = _strain_zz_old[qp];
67  }
68  else if (_have_scalar_strain_zz && _scalar_strain_zz.size() > 0)
69  {
70  strain_zz = _scalar_strain_zz[qp];
71  strain_zz_old = _scalar_strain_zz_old[qp];
72  }
73  else
74  {
75  strain_zz = 0.0;
76  strain_zz_old = 0.0;
77  }
78 
79  fillMatrix(qp, _grad_disp_x, _grad_disp_y, strain_zz, A);
80  fillMatrix(qp, _grad_disp_x_old, _grad_disp_y_old, strain_zz_old, Fbar);
81 
82  A -= Fbar;
83 
84  Fbar.addDiag(1);
85 
86  _Fbar[qp] = Fbar;
87 
88  // Get Fbar^(-1)
89  // Computing the inverse is generally a bad idea.
90  // It's better to compute LU factors. For now at least, we'll take
91  // a direct route.
92 
93  invertMatrix(Fbar, Fbar_inverse);
94 
95  Fhat[qp] = A * Fbar_inverse;
96  Fhat[qp].addDiag(1);
97 
99  {
100  // Now include the contribution for the integration of Fhat over the element
101  Fhat_average += Fhat[qp] * _solid_model.JxW(qp);
102 
103  volume += _solid_model.JxW(qp); // Accumulate original configuration volume
104  }
105  }
106 
108  {
109  Fhat_average /= volume;
110  const Real det_Fhat_average(detMatrix(Fhat_average));
111 
112  // Finalize volumetric locking correction
113  for (unsigned qp = 0; qp < _solid_model.qrule()->n_points(); ++qp)
114  {
115  const Real det_Fhat(detMatrix(Fhat[qp]));
116  const Real factor(std::cbrt(det_Fhat_average / det_Fhat));
117 
118  Fhat[qp] *= factor;
119  }
120  }
121  // Moose::out << "Fhat(0,0)" << Fhat[0](0,0) << std::endl;
122 }
std::vector< ColumnMajorMatrix > _Fbar
Definition: Nonlinear.h:49
const std::vector< ColumnMajorMatrix > & Fhat() const
Definition: Nonlinear.h:34
QBase * qrule()
Definition: SolidModel.h:56
virtual void fillMatrix(unsigned int qp, const VariableGradient &grad_x, const VariableGradient &grad_y, const Real &strain_zz, ColumnMajorMatrix &A) const
static Real detMatrix(const ColumnMajorMatrix &A)
Definition: Element.C:31
SolidModel & _solid_model
Definition: Element.h:75
Real JxW(unsigned i) const
Definition: SolidModel.h:58
const VariableGradient & _grad_disp_y_old
static void invertMatrix(const ColumnMajorMatrix &A, ColumnMajorMatrix &Ainv)
Definition: Element.C:52
const VariableGradient & _grad_disp_x_old

◆ computePolarDecomposition()

void SolidMechanics::Nonlinear::computePolarDecomposition ( const ColumnMajorMatrix &  Fhat)
protectedinherited

Definition at line 139 of file Nonlinear.C.

Referenced by SolidMechanics::Nonlinear::computeStrainAndRotationIncrement().

140 {
141 
142  // From Rashid, 1993.
143 
144  const Real Uxx = Fhat(0, 0);
145  const Real Uxy = Fhat(0, 1);
146  const Real Uxz = Fhat(0, 2);
147  const Real Uyx = Fhat(1, 0);
148  const Real Uyy = Fhat(1, 1);
149  const Real Uyz = Fhat(1, 2);
150  const Real Uzx = Fhat(2, 0);
151  const Real Uzy = Fhat(2, 1);
152  const Real Uzz = Fhat(2, 2);
153 
154  const Real Ax = Uyz - Uzy;
155  const Real Ay = Uzx - Uxz;
156  const Real Az = Uxy - Uyx;
157  const Real Q = 0.25 * (Ax * Ax + Ay * Ay + Az * Az);
158  const Real traceF = Uxx + Uyy + Uzz;
159  const Real P = 0.25 * (traceF - 1) * (traceF - 1);
160  const Real Y = 1 / ((Q + P) * (Q + P) * (Q + P));
161 
162  const Real C1 = std::sqrt(P * (1 + (P * (Q + Q + (Q + P))) * (1 - (Q + P)) * Y));
163  const Real C2 = 0.125 + Q * 0.03125 * (P * P - 12 * (P - 1)) / (P * P);
164  const Real C3 = 0.5 * std::sqrt((P * Q * (3 - Q) + P * P * P + Q * Q) * Y);
165 
166  // Since the input to this routine is the incremental deformation gradient
167  // and not the inverse incremental gradient, this result is the transpose
168  // of the one in Rashid's paper.
169  _incremental_rotation(0, 0) = C1 + (C2 * Ax) * Ax;
170  _incremental_rotation(0, 1) = (C2 * Ay) * Ax + (C3 * Az);
171  _incremental_rotation(0, 2) = (C2 * Az) * Ax - (C3 * Ay);
172  _incremental_rotation(1, 0) = (C2 * Ax) * Ay - (C3 * Az);
173  _incremental_rotation(1, 1) = C1 + (C2 * Ay) * Ay;
174  _incremental_rotation(1, 2) = (C2 * Az) * Ay + (C3 * Ax);
175  _incremental_rotation(2, 0) = (C2 * Ax) * Az + (C3 * Ay);
176  _incremental_rotation(2, 1) = (C2 * Ay) * Az - (C3 * Ax);
177  _incremental_rotation(2, 2) = C1 + (C2 * Az) * Az;
178 }
const std::vector< ColumnMajorMatrix > & Fhat() const
Definition: Nonlinear.h:34
ColumnMajorMatrix _incremental_rotation
Definition: Nonlinear.h:45

◆ computeStrain()

void SolidMechanics::Nonlinear::computeStrain ( const unsigned  qp,
const SymmTensor total_strain_old,
SymmTensor total_strain_new,
SymmTensor strain_increment 
)
protectedvirtualinherited

Implements SolidMechanics::Element.

Definition at line 195 of file Nonlinear.C.

199 {
200  computeStrainAndRotationIncrement(_Fhat[qp], strain_increment);
201 
202  total_strain_new = strain_increment;
203  total_strain_new += total_strain_old;
204 }
void computeStrainAndRotationIncrement(const ColumnMajorMatrix &Fhat, SymmTensor &strain_increment)
Definition: Nonlinear.C:55
std::vector< ColumnMajorMatrix > _Fhat
Definition: Nonlinear.h:48

◆ computeStrainAndRotationIncrement()

void SolidMechanics::Nonlinear::computeStrainAndRotationIncrement ( const ColumnMajorMatrix &  Fhat,
SymmTensor strain_increment 
)
protectedinherited

Definition at line 55 of file Nonlinear.C.

Referenced by SolidMechanics::Nonlinear::computeStrain().

57 {
59  {
60  computeStrainIncrement(Fhat, strain_increment);
62  }
63 
64  else if (_decomp_method == Eigen)
65  {
67  }
68 
69  else
70  {
71  mooseError("Unknown polar decomposition type!");
72  }
73 }
DecompMethod _decomp_method
Definition: Nonlinear.h:43
static void polarDecompositionEigen(const ColumnMajorMatrix &Fhat, ColumnMajorMatrix &Rhat, SymmTensor &strain_increment)
Definition: Element.C:185
void computeStrainIncrement(const ColumnMajorMatrix &Fhat, SymmTensor &strain_increment)
Definition: Nonlinear.C:78
void computePolarDecomposition(const ColumnMajorMatrix &Fhat)
Definition: Nonlinear.C:139
const std::vector< ColumnMajorMatrix > & Fhat() const
Definition: Nonlinear.h:34
ColumnMajorMatrix _incremental_rotation
Definition: Nonlinear.h:45

◆ computeStrainIncrement()

void SolidMechanics::Nonlinear::computeStrainIncrement ( const ColumnMajorMatrix &  Fhat,
SymmTensor strain_increment 
)
protectedinherited

Definition at line 78 of file Nonlinear.C.

Referenced by SolidMechanics::Nonlinear::computeStrainAndRotationIncrement().

79 {
80 
81  //
82  // A calculation of the strain at the mid-interval is probably more
83  // accurate (second vs. first order). This would require the
84  // incremental deformation gradient at the mid-step, which we
85  // currently don't have. We would then have to calculate the
86  // rotation for the whole step.
87  //
88  //
89  // We are looking for:
90  // log( Uhat )
91  // = log( sqrt( Fhat^T*Fhat ) )
92  // = log( sqrt( Chat ) )
93  // A Taylor series expansion gives:
94  // ( Chat - 0.25 * Chat^T*Chat - 0.75 * I )
95  // = ( - 0.25 * Chat^T*Chat + Chat - 0.75 * I )
96  // = ( (0.25*Chat - 0.75*I) * (Chat - I) )
97  // = ( B * A )
98  // B
99  // = 0.25*Chat - 0.75*I
100  // = 0.25*(Chat - I) - 0.5*I
101  // = 0.25*A - 0.5*I
102  //
103 
104  const Real Uxx = Fhat(0, 0);
105  const Real Uxy = Fhat(0, 1);
106  const Real Uxz = Fhat(0, 2);
107  const Real Uyx = Fhat(1, 0);
108  const Real Uyy = Fhat(1, 1);
109  const Real Uyz = Fhat(1, 2);
110  const Real Uzx = Fhat(2, 0);
111  const Real Uzy = Fhat(2, 1);
112  const Real Uzz = Fhat(2, 2);
113 
114  const Real Axx = Uxx * Uxx + Uyx * Uyx + Uzx * Uzx - 1.0;
115  const Real Axy = Uxx * Uxy + Uyx * Uyy + Uzx * Uzy;
116  const Real Axz = Uxx * Uxz + Uyx * Uyz + Uzx * Uzz;
117  const Real Ayy = Uxy * Uxy + Uyy * Uyy + Uzy * Uzy - 1.0;
118  const Real Ayz = Uxy * Uxz + Uyy * Uyz + Uzy * Uzz;
119  const Real Azz = Uxz * Uxz + Uyz * Uyz + Uzz * Uzz - 1.0;
120 
121  const Real Bxx = 0.25 * Axx - 0.5;
122  const Real Bxy = 0.25 * Axy;
123  const Real Bxz = 0.25 * Axz;
124  const Real Byy = 0.25 * Ayy - 0.5;
125  const Real Byz = 0.25 * Ayz;
126  const Real Bzz = 0.25 * Azz - 0.5;
127 
128  strain_increment.xx(-(Bxx * Axx + Bxy * Axy + Bxz * Axz));
129  strain_increment.xy(-(Bxx * Axy + Bxy * Ayy + Bxz * Ayz));
130  strain_increment.zx(-(Bxx * Axz + Bxy * Ayz + Bxz * Azz));
131  strain_increment.yy(-(Bxy * Axy + Byy * Ayy + Byz * Ayz));
132  strain_increment.yz(-(Bxy * Axz + Byy * Ayz + Byz * Azz));
133  strain_increment.zz(-(Bxz * Axz + Byz * Ayz + Bzz * Azz));
134 }
Real yz() const
Definition: SymmTensor.h:136
Real zx() const
Definition: SymmTensor.h:137
const std::vector< ColumnMajorMatrix > & Fhat() const
Definition: Nonlinear.h:34
Real yy() const
Definition: SymmTensor.h:133
Real xx() const
Definition: SymmTensor.h:132
Real xy() const
Definition: SymmTensor.h:135
Real zz() const
Definition: SymmTensor.h:134

◆ detMatrix()

Real SolidMechanics::Element::detMatrix ( const ColumnMajorMatrix &  A)
staticinherited

Definition at line 31 of file Element.C.

Referenced by SolidModel::computeEshelby(), SolidMechanics::Nonlinear3D::computeIncrementalDeformationGradient(), SolidMechanics::NonlinearRZ::computeIncrementalDeformationGradient(), computeIncrementalDeformationGradient(), SolidMechanics::Element::invertMatrix(), SolidMechanics::Nonlinear3D::volumeRatioOld(), SolidMechanics::NonlinearRZ::volumeRatioOld(), and volumeRatioOld().

32 {
33  mooseAssert(A.n() == 3 && A.m() == 3, "detMatrix requires 3x3 matrix");
34 
35  Real Axx = A(0, 0);
36  Real Axy = A(0, 1);
37  Real Axz = A(0, 2);
38  Real Ayx = A(1, 0);
39  Real Ayy = A(1, 1);
40  Real Ayz = A(1, 2);
41  Real Azx = A(2, 0);
42  Real Azy = A(2, 1);
43  Real Azz = A(2, 2);
44 
45  return Axx * Ayy * Azz + Axy * Ayz * Azx + Axz * Ayx * Azy - Azx * Ayy * Axz - Azy * Ayz * Axx -
46  Azz * Ayx * Axy;
47 }

◆ Fhat()

const std::vector<ColumnMajorMatrix>& SolidMechanics::Nonlinear::Fhat ( ) const
inlineinherited

◆ fillMatrix() [1/2]

void SolidMechanics::NonlinearPlaneStrain::fillMatrix ( unsigned int  qp,
const VariableGradient &  grad_x,
const VariableGradient &  grad_y,
const Real &  strain_zz,
ColumnMajorMatrix &  A 
) const
protectedvirtual

Definition at line 150 of file NonlinearPlaneStrain.C.

Referenced by computeIncrementalDeformationGradient(), and volumeRatioOld().

155 {
156  mooseAssert(A.n() == 3 && A.m() == 3, "computeDefGrad requires 3x3 matrix");
157 
158  A(0, 0) = grad_x[qp](0);
159  A(0, 1) = grad_x[qp](1);
160  A(0, 2) = 0;
161  A(1, 0) = grad_y[qp](0);
162  A(1, 1) = grad_y[qp](1);
163  A(1, 2) = 0;
164  A(2, 0) = 0;
165  A(2, 1) = 0;
166  A(2, 2) = strain_zz;
167 }

◆ fillMatrix() [2/2]

void SolidMechanics::Element::fillMatrix ( unsigned int  qp,
const VariableGradient &  grad_x,
const VariableGradient &  grad_y,
const VariableGradient &  grad_z,
ColumnMajorMatrix &  A 
)
inherited

Definition at line 228 of file Element.C.

Referenced by SolidMechanics::Nonlinear3D::computeIncrementalDeformationGradient().

233 {
234  A(0, 0) = grad_x[qp](0);
235  A(0, 1) = grad_x[qp](1);
236  A(0, 2) = grad_x[qp](2);
237  A(1, 0) = grad_y[qp](0);
238  A(1, 1) = grad_y[qp](1);
239  A(1, 2) = grad_y[qp](2);
240  A(2, 0) = grad_z[qp](0);
241  A(2, 1) = grad_z[qp](1);
242  A(2, 2) = grad_z[qp](2);
243 }

◆ finalizeStress()

void SolidMechanics::Nonlinear::finalizeStress ( std::vector< SymmTensor *> &  t)
protectedvirtualinherited

Rotate stress to current configuration.

Reimplemented from SolidMechanics::Element.

Definition at line 183 of file Nonlinear.C.

184 {
185  // Using the incremental rotation, update the stress to the current configuration (R*T*R^T)
186  for (unsigned i = 0; i < t.size(); ++i)
187  {
189  }
190 }
static void rotateSymmetricTensor(const ColumnMajorMatrix &R, const RealTensorValue &T, RealTensorValue &result)
Definition: Element.C:81
ColumnMajorMatrix _incremental_rotation
Definition: Nonlinear.h:45

◆ getNumKnownCrackDirs()

virtual unsigned int SolidMechanics::Element::getNumKnownCrackDirs ( ) const
inlinevirtualinherited

Reimplemented in SolidMechanics::PlaneStrain, SolidMechanics::SphericalR, and SolidMechanics::AxisymmetricRZ.

Definition at line 66 of file Element.h.

Referenced by SolidModel::getNumKnownCrackDirs().

66 { return 0; }

◆ incrementalRotation()

const ColumnMajorMatrix& SolidMechanics::Nonlinear::incrementalRotation ( ) const
inlineinherited

Definition at line 32 of file Nonlinear.h.

32 { return _incremental_rotation; }
ColumnMajorMatrix _incremental_rotation
Definition: Nonlinear.h:45

◆ init()

void SolidMechanics::Nonlinear::init ( )
protectedvirtualinherited

Reimplemented from SolidMechanics::Element.

Definition at line 209 of file Nonlinear.C.

210 {
211  _Fhat.resize(_solid_model.qrule()->n_points());
212 
214 }
QBase * qrule()
Definition: SolidModel.h:56
virtual void computeIncrementalDeformationGradient(std::vector< ColumnMajorMatrix > &Fhat)=0
SolidModel & _solid_model
Definition: Element.h:75
std::vector< ColumnMajorMatrix > _Fhat
Definition: Nonlinear.h:48

◆ invertMatrix()

void SolidMechanics::Element::invertMatrix ( const ColumnMajorMatrix &  A,
ColumnMajorMatrix &  Ainv 
)
staticinherited

Definition at line 52 of file Element.C.

Referenced by SolidModel::computeEshelby(), SolidMechanics::Nonlinear3D::computeIncrementalDeformationGradient(), SolidMechanics::NonlinearRZ::computeIncrementalDeformationGradient(), computeIncrementalDeformationGradient(), and SolidMechanics::Element::polarDecompositionEigen().

53 {
54  Real Axx = A(0, 0);
55  Real Axy = A(0, 1);
56  Real Axz = A(0, 2);
57  Real Ayx = A(1, 0);
58  Real Ayy = A(1, 1);
59  Real Ayz = A(1, 2);
60  Real Azx = A(2, 0);
61  Real Azy = A(2, 1);
62  Real Azz = A(2, 2);
63 
64  mooseAssert(detMatrix(A) > 0, "Matrix is not positive definite!");
65  Real detInv = 1 / detMatrix(A);
66 
67  Ainv(0, 0) = +(Ayy * Azz - Azy * Ayz) * detInv;
68  Ainv(0, 1) = -(Axy * Azz - Azy * Axz) * detInv;
69  Ainv(0, 2) = +(Axy * Ayz - Ayy * Axz) * detInv;
70  Ainv(1, 0) = -(Ayx * Azz - Azx * Ayz) * detInv;
71  Ainv(1, 1) = +(Axx * Azz - Azx * Axz) * detInv;
72  Ainv(1, 2) = -(Axx * Ayz - Ayx * Axz) * detInv;
73  Ainv(2, 0) = +(Ayx * Azy - Azx * Ayy) * detInv;
74  Ainv(2, 1) = -(Axx * Azy - Azx * Axy) * detInv;
75  Ainv(2, 2) = +(Axx * Ayy - Ayx * Axy) * detInv;
76 }
static Real detMatrix(const ColumnMajorMatrix &A)
Definition: Element.C:31

◆ polarDecompositionEigen()

void SolidMechanics::Element::polarDecompositionEigen ( const ColumnMajorMatrix &  Fhat,
ColumnMajorMatrix &  Rhat,
SymmTensor strain_increment 
)
staticinherited

Definition at line 185 of file Element.C.

Referenced by SolidMechanics::Nonlinear::computeStrainAndRotationIncrement().

188 {
189  const int ND = 3;
190 
191  ColumnMajorMatrix eigen_value(ND, 1), eigen_vector(ND, ND);
192  ColumnMajorMatrix n1(ND, 1), n2(ND, 1), n3(ND, 1), N1(ND, 1), N2(ND, 1), N3(ND, 1);
193 
194  ColumnMajorMatrix Chat = Fhat.transpose() * Fhat;
195 
196  Chat.eigen(eigen_value, eigen_vector);
197 
198  for (int i = 0; i < ND; i++)
199  {
200  N1(i) = eigen_vector(i, 0);
201  N2(i) = eigen_vector(i, 1);
202  N3(i) = eigen_vector(i, 2);
203  }
204 
205  const Real lamda1 = std::sqrt(eigen_value(0));
206  const Real lamda2 = std::sqrt(eigen_value(1));
207  const Real lamda3 = std::sqrt(eigen_value(2));
208 
209  const Real log1 = std::log(lamda1);
210  const Real log2 = std::log(lamda2);
211  const Real log3 = std::log(lamda3);
212 
213  ColumnMajorMatrix Uhat =
214  N1 * N1.transpose() * lamda1 + N2 * N2.transpose() * lamda2 + N3 * N3.transpose() * lamda3;
215 
216  ColumnMajorMatrix invUhat(ND, ND);
217  invertMatrix(Uhat, invUhat);
218 
219  Rhat = Fhat * invUhat;
220 
221  strain_increment =
222  N1 * N1.transpose() * log1 + N2 * N2.transpose() * log2 + N3 * N3.transpose() * log3;
223 }
static void invertMatrix(const ColumnMajorMatrix &A, ColumnMajorMatrix &Ainv)
Definition: Element.C:52

◆ rotateSymmetricTensor() [1/2]

void SolidMechanics::Element::rotateSymmetricTensor ( const ColumnMajorMatrix &  R,
const RealTensorValue &  T,
RealTensorValue &  result 
)
staticinherited

Definition at line 81 of file Element.C.

Referenced by SolidMechanics::Nonlinear::finalizeStress().

84 {
85 
86  // R T Rt
87  // 00 01 02 00 01 02 00 10 20
88  // 10 11 12 * 10 11 12 * 01 11 21
89  // 20 21 22 20 21 22 02 12 22
90  //
91  const Real T00 = R(0, 0) * T(0, 0) + R(0, 1) * T(1, 0) + R(0, 2) * T(2, 0);
92  const Real T01 = R(0, 0) * T(0, 1) + R(0, 1) * T(1, 1) + R(0, 2) * T(2, 1);
93  const Real T02 = R(0, 0) * T(0, 2) + R(0, 1) * T(1, 2) + R(0, 2) * T(2, 2);
94 
95  const Real T10 = R(1, 0) * T(0, 0) + R(1, 1) * T(1, 0) + R(1, 2) * T(2, 0);
96  const Real T11 = R(1, 0) * T(0, 1) + R(1, 1) * T(1, 1) + R(1, 2) * T(2, 1);
97  const Real T12 = R(1, 0) * T(0, 2) + R(1, 1) * T(1, 2) + R(1, 2) * T(2, 2);
98 
99  const Real T20 = R(2, 0) * T(0, 0) + R(2, 1) * T(1, 0) + R(2, 2) * T(2, 0);
100  const Real T21 = R(2, 0) * T(0, 1) + R(2, 1) * T(1, 1) + R(2, 2) * T(2, 1);
101  const Real T22 = R(2, 0) * T(0, 2) + R(2, 1) * T(1, 2) + R(2, 2) * T(2, 2);
102 
103  result = RealTensorValue(T00 * R(0, 0) + T01 * R(0, 1) + T02 * R(0, 2),
104  T00 * R(1, 0) + T01 * R(1, 1) + T02 * R(1, 2),
105  T00 * R(2, 0) + T01 * R(2, 1) + T02 * R(2, 2),
106 
107  T10 * R(0, 0) + T11 * R(0, 1) + T12 * R(0, 2),
108  T10 * R(1, 0) + T11 * R(1, 1) + T12 * R(1, 2),
109  T10 * R(2, 0) + T11 * R(2, 1) + T12 * R(2, 2),
110 
111  T20 * R(0, 0) + T21 * R(0, 1) + T22 * R(0, 2),
112  T20 * R(1, 0) + T21 * R(1, 1) + T22 * R(1, 2),
113  T20 * R(2, 0) + T21 * R(2, 1) + T22 * R(2, 2));
114 }

◆ rotateSymmetricTensor() [2/2]

void SolidMechanics::Element::rotateSymmetricTensor ( const ColumnMajorMatrix &  R,
const SymmTensor T,
SymmTensor result 
)
staticinherited

Definition at line 119 of file Element.C.

122 {
123 
124  // R T Rt
125  // 00 01 02 00 01 02 00 10 20
126  // 10 11 12 * 10 11 12 * 01 11 21
127  // 20 21 22 20 21 22 02 12 22
128  //
129  const Real T00 = R(0, 0) * T.xx() + R(0, 1) * T.xy() + R(0, 2) * T.zx();
130  const Real T01 = R(0, 0) * T.xy() + R(0, 1) * T.yy() + R(0, 2) * T.yz();
131  const Real T02 = R(0, 0) * T.zx() + R(0, 1) * T.yz() + R(0, 2) * T.zz();
132 
133  const Real T10 = R(1, 0) * T.xx() + R(1, 1) * T.xy() + R(1, 2) * T.zx();
134  const Real T11 = R(1, 0) * T.xy() + R(1, 1) * T.yy() + R(1, 2) * T.yz();
135  const Real T12 = R(1, 0) * T.zx() + R(1, 1) * T.yz() + R(1, 2) * T.zz();
136 
137  const Real T20 = R(2, 0) * T.xx() + R(2, 1) * T.xy() + R(2, 2) * T.zx();
138  const Real T21 = R(2, 0) * T.xy() + R(2, 1) * T.yy() + R(2, 2) * T.yz();
139  const Real T22 = R(2, 0) * T.zx() + R(2, 1) * T.yz() + R(2, 2) * T.zz();
140 
141  result.xx(T00 * R(0, 0) + T01 * R(0, 1) + T02 * R(0, 2));
142  result.yy(T10 * R(1, 0) + T11 * R(1, 1) + T12 * R(1, 2));
143  result.zz(T20 * R(2, 0) + T21 * R(2, 1) + T22 * R(2, 2));
144  result.xy(T00 * R(1, 0) + T01 * R(1, 1) + T02 * R(1, 2));
145  result.yz(T10 * R(2, 0) + T11 * R(2, 1) + T12 * R(2, 2));
146  result.zx(T00 * R(2, 0) + T01 * R(2, 1) + T02 * R(2, 2));
147 }
Real yz() const
Definition: SymmTensor.h:136
Real zx() const
Definition: SymmTensor.h:137
Real yy() const
Definition: SymmTensor.h:133
Real xx() const
Definition: SymmTensor.h:132
Real xy() const
Definition: SymmTensor.h:135
Real zz() const
Definition: SymmTensor.h:134

◆ unrotateSymmetricTensor()

void SolidMechanics::Element::unrotateSymmetricTensor ( const ColumnMajorMatrix &  R,
const SymmTensor T,
SymmTensor result 
)
staticinherited

Definition at line 152 of file Element.C.

155 {
156 
157  // Rt T R
158  // 00 10 20 00 01 02 00 01 02
159  // 01 11 21 * 10 11 12 * 10 11 12
160  // 02 12 22 20 21 22 20 21 22
161  //
162  const Real T00 = R(0, 0) * T.xx() + R(1, 0) * T.xy() + R(2, 0) * T.zx();
163  const Real T01 = R(0, 0) * T.xy() + R(1, 0) * T.yy() + R(2, 0) * T.yz();
164  const Real T02 = R(0, 0) * T.zx() + R(1, 0) * T.yz() + R(2, 0) * T.zz();
165 
166  const Real T10 = R(0, 1) * T.xx() + R(1, 1) * T.xy() + R(2, 1) * T.zx();
167  const Real T11 = R(0, 1) * T.xy() + R(1, 1) * T.yy() + R(2, 1) * T.yz();
168  const Real T12 = R(0, 1) * T.zx() + R(1, 1) * T.yz() + R(2, 1) * T.zz();
169 
170  const Real T20 = R(0, 2) * T.xx() + R(1, 2) * T.xy() + R(2, 2) * T.zx();
171  const Real T21 = R(0, 2) * T.xy() + R(1, 2) * T.yy() + R(2, 2) * T.yz();
172  const Real T22 = R(0, 2) * T.zx() + R(1, 2) * T.yz() + R(2, 2) * T.zz();
173 
174  result.xx(T00 * R(0, 0) + T01 * R(1, 0) + T02 * R(2, 0));
175  result.yy(T10 * R(0, 1) + T11 * R(1, 1) + T12 * R(2, 1));
176  result.zz(T20 * R(0, 2) + T21 * R(1, 2) + T22 * R(2, 2));
177  result.xy(T00 * R(0, 1) + T01 * R(1, 1) + T02 * R(2, 1));
178  result.yz(T10 * R(0, 2) + T11 * R(1, 2) + T12 * R(2, 2));
179  result.zx(T00 * R(0, 2) + T01 * R(1, 2) + T02 * R(2, 2));
180 }
Real yz() const
Definition: SymmTensor.h:136
Real zx() const
Definition: SymmTensor.h:137
Real yy() const
Definition: SymmTensor.h:133
Real xx() const
Definition: SymmTensor.h:132
Real xy() const
Definition: SymmTensor.h:135
Real zz() const
Definition: SymmTensor.h:134

◆ volumeRatioOld()

Real SolidMechanics::NonlinearPlaneStrain::volumeRatioOld ( unsigned  qp) const
protectedvirtual

Reimplemented from SolidMechanics::Nonlinear.

Definition at line 172 of file NonlinearPlaneStrain.C.

173 {
174  Real strain_zz_old;
175  if (_have_strain_zz)
176  strain_zz_old = _strain_zz_old[qp];
177  else if (_have_scalar_strain_zz && _scalar_strain_zz.size() > 0)
178  strain_zz_old = _scalar_strain_zz_old[qp];
179  else
180  strain_zz_old = 0.0;
181 
182  ColumnMajorMatrix Fnm1T;
183  fillMatrix(qp, _grad_disp_x_old, _grad_disp_y_old, strain_zz_old, Fnm1T);
184  Fnm1T.addDiag(1);
185 
186  return detMatrix(Fnm1T);
187 }
virtual void fillMatrix(unsigned int qp, const VariableGradient &grad_x, const VariableGradient &grad_y, const Real &strain_zz, ColumnMajorMatrix &A) const
static Real detMatrix(const ColumnMajorMatrix &A)
Definition: Element.C:31
const VariableGradient & _grad_disp_y_old
const VariableGradient & _grad_disp_x_old

Member Data Documentation

◆ _decomp_method

DecompMethod SolidMechanics::Nonlinear::_decomp_method
protectedinherited

◆ _F

ColumnMajorMatrix SolidMechanics::Nonlinear::_F
protectedinherited

Definition at line 50 of file Nonlinear.h.

◆ _Fbar

std::vector<ColumnMajorMatrix> SolidMechanics::Nonlinear::_Fbar
protectedinherited

◆ _Fhat

std::vector<ColumnMajorMatrix> SolidMechanics::Nonlinear::_Fhat
protectedinherited

◆ _grad_disp_x

const VariableGradient& SolidMechanics::NonlinearPlaneStrain::_grad_disp_x

◆ _grad_disp_x_old

const VariableGradient& SolidMechanics::NonlinearPlaneStrain::_grad_disp_x_old

Definition at line 38 of file NonlinearPlaneStrain.h.

Referenced by computeIncrementalDeformationGradient(), and volumeRatioOld().

◆ _grad_disp_y

const VariableGradient& SolidMechanics::NonlinearPlaneStrain::_grad_disp_y

◆ _grad_disp_y_old

const VariableGradient& SolidMechanics::NonlinearPlaneStrain::_grad_disp_y_old

Definition at line 39 of file NonlinearPlaneStrain.h.

Referenced by computeIncrementalDeformationGradient(), and volumeRatioOld().

◆ _have_scalar_strain_zz

bool SolidMechanics::NonlinearPlaneStrain::_have_scalar_strain_zz

◆ _have_strain_zz

bool SolidMechanics::NonlinearPlaneStrain::_have_strain_zz

◆ _incremental_rotation

ColumnMajorMatrix SolidMechanics::Nonlinear::_incremental_rotation
protectedinherited

◆ _scalar_strain_zz

const VariableValue& SolidMechanics::NonlinearPlaneStrain::_scalar_strain_zz

◆ _scalar_strain_zz_old

const VariableValue& SolidMechanics::NonlinearPlaneStrain::_scalar_strain_zz_old

Definition at line 41 of file NonlinearPlaneStrain.h.

Referenced by computeIncrementalDeformationGradient(), and volumeRatioOld().

◆ _solid_model

SolidModel& SolidMechanics::Element::_solid_model
protectedinherited

◆ _strain_zz

const VariableValue& SolidMechanics::NonlinearPlaneStrain::_strain_zz

◆ _strain_zz_old

const VariableValue& SolidMechanics::NonlinearPlaneStrain::_strain_zz_old

Definition at line 40 of file NonlinearPlaneStrain.h.

Referenced by computeIncrementalDeformationGradient(), and volumeRatioOld().

◆ _Uhat

ColumnMajorMatrix SolidMechanics::Nonlinear::_Uhat
protectedinherited

Definition at line 46 of file Nonlinear.h.

◆ _volumetric_locking_correction

const bool SolidMechanics::NonlinearPlaneStrain::_volumetric_locking_correction
protected

Definition at line 54 of file NonlinearPlaneStrain.h.

Referenced by computeIncrementalDeformationGradient().


The documentation for this class was generated from the following files: