www.mooseframework.org
ComputeFiniteStrainNOSPD.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 
11 
12 #include "libmesh/utility.h"
13 
15 
16 MooseEnum
18 {
19  return MooseEnum("TaylorExpansion EigenSolution", "TaylorExpansion");
20 }
21 
22 template <>
23 InputParameters
25 {
26  InputParameters params = validParams<ComputeStrainBaseNOSPD>();
27  params.addClassDescription(
28  "Class for computing nodal quantities for residual and jacobian calculation "
29  "for Self-stabilized Non-Ordinary State-based PeriDynamic (SNOSPD) "
30  "correspondence model under finite strain assumptions");
31 
32  params.addParam<MooseEnum>("decomposition_method",
34  "Methods to calculate the strain and rotation increments");
35 
36  return params;
37 }
38 
39 ComputeFiniteStrainNOSPD::ComputeFiniteStrainNOSPD(const InputParameters & parameters)
40  : ComputeStrainBaseNOSPD(parameters),
41  _strain_rate(declareProperty<RankTwoTensor>("strain_rate")),
42  _strain_increment(declareProperty<RankTwoTensor>("strain_increment")),
43  _rotation_increment(declareProperty<RankTwoTensor>("rotation_increment")),
44  _deformation_gradient_old(getMaterialPropertyOld<RankTwoTensor>("deformation_gradient")),
45  _mechanical_strain_old(getMaterialPropertyOld<RankTwoTensor>("mechanical_strain")),
46  _total_strain_old(getMaterialPropertyOld<RankTwoTensor>("total_strain")),
47  _eigenstrains_old(_eigenstrain_names.size()),
48  _Fhat(2),
49  _decomposition_method(getParam<MooseEnum>("decomposition_method").getEnum<DecompMethod>())
50 {
51  for (unsigned int i = 0; i < _eigenstrains_old.size(); ++i)
52  _eigenstrains_old[i] = &getMaterialPropertyOld<RankTwoTensor>(_eigenstrain_names[i]);
53 }
54 
55 void
57 {
59 
60  computeQpFhat();
61 
62  RankTwoTensor total_strain_increment;
63 
64  // Two ways to calculate these increments: TaylorExpansion(default) or EigenSolution
65  computeQpStrainRotationIncrements(total_strain_increment, _rotation_increment[_qp]);
66 
67  _strain_increment[_qp] = total_strain_increment;
68 
69  // Remove the eigenstrain increment
71 
72  if (_dt > 0)
73  _strain_rate[_qp] = _strain_increment[_qp] / _dt;
74  else
75  _strain_rate[_qp].zero();
76 
77  // Update strain in intermediate configuration
79  _total_strain[_qp] = _total_strain_old[_qp] + total_strain_increment;
80 
81  // Rotate strain to current configuration
82  _mechanical_strain[_qp] =
83  _rotation_increment[_qp] * _mechanical_strain[_qp] * _rotation_increment[_qp].transpose();
84  _total_strain[_qp] =
85  _rotation_increment[_qp] * _total_strain[_qp] * _rotation_increment[_qp].transpose();
86 }
87 
88 void
90 {
91  // Incremental deformation gradient of current step w.r.t previous step:
92  // _Fhat = deformation_gradient * inv(deformation_gradient_old)
93  _Fhat[_qp] = _deformation_gradient[_qp] * _deformation_gradient_old[_qp].inverse();
94 }
95 
96 void
98  RankTwoTensor & rotation_increment)
99 {
100  switch (_decomposition_method)
101  {
103  {
104  // inverse of _Fhat
105  RankTwoTensor invFhat(_Fhat[_qp].inverse());
106 
107  // A = I - _Fhat^-1
108  RankTwoTensor A(RankTwoTensor::initIdentity);
109  A -= invFhat;
110 
111  // Cinv - I = A A^T - A - A^T;
112  RankTwoTensor Cinv_I = A * A.transpose() - A - A.transpose();
113 
114  // strain rate D from Taylor expansion, Chat = (-1/2(Chat^-1 - I) + 1/4*(Chat^-1 - I)^2 + ...
115  total_strain_increment = -Cinv_I * 0.5 + Cinv_I * Cinv_I * 0.25;
116 
117  const Real a[3] = {invFhat(1, 2) - invFhat(2, 1),
118  invFhat(2, 0) - invFhat(0, 2),
119  invFhat(0, 1) - invFhat(1, 0)};
120 
121  Real q = (a[0] * a[0] + a[1] * a[1] + a[2] * a[2]) / 4.0;
122  Real trFhatinv_1 = invFhat.trace() - 1.0;
123  const Real p = trFhatinv_1 * trFhatinv_1 / 4.0;
124 
125  // cos theta_a
126  const Real C1 =
127  std::sqrt(p + 3.0 * Utility::pow<2>(p) * (1.0 - (p + q)) / Utility::pow<2>(p + q) -
128  2.0 * Utility::pow<3>(p) * (1.0 - (p + q)) / Utility::pow<3>(p + q));
129 
130  Real C2;
131  if (q > 0.01)
132  // (1-cos theta_a)/4q
133  C2 = (1.0 - C1) / (4.0 * q);
134  else
135  // alternate form for small q
136  C2 = 0.125 + q * 0.03125 * (Utility::pow<2>(p) - 12.0 * (p - 1.0)) / Utility::pow<2>(p) +
137  Utility::pow<2>(q) * (p - 2.0) * (Utility::pow<2>(p) - 10.0 * p + 32.0) /
138  Utility::pow<3>(p) +
139  Utility::pow<3>(q) *
140  (1104.0 - 992.0 * p + 376.0 * Utility::pow<2>(p) - 72.0 * Utility::pow<3>(p) +
141  5.0 * Utility::pow<4>(p)) /
142  (512.0 * Utility::pow<4>(p));
143  const Real C3 =
144  0.5 * std::sqrt((p * q * (3.0 - q) + Utility::pow<3>(p) + Utility::pow<2>(q)) /
145  Utility::pow<3>(p + q)); // sin theta_a/(2 sqrt(q))
146 
147  // Calculate incremental rotation. Note that this value is the transpose of that from Rashid,
148  // 93, so we transpose it before storing
149  RankTwoTensor R_incr;
150  R_incr.addIa(C1);
151  for (unsigned int i = 0; i < 3; ++i)
152  for (unsigned int j = 0; j < 3; ++j)
153  R_incr(i, j) += C2 * a[i] * a[j];
154 
155  R_incr(0, 1) += C3 * a[2];
156  R_incr(0, 2) -= C3 * a[1];
157  R_incr(1, 0) -= C3 * a[2];
158  R_incr(1, 2) += C3 * a[0];
159  R_incr(2, 0) += C3 * a[1];
160  R_incr(2, 1) -= C3 * a[0];
161 
162  rotation_increment = R_incr.transpose();
163  break;
164  }
166  {
167  std::vector<Real> e_value(3);
168  RankTwoTensor e_vector, N1, N2, N3;
169 
170  RankTwoTensor Chat = _Fhat[_qp].transpose() * _Fhat[_qp];
171  Chat.symmetricEigenvaluesEigenvectors(e_value, e_vector);
172 
173  const Real lambda1 = std::sqrt(e_value[0]);
174  const Real lambda2 = std::sqrt(e_value[1]);
175  const Real lambda3 = std::sqrt(e_value[2]);
176 
177  N1.vectorOuterProduct(e_vector.column(0), e_vector.column(0));
178  N2.vectorOuterProduct(e_vector.column(1), e_vector.column(1));
179  N3.vectorOuterProduct(e_vector.column(2), e_vector.column(2));
180 
181  RankTwoTensor Uhat = N1 * lambda1 + N2 * lambda2 + N3 * lambda3;
182  RankTwoTensor invUhat(Uhat.inverse());
183 
184  rotation_increment = _Fhat[_qp] * invUhat;
185 
186  total_strain_increment =
187  N1 * std::log(lambda1) + N2 * std::log(lambda2) + N3 * std::log(lambda3);
188  break;
189  }
190 
191  default:
192  mooseError("ComputeFiniteStrainNOSPD Error: Invalid decomposition type! Please specify : "
193  "TaylorExpansion or "
194  "EigenSolution.");
195  }
196 }
197 
198 void
200 {
201  for (unsigned int i = 0; i < _eigenstrains.size(); ++i)
202  {
203  strain -= (*_eigenstrains[i])[_qp];
204  strain += (*_eigenstrains_old[i])[_qp];
205  }
206 }
ComputeStrainBaseNOSPD::_mechanical_strain
MaterialProperty< RankTwoTensor > & _mechanical_strain
Definition: ComputeStrainBaseNOSPD.h:62
ComputeFiniteStrainNOSPD::_mechanical_strain_old
const MaterialProperty< RankTwoTensor > & _mechanical_strain_old
Definition: ComputeFiniteStrainNOSPD.h:53
ComputeFiniteStrainNOSPD.h
ComputeFiniteStrainNOSPD::DecompMethod::EigenSolution
registerMooseObject
registerMooseObject("PeridynamicsApp", ComputeFiniteStrainNOSPD)
ComputeFiniteStrainNOSPD::_decomposition_method
const DecompMethod _decomposition_method
Definition: ComputeFiniteStrainNOSPD.h:68
ComputeFiniteStrainNOSPD::_strain_rate
MaterialProperty< RankTwoTensor > & _strain_rate
Material properties to store.
Definition: ComputeFiniteStrainNOSPD.h:46
ComputeFiniteStrainNOSPD::subtractEigenstrainIncrementFromStrain
void subtractEigenstrainIncrementFromStrain(RankTwoTensor &strain)
Function to compute the mechanical strain tensor by subtracting thermal strain from the total strain.
Definition: ComputeFiniteStrainNOSPD.C:199
ComputeStrainBaseNOSPD
Base material class for correspondence material model.
Definition: ComputeStrainBaseNOSPD.h:24
ComputeFiniteStrainNOSPD::DecompMethod::TaylorExpansion
ComputeFiniteStrainNOSPD::_rotation_increment
MaterialProperty< RankTwoTensor > & _rotation_increment
Definition: ComputeFiniteStrainNOSPD.h:48
validParams< ComputeStrainBaseNOSPD >
InputParameters validParams< ComputeStrainBaseNOSPD >()
Definition: ComputeStrainBaseNOSPD.C:17
ComputeStrainBaseNOSPD::_deformation_gradient
MaterialProperty< RankTwoTensor > & _deformation_gradient
Definition: ComputeStrainBaseNOSPD.h:55
ComputeFiniteStrainNOSPD::DecompMethod
DecompMethod
Method to decompose into rotation increment and strain increment.
Definition: ComputeFiniteStrainNOSPD.h:63
ComputeFiniteStrainNOSPD
Material class for bond-associated correspondence material model for finite strain.
Definition: ComputeFiniteStrainNOSPD.h:23
ComputeStrainBaseNOSPD::computeQpDeformationGradient
virtual void computeQpDeformationGradient()
Function to compute bond-associated deformation gradient.
Definition: ComputeStrainBaseNOSPD.C:71
ComputeFiniteStrainNOSPD::computeQpStrain
virtual void computeQpStrain() override
Function to compute strain tensors.
Definition: ComputeFiniteStrainNOSPD.C:56
ComputeFiniteStrainNOSPD::_total_strain_old
const MaterialProperty< RankTwoTensor > & _total_strain_old
Definition: ComputeFiniteStrainNOSPD.h:54
ComputeStrainBaseNOSPD::_eigenstrain_names
std::vector< MaterialPropertyName > _eigenstrain_names
Definition: ComputeStrainBaseNOSPD.h:49
ComputeFiniteStrainNOSPD::_eigenstrains_old
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains_old
Definition: ComputeFiniteStrainNOSPD.h:55
ComputeStrainBaseNOSPD::_eigenstrains
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains
Definition: ComputeStrainBaseNOSPD.h:50
ComputeFiniteStrainNOSPD::_deformation_gradient_old
const MaterialProperty< RankTwoTensor > & _deformation_gradient_old
Material properties to fetch.
Definition: ComputeFiniteStrainNOSPD.h:52
ComputeFiniteStrainNOSPD::computeQpFhat
virtual void computeQpFhat()
Definition: ComputeFiniteStrainNOSPD.C:89
ComputeFiniteStrainNOSPD::ComputeFiniteStrainNOSPD
ComputeFiniteStrainNOSPD(const InputParameters &parameters)
Definition: ComputeFiniteStrainNOSPD.C:39
ComputeFiniteStrainNOSPD::_strain_increment
MaterialProperty< RankTwoTensor > & _strain_increment
Definition: ComputeFiniteStrainNOSPD.h:47
RankTwoTensorTempl< Real >
validParams< ComputeFiniteStrainNOSPD >
InputParameters validParams< ComputeFiniteStrainNOSPD >()
Definition: ComputeFiniteStrainNOSPD.C:24
ComputeStrainBaseNOSPD::_total_strain
MaterialProperty< RankTwoTensor > & _total_strain
Definition: ComputeStrainBaseNOSPD.h:61
ComputeFiniteStrainNOSPD::decompositionType
static MooseEnum decompositionType()
Definition: ComputeFiniteStrainNOSPD.C:17
ComputeFiniteStrainNOSPD::computeQpStrainRotationIncrements
void computeQpStrainRotationIncrements(RankTwoTensor &e, RankTwoTensor &r)
Function to compute strain and rotational increments.
Definition: ComputeFiniteStrainNOSPD.C:97
ComputeFiniteStrainNOSPD::_Fhat
std::vector< RankTwoTensor > _Fhat
'Incremental' deformation gradient
Definition: ComputeFiniteStrainNOSPD.h:59