www.mooseframework.org
GeneralizedPlaneStrainUserObject.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 "RankFourTensor.h"
13 #include "Function.h"
14 #include "Assembly.h"
15 
16 #include "libmesh/quadrature.h"
17 
19 
21 
22 InputParameters
24 {
25  InputParameters params = ElementUserObject::validParams();
26  params.addClassDescription(
27  "Generalized plane strain UserObject to provide residual and diagonal Jacobian entries.");
28  params.addParam<UserObjectName>("subblock_index_provider",
29  "SubblockIndexProvider user object name");
30  params.addParam<FunctionName>(
31  "out_of_plane_pressure",
32  "0",
33  "Function used to prescribe pressure in the out-of-plane direction");
34  MooseEnum outOfPlaneDirection("x y z", "z");
35  params.addParam<MooseEnum>(
36  "out_of_plane_direction", outOfPlaneDirection, "The direction of the out-of-plane strain.");
37  params.addParam<Real>("factor", 1.0, "Scale factor applied to prescribed pressure");
38  params.addParam<std::string>("base_name", "Material properties base name");
39  params.set<ExecFlagEnum>("execute_on") = EXEC_LINEAR;
40 
41  return params;
42 }
43 
45  const InputParameters & parameters)
46  : ElementUserObject(parameters),
47  _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
48  _Cijkl(getMaterialProperty<RankFourTensor>(_base_name + "elasticity_tensor")),
49  _stress(getMaterialProperty<RankTwoTensor>(_base_name + "stress")),
50  _subblock_id_provider(nullptr),
51  _out_of_plane_pressure(getFunction("out_of_plane_pressure")),
52  _factor(getParam<Real>("factor"))
53 {
54 }
55 
56 void
58 {
59  if (isParamValid("subblock_index_provider"))
60  _subblock_id_provider = &getUserObject<SubblockIndexProvider>("subblock_index_provider");
61  if (_assembly.coordSystem() == Moose::COORD_XYZ)
62  _scalar_out_of_plane_strain_direction = getParam<MooseEnum>("out_of_plane_direction");
63  else if (_assembly.coordSystem() == Moose::COORD_RZ)
65  else
66  mooseError("Unsupported coordinate system for generalized plane strain formulation");
67 
68  unsigned int max_size = _subblock_id_provider ? _subblock_id_provider->getMaxSubblockIndex() : 1;
69  _residual.assign(max_size, 0.0);
70  _reference_residual.assign(max_size, 0.0);
71  _jacobian.assign(max_size, 0.0);
72 }
73 
74 void
76 {
77  const unsigned int subblock_id =
79 
80  for (unsigned int _qp = 0; _qp < _qrule->n_points(); _qp++)
81  {
82  // residual, integral of stress_zz for COORD_XYZ
83  _residual[subblock_id] += _JxW[_qp] * _coord[_qp] *
86  _out_of_plane_pressure.value(_t, _q_point[_qp]) * _factor);
87 
88  _reference_residual[subblock_id] += std::abs(
89  _JxW[_qp] * _coord[_qp] *
91 
92  // diagonal jacobian, integral of C(2, 2, 2, 2) for COORD_XYZ
93  _jacobian[subblock_id] += _JxW[_qp] * _coord[_qp] *
98  }
99 }
100 
101 void
103 {
104  const GeneralizedPlaneStrainUserObject & gpsuo =
105  static_cast<const GeneralizedPlaneStrainUserObject &>(uo);
106  for (unsigned int i = 0; i < _residual.size(); ++i)
107  {
108  _residual[i] += gpsuo._residual[i];
110  _jacobian[i] += gpsuo._jacobian[i];
111  }
112 }
113 
114 void
116 {
117  gatherSum(_residual);
118  gatherSum(_reference_residual);
119  gatherSum(_jacobian);
120 }
121 
122 Real
123 GeneralizedPlaneStrainUserObject::returnResidual(unsigned int scalar_var_id) const
124 {
125  if (_residual.size() <= scalar_var_id)
126  mooseError("Index out of bounds!");
127 
128  return _residual[scalar_var_id];
129 }
130 
131 Real
133 {
134  // At startup, the GeneralizedPlaneStrainReferenceResidual class can ask for this value
135  // before it has been computed. Return 0.0 in this case. The only way size will stay
136  // zero is if initialize is never called.
137  if (_reference_residual.size() == 0)
138  return 0.0;
139 
140  if (_residual.size() <= scalar_var_id)
141  mooseError("Index out of bounds!");
142 
143  return _reference_residual[scalar_var_id];
144 }
145 
146 Real
147 GeneralizedPlaneStrainUserObject::returnJacobian(unsigned int scalar_var_id) const
148 {
149  if (_jacobian.size() <= scalar_var_id)
150  mooseError("Index out of bounds!");
151 
152  return _jacobian[scalar_var_id];
153 }
SubblockIndexProvider::getMaxSubblockIndex
virtual unsigned int getMaxSubblockIndex() const =0
The max index of subblock.
GeneralizedPlaneStrainUserObject::_residual
std::vector< Real > _residual
Definition: GeneralizedPlaneStrainUserObject.h:53
registerMooseObject
registerMooseObject("TensorMechanicsApp", GeneralizedPlaneStrainUserObject)
SubblockIndexProvider::getSubblockIndex
virtual unsigned int getSubblockIndex(const Elem &) const =0
The index of subblock this element is on.
GeneralizedPlaneStrainUserObject::returnJacobian
virtual Real returnJacobian(unsigned int scalar_var_id=0) const
Definition: GeneralizedPlaneStrainUserObject.C:147
GeneralizedPlaneStrainUserObject::returnResidual
virtual Real returnResidual(unsigned int scalar_var_id=0) const
Definition: GeneralizedPlaneStrainUserObject.C:123
GeneralizedPlaneStrainUserObject::GeneralizedPlaneStrainUserObject
GeneralizedPlaneStrainUserObject(const InputParameters &parameters)
Definition: GeneralizedPlaneStrainUserObject.C:44
GeneralizedPlaneStrainUserObject::_scalar_out_of_plane_strain_direction
unsigned int _scalar_out_of_plane_strain_direction
Definition: GeneralizedPlaneStrainUserObject.h:52
GeneralizedPlaneStrainUserObject::_out_of_plane_pressure
const Function & _out_of_plane_pressure
Definition: GeneralizedPlaneStrainUserObject.h:50
GeneralizedPlaneStrainUserObject::_Cijkl
const MaterialProperty< RankFourTensor > & _Cijkl
Definition: GeneralizedPlaneStrainUserObject.h:45
GeneralizedPlaneStrainUserObject::returnReferenceResidual
virtual Real returnReferenceResidual(unsigned int scalar_var_id=0) const
Definition: GeneralizedPlaneStrainUserObject.C:132
defineLegacyParams
defineLegacyParams(GeneralizedPlaneStrainUserObject)
GeneralizedPlaneStrainUserObject::_stress
const MaterialProperty< RankTwoTensor > & _stress
Definition: GeneralizedPlaneStrainUserObject.h:46
validParams
InputParameters validParams()
GeneralizedPlaneStrainUserObject::finalize
void finalize() override
Definition: GeneralizedPlaneStrainUserObject.C:115
GeneralizedPlaneStrainUserObject::_subblock_id_provider
const SubblockIndexProvider * _subblock_id_provider
Definition: GeneralizedPlaneStrainUserObject.h:48
GeneralizedPlaneStrainUserObject::initialize
void initialize() override
Definition: GeneralizedPlaneStrainUserObject.C:57
GeneralizedPlaneStrainUserObject::_factor
const Real _factor
Definition: GeneralizedPlaneStrainUserObject.h:51
RankFourTensorTempl< Real >
GeneralizedPlaneStrainUserObject::execute
void execute() override
Definition: GeneralizedPlaneStrainUserObject.C:75
GeneralizedPlaneStrainUserObject::threadJoin
void threadJoin(const UserObject &uo) override
Definition: GeneralizedPlaneStrainUserObject.C:102
GeneralizedPlaneStrainUserObject::validParams
static InputParameters validParams()
Definition: GeneralizedPlaneStrainUserObject.C:23
GeneralizedPlaneStrainUserObject
Definition: GeneralizedPlaneStrainUserObject.h:27
GeneralizedPlaneStrainUserObject::_reference_residual
std::vector< Real > _reference_residual
Definition: GeneralizedPlaneStrainUserObject.h:54
RankTwoTensorTempl
Definition: ACGrGrElasticDrivingForce.h:17
GeneralizedPlaneStrainUserObject::_jacobian
std::vector< Real > _jacobian
Definition: GeneralizedPlaneStrainUserObject.h:55
GeneralizedPlaneStrainUserObject.h