13 #include "FEProblem.h"
15 #include "AddVariableAction.h"
16 #include "libmesh/string_to_enum.h"
30 MooseEnum orders(
"CONSTANT FIRST SECOND THIRD FOURTH",
"FIRST");
32 InputParameters params = validParams<Action>();
33 params.addRequiredParam<NonlinearVariableName>(
"porepressure",
"The porepressure variable");
34 params.addRequiredParam<NonlinearVariableName>(
"saturation",
"The water saturation variable");
35 params.addRequiredParam<UserObjectName>(
37 "A RichardsDensity UserObject that defines the water density as a function of porepressure.");
38 params.addRequiredParam<UserObjectName>(
40 "A RichardsRelPerm UserObject that defines the water relative permeability "
41 "as a function of water saturation (eg RichardsRelPermPower).");
42 params.addParam<UserObjectName>(
43 "water_relperm_for_diffusion",
44 "A RichardsRelPerm UserObject that defines the water relative permeability as a function of "
45 "water saturation that will be used in the diffusivity Kernel (eg RichardsRelPermPower). If "
46 "not given, water_relperm will be used instead, which is the most common use-case.");
47 params.addRequiredParam<Real>(
"water_viscosity",
"The water viscosity");
48 params.addRequiredParam<UserObjectName>(
50 "A RichardsDensity UserObject that defines the gas density as a function of porepressure.");
51 params.addRequiredParam<UserObjectName>(
53 "A RichardsRelPerm UserObject that defines the gas relative permeability as a "
54 "function of water saturation (eg Q2PRelPermPowerGas).");
55 params.addRequiredParam<Real>(
"gas_viscosity",
"The gas viscosity");
56 params.addRequiredParam<Real>(
"diffusivity",
"The diffusivity");
57 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",
62 "Output total water and gas mass to this Output object. If you "
63 "don't want any outputs, don't input anything here");
64 params.addParam<
bool>(
"save_gas_flux_in_Q2PGasFluxResidual",
66 "Save the residual for the "
67 "Q2PPorepressureFlux into "
68 "the AuxVariable called "
69 "Q2PGasFluxResidual");
70 params.addParam<
bool>(
"save_water_flux_in_Q2PWaterFluxResidual",
72 "Save the residual for the Q2PSaturationFlux into the AuxVariable called "
73 "Q2PWaterFluxResidual");
74 params.addParam<
bool>(
"save_gas_Jacobian_in_Q2PGasJacobian",
76 "Save the diagonal component of the Q2PPorepressureFlux Jacobian into the "
77 "AuxVariable called Q2PGasJacobian");
78 params.addParam<
bool>(
"save_water_Jacobian_in_Q2PWaterJacobian",
80 "Save the diagonal component of the Q2PSaturationFlux Jacobian into the "
81 "AuxVariable called Q2PWaterJacobian");
82 params.addParam<MooseEnum>(
85 "The order for the porepressure and saturation: " + orders.getRawNames() +
86 " (only needed if you're calculating masses)");
92 _pp_var(getParam<NonlinearVariableName>(
"porepressure")),
93 _sat_var(getParam<NonlinearVariableName>(
"saturation")),
94 _water_density(getParam<UserObjectName>(
"water_density")),
95 _water_relperm(getParam<UserObjectName>(
"water_relperm")),
96 _water_relperm_for_diffusivity(isParamValid(
"water_relperm_for_diffusivity")
97 ? getParam<UserObjectName>(
"water_relperm_for_diffusivity")
98 : getParam<UserObjectName>(
"water_relperm")),
99 _water_viscosity(getParam<Real>(
"water_viscosity")),
100 _gas_density(getParam<UserObjectName>(
"gas_density")),
101 _gas_relperm(getParam<UserObjectName>(
"gas_relperm")),
102 _gas_viscosity(getParam<Real>(
"gas_viscosity")),
103 _diffusivity(getParam<Real>(
"diffusivity")),
104 _output_nodal_masses_to(getParam<std::vector<OutputName>>(
"output_nodal_masses_to")),
105 _output_total_masses_to(getParam<std::vector<OutputName>>(
"output_total_masses_to")),
106 _save_gas_flux_in_Q2PGasFluxResidual(getParam<bool>(
"save_gas_flux_in_Q2PGasFluxResidual")),
107 _save_water_flux_in_Q2PWaterFluxResidual(
108 getParam<bool>(
"save_water_flux_in_Q2PWaterFluxResidual")),
109 _save_gas_Jacobian_in_Q2PGasJacobian(getParam<bool>(
"save_gas_Jacobian_in_Q2PGasJacobian")),
110 _save_water_Jacobian_in_Q2PWaterJacobian(
111 getParam<bool>(
"save_water_Jacobian_in_Q2PWaterJacobian"))
128 if (_current_task ==
"add_kernel")
130 std::string kernel_name;
131 std::string kernel_type;
132 InputParameters params = _factory.getValidParams(
"Q2PNodalMass");
134 kernel_name =
"Q2P_nodal_water_mass";
135 kernel_type =
"Q2PNodalMass";
136 params = _factory.getValidParams(kernel_type);
137 params.set<NonlinearVariableName>(
"variable") =
_sat_var;
138 params.set<std::vector<VariableName>>(
"other_var") = {
_pp_var};
139 params.set<
bool>(
"var_is_porepressure") =
false;
141 params.set<std::vector<AuxVariableName>>(
"save_in") = {
"Q2P_nodal_water_mass_divided_by_dt"};
143 _problem->addKernel(kernel_type, kernel_name, params);
145 kernel_name =
"Q2P_nodal_gas_mass";
146 kernel_type =
"Q2PNodalMass";
147 params = _factory.getValidParams(kernel_type);
148 params.set<NonlinearVariableName>(
"variable") =
_pp_var;
149 params.set<std::vector<VariableName>>(
"other_var") = {
_sat_var};
150 params.set<
bool>(
"var_is_porepressure") =
true;
152 params.set<std::vector<AuxVariableName>>(
"save_in") = {
"Q2P_nodal_gas_mass_divided_by_dt"};
153 params.set<UserObjectName>(
"fluid_density") =
_gas_density;
154 _problem->addKernel(kernel_type, kernel_name, params);
156 kernel_name =
"Q2P_nodal_water_mass_old";
157 kernel_type =
"Q2PNegativeNodalMassOld";
158 params = _factory.getValidParams(kernel_type);
159 params.set<NonlinearVariableName>(
"variable") =
_sat_var;
160 params.set<std::vector<VariableName>>(
"other_var") = {
_pp_var};
161 params.set<
bool>(
"var_is_porepressure") =
false;
163 _problem->addKernel(kernel_type, kernel_name, params);
165 kernel_name =
"Q2P_nodal_gas_mass_old";
166 kernel_type =
"Q2PNegativeNodalMassOld";
167 params = _factory.getValidParams(kernel_type);
168 params.set<NonlinearVariableName>(
"variable") =
_pp_var;
169 params.set<std::vector<VariableName>>(
"other_var") = {
_sat_var};
170 params.set<
bool>(
"var_is_porepressure") =
true;
171 params.set<UserObjectName>(
"fluid_density") =
_gas_density;
172 _problem->addKernel(kernel_type, kernel_name, params);
174 kernel_name =
"Q2P_water_flux";
175 kernel_type =
"Q2PSaturationFlux";
176 params = _factory.getValidParams(kernel_type);
177 params.set<NonlinearVariableName>(
"variable") =
_sat_var;
178 params.set<std::vector<VariableName>>(
"porepressure_variable") = {
_pp_var};
183 params.set<std::vector<AuxVariableName>>(
"save_in") = {
"Q2PWaterFluxResidual"};
185 params.set<std::vector<AuxVariableName>>(
"diag_save_in") = {
"Q2PWaterJacobian"};
186 _problem->addKernel(kernel_type, kernel_name, params);
188 kernel_name =
"Q2P_gas_flux";
189 kernel_type =
"Q2PPorepressureFlux";
190 params = _factory.getValidParams(kernel_type);
191 params.set<NonlinearVariableName>(
"variable") =
_pp_var;
192 params.set<std::vector<VariableName>>(
"saturation_variable") = {
_sat_var};
193 params.set<UserObjectName>(
"fluid_density") =
_gas_density;
194 params.set<UserObjectName>(
"fluid_relperm") =
_gas_relperm;
197 params.set<std::vector<AuxVariableName>>(
"save_in") = {
"Q2PGasFluxResidual"};
199 params.set<std::vector<AuxVariableName>>(
"diag_save_in") = {
"Q2PGasJacobian"};
200 _problem->addKernel(kernel_type, kernel_name, params);
202 kernel_name =
"Q2P_liquid_diffusion";
203 kernel_type =
"Q2PSaturationDiffusion";
204 params = _factory.getValidParams(kernel_type);
205 params.set<NonlinearVariableName>(
"variable") =
_sat_var;
206 params.set<std::vector<VariableName>>(
"porepressure_variable") = {
_pp_var};
211 _problem->addKernel(kernel_type, kernel_name, params);
214 if (_current_task ==
"add_aux_variable")
216 FEType fe_type(Utility::string_to_enum<Order>(getParam<MooseEnum>(
"ORDER")),
217 Utility::string_to_enum<FEFamily>(
"LAGRANGE"));
218 auto type = AddVariableAction::determineType(fe_type, 1);
219 auto var_params = _factory.getValidParams(type);
220 var_params.set<MooseEnum>(
"family") =
"LAGRANGE";
221 var_params.set<MooseEnum>(
"order") = getParam<MooseEnum>(
"ORDER");
226 _problem->addAuxVariable(type,
"Q2P_nodal_water_mass_divided_by_dt", var_params);
227 _problem->addAuxVariable(type,
"Q2P_nodal_gas_mass_divided_by_dt", var_params);
230 _problem->addAuxVariable(type,
"Q2PGasFluxResidual", var_params);
232 _problem->addAuxVariable(type,
"Q2PWaterFluxResidual", var_params);
234 _problem->addAuxVariable(type,
"Q2PGasJacobian", var_params);
236 _problem->addAuxVariable(type,
"Q2PWaterJacobian", var_params);
242 InputParameters params = _factory.getValidParams(
"ParsedFunction");
244 params.set<std::string>(
"value") =
"a*b";
246 std::vector<std::string> vars;
249 params.set<std::vector<std::string>>(
"vars") = vars;
251 std::vector<std::string> vals_water;
252 vals_water.push_back(
"Q2P_mass_water_divided_by_dt");
253 vals_water.push_back(
"Q2P_dt");
254 params.set<std::vector<std::string>>(
"vals") = vals_water;
255 _problem->addFunction(
"ParsedFunction",
"Q2P_water_mass_fcn", params);
257 std::vector<std::string> vals_gas;
258 vals_gas.push_back(
"Q2P_mass_gas_divided_by_dt");
259 vals_gas.push_back(
"Q2P_dt");
260 params.set<std::vector<std::string>>(
"vals") = vals_gas;
261 _problem->addFunction(
"ParsedFunction",
"Q2P_gas_mass_fcn", params);
268 InputParameters params = _factory.getValidParams(
"TimestepSize");
270 params.set<ExecFlagEnum>(
"execute_on") = EXEC_TIMESTEP_BEGIN;
271 params.set<std::vector<OutputName>>(
"outputs") = {
"none"};
272 _problem->addPostprocessor(
"TimestepSize",
"Q2P_dt", params);
274 params = _factory.getValidParams(
"NodalSum");
275 params.set<std::vector<OutputName>>(
"outputs") = {
"none"};
276 params.set<std::vector<VariableName>>(
"variable") = {
"Q2P_nodal_water_mass_divided_by_dt"};
277 _problem->addPostprocessor(
"NodalSum",
"Q2P_mass_water_divided_by_dt", params);
279 params = _factory.getValidParams(
"FunctionValuePostprocessor");
280 params.set<FunctionName>(
"function") =
"Q2P_water_mass_fcn";
282 _problem->addPostprocessor(
"FunctionValuePostprocessor",
"mass_water", params);
284 params = _factory.getValidParams(
"NodalSum");
285 params.set<std::vector<OutputName>>(
"outputs") = {
"none"};
286 params.set<std::vector<VariableName>>(
"variable") = {
"Q2P_nodal_gas_mass_divided_by_dt"};
287 _problem->addPostprocessor(
"NodalSum",
"Q2P_mass_gas_divided_by_dt", params);
289 params = _factory.getValidParams(
"FunctionValuePostprocessor");
290 params.set<FunctionName>(
"function") =
"Q2P_gas_mass_fcn";
292 _problem->addPostprocessor(
"FunctionValuePostprocessor",
"mass_gas", params);