www.mooseframework.org
GlobalStrainUserObject.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 "GlobalStrainUserObject.h"
11 
12 #include "libmesh/quadrature.h"
13 
14 registerMooseObject("TensorMechanicsApp", GlobalStrainUserObject);
15 
17 
18 InputParameters
20 {
21  InputParameters params = ElementUserObject::validParams();
22  params.addClassDescription(
23  "Global Strain UserObject to provide Residual and diagonal Jacobian entry");
24  params.addParam<std::vector<Real>>("applied_stress_tensor",
25  "Vector of values defining the constant applied stress "
26  "to add, in order 11, 22, 33, 23, 13, 12");
27  params.addParam<std::string>("base_name", "Material properties base name");
28  params.addCoupledVar("displacements", "The name of the displacement variables");
29  params.set<ExecFlagEnum>("execute_on") = EXEC_LINEAR;
30 
31  return params;
32 }
33 
34 GlobalStrainUserObject::GlobalStrainUserObject(const InputParameters & parameters)
35  : ElementUserObject(parameters),
37  _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
38  _dstress_dstrain(getMaterialProperty<RankFourTensor>(_base_name + "Jacobian_mult")),
39  _stress(getMaterialProperty<RankTwoTensor>(_base_name + "stress")),
40  _dim(_mesh.dimension()),
41  _ndisp(coupledComponents("displacements")),
42  _disp_var(_ndisp),
43  _periodic_dir()
44 {
45  for (unsigned int i = 0; i < _ndisp; ++i)
46  _disp_var[i] = coupled("displacements", i);
47 
48  for (unsigned int dir = 0; dir < _dim; ++dir)
49  {
50  _periodic_dir(dir) = _mesh.isTranslatedPeriodic(_disp_var[0], dir);
51 
52  for (unsigned int i = 1; i < _ndisp; ++i)
53  if (_mesh.isTranslatedPeriodic(_disp_var[i], dir) != _periodic_dir(dir))
54  mooseError("All the displacement components in a particular direction should have same "
55  "periodicity.");
56  }
57 
58  if (isParamValid("applied_stress_tensor"))
59  _applied_stress_tensor.fillFromInputVector(
60  getParam<std::vector<Real>>("applied_stress_tensor"));
61  else
63 }
64 
65 void
67 {
68  _residual.zero();
69  _jacobian.zero();
70 }
71 
72 void
74 {
76 
77  for (unsigned int _qp = 0; _qp < _qrule->n_points(); _qp++)
78  {
79  // residual, integral of stress components
80  _residual += _JxW[_qp] * _coord[_qp] * (_stress[_qp] - _applied_stress_tensor);
81 
82  // diagonal jacobian, integral of elasticity tensor components
83  _jacobian += _JxW[_qp] * _coord[_qp] * _dstress_dstrain[_qp];
84  }
85 }
86 
87 void
88 GlobalStrainUserObject::threadJoin(const UserObject & uo)
89 {
90  const GlobalStrainUserObject & pstuo = static_cast<const GlobalStrainUserObject &>(uo);
91  _residual += pstuo._residual;
92  _jacobian += pstuo._jacobian;
93 }
94 
95 void
97 {
98  std::vector<Real> residual(9);
99  std::vector<Real> jacobian(81);
100 
101  std::copy(&_residual(0, 0), &_residual(0, 0) + 9, residual.begin());
102  std::copy(&_jacobian(0, 0, 0, 0), &_jacobian(0, 0, 0, 0) + 81, jacobian.begin());
103 
104  gatherSum(residual);
105  gatherSum(jacobian);
106 
107  std::copy(residual.begin(), residual.end(), &_residual(0, 0));
108  std::copy(jacobian.begin(), jacobian.end(), &_jacobian(0, 0, 0, 0));
109 }
110 
111 const RankTwoTensor &
113 {
114  return _residual;
115 }
116 
117 const RankFourTensor &
119 {
120  return _jacobian;
121 }
122 
123 const VectorValue<bool> &
125 {
126  return _periodic_dir;
127 }
GlobalStrainUserObjectInterface
This class provides interface for extracting the periodic directions, residual, and jacobian values f...
Definition: GlobalStrainUserObjectInterface.h:19
GlobalStrainUserObject::_dim
const unsigned int _dim
Definition: GlobalStrainUserObject.h:53
defineLegacyParams
defineLegacyParams(GlobalStrainUserObject)
GlobalStrainUserObject::finalize
void finalize() override
Definition: GlobalStrainUserObject.C:96
GlobalStrainUserObject::_jacobian
RankFourTensor _jacobian
Definition: GlobalStrainUserObject.h:51
GlobalStrainUserObject::_residual
RankTwoTensor _residual
Definition: GlobalStrainUserObject.h:50
GlobalStrainUserObject::initialize
void initialize() override
Definition: GlobalStrainUserObject.C:66
registerMooseObject
registerMooseObject("TensorMechanicsApp", GlobalStrainUserObject)
GlobalStrainUserObject::_ndisp
const unsigned int _ndisp
Definition: GlobalStrainUserObject.h:54
GlobalStrainUserObject::validParams
static InputParameters validParams()
Definition: GlobalStrainUserObject.C:19
GlobalStrainUserObject::execute
void execute() override
Definition: GlobalStrainUserObject.C:73
GlobalStrainUserObject::_applied_stress_tensor
RankTwoTensor _applied_stress_tensor
Definition: GlobalStrainUserObject.h:49
GlobalStrainUserObject::GlobalStrainUserObject
GlobalStrainUserObject(const InputParameters &parameters)
Definition: GlobalStrainUserObject.C:34
validParams
InputParameters validParams()
GlobalStrainUserObject::getJacobian
virtual const RankFourTensor & getJacobian() const override
Definition: GlobalStrainUserObject.C:118
GlobalStrainUserObject::_periodic_dir
VectorValue< bool > _periodic_dir
Definition: GlobalStrainUserObject.h:56
GlobalStrainUserObject::_disp_var
std::vector< unsigned int > _disp_var
Definition: GlobalStrainUserObject.h:55
GlobalStrainUserObject::computeAdditionalStress
virtual void computeAdditionalStress()
Calculate additional applied stresses.
Definition: GlobalStrainUserObject.h:41
GlobalStrainUserObject.h
GlobalStrainUserObject::_dstress_dstrain
const MaterialProperty< RankFourTensor > & _dstress_dstrain
Definition: GlobalStrainUserObject.h:46
GlobalStrainUserObject::getPeriodicDirections
virtual const VectorValue< bool > & getPeriodicDirections() const override
Definition: GlobalStrainUserObject.C:124
GlobalStrainUserObject::threadJoin
void threadJoin(const UserObject &uo) override
Definition: GlobalStrainUserObject.C:88
RankFourTensorTempl
Definition: ACGrGrElasticDrivingForce.h:20
RankTwoTensorTempl< Real >
GlobalStrainUserObject
Definition: GlobalStrainUserObject.h:23
GlobalStrainUserObject::getResidual
virtual const RankTwoTensor & getResidual() const override
Definition: GlobalStrainUserObject.C:112
GlobalStrainUserObject::_stress
const MaterialProperty< RankTwoTensor > & _stress
Definition: GlobalStrainUserObject.h:47