www.mooseframework.org
HEVPFlowRatePowerLawJ2.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 "HEVPFlowRatePowerLawJ2.h"
11 
12 registerMooseObject("SolidMechanicsApp", HEVPFlowRatePowerLawJ2);
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");
22  params.addClassDescription(
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 
36 bool
37 HEVPFlowRatePowerLawJ2::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 
54 bool
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 
67 bool
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 
85 bool
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 
132 Real
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 }
RankTwoTensorTempl< Real > inverse() const
std::string _pk2_prop_name
virtual bool computeTensorDerivative(unsigned int, const std::string &, RankTwoTensor &) const
registerMooseObject("SolidMechanicsApp", HEVPFlowRatePowerLawJ2)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
static constexpr std::size_t dim
virtual bool computeDirection(unsigned int, RankTwoTensor &) const
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
void mooseWarning(Args &&... args) const
virtual bool computeDerivative(unsigned int, const std::string &, Real &) const
static InputParameters validParams()
This user object is a pure virtual base classs Derived classes computes flow rate, direction and derivatives.
virtual bool computeValue(unsigned int, Real &) const
static InputParameters validParams()
const MaterialProperty< Real > & _strength
Real doubleContraction(const RankTwoTensorTempl< Real > &a) const
RankFourTensorTempl< T > transposeMajor() const
const MaterialProperty< RankTwoTensor > & _pk2
RankTwoTensorTempl< Real > transpose() const
HEVPFlowRatePowerLawJ2(const InputParameters &parameters)
This user object classs Computes flow rate based on power law and Direction based on J2...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)
void addClassDescription(const std::string &doc_string)
Real computeEqvStress(const RankTwoTensor &, const RankTwoTensor &) const
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
RankTwoTensor computePK2Deviatoric(const RankTwoTensor &, const RankTwoTensor &) const
const MaterialProperty< RankTwoTensor > & _ce
std::string _strength_prop_name
MooseUnits pow(const MooseUnits &, int)
static const std::string k
Definition: NS.h:124