Loading [MathJax]/extensions/tex2jax.js
https://mooseframework.inl.gov
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
JacobianTest1PhaseRDGAction.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 #include "TestAction.h"
12 #include "MooseObjectAction.h"
13 #include "ActionFactory.h"
14 #include "ActionWarehouse.h"
15 
16 registerMooseAction("ThermalHydraulicsTestApp", JacobianTest1PhaseRDGAction, "meta_action");
17 
20 {
23 
24  params.addClassDescription("Sets up a Jacobian test for rDG");
25 
26  params.addParam<bool>("add_dg_kernel", false, "Option to add DG kernel");
27  params.addParam<bool>("add_bc", false, "Option to add BC");
28 
29  params.addParam<UserObjectName>(
30  "numerical_flux", "", "Name of the numerical flux user object to test");
31  params.addParam<UserObjectName>(
32  "boundary_flux", "", "Name of the boundary flux user object to test");
33 
34  MooseEnum ic_option("constant riemann_L riemann_LM riemann_RM riemann_R");
35  params.addRequiredParam<MooseEnum>("ic_option", ic_option, "IC option");
36 
37  params.addParam<FunctionName>("A_function", "2.0", "Area function");
38 
39  params.addParam<bool>("use_slope_reconstruction", true, "Use slope reconstruction?");
40 
41  params.addParam<bool>(
42  "use_elem_area", false, "Use the elemental area variable instead of linear area");
43 
44  params.set<std::string>("fe_family") = "MONOMIAL";
45  params.set<std::string>("fe_order") = "CONSTANT";
46 
47  return params;
48 }
49 
51  : JacobianTestAction(params),
52  _A_name("A"),
53  _A_linear_name("A_linear"),
54  _rhoA_name("rhoA"),
55  _rhouA_name("rhouA"),
56  _rhoEA_name("rhoEA"),
57  _add_dg_kernel(getParam<bool>("add_dg_kernel")),
58  _add_bc(getParam<bool>("add_bc")),
59  _numerical_flux_name(getParam<UserObjectName>("numerical_flux")),
60  _boundary_flux_name(getParam<UserObjectName>("boundary_flux")),
61  _ic_option(getParam<MooseEnum>("ic_option")),
62  _A_fn_name(getParam<FunctionName>("A_function")),
63  _use_slope_reconstruction(getParam<bool>("use_slope_reconstruction")),
64  _reconstruction_material_name("reconstruction_material"),
65  _direction_name("direction"),
66  _fp_name("fluid_properties")
67 {
68  if (_add_dg_kernel && !_pars.isParamSetByUser("numerical_flux"))
69  mooseError("The parameter 'numerical_flux' must be provided when adding a DG kernel.");
70  if (_add_bc && !_pars.isParamSetByUser("boundary_flux"))
71  mooseError("The parameter 'boundary_flux' must be provided when adding a BC.");
72 }
73 
74 void
76 {
78 
79  const std::vector<VariableName> variables = {_rhoA_name, _rhouA_name, _rhoEA_name};
80 
81  if (_add_dg_kernel)
82  {
83  // add the DG kernel to use the internal flux
84  for (unsigned int i = 0; i < variables.size(); i++)
85  {
86  const std::string class_name = "AddDGKernelAction";
87  InputParameters params = _action_factory.getValidParams(class_name);
88  params.set<std::string>("type") = "NumericalFlux3EqnDGKernel";
89  params.set<NonlinearVariableName>("variable") = variables[i];
90  params.set<std::vector<SubdomainName>>("block") = {"0"};
91 
92  std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
93  _action_factory.create(class_name, "internal_side_flux_" + variables[i], params));
94 
95  action->getObjectParams().set<NonlinearVariableName>("variable") = variables[i];
96  action->getObjectParams().set<std::vector<SubdomainName>>("block") = {"0"};
97 
98  action->getObjectParams().set<std::vector<VariableName>>("A_linear") = {_A_linear_name};
99  action->getObjectParams().set<std::vector<VariableName>>("rhoA") = {_rhoA_name};
100  action->getObjectParams().set<std::vector<VariableName>>("rhouA") = {_rhouA_name};
101  action->getObjectParams().set<std::vector<VariableName>>("rhoEA") = {_rhoEA_name};
102 
103  action->getObjectParams().set<UserObjectName>("numerical_flux") = _numerical_flux_name;
104 
105  _awh.addActionBlock(action);
106  }
107  }
108 
109  if (_add_bc)
110  {
111  // add the BC to use the boundary flux
112  for (unsigned int i = 0; i < variables.size(); i++)
113  {
114  const std::string class_name = "AddBCAction";
115  InputParameters params = _action_factory.getValidParams(class_name);
116  params.set<std::string>("type") = "BoundaryFlux3EqnBC";
117  params.set<NonlinearVariableName>("variable") = variables[i];
118  params.set<Real>("normal") = 1.;
119  params.set<std::vector<BoundaryName>>("boundary") = {"0"};
120 
121  std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
122  _action_factory.create(class_name, "bc_" + variables[i], params));
123 
124  action->getObjectParams().set<NonlinearVariableName>("variable") = variables[i];
125  action->getObjectParams().set<Real>("normal") = 1.;
126  action->getObjectParams().set<std::vector<BoundaryName>>("boundary") = {"0"};
127 
128  action->getObjectParams().set<std::vector<VariableName>>("A_elem") = {_A_name};
129  action->getObjectParams().set<std::vector<VariableName>>("A_linear") = {_A_linear_name};
130  action->getObjectParams().set<std::vector<VariableName>>("rhoA") = {_rhoA_name};
131  action->getObjectParams().set<std::vector<VariableName>>("rhouA") = {_rhouA_name};
132  action->getObjectParams().set<std::vector<VariableName>>("rhoEA") = {_rhoEA_name};
133 
134  action->getObjectParams().set<UserObjectName>("boundary_flux") = _boundary_flux_name;
135 
136  _awh.addActionBlock(action);
137  }
138  }
139 }
140 
141 void
143 {
144  // for internal side flux testing, use 2 elements (need an internal side)
145  if (_add_dg_kernel)
146  addMeshInternal(2);
147  else
148  addMeshInternal(1);
149 }
150 
151 void
153 {
154 }
155 
156 void
158 {
159  const std::vector<VariableName> variables = {_rhoA_name, _rhouA_name, _rhoEA_name};
160 
161  if (_ic_option == "constant")
162  {
163  const std::vector<Real> values = {2.0, 4.0, 30.0};
164 
165  for (std::size_t i = 0; i < variables.size(); ++i)
166  {
167  addSolutionVariable(variables[i]);
168  addConstantIC(variables[i], values[i]);
169  }
170  }
171  else if (_ic_option == "riemann_L") // left region
172  {
173  const std::vector<Real> values_left = {2.2, 4.4, 11.2};
174  const std::vector<Real> values_right = {2.6, 6.4, 12.2};
175 
176  addSolutionVariablesRiemannIC(variables, values_left, values_right);
177  }
178  else if (_ic_option == "riemann_LM") // left star region
179  {
180  const std::vector<Real> values_left = {2.2, -4.4, 11.2};
181  const std::vector<Real> values_right = {3.2, 8.4, 12.2};
182 
183  addSolutionVariablesRiemannIC(variables, values_left, values_right);
184  }
185  else if (_ic_option == "riemann_RM") // right star region
186  {
187  const std::vector<Real> values_left = {2.2, 4.4, 11.2};
188  const std::vector<Real> values_right = {1.8, -5.0, 12.2};
189 
190  addSolutionVariablesRiemannIC(variables, values_left, values_right);
191  }
192  else if (_ic_option == "riemann_R") // right region
193  {
194  const std::vector<Real> values_left = {2.2, 4.4, 11.2};
195  const std::vector<Real> values_right = {2.4, -16.0, 53.4};
196 
197  addSolutionVariablesRiemannIC(variables, values_left, values_right);
198  }
199  else
200  {
201  mooseError("Invalid IC option");
202  }
203 }
204 
205 void
207  const std::vector<VariableName> & variables,
208  const std::vector<Real> & values_left,
209  const std::vector<Real> & values_right)
210 {
211  for (unsigned int i = 0; i < variables.size(); ++i)
212  {
213  // add the variable
214  addSolutionVariable(variables[i], "MONOMIAL", "CONSTANT");
215 
216  // add the IC function
217  FunctionName ic_fn_name;
218  {
219  const std::string class_name = "AddFunctionAction";
220  InputParameters params = _action_factory.getValidParams(class_name);
221  params.set<std::string>("type") = "PiecewiseConstant";
222 
223  ic_fn_name = variables[i] + "_IC_fn";
224  std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
225  _action_factory.create(class_name, ic_fn_name, params));
226 
227  action->getObjectParams().set<MooseEnum>("axis") = "x";
228  action->getObjectParams().set<std::vector<Real>>("x") = {0.0, 0.5};
229  action->getObjectParams().set<std::vector<Real>>("y") = {values_left[i], values_right[i]};
230 
231  _awh.addActionBlock(action);
232  }
233 
234  addFunctionIC(variables[i], ic_fn_name);
235  }
236 }
237 
238 void
240 {
243  if (getParam<bool>("use_elem_area"))
245  else
246  addAuxVariable(_A_linear_name, "LAGRANGE", "FIRST");
248 }
249 
250 void
252 {
253  // direction
254  {
255  const std::string class_name = "AddMaterialAction";
256  InputParameters params = _action_factory.getValidParams(class_name);
257  params.set<std::string>("type") = "DirectionMaterial";
258 
259  std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
260  _action_factory.create(class_name, "direction_material", params));
261 
262  _awh.addActionBlock(action);
263  }
264 
265  // fluid properties
266  {
267  const std::string class_name = "AddMaterialAction";
268  InputParameters params = _action_factory.getValidParams(class_name);
269  if (_ad)
270  params.set<std::string>("type") = "ADFluidProperties3EqnMaterial";
271  else
272  params.set<std::string>("type") = "FluidProperties3EqnMaterial";
273 
274  std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
275  _action_factory.create(class_name, "fluid_properties_material", params));
276 
277  action->getObjectParams().set<std::vector<VariableName>>("A") = {_A_name};
278  action->getObjectParams().set<std::vector<VariableName>>("rhoA") = {_rhoA_name};
279  action->getObjectParams().set<std::vector<VariableName>>("rhouA") = {_rhouA_name};
280  action->getObjectParams().set<std::vector<VariableName>>("rhoEA") = {_rhoEA_name};
281 
282  action->getObjectParams().set<UserObjectName>("fp") = _fp_name;
283 
284  _awh.addActionBlock(action);
285  }
286 
287  // reconstruction material
288  {
289  const std::string class_name = "AddMaterialAction";
290  InputParameters params = _action_factory.getValidParams(class_name);
291  params.set<std::string>("type") = "RDG3EqnMaterial";
292 
293  std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
295 
297  action->getObjectParams().set<MooseEnum>("scheme") = "Minmod";
298  else
299  action->getObjectParams().set<MooseEnum>("scheme") = "None";
300 
301  action->getObjectParams().set<std::vector<VariableName>>("A_elem") = {_A_name};
302  action->getObjectParams().set<std::vector<VariableName>>("A_linear") = {_A_linear_name};
303  action->getObjectParams().set<std::vector<VariableName>>("rhoA") = {_rhoA_name};
304  action->getObjectParams().set<std::vector<VariableName>>("rhouA") = {_rhouA_name};
305  action->getObjectParams().set<std::vector<VariableName>>("rhoEA") = {_rhoEA_name};
306  action->getObjectParams().set<MaterialPropertyName>("direction") = _direction_name;
307 
308  action->getObjectParams().set<UserObjectName>("fluid_properties") = _fp_name;
309 
310  _awh.addActionBlock(action);
311  }
312 }
313 
314 void
316 {
317  // fluid properties
318  {
319  const std::string class_name = "AddFluidPropertiesAction";
320  InputParameters params = _action_factory.getValidParams(class_name);
321  params.set<std::string>("type") = "IdealGasFluidProperties";
322 
323  std::shared_ptr<MooseObjectAction> action = std::static_pointer_cast<MooseObjectAction>(
324  _action_factory.create(class_name, _fp_name, params));
325 
326  action->getObjectParams().set<Real>("gamma") = 1.5;
327  action->getObjectParams().set<Real>("molar_mass") = 0.83144598;
328 
329  _awh.addActionBlock(action);
330  }
331 }
Sets up a Jacobian test for 1-phase rDG.
ActionWarehouse & _awh
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
InputParameters getValidParams(const std::string &name)
void addAuxVariable(const VariableName &var_name, const std::string &fe_family, const std::string &fe_order)
Adds an aux variable.
Definition: TestAction.C:248
T & set(const std::string &name, bool quiet_mode=false)
const std::string _fe_order
Default FE order.
Definition: TestAction.h:152
virtual void addObjects()
Adds all non-mesh objects.
Definition: TestAction.C:140
const UserObjectName _boundary_flux_name
name of boundary flux user object being tested
registerMooseAction("ThermalHydraulicsTestApp", JacobianTest1PhaseRDGAction, "meta_action")
const VariableName _rhoA_name
rho*A variable name
void addActionBlock(std::shared_ptr< Action > blk)
void addConstantIC(const VariableName &var_name, const Real &value)
Adds a constant initial condition.
Definition: TestAction.C:265
void addMeshInternal(const unsigned int &nx)
Adds the mesh with a provided number of elements in x direction.
Definition: TestAction.C:105
static InputParameters validParams()
virtual void addAuxVariables() override
Adds aux variables.
void addRequiredParam(const std::string &name, const std::string &doc_string)
std::shared_ptr< Action > create(const std::string &action, const std::string &action_name, InputParameters &parameters)
InputParameters emptyInputParameters()
const bool _use_slope_reconstruction
option to use slope reconstruction
const VariableName _rhoEA_name
rho*E*A variable name
virtual void addObjects() override
Adds all non-mesh objects.
const UserObjectName _fp_name
fluid properties object name
InputParameters & getObjectParams()
JacobianTest1PhaseRDGAction(const InputParameters &params)
void addSolutionVariable(const VariableName &var_name, const std::string &family="LAGRANGE", const std::string &order="FIRST", const Real &scaling=1.0)
Adds a solution variable.
Definition: TestAction.C:230
static InputParameters validParams()
const UserObjectName _numerical_flux_name
name of numerical flux user object being tested
const MooseEnum _ic_option
initial conditions option
void addSolutionVariablesRiemannIC(const std::vector< VariableName > &variables, const std::vector< Real > &values_left, const std::vector< Real > &values_right)
Adds solution variables with Riemann problem IC (constant left and right states)
const bool & _ad
True for setting up testing with AD, false otherwise.
Definition: TestAction.h:154
Base class for adding common actions for Jacobian tests.
const bool _add_dg_kernel
option to add DG kernel
ActionFactory & _action_factory
bool isParamSetByUser(const std::string &name) const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void addUserObjects() override
Adds user objects.
const FunctionName & _A_fn_name
area function name
const std::string _fe_family
Default FE family.
Definition: TestAction.h:150
void mooseError(Args &&... args) const
const InputParameters & _pars
void addFunctionIC(const VariableName &var_name, const FunctionName &function_name)
Adds a function initial condition.
Definition: TestAction.C:281
const VariableName _rhouA_name
rho*u*A variable name
void addClassDescription(const std::string &doc_string)
virtual void addSolutionVariables() override
Adds the solution variables.
virtual void addMaterials() override
Adds materials.
const std::string _reconstruction_material_name
reconstruction material name
virtual void addInitialConditions() override
Adds the initial conditions.
const VariableName _A_linear_name
cross-sectional area variable name, linear Lagrange
const MaterialPropertyName _direction_name
direction material property name
const VariableName _A_name
cross-sectional area variable name, elemental average
virtual void addMesh() override
Adds the mesh.