https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
15template <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
28template <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
79template <bool is_ad>
80void
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
const double v
registerMooseObject("PorousFlowApp", PorousFlowDarcyVelocityMaterial)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addPrivateParam(const std::string &name, const T &value)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
void mooseError(Args &&... args) const
Material to calculate the Darcy velocity for all phases.
PorousFlowDarcyVelocityMaterialTempl(const InputParameters &parameters)
PorousFlowMaterial is the base class for all PorousFlow Materials It allows users to specify that the...
static InputParameters validParams()
const bool _nodal_material
Whether the derived class holds nodal values.