1 #ifndef VERTEXCFD_RADCLOSUREMODELFACTORY_IMPL_HPP
2 #define VERTEXCFD_RADCLOSUREMODELFACTORY_IMPL_HPP
4 #include "closure_models/VertexCFD_Closure_ConstantVectorField.hpp"
5 #include "closure_models/VertexCFD_Closure_ElementLength.hpp"
6 #include "closure_models/VertexCFD_Closure_ExternalInterpolation.hpp"
8 #include "rad_solver/closure_models/VertexCFD_Closure_RADAdvectionFlux.hpp"
9 #include "rad_solver/closure_models/VertexCFD_Closure_RADBADExactSolution.hpp"
10 #include "rad_solver/closure_models/VertexCFD_Closure_RADDiffusionFlux.hpp"
11 #include "rad_solver/closure_models/VertexCFD_Closure_RADErrorNorms.hpp"
12 #include "rad_solver/closure_models/VertexCFD_Closure_RADFissionSource.hpp"
13 #include "rad_solver/closure_models/VertexCFD_Closure_RADFissionSourceExactSolution.hpp"
14 #include "rad_solver/closure_models/VertexCFD_Closure_RADLocalTimeStepSize.hpp"
15 #include "rad_solver/closure_models/VertexCFD_Closure_RADReaction.hpp"
16 #include "rad_solver/closure_models/VertexCFD_Closure_RADTimeDerivative.hpp"
18 #include "rad_solver/closure_models/VertexCFD_RADClosureModelFactory.hpp"
20 #include "utils/VertexCFD_Utils_Constants.hpp"
24 namespace ClosureModel
27 template<
class EvalType,
int NumSpaceDim>
28 Teuchos::RCP<std::vector<Teuchos::RCP<PHX::Evaluator<panzer::Traits>>>>
30 const std::string& model_id,
31 const Teuchos::ParameterList& model_params,
32 const panzer::FieldLayoutLibrary&,
33 const Teuchos::RCP<panzer::IntegrationRule>& ir,
34 const Teuchos::ParameterList& ,
35 const Teuchos::ParameterList& user_params,
36 const Teuchos::RCP<panzer::GlobalData>& ,
37 PHX::FieldManager<panzer::Traits>&)
const
39 constexpr
int num_space_dim = NumSpaceDim;
40 auto evaluators = Teuchos::rcp(
41 new std::vector<Teuchos::RCP<PHX::Evaluator<panzer::Traits>>>);
43 if (!model_params.isSublist(model_id))
45 throw std::runtime_error(
"RAD closure model id " + model_id
50 const Teuchos::ParameterList& closure_model_list
51 = model_params.sublist(model_id);
55 const std::string factory_type
56 = closure_model_list.isType<std::string>(
"Closure Factory Type")
57 ? closure_model_list.get<std::string>(
"Closure Factory Type")
60 if (factory_type !=
"RAD")
63 if (!closure_model_list.isSublist(
"Model Parameters"))
65 throw std::runtime_error(
66 "\n\nERROR: define model parameters in 'Model Parameters' sublist "
67 "in 'Closure Models' list.\n\n");
71 auto rad_params = closure_model_list.sublist(
"Model Parameters");
72 Teuchos::ParameterList reaction_params;
73 if (rad_params.isSublist(
"Reaction Parameters"))
75 reaction_params = rad_params.sublist(
"Reaction Parameters");
77 rad_params.remove(
"Reaction Parameters");
81 Teuchos::ParameterList valid_parameters;
82 valid_parameters.set(
"Number of Species", 1,
"Number of species");
83 valid_parameters.set(
"Build Advection",
false,
"Advection term boolean");
84 valid_parameters.set(
"Build Diffusion",
false,
"Diffusion term boolean");
85 valid_parameters.set(
"Build Reaction Bateman Source",
87 "Reaction boolean with Bateman term");
89 "Build Fission Source",
false,
"Fission source boolean");
90 valid_parameters.set(
"Build Reaction Transmutation Source",
92 "Reaction boolean with Transmutation term");
93 valid_parameters.set(
"Diffusion Coefficient",
94 std::numeric_limits<double>::quiet_NaN(),
95 "Constant diffusion coefficient");
96 valid_parameters.set(
"Neutron Flux Variable Name",
98 "External neutron flux name string");
100 rad_params.validateParametersAndSetDefaults(valid_parameters);
102 const bool build_advection = rad_params.get<
bool>(
"Build Advection");
103 const bool build_diffusion = rad_params.get<
bool>(
"Build Diffusion");
104 const bool build_bateman
105 = rad_params.get<
bool>(
"Build Reaction Bateman Source");
106 const bool build_fission_source
107 = rad_params.get<
bool>(
"Build Fission Source");
108 const bool build_transmutation
109 = rad_params.get<
bool>(
"Build Reaction Transmutation Source");
110 const std::string neutron_flux_name
111 = rad_params.get<std::string>(
"Neutron Flux Variable Name");
119 const std::string default_closure_models
120 =
"RADAdvectionFlux,\nRADDiffusionFlux,\nRADReaction,"
121 "\nRADErrorNorms,\nRADFissionSource,\nRADTimeDerivative,"
122 "\nElementLength.\n";
125 if (build_bateman || build_transmutation)
128 *ir, rad_species_prop_params, neutron_flux_name));
129 evaluators->push_back(eval_rad);
133 if (build_fission_source)
137 *ir, rad_species_prop_params, neutron_flux_name));
138 evaluators->push_back(eval_rad);
144 auto eval_rad = Teuchos::rcp(
146 *ir, rad_species_prop_params));
147 evaluators->push_back(eval_rad);
155 *ir, rad_species_prop_params));
156 evaluators->push_back(eval_rad);
160 if (user_params.isSublist(
"Compute Error Norms"))
164 *ir, rad_species_prop_params));
165 evaluators->push_back(eval_rad);
172 *ir, rad_species_prop_params));
173 evaluators->push_back(eval_rad);
180 evaluators->push_back(eval);
184 for (
const auto& closure_model : closure_model_list)
186 bool found_model =
false;
188 const auto closure_name = closure_model.first;
189 if (closure_name ==
"Closure Factory Type")
191 if (closure_name ==
"Model Parameters")
195 const auto& closure_params
196 = Teuchos::getValue<Teuchos::ParameterList>(closure_model.second);
198 if (closure_params.isType<std::string>(
"Type"))
200 const auto closure_type = closure_params.get<std::string>(
"Type");
203 if (default_closure_models.find(closure_type) != std::string::npos)
205 std::string msg =
"\n\nRAD closure model/type '" + closure_name +
"'/'" + closure_type
206 +
"' found in model id '" + model_id +
"' is a default closure model and should not be added to the input file.\n";
207 msg +=
"The list of default closure models for the rad equation is:\n";
208 msg += default_closure_models;
209 throw std::runtime_error(msg);
213 if (closure_type ==
"ConstantVectorField")
215 auto eval = Teuchos::rcp(
217 *ir, closure_params));
218 evaluators->push_back(eval);
223 #ifdef VERTEXCFD_HAVE_ARBORX
224 if (closure_type ==
"ExternalInterpolation")
226 auto eval = Teuchos::rcp(
227 new ExternalInterpolation<EvalType, panzer::Traits, num_space_dim>(
228 *ir, closure_params));
229 evaluators->push_back(eval);
235 if (closure_type ==
"RADLocalTimeStepSize")
237 auto eval_rad = Teuchos::rcp(
239 *ir, rad_species_prop_params, neutron_flux_name));
240 evaluators->push_back(eval_rad);
245 if (closure_type ==
"RADBADExactSolution")
247 auto eval_rad = Teuchos::rcp(
249 *ir, rad_species_prop_params, closure_params));
250 evaluators->push_back(eval_rad);
255 if (closure_type ==
"RADFissionSourceExactSolution")
257 auto eval_rad = Teuchos::rcp(
259 *ir, rad_species_prop_params, closure_params));
260 evaluators->push_back(eval_rad);
267 std::string msg =
"\n\nRAD closure model/type " + closure_name
269 +
" failed to build in model id " + model_id
271 msg +=
"The rad closure models available in Vertex-CFD are:\n";
272 msg +=
"\nConstantVectorField,";
273 msg +=
"\nExternalInterpolation,";
274 msg +=
"\nRADBADExactSolution,";
275 msg +=
"\nRADFissionSourceExactSolution,";
276 msg +=
"\nRADLocalTimeStepSize,";
279 throw std::runtime_error(msg);
292 #endif // end VERTEXCFD_RADCLOSUREMODELFACTORY_IMPL_HPP