https://mooseframework.inl.gov
Loading...
Searching...
No Matches
HEVPFlowRatePowerLawJ2.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
13
16{
18 params.addParam<Real>(
19 "reference_flow_rate", 0.001, "Reference flow rate for rate dependent flow");
20 params.addParam<Real>("flow_rate_exponent", 10.0, "Power law exponent in flow rate equation");
21 params.addParam<Real>("flow_rate_tol", 1e3, "Tolerance for flow rate");
23 "User object to evaluate power law flow rate and flow direction based on J2");
24
25 return params;
26}
27
29 : HEVPFlowRateUOBase(parameters),
30 _ref_flow_rate(getParam<Real>("reference_flow_rate")),
31 _flow_rate_exponent(getParam<Real>("flow_rate_exponent")),
32 _flow_rate_tol(getParam<Real>("flow_rate_tol"))
33{
34}
35
36bool
37HEVPFlowRatePowerLawJ2::computeValue(unsigned int qp, Real & val) const
38{
39 RankTwoTensor pk2_dev = computePK2Deviatoric(_pk2[qp], _ce[qp]);
40 Real eqv_stress = computeEqvStress(pk2_dev, _ce[qp]);
41 val = std::pow(eqv_stress / _strength[qp], _flow_rate_exponent) * _ref_flow_rate;
42
43 if (val > _flow_rate_tol)
44 {
45#ifdef DEBUG
47 "Flow rate greater than ", _flow_rate_tol, " ", val, " ", eqv_stress, " ", _strength[qp]);
48#endif
49 return false;
50 }
51 return true;
52}
53
54bool
56{
57 RankTwoTensor pk2_dev = computePK2Deviatoric(_pk2[qp], _ce[qp]);
58 Real eqv_stress = computeEqvStress(pk2_dev, _ce[qp]);
59
60 val.zero();
61 if (eqv_stress > 0.0)
62 val = 1.5 / eqv_stress * _ce[qp] * pk2_dev * _ce[qp];
63
64 return true;
65}
66
67bool
69 const std::string & coupled_var_name,
70 Real & val) const
71{
72 val = 0.0;
73
74 if (_strength_prop_name == coupled_var_name)
75 {
76 RankTwoTensor pk2_dev = computePK2Deviatoric(_pk2[qp], _ce[qp]);
77 Real eqv_stress = computeEqvStress(pk2_dev, _ce[qp]);
79 std::pow(eqv_stress / _strength[qp], _flow_rate_exponent) / _strength[qp];
80 }
81
82 return true;
83}
84
85bool
87 const std::string & coupled_var_name,
88 RankTwoTensor & val) const
89{
90 val.zero();
91
92 if (_pk2_prop_name == coupled_var_name)
93 {
94 RankTwoTensor pk2_dev = computePK2Deviatoric(_pk2[qp], _ce[qp]);
95 Real eqv_stress = computeEqvStress(pk2_dev, _ce[qp]);
96 Real dflowrate_dseqv = _ref_flow_rate * _flow_rate_exponent *
97 std::pow(eqv_stress / _strength[qp], _flow_rate_exponent - 1.0) /
98 _strength[qp];
99
100 RankTwoTensor tau = pk2_dev * _ce[qp];
101 RankTwoTensor dseqv_dpk2dev;
102
103 dseqv_dpk2dev.zero();
104 if (eqv_stress > 0.0)
105 dseqv_dpk2dev = 1.5 / eqv_stress * tau * _ce[qp];
106
107 RankTwoTensor ce_inv = _ce[qp].inverse();
108
109 RankFourTensor dpk2dev_dpk2;
110 for (const auto i : make_range(Moose::dim))
111 for (const auto j : make_range(Moose::dim))
112 for (const auto k : make_range(Moose::dim))
113 for (const auto l : make_range(Moose::dim))
114 {
115 dpk2dev_dpk2(i, j, k, l) = 0.0;
116 if (i == k && j == l)
117 dpk2dev_dpk2(i, j, k, l) = 1.0;
118 dpk2dev_dpk2(i, j, k, l) -= ce_inv(i, j) * _ce[qp](k, l) / 3.0;
119 }
120 val = dflowrate_dseqv * dpk2dev_dpk2.transposeMajor() * dseqv_dpk2dev;
121 }
122 return true;
123}
124
127 const RankTwoTensor & ce) const
128{
129 return pk2 - (pk2.doubleContraction(ce) * ce.inverse()) / 3.0;
130}
131
132Real
134 const RankTwoTensor & ce) const
135{
136 RankTwoTensor sdev = pk2_dev * ce;
137 Real val = sdev.doubleContraction(sdev.transpose());
138 return std::sqrt(1.5 * val);
139}
registerMooseObject("SolidMechanicsApp", HEVPFlowRatePowerLawJ2)
This user object classs Computes flow rate based on power law and Direction based on J2.
Real computeEqvStress(const RankTwoTensor &, const RankTwoTensor &) const
virtual bool computeDerivative(unsigned int, const std::string &, Real &) const
RankTwoTensor computePK2Deviatoric(const RankTwoTensor &, const RankTwoTensor &) const
virtual bool computeTensorDerivative(unsigned int, const std::string &, RankTwoTensor &) const
virtual bool computeDirection(unsigned int, RankTwoTensor &) const
HEVPFlowRatePowerLawJ2(const InputParameters &parameters)
virtual bool computeValue(unsigned int, Real &) const
static InputParameters validParams()
This user object is a pure virtual base classs Derived classes computes flow rate,...
const MaterialProperty< RankTwoTensor > & _ce
const MaterialProperty< Real > & _strength
const MaterialProperty< RankTwoTensor > & _pk2
std::string _strength_prop_name
static InputParameters validParams()
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)
void mooseWarning(Args &&... args) const
RankFourTensorTempl< T > transposeMajor() const
T doubleContraction(const RankTwoTensorTempl< T > &a) const
RankTwoTensorTempl< T > inverse() const
RankTwoTensorTempl< T > transpose() const
static constexpr std::size_t dim