https://mooseframework.inl.gov
PorousFlowDarcyVelocityMaterial.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 
14 
15 template <bool is_ad>
18 {
20  params.addRequiredParam<RealVectorValue>("gravity",
21  "Gravitational acceleration vector downwards (m/s^2)");
22  params.addClassDescription("This Material calculates the Darcy velocity for all phases");
23  params.addPrivateParam<std::string>("pf_material_type", "darcy_velocity");
24  params.set<bool>("at_nodes") = false;
25  return params;
26 }
27 
28 template <bool is_ad>
30  const InputParameters & parameters)
31  : PorousFlowMaterial(parameters),
32  _num_phases(_dictator.numPhases()),
33  _num_var(_dictator.numVariables()),
34  _permeability(getGenericMaterialProperty<RealTensorValue, is_ad>("PorousFlow_permeability_qp")),
35  _dpermeability_dvar(is_ad ? nullptr
36  : &getMaterialProperty<std::vector<RealTensorValue>>(
37  "dPorousFlow_permeability_qp_dvar")),
38  _dpermeability_dgradvar(is_ad ? nullptr
39  : &getMaterialProperty<std::vector<std::vector<RealTensorValue>>>(
40  "dPorousFlow_permeability_qp_dgradvar")),
41  _fluid_density(
42  getGenericMaterialProperty<std::vector<Real>, is_ad>("PorousFlow_fluid_phase_density_qp")),
43  _dfluid_density_dvar(is_ad ? nullptr
44  : &getMaterialProperty<std::vector<std::vector<Real>>>(
45  "dPorousFlow_fluid_phase_density_qp_dvar")),
46  _fluid_viscosity(
47  getGenericMaterialProperty<std::vector<Real>, is_ad>("PorousFlow_viscosity_qp")),
48  _dfluid_viscosity_dvar(is_ad ? nullptr
49  : &getMaterialProperty<std::vector<std::vector<Real>>>(
50  "dPorousFlow_viscosity_qp_dvar")),
51  _relative_permeability(getGenericMaterialProperty<std::vector<Real>, is_ad>(
52  "PorousFlow_relative_permeability_qp")),
53  _drelative_permeability_dvar(is_ad ? nullptr
54  : &getMaterialProperty<std::vector<std::vector<Real>>>(
55  "dPorousFlow_relative_permeability_qp_dvar")),
56  _grad_p(getGenericMaterialProperty<std::vector<RealGradient>, is_ad>(
57  "PorousFlow_grad_porepressure_qp")),
58  _dgrad_p_dgradvar(is_ad ? nullptr
59  : &getMaterialProperty<std::vector<std::vector<Real>>>(
60  "dPorousFlow_grad_porepressure_qp_dgradvar")),
61  _dgrad_p_dvar(is_ad ? nullptr
62  : &getMaterialProperty<std::vector<std::vector<RealGradient>>>(
63  "dPorousFlow_grad_porepressure_qp_dvar")),
64  _gravity(getParam<RealVectorValue>("gravity")),
65  _darcy_velocity(declareGenericProperty<std::vector<RealVectorValue>, is_ad>(
66  "PorousFlow_darcy_velocity_qp")),
67  _ddarcy_velocity_dvar(is_ad ? nullptr
68  : &declareProperty<std::vector<std::vector<RealVectorValue>>>(
69  "dPorousFlow_darcy_velocity_qp_dvar")),
70  _ddarcy_velocity_dgradvar(
71  is_ad ? nullptr
72  : &declareProperty<std::vector<std::vector<std::vector<RealVectorValue>>>>(
73  "dPorousFlow_darcy_velocity_qp_dgradvar"))
74 {
75  if (_nodal_material == true)
76  mooseError("PorousFlowDarcyVelocityMaterial is only defined for at_nodes = false");
77 }
78 
79 template <bool is_ad>
80 void
82 {
83  _darcy_velocity[_qp].resize(_num_phases);
84 
85  for (unsigned ph = 0; ph < _num_phases; ++ph)
86  _darcy_velocity[_qp][ph] =
87  -(_permeability[_qp] * (_grad_p[_qp][ph] - _fluid_density[_qp][ph] * _gravity) *
88  _relative_permeability[_qp][ph] / _fluid_viscosity[_qp][ph]);
89 
90  if constexpr (!is_ad)
91  {
92  (*_ddarcy_velocity_dvar)[_qp].resize(_num_phases);
93  for (unsigned ph = 0; ph < _num_phases; ++ph)
94  (*_ddarcy_velocity_dvar)[_qp][ph].resize(_num_var);
95 
96  for (unsigned ph = 0; ph < _num_phases; ++ph)
97  for (unsigned v = 0; v < _num_var; ++v)
98  {
99  (*_ddarcy_velocity_dvar)[_qp][ph][v] =
100  -(*_dpermeability_dvar)[_qp][v] *
101  (_grad_p[_qp][ph] - _fluid_density[_qp][ph] * _gravity) *
102  _relative_permeability[_qp][ph] / _fluid_viscosity[_qp][ph];
103  (*_ddarcy_velocity_dvar)[_qp][ph][v] -=
104  _permeability[_qp] *
105  ((*_dgrad_p_dvar)[_qp][ph][v] - (*_dfluid_density_dvar)[_qp][ph][v] * _gravity) *
106  _relative_permeability[_qp][ph] / _fluid_viscosity[_qp][ph];
107  (*_ddarcy_velocity_dvar)[_qp][ph][v] -=
108  _permeability[_qp] * (_grad_p[_qp][ph] - _fluid_density[_qp][ph] * _gravity) *
109  ((*_drelative_permeability_dvar)[_qp][ph][v] / _fluid_viscosity[_qp][ph] -
110  _relative_permeability[_qp][ph] * (*_dfluid_viscosity_dvar)[_qp][ph][v] /
111  std::pow(_fluid_viscosity[_qp][ph], 2));
112  }
113 
114  (*_ddarcy_velocity_dgradvar)[_qp].resize(_num_phases);
115  for (unsigned ph = 0; ph < _num_phases; ++ph)
116  {
117  (*_ddarcy_velocity_dgradvar)[_qp][ph].resize(LIBMESH_DIM);
118  for (unsigned i = 0; i < LIBMESH_DIM; ++i)
119  (*_ddarcy_velocity_dgradvar)[_qp][ph][i].resize(_num_var);
120  }
121 
122  for (unsigned ph = 0; ph < _num_phases; ++ph)
123  for (unsigned i = 0; i < LIBMESH_DIM; ++i)
124  for (unsigned v = 0; v < _num_var; ++v)
125  {
126  (*_ddarcy_velocity_dgradvar)[_qp][ph][i][v] =
127  -(*_dpermeability_dgradvar)[_qp][i][v] *
128  (_grad_p[_qp][ph] - _fluid_density[_qp][ph] * _gravity);
129  for (unsigned j = 0; j < LIBMESH_DIM; ++j)
130  (*_ddarcy_velocity_dgradvar)[_qp][ph][i][v](j) -=
131  _permeability[_qp](j, i) * (*_dgrad_p_dgradvar)[_qp][ph][v];
132  (*_ddarcy_velocity_dgradvar)[_qp][ph][i][v] *=
133  _relative_permeability[_qp][ph] / _fluid_viscosity[_qp][ph];
134  }
135  }
136 }
137 
PorousFlowMaterial is the base class for all PorousFlow Materials It allows users to specify that the...
registerMooseObject("PorousFlowApp", PorousFlowDarcyVelocityMaterial)
void addPrivateParam(const std::string &name, const T &value)
PorousFlowDarcyVelocityMaterialTempl(const InputParameters &parameters)
T & set(const std::string &name, bool quiet_mode=false)
const double v
const bool _nodal_material
Whether the derived class holds nodal values.
void addRequiredParam(const std::string &name, const std::string &doc_string)
TensorValue< Real > RealTensorValue
static InputParameters validParams()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
Material to calculate the Darcy velocity for all phases.
MooseUnits pow(const MooseUnits &, int)