www.mooseframework.org
Nonlinear.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 "Nonlinear.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  : Element(solid_model, name, parameters),
24  _decomp_method(RashidApprox),
25  _incremental_rotation(3, 3),
26  _Uhat(3, 3)
27 {
28 
29  std::string increment_calculation =
30  solid_model.getParamTempl<std::string>("increment_calculation");
31  std::transform(increment_calculation.begin(),
32  increment_calculation.end(),
33  increment_calculation.begin(),
34  ::tolower);
35  if (increment_calculation == "rashidapprox")
36  {
38  }
39  else if (increment_calculation == "eigen")
40  {
42  }
43  else
44  {
45  mooseError("The options for the increment calculation are RashidApprox and Eigen.");
46  }
47 }
48 
50 
52 
54 
55 void
56 Nonlinear::computeStrainAndRotationIncrement(const ColumnMajorMatrix & Fhat,
57  SymmTensor & strain_increment)
58 {
60  {
61  computeStrainIncrement(Fhat, strain_increment);
63  }
64 
65  else if (_decomp_method == Eigen)
66  {
68  }
69 
70  else
71  {
72  mooseError("Unknown polar decomposition type!");
73  }
74 }
75 
77 
78 void
79 Nonlinear::computeStrainIncrement(const ColumnMajorMatrix & Fhat, SymmTensor & strain_increment)
80 {
81 
82  //
83  // A calculation of the strain at the mid-interval is probably more
84  // accurate (second vs. first order). This would require the
85  // incremental deformation gradient at the mid-step, which we
86  // currently don't have. We would then have to calculate the
87  // rotation for the whole step.
88  //
89  //
90  // We are looking for:
91  // log( Uhat )
92  // = log( sqrt( Fhat^T*Fhat ) )
93  // = log( sqrt( Chat ) )
94  // A Taylor series expansion gives:
95  // ( Chat - 0.25 * Chat^T*Chat - 0.75 * I )
96  // = ( - 0.25 * Chat^T*Chat + Chat - 0.75 * I )
97  // = ( (0.25*Chat - 0.75*I) * (Chat - I) )
98  // = ( B * A )
99  // B
100  // = 0.25*Chat - 0.75*I
101  // = 0.25*(Chat - I) - 0.5*I
102  // = 0.25*A - 0.5*I
103  //
104 
105  const Real Uxx = Fhat(0, 0);
106  const Real Uxy = Fhat(0, 1);
107  const Real Uxz = Fhat(0, 2);
108  const Real Uyx = Fhat(1, 0);
109  const Real Uyy = Fhat(1, 1);
110  const Real Uyz = Fhat(1, 2);
111  const Real Uzx = Fhat(2, 0);
112  const Real Uzy = Fhat(2, 1);
113  const Real Uzz = Fhat(2, 2);
114 
115  const Real Axx = Uxx * Uxx + Uyx * Uyx + Uzx * Uzx - 1.0;
116  const Real Axy = Uxx * Uxy + Uyx * Uyy + Uzx * Uzy;
117  const Real Axz = Uxx * Uxz + Uyx * Uyz + Uzx * Uzz;
118  const Real Ayy = Uxy * Uxy + Uyy * Uyy + Uzy * Uzy - 1.0;
119  const Real Ayz = Uxy * Uxz + Uyy * Uyz + Uzy * Uzz;
120  const Real Azz = Uxz * Uxz + Uyz * Uyz + Uzz * Uzz - 1.0;
121 
122  const Real Bxx = 0.25 * Axx - 0.5;
123  const Real Bxy = 0.25 * Axy;
124  const Real Bxz = 0.25 * Axz;
125  const Real Byy = 0.25 * Ayy - 0.5;
126  const Real Byz = 0.25 * Ayz;
127  const Real Bzz = 0.25 * Azz - 0.5;
128 
129  strain_increment.xx(-(Bxx * Axx + Bxy * Axy + Bxz * Axz));
130  strain_increment.xy(-(Bxx * Axy + Bxy * Ayy + Bxz * Ayz));
131  strain_increment.zx(-(Bxx * Axz + Bxy * Ayz + Bxz * Azz));
132  strain_increment.yy(-(Bxy * Axy + Byy * Ayy + Byz * Ayz));
133  strain_increment.yz(-(Bxy * Axz + Byy * Ayz + Byz * Azz));
134  strain_increment.zz(-(Bxz * Axz + Byz * Ayz + Bzz * Azz));
135 }
136 
138 
139 void
140 Nonlinear::computePolarDecomposition(const ColumnMajorMatrix & Fhat)
141 {
142 
143  // From Rashid, 1993.
144 
145  const Real Uxx = Fhat(0, 0);
146  const Real Uxy = Fhat(0, 1);
147  const Real Uxz = Fhat(0, 2);
148  const Real Uyx = Fhat(1, 0);
149  const Real Uyy = Fhat(1, 1);
150  const Real Uyz = Fhat(1, 2);
151  const Real Uzx = Fhat(2, 0);
152  const Real Uzy = Fhat(2, 1);
153  const Real Uzz = Fhat(2, 2);
154 
155  const Real Ax = Uyz - Uzy;
156  const Real Ay = Uzx - Uxz;
157  const Real Az = Uxy - Uyx;
158  const Real Q = 0.25 * (Ax * Ax + Ay * Ay + Az * Az);
159  const Real traceF = Uxx + Uyy + Uzz;
160  const Real P = 0.25 * (traceF - 1) * (traceF - 1);
161  const Real Y = 1 / ((Q + P) * (Q + P) * (Q + P));
162 
163  const Real C1 = std::sqrt(P * (1 + (P * (Q + Q + (Q + P))) * (1 - (Q + P)) * Y));
164  const Real C2 = 0.125 + Q * 0.03125 * (P * P - 12 * (P - 1)) / (P * P);
165  const Real C3 = 0.5 * std::sqrt((P * Q * (3 - Q) + P * P * P + Q * Q) * Y);
166 
167  // Since the input to this routine is the incremental deformation gradient
168  // and not the inverse incremental gradient, this result is the transpose
169  // of the one in Rashid's paper.
170  _incremental_rotation(0, 0) = C1 + (C2 * Ax) * Ax;
171  _incremental_rotation(0, 1) = (C2 * Ay) * Ax + (C3 * Az);
172  _incremental_rotation(0, 2) = (C2 * Az) * Ax - (C3 * Ay);
173  _incremental_rotation(1, 0) = (C2 * Ax) * Ay - (C3 * Az);
174  _incremental_rotation(1, 1) = C1 + (C2 * Ay) * Ay;
175  _incremental_rotation(1, 2) = (C2 * Az) * Ay + (C3 * Ax);
176  _incremental_rotation(2, 0) = (C2 * Ax) * Az + (C3 * Ay);
177  _incremental_rotation(2, 1) = (C2 * Ay) * Az - (C3 * Ax);
178  _incremental_rotation(2, 2) = C1 + (C2 * Az) * Az;
179 }
180 
182 
183 void
184 Nonlinear::finalizeStress(std::vector<SymmTensor *> & t)
185 {
186  // Using the incremental rotation, update the stress to the current configuration (R*T*R^T)
187  for (unsigned i = 0; i < t.size(); ++i)
188  {
190  }
191 }
192 
194 
195 void
196 Nonlinear::computeStrain(const unsigned qp,
197  const SymmTensor & total_strain_old,
198  SymmTensor & total_strain_new,
199  SymmTensor & strain_increment)
200 {
201  computeStrainAndRotationIncrement(_Fhat[qp], strain_increment);
202 
203  total_strain_new = strain_increment;
204  total_strain_new += total_strain_old;
205 }
206 
208 
209 void
211 {
212  _Fhat.resize(_solid_model.qrule()->n_points());
213 
215 }
216 
218 }
SymmTensor::xx
Real xx() const
Definition: SymmTensor.h:131
SymmTensor::zx
Real zx() const
Definition: SymmTensor.h:136
SolidMechanics::Nonlinear::Eigen
Definition: Nonlinear.h:39
SolidMechanics::Nonlinear::_Fhat
std::vector< ColumnMajorMatrix > _Fhat
Definition: Nonlinear.h:47
SymmTensor::zz
Real zz() const
Definition: SymmTensor.h:133
SolidMechanics::Element::rotateSymmetricTensor
static void rotateSymmetricTensor(const ColumnMajorMatrix &R, const RealTensorValue &T, RealTensorValue &result)
Definition: Element.C:81
SymmIsotropicElasticityTensor.h
SolidMechanics::Element::polarDecompositionEigen
static void polarDecompositionEigen(const ColumnMajorMatrix &Fhat, ColumnMajorMatrix &Rhat, SymmTensor &strain_increment)
Definition: Element.C:185
SolidMechanics::Nonlinear::computePolarDecomposition
void computePolarDecomposition(const ColumnMajorMatrix &Fhat)
Definition: Nonlinear.C:140
SolidMechanics::Nonlinear::_decomp_method
DecompMethod _decomp_method
Definition: Nonlinear.h:42
SolidMechanics::Nonlinear::computeStrainAndRotationIncrement
void computeStrainAndRotationIncrement(const ColumnMajorMatrix &Fhat, SymmTensor &strain_increment)
Definition: Nonlinear.C:56
SolidMechanics::Nonlinear::Fhat
const std::vector< ColumnMajorMatrix > & Fhat() const
Definition: Nonlinear.h:33
SolidMechanics::Nonlinear::Nonlinear
Nonlinear(SolidModel &solid_model, const std::string &name, const InputParameters &parameters)
Definition: Nonlinear.C:20
SymmTensor::xy
Real xy() const
Definition: SymmTensor.h:134
Nonlinear.h
SolidMechanics::Nonlinear::init
virtual void init()
Definition: Nonlinear.C:210
SolidMechanics
Definition: AxisymmetricRZ.h:16
SolidMechanics::Nonlinear::~Nonlinear
virtual ~Nonlinear()
Definition: Nonlinear.C:51
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
SymmTensor::yz
Real yz() const
Definition: SymmTensor.h:135
SolidMechanics::Nonlinear::computeStrainIncrement
void computeStrainIncrement(const ColumnMajorMatrix &Fhat, SymmTensor &strain_increment)
Definition: Nonlinear.C:79
SolidMechanics::Nonlinear::RashidApprox
Definition: Nonlinear.h:38
SolidMechanics::Element::_solid_model
SolidModel & _solid_model
Definition: Element.h:74
SolidMechanics::Element
Element is the base class for all of this module's solid mechanics element formulations.
Definition: Element.h:25
SolidMechanics::Nonlinear::finalizeStress
virtual void finalizeStress(std::vector< SymmTensor * > &t)
Rotate stress to current configuration.
Definition: Nonlinear.C:184
SymmTensor
Definition: SymmTensor.h:21
SolidMechanics::Nonlinear::computeIncrementalDeformationGradient
virtual void computeIncrementalDeformationGradient(std::vector< ColumnMajorMatrix > &Fhat)=0
SolidMechanics::Nonlinear::computeStrain
virtual void computeStrain(const unsigned qp, const SymmTensor &total_strain_old, SymmTensor &total_strain_new, SymmTensor &strain_increment)
Definition: Nonlinear.C:196
SymmTensor::yy
Real yy() const
Definition: SymmTensor.h:132
SolidModel.h
SolidModel::qrule
const QBase * qrule()
Definition: SolidModel.h:55
SolidMechanics::Nonlinear::_incremental_rotation
ColumnMajorMatrix _incremental_rotation
Definition: Nonlinear.h:44