https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
16registerMooseAction("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
74void
76{
78
79 const std::vector<VariableName> variables = {_rhoA_name, _rhouA_name, _rhoEA_name};
80
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";
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";
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
141void
143{
144 // for internal side flux testing, use 2 elements (need an internal side)
145 if (_add_dg_kernel)
147 else
149}
150
151void
155
156void
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
205void
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";
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
238void
249
250void
252{
253 // direction
254 {
255 const std::string class_name = "AddMaterialAction";
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";
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";
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
314void
316{
317 // fluid properties
318 {
319 const std::string class_name = "AddFluidPropertiesAction";
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}
InputParameters emptyInputParameters()
registerMooseAction("ThermalHydraulicsTestApp", JacobianTest1PhaseRDGAction, "meta_action")
std::array< Real, 2 > values
std::shared_ptr< Action > create(const std::string &action, const std::string &action_name, InputParameters &parameters)
InputParameters getValidParams(const std::string &name)
void addActionBlock(std::shared_ptr< Action > blk)
ActionWarehouse & _awh
bool isParamSetByUser(const std::string &name) const
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
Sets up a Jacobian test for 1-phase rDG.
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 UserObjectName _numerical_flux_name
name of numerical flux user object being tested
virtual void addInitialConditions() override
Adds the initial conditions.
virtual void addAuxVariables() override
Adds aux variables.
const bool _use_slope_reconstruction
option to use slope reconstruction
const VariableName _A_name
cross-sectional area variable name, elemental average
JacobianTest1PhaseRDGAction(const InputParameters &params)
const std::string _reconstruction_material_name
reconstruction material name
const MooseEnum _ic_option
initial conditions option
const VariableName _rhouA_name
rho*u*A variable name
virtual void addUserObjects() override
Adds user objects.
const VariableName _rhoA_name
rho*A variable name
const VariableName _A_linear_name
cross-sectional area variable name, linear Lagrange
const UserObjectName _boundary_flux_name
name of boundary flux user object being tested
const UserObjectName _fp_name
fluid properties object name
virtual void addMesh() override
Adds the mesh.
virtual void addObjects() override
Adds all non-mesh objects.
virtual void addMaterials() override
Adds materials.
const MaterialPropertyName _direction_name
direction material property name
const bool _add_dg_kernel
option to add DG kernel
const VariableName _rhoEA_name
rho*E*A variable name
virtual void addSolutionVariables() override
Adds the solution variables.
const FunctionName & _A_fn_name
area function name
Base class for adding common actions for Jacobian tests.
static InputParameters validParams()
void mooseError(Args &&... args) const
const InputParameters & _pars
ActionFactory & _action_factory
void addFunctionIC(const VariableName &var_name, const FunctionName &function_name)
Adds a function initial condition.
Definition TestAction.C:283
const std::string _fe_family
Default FE family.
Definition TestAction.h:150
virtual void addObjects()
Adds all non-mesh objects.
Definition TestAction.C:142
const bool & _ad
True for setting up testing with AD, false otherwise.
Definition TestAction.h:154
const std::string _fe_order
Default FE order.
Definition TestAction.h:152
void addConstantIC(const VariableName &var_name, const Real &value)
Adds a constant initial condition.
Definition TestAction.C:267
void addAuxVariable(const VariableName &var_name, const std::string &fe_family, const std::string &fe_order)
Adds an aux variable.
Definition TestAction.C:250
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:232
void addMeshInternal(const unsigned int &nx)
Adds the mesh with a provided number of elements in x direction.
Definition TestAction.C:107