www.mooseframework.org
ComputeEigenstrainFromInitialStress.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 #include "RankTwoTensor.h"
12 #include "Function.h"
13 #include "Conversion.h" // for stringify
14 
16 
19 {
21  params.addClassDescription("Computes an eigenstrain from an initial stress");
22  params.addRequiredParam<std::vector<FunctionName>>(
23  "initial_stress",
24  "A list of functions describing the initial stress. There must be 9 of these, corresponding "
25  "to the xx, yx, zx, xy, yy, zy, xz, yz, zz components respectively. To compute the "
26  "eigenstrain correctly, your elasticity tensor should not be time-varying in the first "
27  "timestep");
28  params.addCoupledVar("initial_stress_aux",
29  "A list of 9 AuxVariables describing the initial stress. If provided, each "
30  "of these is multiplied by its corresponding initial_stress function to "
31  "obtain the relevant component of initial stress.");
32  params.addParam<std::string>("base_name",
33  "The base_name for the elasticity tensor that will be "
34  "used to compute strain from stress. Do not provide "
35  "any base_name if your elasticity tensor does not use "
36  "one.");
37  return params;
38 }
39 
41  const InputParameters & parameters)
42  : ComputeEigenstrainBase(parameters),
43  _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
44  _elasticity_tensor(getMaterialPropertyByName<RankFourTensor>(_base_name + "elasticity_tensor")),
45  _eigenstrain_old(getMaterialPropertyOld<RankTwoTensor>(_eigenstrain_name)),
46  _ini_aux_provided(isParamValid("initial_stress_aux")),
47  _ini_aux(_ini_aux_provided ? coupledValues("initial_stress_aux")
48  : std::vector<const VariableValue *>())
49 {
50  const std::vector<FunctionName> & fcn_names(
51  getParam<std::vector<FunctionName>>("initial_stress"));
52  const std::size_t num = fcn_names.size();
53 
54  if (num != LIBMESH_DIM * LIBMESH_DIM)
55  paramError(
56  "initial_stress",
57  "ComputeEigenstrainFromInitialStress: " + Moose::stringify(LIBMESH_DIM * LIBMESH_DIM) +
58  " initial stress functions must be provided. You supplied " + Moose::stringify(num) +
59  "\n");
60 
61  _initial_stress_fcn.resize(num);
62  for (unsigned i = 0; i < num; ++i)
63  _initial_stress_fcn[i] = &getFunctionByName(fcn_names[i]);
64 
66  {
67  const std::size_t aux_size = coupledComponents("initial_stress_aux");
68  if (aux_size != LIBMESH_DIM * LIBMESH_DIM)
69  paramError("initial_stress_aux",
70  "ComputeEigenstrainFromInitialStress: If you supply initial_stress_aux, " +
71  Moose::stringify(LIBMESH_DIM * LIBMESH_DIM) +
72  " values must be given. You supplied " + Moose::stringify(aux_size) + "\n");
73  }
74 }
75 
76 void
78 {
79  if (_t_step == 1)
80  {
81  RankTwoTensor initial_stress;
82  for (unsigned i = 0; i < LIBMESH_DIM; ++i)
83  for (unsigned j = 0; j < LIBMESH_DIM; ++j)
84  {
85  initial_stress(i, j) = _initial_stress_fcn[i * LIBMESH_DIM + j]->value(_t, _q_point[_qp]);
87  initial_stress(i, j) *= (*_ini_aux[i * LIBMESH_DIM + j])[_qp];
88  }
89 
90  _eigenstrain[_qp] = -_elasticity_tensor[_qp].invSymm() * initial_stress;
91  }
92  else
94 }
const MooseArray< Point > & _q_point
const bool _ini_aux_provided
Whether the user has supplied AuxVariables representing the initial stress.
registerMooseObject("SolidMechanicsApp", ComputeEigenstrainFromInitialStress)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
ComputeEigenstrainFromInitialStress(const InputParameters &parameters)
std::vector< const Function * > _initial_stress_fcn
initial stress components
void addRequiredParam(const std::string &name, const std::string &doc_string)
unsigned int _qp
int & _t_step
static InputParameters validParams()
Real & _t
const T & getParam(const std::string &name) const
ComputeEigenstrainBase is the base class for eigenstrain tensors.
void paramError(const std::string &param, Args... args) const
std::string stringify(const T &t)
ComputeEigenstrain computes an Eigenstrain that results from an initial stress The initial stress is ...
void addCoupledVar(const std::string &name, const std::string &doc_string)
OutputTools< Real >::VariableValue VariableValue
unsigned int coupledComponents(const std::string &var_name) const
const Function & getFunctionByName(const FunctionName &name) const
GenericMaterialProperty< RankTwoTensor, is_ad > & _eigenstrain
Stores the current total eigenstrain.
const std::vector< const VariableValue * > _ini_aux
AuxVariables defining the initial stress.
const MaterialProperty< RankTwoTensor > & _eigenstrain_old
Stores the total eigenstrain in the previous step.
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
const MaterialProperty< RankFourTensor > & _elasticity_tensor
elasticity tensor used to convert stress to strain
virtual void computeQpEigenstrain() override
Compute the eigenstrain and store in _eigenstrain.