www.mooseframework.org
RateDepSmearCrackModel.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 "RateDepSmearCrackModel.h"
11 
12 registerMooseObject("SolidMechanicsApp", RateDepSmearCrackModel);
13 
14 template <>
15 InputParameters
17 {
18 
19  InputParameters params = validParams<ConstitutiveModel>();
20 
21  params.addRequiredParam<Real>("ref_damage_rate", "Reference damage rate");
22  params.addRequiredParam<unsigned int>("nstate", "Number of state variables");
23  params.addParam<Real>("exponent", 1.0, "Power law exponent");
24  params.addParam<unsigned int>("maxiter", 20, "Constitutive update iteration");
25  params.addParam<Real>("tol", 1e-5, "Constitutive update tolerance");
26  params.addParam<Real>("zero_tol", 1e-8, "Tolerance for zero");
27  params.addParam<Real>(
28  "intvar_incr_tol", 0.1, "Allowable relative increment size for state variables");
29  params.addParam<bool>("input_random_scaling_var",
30  false,
31  "Flag to specify scaling parameter to generate random stress");
32  params.addParam<Real>("random_scaling_var",
33  1e9,
34  "Scaling value: Too large a value can cause "
35  "non-positive definiteness - use 0.1 of young's "
36  "modulus");
37 
38  return params;
39 }
40 
41 RateDepSmearCrackModel::RateDepSmearCrackModel(const InputParameters & parameters)
42  : ConstitutiveModel(parameters),
43  _ref_damage_rate(getParam<Real>("ref_damage_rate")),
44  _nstate(getParam<unsigned int>("nstate")),
45  _exponent(getParam<Real>("exponent")),
46  _maxiter(getParam<unsigned int>("maxiter")),
47  _tol(getParam<Real>("tol")),
48  _zero_tol(getParam<Real>("zero_tol")),
49  _intvar_incr_tol(getParam<Real>("intvar_incr_tol")),
50  _input_rndm_scale_var(getParam<bool>("input_random_scaling_var")),
51  _rndm_scale_var(getParam<Real>("random_scaling_var")),
52  _intvar(declareProperty<std::vector<Real>>("intvar")),
53  _intvar_old(getMaterialPropertyOld<std::vector<Real>>("intvar")),
54  _stress_undamaged(declareProperty<SymmTensor>("stress_undamaged")),
55  _stress_undamaged_old(getMaterialPropertyOld<SymmTensor>("stress_undamaged"))
56 {
57 
58  _intvar_incr.resize(_nstate, 0.0);
59  _intvar_tmp.resize(_nstate, 0.0);
60  _intvar_old_tmp.resize(_nstate, 0.0);
61  _resid.resize(_nstate, 0.0);
62  _jac.resize(_nstate * _nstate, 0.0);
63  _dvar.resize(_nstate, 0.0);
64 
66 }
67 
68 void
70 {
71  _intvar[_qp].resize(_nstate, 0.0);
72  const_cast<MaterialProperty<std::vector<Real>> &>(_intvar_old)[_qp].resize(_nstate, 0.0);
73 }
74 
75 void
76 RateDepSmearCrackModel::computeStress(const Elem & /*current_elem*/,
77  const SymmElasticityTensor & elasticityTensor,
78  const SymmTensor & stress_old,
79  SymmTensor & strain_increment,
80  SymmTensor & stress_new)
81 {
82  _elasticity = elasticityTensor;
83  _stress_old = stress_old;
84  _dstrain = strain_increment;
85 
86  initVariables();
87  solve();
88 
90  _rndm_scale_var = elasticityTensor.valueAtIndex(0);
91 
92  if (_nconv || _err_tol)
93  {
94  mooseWarning("RateDepSmearCrackModel: Constitutive cutback");
96  }
97  else
98  {
100  postSolveStress();
101 
102  stress_new = _stress_new;
104  }
105 }
106 
107 void
109 {
110 
113 
114  for (unsigned int i = 0; i < _nstate; ++i)
115  {
116  _intvar_tmp[i] = _intvar_old[_qp][i];
117  _intvar_old_tmp[i] = _intvar_old[_qp][i];
118  }
119 }
120 
121 void
123 {
124 
125  unsigned int iter = 0;
126  _err_tol = false;
127 
128  calcResidual();
129 
131 
132  while (_nconv && iter < _maxiter && !_err_tol)
133  {
134  calcJacobian();
135  updateVariables();
136  calcResidual();
137 
139 
140  iter++;
141  }
142 }
143 
144 void
146 {
147  int error = matrixInversion(_jac, _nstate);
148  if (error != 0)
149  mooseError("Error in Matrix Inversion in RankFourTensor");
150 
151  for (unsigned int i = 0; i < _nstate; i++)
152  {
153  _dvar[i] = 0.0;
154  for (unsigned int j = 0; j < _nstate; j++)
155  _dvar[i] += _jac[i * _nstate + j] * _resid[j];
156  }
157 
158  for (unsigned int i = 0; i < _nstate; i++)
159  _intvar_tmp[i] -= _dvar[i];
160 }
161 
162 bool
164 {
165  Real vold, r;
166 
167  for (unsigned int i = 0; i < _nstate; i++)
168  {
169  vold = std::abs(_intvar_old_tmp[i]);
170  r = std::abs(_resid[i]);
171 
172  if (vold > _zero_tol)
173  {
174  if (r > _tol * vold)
175  return true;
176  }
177  else
178  {
179  if (r > _zero_tol)
180  return true;
181  }
182  }
183  return false;
184 }
185 
186 void
188 {
189  for (unsigned int i = 0; i < _nstate; ++i)
190  _intvar[_qp][i] = _intvar_tmp[i];
191 }
192 
193 void
195 {
196 }
197 
198 void
200 {
201  calcStateIncr();
202 
203  if (_err_tol)
204  return;
205 
206  for (unsigned int i = 0; i < _nstate; ++i)
208 }
209 
210 void
212 {
213 }
214 
215 void
217 {
218 }
219 
220 int
221 RateDepSmearCrackModel::matrixInversion(std::vector<Real> & A, int n) const
222 {
223  int return_value, buffer_size = n * 64;
224  std::vector<PetscBLASInt> ipiv(n);
225  std::vector<PetscScalar> buffer(buffer_size);
226 
227  // Following does a LU decomposition of "square matrix A"
228  // upon return "A = P*L*U" if return_value == 0
229  // Here i use quotes because A is actually an array of length n^2, not a matrix of size n-by-n
230  LAPACKgetrf_(&n, &n, &A[0], &n, &ipiv[0], &return_value);
231 
232  if (return_value != 0)
233  // couldn't LU decompose because: illegal value in A; or, A singular
234  return return_value;
235 
236 // get the inverse of A
237 #if PETSC_VERSION_LESS_THAN(3, 5, 0)
238  FORTRAN_CALL(dgetri)(&n, &A[0], &n, &ipiv[0], &buffer[0], &buffer_size, &return_value);
239 #else
240  LAPACKgetri_(&n, &A[0], &n, &ipiv[0], &buffer[0], &buffer_size, &return_value);
241 #endif
242 
243  return return_value;
244 }
245 
dgetri
void FORTRAN_CALL() dgetri(...)
RateDepSmearCrackModel::postSolveStress
virtual void postSolveStress()
This function updates the stress after solve.
Definition: RateDepSmearCrackModel.C:194
RateDepSmearCrackModel::_stress_old
SymmTensor _stress_old
Definition: RateDepSmearCrackModel.h:121
RateDepSmearCrackModel::_stress_new
SymmTensor _stress_new
Definition: RateDepSmearCrackModel.h:121
SymmElasticityTensor::valueAtIndex
Real valueAtIndex(int i) const
Definition: SymmElasticityTensor.C:409
RateDepSmearCrackModel::_elasticity
SymmElasticityTensor _elasticity
Definition: RateDepSmearCrackModel.h:120
RateDepSmearCrackModel::initVariables
virtual void initVariables()
Definition: RateDepSmearCrackModel.C:108
RateDepSmearCrackModel
RateDepSmearCrackModel is the base class for rate dependent continuum damage model.
Definition: RateDepSmearCrackModel.h:32
ConstitutiveModel
Definition: ConstitutiveModel.h:22
RateDepSmearCrackModel::_intvar_tmp
std::vector< Real > _intvar_tmp
Definition: RateDepSmearCrackModel.h:115
SymmTensor::genRandomSymmTensor
static SymmTensor genRandomSymmTensor(Real scalefactor)
Definition: SymmTensor.h:449
RateDepSmearCrackModel::_maxiter
unsigned int _maxiter
Definition: RateDepSmearCrackModel.h:101
RateDepSmearCrackModel::postSolveVariables
virtual void postSolveVariables()
This function updates the internal variables after solve.
Definition: RateDepSmearCrackModel.C:187
RateDepSmearCrackModel::_zero_tol
Real _zero_tol
Relative tolerance factor for convergence of the Newton Raphson solve.
Definition: RateDepSmearCrackModel.h:103
RateDepSmearCrackModel::_dstrain
SymmTensor _dstrain
Definition: RateDepSmearCrackModel.h:121
RateDepSmearCrackModel::_stress_undamaged_old
const MaterialProperty< SymmTensor > & _stress_undamaged_old
Definition: RateDepSmearCrackModel.h:112
SymmTensor::initRandom
static void initRandom()
Definition: SymmTensor.h:442
RateDepSmearCrackModel::_err_tol
bool _err_tol
Convergence flag.
Definition: RateDepSmearCrackModel.h:124
RateDepSmearCrackModel::_intvar_incr
std::vector< Real > _intvar_incr
Definition: RateDepSmearCrackModel.h:114
RateDepSmearCrackModel::RateDepSmearCrackModel
RateDepSmearCrackModel(const InputParameters &parameters)
Definition: RateDepSmearCrackModel.C:41
RateDepSmearCrackModel::_jac
std::vector< Real > _jac
Definition: RateDepSmearCrackModel.h:117
registerMooseObject
registerMooseObject("SolidMechanicsApp", RateDepSmearCrackModel)
RateDepSmearCrackModel::updateVariables
virtual void updateVariables()
This function updates variables during solve a(i+1) = a(i) + da(i+1)
Definition: RateDepSmearCrackModel.C:145
SymmElasticityTensor
This class defines a basic set of capabilities any elasticity tensor should have.
Definition: SymmElasticityTensor.h:55
RateDepSmearCrackModel::_stress_undamaged
MaterialProperty< SymmTensor > & _stress_undamaged
Definition: RateDepSmearCrackModel.h:111
RateDepSmearCrackModel::computeStress
virtual void computeStress(const Elem &current_elem, const SymmElasticityTensor &elasticity_tensor, const SymmTensor &stress_old, SymmTensor &strain_increment, SymmTensor &stress_new)
Definition: RateDepSmearCrackModel.C:76
RateDepSmearCrackModel::_rndm_scale_var
Real _rndm_scale_var
Flag to specify scaling parameter to generate random stress.
Definition: RateDepSmearCrackModel.h:106
RateDepSmearCrackModel::~RateDepSmearCrackModel
virtual ~RateDepSmearCrackModel()
Definition: RateDepSmearCrackModel.C:246
RateDepSmearCrackModel::_nstate
unsigned int _nstate
reference damage rate
Definition: RateDepSmearCrackModel.h:99
RateDepSmearCrackModel::solve
virtual void solve()
This function solves the state variables.
Definition: RateDepSmearCrackModel.C:122
RateDepSmearCrackModel::_dvar
std::vector< Real > _dvar
Definition: RateDepSmearCrackModel.h:118
RateDepSmearCrackModel::_resid
std::vector< Real > _resid
Definition: RateDepSmearCrackModel.h:116
RateDepSmearCrackModel::_stress0
SymmTensor _stress0
Definition: RateDepSmearCrackModel.h:122
RateDepSmearCrackModel::_nconv
bool _nconv
Definition: RateDepSmearCrackModel.h:123
RateDepSmearCrackModel::initQpStatefulProperties
virtual void initQpStatefulProperties()
Definition: RateDepSmearCrackModel.C:69
RateDepSmearCrackModel::calcJacobian
virtual void calcJacobian()
This function calculates the Jacobian.
Definition: RateDepSmearCrackModel.C:216
RateDepSmearCrackModel::_intvar_old_tmp
std::vector< Real > _intvar_old_tmp
Definition: RateDepSmearCrackModel.h:115
RateDepSmearCrackModel::_intvar
MaterialProperty< std::vector< Real > > & _intvar
Variable value.
Definition: RateDepSmearCrackModel.h:108
RateDepSmearCrackModel::calcResidual
virtual void calcResidual()
This function calculates the residual as r = v - v_old - dv.
Definition: RateDepSmearCrackModel.C:199
RateDepSmearCrackModel::matrixInversion
int matrixInversion(std::vector< Real > &A, int n) const
Definition: RateDepSmearCrackModel.C:221
RateDepSmearCrackModel::_dstress0
SymmTensor _dstress0
Definition: RateDepSmearCrackModel.h:122
SymmTensor
Definition: SymmTensor.h:21
RateDepSmearCrackModel::_input_rndm_scale_var
bool _input_rndm_scale_var
Allowable relative increment size of state variables (dv)
Definition: RateDepSmearCrackModel.h:105
RateDepSmearCrackModel.h
validParams< RateDepSmearCrackModel >
InputParameters validParams< RateDepSmearCrackModel >()
Definition: RateDepSmearCrackModel.C:16
RateDepSmearCrackModel::getConvergeVar
bool getConvergeVar()
This function returns true if convergence is not achieved.
Definition: RateDepSmearCrackModel.C:163
RateDepSmearCrackModel::_tol
Real _tol
Maximum number of Newton Raphson iteration.
Definition: RateDepSmearCrackModel.h:102
RateDepSmearCrackModel::_intvar_old
const MaterialProperty< std::vector< Real > > & _intvar_old
Definition: RateDepSmearCrackModel.h:109
RateDepSmearCrackModel::calcStateIncr
virtual void calcStateIncr()
This function calculated thw increment of the state variables (dv) used to form the residual.
Definition: RateDepSmearCrackModel.C:211
validParams< ConstitutiveModel >
InputParameters validParams< ConstitutiveModel >()
Definition: ConstitutiveModel.C:16