www.mooseframework.org
Q2PAction.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
10 #include "Q2PAction.h"
11 
12 #include "Factory.h"
13 #include "FEProblem.h"
14 #include "Parser.h"
15 #include "AddVariableAction.h"
16 #include "libmesh/string_to_enum.h"
17 
18 registerMooseAction("RichardsApp", Q2PAction, "add_kernel");
19 
20 registerMooseAction("RichardsApp", Q2PAction, "add_aux_variable");
21 
22 registerMooseAction("RichardsApp", Q2PAction, "add_function");
23 
24 registerMooseAction("RichardsApp", Q2PAction, "add_postprocessor");
25 
26 template <>
27 InputParameters
29 {
30  MooseEnum orders("CONSTANT FIRST SECOND THIRD FOURTH", "FIRST");
31 
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>(
36  "water_density",
37  "A RichardsDensity UserObject that defines the water density as a function of porepressure.");
38  params.addRequiredParam<UserObjectName>(
39  "water_relperm",
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>(
49  "gas_density",
50  "A RichardsDensity UserObject that defines the gas density as a function of porepressure.");
51  params.addRequiredParam<UserObjectName>(
52  "gas_relperm",
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",
65  false,
66  "Save the residual for the "
67  "Q2PPorepressureFlux into "
68  "the AuxVariable called "
69  "Q2PGasFluxResidual");
70  params.addParam<bool>("save_water_flux_in_Q2PWaterFluxResidual",
71  false,
72  "Save the residual for the Q2PSaturationFlux into the AuxVariable called "
73  "Q2PWaterFluxResidual");
74  params.addParam<bool>("save_gas_Jacobian_in_Q2PGasJacobian",
75  false,
76  "Save the diagonal component of the Q2PPorepressureFlux Jacobian into the "
77  "AuxVariable called Q2PGasJacobian");
78  params.addParam<bool>("save_water_Jacobian_in_Q2PWaterJacobian",
79  false,
80  "Save the diagonal component of the Q2PSaturationFlux Jacobian into the "
81  "AuxVariable called Q2PWaterJacobian");
82  params.addParam<MooseEnum>(
83  "ORDER",
84  orders,
85  "The order for the porepressure and saturation: " + orders.getRawNames() +
86  " (only needed if you're calculating masses)");
87  return params;
88 }
89 
90 Q2PAction::Q2PAction(const InputParameters & params)
91  : Action(params),
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"))
112 {
114  if (_output_nodal_masses_to.size() == 0)
116 
118  if (_output_total_masses_to.size() == 0)
120 
122 }
123 
124 void
126 {
127  // add the kernels
128  if (_current_task == "add_kernel")
129  {
130  std::string kernel_name;
131  std::string kernel_type;
132  InputParameters params = _factory.getValidParams("Q2PNodalMass");
133 
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"};
142  params.set<UserObjectName>("fluid_density") = _water_density;
143  _problem->addKernel(kernel_type, kernel_name, params);
144 
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);
155 
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;
162  params.set<UserObjectName>("fluid_density") = _water_density;
163  _problem->addKernel(kernel_type, kernel_name, params);
164 
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);
173 
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};
179  params.set<UserObjectName>("fluid_density") = _water_density;
180  params.set<UserObjectName>("fluid_relperm") = _water_relperm;
181  params.set<Real>("fluid_viscosity") = _water_viscosity;
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);
187 
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;
195  params.set<Real>("fluid_viscosity") = _gas_viscosity;
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);
201 
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};
207  params.set<UserObjectName>("fluid_density") = _water_density;
208  params.set<UserObjectName>("fluid_relperm") = _water_relperm_for_diffusivity;
209  params.set<Real>("fluid_viscosity") = _water_viscosity;
210  params.set<Real>("diffusivity") = _diffusivity;
211  _problem->addKernel(kernel_type, kernel_name, params);
212  }
213 
214  if (_current_task == "add_aux_variable")
215  {
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");
222 
224  {
225  // user wants nodal masses or total masses
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);
228  }
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);
237  }
238 
239  if (_current_task == "add_function" && _output_total_masses_to.size() > 0)
240  {
241  // user wants total masses, so need to build Functions to do this
242  InputParameters params = _factory.getValidParams("ParsedFunction");
243 
244  params.set<std::string>("value") = "a*b";
245 
246  std::vector<std::string> vars;
247  vars.push_back("a");
248  vars.push_back("b");
249  params.set<std::vector<std::string>>("vars") = vars;
250 
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);
256 
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);
262  }
263 
264  if (_current_task == "add_postprocessor" && _output_total_masses_to.size() > 0)
265  {
266  // user wants total masses, so need to build Postprocessors to do this
267 
268  InputParameters params = _factory.getValidParams("TimestepSize");
269 
270  params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_BEGIN;
271  params.set<std::vector<OutputName>>("outputs") = {"none"};
272  _problem->addPostprocessor("TimestepSize", "Q2P_dt", params);
273 
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);
278 
279  params = _factory.getValidParams("FunctionValuePostprocessor");
280  params.set<FunctionName>("function") = "Q2P_water_mass_fcn";
281  params.set<std::vector<OutputName>>("outputs") = _output_total_masses_to;
282  _problem->addPostprocessor("FunctionValuePostprocessor", "mass_water", params);
283 
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);
288 
289  params = _factory.getValidParams("FunctionValuePostprocessor");
290  params.set<FunctionName>("function") = "Q2P_gas_mass_fcn";
291  params.set<std::vector<OutputName>>("outputs") = _output_total_masses_to;
292  _problem->addPostprocessor("FunctionValuePostprocessor", "mass_gas", params);
293  }
294 }
Q2PAction::_gas_relperm
UserObjectName _gas_relperm
Definition: Q2PAction.h:34
registerMooseAction
registerMooseAction("RichardsApp", Q2PAction, "add_kernel")
Q2PAction::_water_relperm_for_diffusivity
UserObjectName _water_relperm_for_diffusivity
Definition: Q2PAction.h:31
Q2PAction::_water_relperm
UserObjectName _water_relperm
Definition: Q2PAction.h:30
Q2PAction::act
virtual void act()
Definition: Q2PAction.C:125
Q2PAction::_save_water_Jacobian_in_Q2PWaterJacobian
bool _save_water_Jacobian_in_Q2PWaterJacobian
Definition: Q2PAction.h:42
Q2PAction::_diffusivity
Real _diffusivity
Definition: Q2PAction.h:36
Q2PAction::_save_water_flux_in_Q2PWaterFluxResidual
bool _save_water_flux_in_Q2PWaterFluxResidual
Definition: Q2PAction.h:40
Q2PAction::_no_mass_calculations
bool _no_mass_calculations
Definition: Q2PAction.h:45
Q2PAction::_save_gas_flux_in_Q2PGasFluxResidual
bool _save_gas_flux_in_Q2PGasFluxResidual
Definition: Q2PAction.h:39
Q2PAction::_nodal_masses_not_outputted
bool _nodal_masses_not_outputted
Definition: Q2PAction.h:43
Q2PAction::_water_viscosity
Real _water_viscosity
Definition: Q2PAction.h:32
Q2PAction.h
Q2PAction::_pp_var
VariableName _pp_var
Definition: Q2PAction.h:27
Q2PAction::_sat_var
VariableName _sat_var
Definition: Q2PAction.h:28
Q2PAction::_output_total_masses_to
std::vector< OutputName > _output_total_masses_to
Definition: Q2PAction.h:38
Q2PAction
Definition: Q2PAction.h:19
Q2PAction::_gas_viscosity
Real _gas_viscosity
Definition: Q2PAction.h:35
Q2PAction::_gas_density
UserObjectName _gas_density
Definition: Q2PAction.h:33
Q2PAction::_output_nodal_masses_to
std::vector< OutputName > _output_nodal_masses_to
Definition: Q2PAction.h:37
Q2PAction::_total_masses_not_outputted
bool _total_masses_not_outputted
Definition: Q2PAction.h:44
Q2PAction::_save_gas_Jacobian_in_Q2PGasJacobian
bool _save_gas_Jacobian_in_Q2PGasJacobian
Definition: Q2PAction.h:41
Q2PAction::Q2PAction
Q2PAction(const InputParameters &params)
Definition: Q2PAction.C:90
validParams< Q2PAction >
InputParameters validParams< Q2PAction >()
Definition: Q2PAction.C:28
Q2PAction::_water_density
UserObjectName _water_density
Definition: Q2PAction.h:29