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  _disp_var(getFieldVars("displacements")),
40  _periodic_dir()
41 {
42  for (unsigned int dir = 0; dir < _dim; ++dir)
43  {
45 
46  for (unsigned int i = 1; i < _disp_var.size(); ++i)
47  if (_mesh.isTranslatedPeriodic(*_disp_var[i], dir) != _periodic_dir(dir))
48  mooseError("All the displacement components in a particular direction should have same "
49  "periodicity.");
50  }
51 
52  if (isParamValid("applied_stress_tensor"))
54  getParam<std::vector<Real>>("applied_stress_tensor"));
55  else
57 }
58 
59 void
61 {
62  _residual.zero();
63  _jacobian.zero();
64 }
65 
66 void
68 {
70 
71  for (unsigned int _qp = 0; _qp < _qrule->n_points(); _qp++)
72  {
73  // residual, integral of stress components
74  _residual += _JxW[_qp] * _coord[_qp] * (_stress[_qp] - _applied_stress_tensor);
75 
76  // diagonal jacobian, integral of elasticity tensor components
77  _jacobian += _JxW[_qp] * _coord[_qp] * _dstress_dstrain[_qp];
78  }
79 }
80 
81 void
83 {
84  const auto & pstuo = static_cast<const GlobalStrainUserObject &>(uo);
85  _residual += pstuo._residual;
86  _jacobian += pstuo._jacobian;
87 }
88 
89 void
91 {
92  std::vector<Real> residual(9);
93  std::vector<Real> jacobian(81);
94 
95  std::copy(&_residual(0, 0), &_residual(0, 0) + 9, residual.begin());
96  std::copy(&_jacobian(0, 0, 0, 0), &_jacobian(0, 0, 0, 0) + 81, jacobian.begin());
97 
98  gatherSum(residual);
99  gatherSum(jacobian);
100 
101  std::copy(residual.begin(), residual.end(), &_residual(0, 0));
102  std::copy(jacobian.begin(), jacobian.end(), &_jacobian(0, 0, 0, 0));
103 }
104 
105 const RankTwoTensor &
107 {
108  return _residual;
109 }
110 
111 const RankFourTensor &
113 {
114  return _jacobian;
115 }
116 
117 const VectorValue<bool> &
119 {
120  return _periodic_dir;
121 }
const MaterialProperty< RankTwoTensor > & _stress
The stress tensor.
void gatherSum(T &value)
registerMooseObject("SolidMechanicsApp", GlobalStrainUserObject)
const MooseArray< Real > & _coord
const T & getParam(const std::string &name) const
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
static InputParameters validParams()
T & set(const std::string &name, bool quiet_mode=false)
const std::vector< const MooseVariableFieldBase * > _disp_var
Displacement variables.
void fillFromInputVector(const std::vector< Real > &input, FillMethod fill_method=autodetect)
const MaterialProperty< RankFourTensor > & _dstress_dstrain
static InputParameters validParams()
virtual const RankFourTensor & getJacobian() const override
VectorValue< bool > _periodic_dir
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...
bool isTranslatedPeriodic(const unsigned int sys_num, const unsigned int var_num, const unsigned int component) const
const MooseArray< Real > & _JxW
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
bool isParamValid(const std::string &name) const
virtual const VectorValue< bool > & getPeriodicDirections() const override
virtual const RankTwoTensor & getResidual() const override
MooseMesh & _mesh
void threadJoin(const UserObject &uo) override