https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
11
12#include "libmesh/quadrature.h"
13
15
18{
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)
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
59void
65
66void
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
81void
83{
84 const auto & pstuo = static_cast<const GlobalStrainUserObject &>(uo);
85 _residual += pstuo._residual;
86 _jacobian += pstuo._jacobian;
87}
88
89void
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
105const RankTwoTensor &
107{
108 return _residual;
109}
110
111const RankFourTensor &
113{
114 return _jacobian;
115}
116
117const VectorValue<bool> &
registerMooseObject("SolidMechanicsApp", GlobalStrainUserObject)
const ExecFlagType EXEC_LINEAR
static InputParameters validParams()
const QBase *const & _qrule
MooseMesh & _mesh
const MooseArray< Real > & _coord
const MooseArray< Real > & _JxW
This class provides interface for extracting the periodic directions, residual, and jacobian values f...
const MaterialProperty< RankTwoTensor > & _stress
The stress tensor.
static InputParameters validParams()
const std::vector< const MooseVariableFieldBase * > _disp_var
Displacement variables.
const MaterialProperty< RankFourTensor > & _dstress_dstrain
virtual const RankFourTensor & getJacobian() const override
GlobalStrainUserObject(const InputParameters &parameters)
virtual const VectorValue< bool > & getPeriodicDirections() const override
VectorValue< bool > _periodic_dir
Variable numbers of the displacement variables.
virtual const RankTwoTensor & getResidual() const override
virtual void computeAdditionalStress()
Calculate additional applied stresses.
void threadJoin(const UserObject &uo) override
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
void addCoupledVar(const std::string &name, const std::string &doc_string)
void mooseError(Args &&... args) const
const T & getParam(const std::string &name) const
bool isParamValid(const std::string &name) const
bool isTranslatedPeriodic(const unsigned int sys_num, const unsigned int var_num, const unsigned int component) const
void fillFromInputVector(const std::vector< T > &input, FillMethod fill_method=autodetect)
void gatherSum(T &value)