16 #include "libmesh/string_to_enum.h" 29 MooseEnum orders(
"CONSTANT FIRST SECOND THIRD FOURTH",
"FIRST");
32 params.
addRequiredParam<NonlinearVariableName>(
"porepressure",
"The porepressure variable");
33 params.
addRequiredParam<NonlinearVariableName>(
"saturation",
"The water saturation variable");
36 "A RichardsDensity UserObject that defines the water density as a function of porepressure.");
39 "A RichardsRelPerm UserObject that defines the water relative permeability " 40 "as a function of water saturation (eg RichardsRelPermPower).");
42 "water_relperm_for_diffusion",
43 "A RichardsRelPerm UserObject that defines the water relative permeability as a function of " 44 "water saturation that will be used in the diffusivity Kernel (eg RichardsRelPermPower). If " 45 "not given, water_relperm will be used instead, which is the most common use-case.");
49 "A RichardsDensity UserObject that defines the gas density as a function of porepressure.");
52 "A RichardsRelPerm UserObject that defines the gas relative permeability as a " 53 "function of water saturation (eg Q2PRelPermPowerGas).");
56 params.
addParam<std::vector<OutputName>>(
"output_nodal_masses_to",
58 "Output Nodal masses to this Output object. If you " 59 "don't want any outputs, don't input anything here");
60 params.
addParam<std::vector<OutputName>>(
61 "output_total_masses_to",
63 "Output total water and gas mass to this Output object. If you " 64 "don't want any outputs, don't input anything here");
65 params.
addParam<
bool>(
"save_gas_flux_in_Q2PGasFluxResidual",
67 "Save the residual for the " 68 "Q2PPorepressureFlux into " 69 "the AuxVariable called " 70 "Q2PGasFluxResidual");
71 params.
addParam<
bool>(
"save_water_flux_in_Q2PWaterFluxResidual",
73 "Save the residual for the Q2PSaturationFlux into the AuxVariable called " 74 "Q2PWaterFluxResidual");
75 params.
addParam<
bool>(
"save_gas_Jacobian_in_Q2PGasJacobian",
77 "Save the diagonal component of the Q2PPorepressureFlux Jacobian into the " 78 "AuxVariable called Q2PGasJacobian");
79 params.
addParam<
bool>(
"save_water_Jacobian_in_Q2PWaterJacobian",
81 "Save the diagonal component of the Q2PSaturationFlux Jacobian into the " 82 "AuxVariable called Q2PWaterJacobian");
86 "The order for the porepressure and saturation: " + orders.
getRawNames() +
87 " (only needed if you're calculating masses)");
93 _pp_var(getParam<NonlinearVariableName>(
"porepressure")),
94 _sat_var(getParam<NonlinearVariableName>(
"saturation")),
95 _water_density(getParam<UserObjectName>(
"water_density")),
96 _water_relperm(getParam<UserObjectName>(
"water_relperm")),
97 _water_relperm_for_diffusivity(isParamValid(
"water_relperm_for_diffusivity")
98 ? getParam<UserObjectName>(
"water_relperm_for_diffusivity")
99 : getParam<UserObjectName>(
"water_relperm")),
100 _water_viscosity(getParam<
Real>(
"water_viscosity")),
101 _gas_density(getParam<UserObjectName>(
"gas_density")),
102 _gas_relperm(getParam<UserObjectName>(
"gas_relperm")),
103 _gas_viscosity(getParam<
Real>(
"gas_viscosity")),
104 _diffusivity(getParam<
Real>(
"diffusivity")),
105 _output_nodal_masses_to(getParam<
std::vector<OutputName>>(
"output_nodal_masses_to")),
106 _output_total_masses_to(getParam<
std::vector<OutputName>>(
"output_total_masses_to")),
107 _save_gas_flux_in_Q2PGasFluxResidual(getParam<bool>(
"save_gas_flux_in_Q2PGasFluxResidual")),
108 _save_water_flux_in_Q2PWaterFluxResidual(
109 getParam<bool>(
"save_water_flux_in_Q2PWaterFluxResidual")),
110 _save_gas_Jacobian_in_Q2PGasJacobian(getParam<bool>(
"save_gas_Jacobian_in_Q2PGasJacobian")),
111 _save_water_Jacobian_in_Q2PWaterJacobian(
112 getParam<bool>(
"save_water_Jacobian_in_Q2PWaterJacobian"))
131 std::string kernel_name;
132 std::string kernel_type;
135 kernel_name =
"Q2P_nodal_water_mass";
136 kernel_type =
"Q2PNodalMass";
138 params.
set<NonlinearVariableName>(
"variable") =
_sat_var;
139 params.
set<std::vector<VariableName>>(
"other_var") = {
_pp_var};
140 params.
set<
bool>(
"var_is_porepressure") =
false;
142 params.
set<std::vector<AuxVariableName>>(
"save_in") = {
"Q2P_nodal_water_mass_divided_by_dt"};
144 _problem->addKernel(kernel_type, kernel_name, params);
146 kernel_name =
"Q2P_nodal_gas_mass";
147 kernel_type =
"Q2PNodalMass";
149 params.
set<NonlinearVariableName>(
"variable") =
_pp_var;
150 params.
set<std::vector<VariableName>>(
"other_var") = {
_sat_var};
151 params.
set<
bool>(
"var_is_porepressure") =
true;
153 params.
set<std::vector<AuxVariableName>>(
"save_in") = {
"Q2P_nodal_gas_mass_divided_by_dt"};
155 _problem->addKernel(kernel_type, kernel_name, params);
157 kernel_name =
"Q2P_nodal_water_mass_old";
158 kernel_type =
"Q2PNegativeNodalMassOld";
160 params.
set<NonlinearVariableName>(
"variable") =
_sat_var;
161 params.
set<std::vector<VariableName>>(
"other_var") = {
_pp_var};
162 params.
set<
bool>(
"var_is_porepressure") =
false;
164 _problem->addKernel(kernel_type, kernel_name, params);
166 kernel_name =
"Q2P_nodal_gas_mass_old";
167 kernel_type =
"Q2PNegativeNodalMassOld";
169 params.
set<NonlinearVariableName>(
"variable") =
_pp_var;
170 params.
set<std::vector<VariableName>>(
"other_var") = {
_sat_var};
171 params.
set<
bool>(
"var_is_porepressure") =
true;
173 _problem->addKernel(kernel_type, kernel_name, params);
175 kernel_name =
"Q2P_water_flux";
176 kernel_type =
"Q2PSaturationFlux";
178 params.
set<NonlinearVariableName>(
"variable") =
_sat_var;
179 params.
set<std::vector<VariableName>>(
"porepressure_variable") = {
_pp_var};
184 params.
set<std::vector<AuxVariableName>>(
"save_in") = {
"Q2PWaterFluxResidual"};
186 params.
set<std::vector<AuxVariableName>>(
"diag_save_in") = {
"Q2PWaterJacobian"};
187 _problem->addKernel(kernel_type, kernel_name, params);
189 kernel_name =
"Q2P_gas_flux";
190 kernel_type =
"Q2PPorepressureFlux";
192 params.
set<NonlinearVariableName>(
"variable") =
_pp_var;
193 params.
set<std::vector<VariableName>>(
"saturation_variable") = {
_sat_var};
198 params.
set<std::vector<AuxVariableName>>(
"save_in") = {
"Q2PGasFluxResidual"};
200 params.
set<std::vector<AuxVariableName>>(
"diag_save_in") = {
"Q2PGasJacobian"};
201 _problem->addKernel(kernel_type, kernel_name, params);
203 kernel_name =
"Q2P_liquid_diffusion";
204 kernel_type =
"Q2PSaturationDiffusion";
206 params.
set<NonlinearVariableName>(
"variable") =
_sat_var;
207 params.
set<std::vector<VariableName>>(
"porepressure_variable") = {
_pp_var};
212 _problem->addKernel(kernel_type, kernel_name, params);
217 FEType fe_type(Utility::string_to_enum<Order>(getParam<MooseEnum>(
"ORDER")),
218 Utility::string_to_enum<FEFamily>(
"LAGRANGE"));
222 var_params.set<
MooseEnum>(
"order") = getParam<MooseEnum>(
"ORDER");
227 _problem->addAuxVariable(
type,
"Q2P_nodal_water_mass_divided_by_dt", var_params);
228 _problem->addAuxVariable(
type,
"Q2P_nodal_gas_mass_divided_by_dt", var_params);
231 _problem->addAuxVariable(
type,
"Q2PGasFluxResidual", var_params);
233 _problem->addAuxVariable(
type,
"Q2PWaterFluxResidual", var_params);
235 _problem->addAuxVariable(
type,
"Q2PGasJacobian", var_params);
237 _problem->addAuxVariable(
type,
"Q2PWaterJacobian", var_params);
245 params.
set<std::string>(
"value") =
"a*b";
247 std::vector<std::string> vars;
250 params.
set<std::vector<std::string>>(
"vars") = vars;
252 std::vector<std::string> vals_water;
253 vals_water.push_back(
"Q2P_mass_water_divided_by_dt");
254 vals_water.push_back(
"Q2P_dt");
255 params.
set<std::vector<std::string>>(
"vals") = vals_water;
256 _problem->addFunction(
"ParsedFunction",
"Q2P_water_mass_fcn", params);
258 std::vector<std::string> vals_gas;
259 vals_gas.push_back(
"Q2P_mass_gas_divided_by_dt");
260 vals_gas.push_back(
"Q2P_dt");
261 params.
set<std::vector<std::string>>(
"vals") = vals_gas;
262 _problem->addFunction(
"ParsedFunction",
"Q2P_gas_mass_fcn", params);
272 params.
set<std::vector<OutputName>>(
"outputs") = {
"none"};
273 _problem->addPostprocessor(
"TimestepSize",
"Q2P_dt", params);
276 params.
set<std::vector<OutputName>>(
"outputs") = {
"none"};
277 params.
set<std::vector<VariableName>>(
"variable") = {
"Q2P_nodal_water_mass_divided_by_dt"};
278 _problem->addPostprocessor(
"NodalSum",
"Q2P_mass_water_divided_by_dt", params);
281 params.
set<FunctionName>(
"function") =
"Q2P_water_mass_fcn";
283 _problem->addPostprocessor(
"FunctionValuePostprocessor",
"mass_water", params);
286 params.
set<std::vector<OutputName>>(
"outputs") = {
"none"};
287 params.
set<std::vector<VariableName>>(
"variable") = {
"Q2P_nodal_gas_mass_divided_by_dt"};
288 _problem->addPostprocessor(
"NodalSum",
"Q2P_mass_gas_divided_by_dt", params);
291 params.
set<FunctionName>(
"function") =
"Q2P_gas_mass_fcn";
293 _problem->addPostprocessor(
"FunctionValuePostprocessor",
"mass_gas", params);
UserObjectName _water_density
static std::string variableType(const FEType &fe_type, const bool is_fv=false, const bool is_array=false)
bool _total_masses_not_outputted
std::vector< OutputName > _output_total_masses_to
UserObjectName _water_relperm
InputParameters getValidParams(const std::string &name) const
registerMooseAction("RichardsApp", Q2PAction, "add_kernel")
std::vector< OutputName > _output_nodal_masses_to
bool _save_gas_Jacobian_in_Q2PGasJacobian
std::string getRawNames() const
UserObjectName _water_relperm_for_diffusivity
bool _save_water_Jacobian_in_Q2PWaterJacobian
bool _save_water_flux_in_Q2PWaterFluxResidual
static InputParameters validParams()
bool _save_gas_flux_in_Q2PGasFluxResidual
static InputParameters validParams()
UserObjectName _gas_density
const ExecFlagType EXEC_TIMESTEP_BEGIN
const std::string & type() const
const std::string & _current_task
bool _nodal_masses_not_outputted
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Q2PAction(const InputParameters ¶ms)
std::shared_ptr< FEProblemBase > & _problem
bool _no_mass_calculations
UserObjectName _gas_relperm