21 "Gravitational acceleration vector downwards (m/s^2)");
23 params.
addPrivateParam<std::string>(
"pf_material_type",
"darcy_velocity");
24 params.
set<
bool>(
"at_nodes") =
false;
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
37 "dPorousFlow_permeability_qp_dvar")),
38 _dpermeability_dgradvar(is_ad ? nullptr
40 "dPorousFlow_permeability_qp_dgradvar")),
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")),
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")),
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
63 "dPorousFlow_grad_porepressure_qp_dvar")),
66 "PorousFlow_darcy_velocity_qp")),
67 _ddarcy_velocity_dvar(is_ad ? nullptr
69 "dPorousFlow_darcy_velocity_qp_dvar")),
70 _ddarcy_velocity_dgradvar(
73 "dPorousFlow_darcy_velocity_qp_dgradvar"))
76 mooseError(
"PorousFlowDarcyVelocityMaterial is only defined for at_nodes = false");
83 _darcy_velocity[_qp].resize(_num_phases);
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]);
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);
96 for (
unsigned ph = 0; ph < _num_phases; ++ph)
97 for (
unsigned v = 0;
v < _num_var; ++
v)
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] -=
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));
114 (*_ddarcy_velocity_dgradvar)[_qp].resize(_num_phases);
115 for (
unsigned ph = 0; ph < _num_phases; ++ph)
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);
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)
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];
PorousFlowMaterial is the base class for all PorousFlow Materials It allows users to specify that the...
registerMooseObject("PorousFlowApp", PorousFlowDarcyVelocityMaterial)
static InputParameters validParams()
PorousFlowDarcyVelocityMaterialTempl(const InputParameters ¶meters)
const bool _nodal_material
Whether the derived class holds nodal values.
TensorValue< Real > RealTensorValue
static InputParameters validParams()
virtual void computeQpProperties() override
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void mooseError(Args &&... args) const
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)