https://mooseframework.inl.gov
GlobalStrainUserObject.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
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 "GlobalStrainUserObject.h"
11 
12 #include "libmesh/quadrature.h"
13 
14 registerMooseObject("SolidMechanicsApp", GlobalStrainUserObject);
15 
18 {
20  params.addClassDescription(
21  "Global Strain UserObject to provide Residual and diagonal Jacobian entry");
22  params.addParam<std::vector<Real>>("applied_stress_tensor",
23  "Vector of values defining the constant applied stress "
24  "to add, in order 11, 22, 33, 23, 13, 12");
25  params.addParam<std::string>("base_name", "Material properties base name");
26  params.addCoupledVar("displacements", "The name of the displacement variables");
27  params.set<ExecFlagEnum>("execute_on") = EXEC_LINEAR;
28 
29  return params;
30 }
31 
33  : ElementUserObject(parameters),
35  _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
36  _dstress_dstrain(getMaterialProperty<RankFourTensor>(_base_name + "Jacobian_mult")),
37  _stress(getMaterialProperty<RankTwoTensor>(_base_name + "stress")),
38  _dim(_mesh.dimension()),
39  _ndisp(coupledComponents("displacements")),
40  _disp_var(_ndisp),
41  _periodic_dir()
42 {
43  for (unsigned int i = 0; i < _ndisp; ++i)
44  _disp_var[i] = coupled("displacements", i);
45 
46  for (unsigned int dir = 0; dir < _dim; ++dir)
47  {
49 
50  for (unsigned int i = 1; i < _ndisp; ++i)
52  mooseError("All the displacement components in a particular direction should have same "
53  "periodicity.");
54  }
55 
56  if (isParamValid("applied_stress_tensor"))
58  getParam<std::vector<Real>>("applied_stress_tensor"));
59  else
61 }
62 
63 void
65 {
66  _residual.zero();
67  _jacobian.zero();
68 }
69 
70 void
72 {
74 
75  for (unsigned int _qp = 0; _qp < _qrule->n_points(); _qp++)
76  {
77  // residual, integral of stress components
78  _residual += _JxW[_qp] * _coord[_qp] * (_stress[_qp] - _applied_stress_tensor);
79 
80  // diagonal jacobian, integral of elasticity tensor components
81  _jacobian += _JxW[_qp] * _coord[_qp] * _dstress_dstrain[_qp];
82  }
83 }
84 
85 void
87 {
88  const auto & pstuo = static_cast<const GlobalStrainUserObject &>(uo);
89  _residual += pstuo._residual;
90  _jacobian += pstuo._jacobian;
91 }
92 
93 void
95 {
96  std::vector<Real> residual(9);
97  std::vector<Real> jacobian(81);
98 
99  std::copy(&_residual(0, 0), &_residual(0, 0) + 9, residual.begin());
100  std::copy(&_jacobian(0, 0, 0, 0), &_jacobian(0, 0, 0, 0) + 81, jacobian.begin());
101 
102  gatherSum(residual);
103  gatherSum(jacobian);
104 
105  std::copy(residual.begin(), residual.end(), &_residual(0, 0));
106  std::copy(jacobian.begin(), jacobian.end(), &_jacobian(0, 0, 0, 0));
107 }
108 
109 const RankTwoTensor &
111 {
112  return _residual;
113 }
114 
115 const RankFourTensor &
117 {
118  return _jacobian;
119 }
120 
121 const VectorValue<bool> &
123 {
124  return _periodic_dir;
125 }
const MaterialProperty< RankTwoTensor > & _stress
The stress tensor.
virtual unsigned int coupled(const std::string &var_name, unsigned int comp=0) const
registerMooseObject("SolidMechanicsApp", GlobalStrainUserObject)
const MooseArray< Real > & _coord
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
static InputParameters validParams()
const unsigned int _ndisp
Number of displacement variables.
bool isTranslatedPeriodic(unsigned int nonlinear_var_num, unsigned int component) const
T & set(const std::string &name, bool quiet_mode=false)
bool isParamValid(const std::string &name) const
void fillFromInputVector(const std::vector< Real > &input, FillMethod fill_method=autodetect)
void gatherSum(T &value)
const MaterialProperty< RankFourTensor > & _dstress_dstrain
static InputParameters validParams()
const T & getParam(const std::string &name) const
virtual const RankFourTensor & getJacobian() const override
VectorValue< bool > _periodic_dir
std::vector< unsigned int > _disp_var
Variable numbers of the displacement variables.
const ExecFlagType EXEC_LINEAR
GlobalStrainUserObject(const InputParameters &parameters)
void addCoupledVar(const std::string &name, const std::string &doc_string)
virtual void computeAdditionalStress()
Calculate additional applied stresses.
const QBase *const & _qrule
This class provides interface for extracting the periodic directions, residual, and jacobian values f...
const MooseArray< Real > & _JxW
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
virtual const VectorValue< bool > & getPeriodicDirections() const override
virtual const RankTwoTensor & getResidual() const override
MooseMesh & _mesh
void threadJoin(const UserObject &uo) override