VertexCFD  0.0-dev
VertexCFD_RADClosureModelFactory_impl.hpp
1 #ifndef VERTEXCFD_RADCLOSUREMODELFACTORY_IMPL_HPP
2 #define VERTEXCFD_RADCLOSUREMODELFACTORY_IMPL_HPP
3 
4 #include "closure_models/VertexCFD_Closure_ConstantVectorField.hpp"
5 #include "closure_models/VertexCFD_Closure_ElementLength.hpp"
6 #include "closure_models/VertexCFD_Closure_ExternalInterpolation.hpp"
7 
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"
17 
18 #include "rad_solver/closure_models/VertexCFD_RADClosureModelFactory.hpp"
19 
20 #include "utils/VertexCFD_Utils_Constants.hpp"
21 
22 namespace VertexCFD
23 {
24 namespace ClosureModel
25 {
26 //---------------------------------------------------------------------------//
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
38 {
39  constexpr int num_space_dim = NumSpaceDim;
40  auto evaluators = Teuchos::rcp(
41  new std::vector<Teuchos::RCP<PHX::Evaluator<panzer::Traits>>>);
42 
43  if (!model_params.isSublist(model_id))
44  {
45  throw std::runtime_error("RAD closure model id " + model_id
46  + "not in list.");
47  }
48 
49  // Get closure model list for 'model_id'
50  const Teuchos::ParameterList& closure_model_list
51  = model_params.sublist(model_id);
52 
53  // Check for closure model factory type. If not `RAD` return empty
54  // evaluator
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")
58  : "None";
59 
60  if (factory_type != "RAD")
61  return evaluators;
62 
63  if (!closure_model_list.isSublist("Model Parameters"))
64  {
65  throw std::runtime_error(
66  "\n\nERROR: define model parameters in 'Model Parameters' sublist "
67  "in 'Closure Models' list.\n\n");
68  }
69 
70  // Get Model and Reaction Parameters
71  auto rad_params = closure_model_list.sublist("Model Parameters");
72  Teuchos::ParameterList reaction_params;
73  if (rad_params.isSublist("Reaction Parameters"))
74  {
75  reaction_params = rad_params.sublist("Reaction Parameters");
76  // We need to delete reaction parameters for the parameter validation
77  rad_params.remove("Reaction Parameters");
78  }
79 
80  // Define valid parameters and set them
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",
86  false,
87  "Reaction boolean with Bateman term");
88  valid_parameters.set(
89  "Build Fission Source", false, "Fission source boolean");
90  valid_parameters.set("Build Reaction Transmutation Source",
91  false,
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",
97  "neutron_flux",
98  "External neutron flux name string");
99 
100  rad_params.validateParametersAndSetDefaults(valid_parameters);
101 
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");
112 
113  // Species properties
114  const SpeciesProperties::ConstantSpeciesProperties rad_species_prop_params
116  reaction_params);
117 
118  // Adding default closure models to solve rad equations
119  const std::string default_closure_models
120  = "RADAdvectionFlux,\nRADDiffusionFlux,\nRADReaction,"
121  "\nRADErrorNorms,\nRADFissionSource,\nRADTimeDerivative,"
122  "\nElementLength.\n";
123 
124  // Reaction term
125  if (build_bateman || build_transmutation)
126  {
127  auto eval_rad = Teuchos::rcp(new RADReaction<EvalType, panzer::Traits>(
128  *ir, rad_species_prop_params, neutron_flux_name));
129  evaluators->push_back(eval_rad);
130  }
131 
132  // Fission source
133  if (build_fission_source)
134  {
135  auto eval_rad
137  *ir, rad_species_prop_params, neutron_flux_name));
138  evaluators->push_back(eval_rad);
139  }
140 
141  // Advection flux
142  if (build_advection)
143  {
144  auto eval_rad = Teuchos::rcp(
146  *ir, rad_species_prop_params));
147  evaluators->push_back(eval_rad);
148  }
149 
150  // Diffusion flux
151  if (build_diffusion)
152  {
153  auto eval_rad
155  *ir, rad_species_prop_params));
156  evaluators->push_back(eval_rad);
157  }
158 
159  // RAD error norms
160  if (user_params.isSublist("Compute Error Norms"))
161  {
162  auto eval_rad
163  = Teuchos::rcp(new RADErrorNorms<EvalType, panzer::Traits>(
164  *ir, rad_species_prop_params));
165  evaluators->push_back(eval_rad);
166  }
167 
168  // RAD time derivative
169  {
170  auto eval_rad
172  *ir, rad_species_prop_params));
173  evaluators->push_back(eval_rad);
174  }
175 
176  // Element length
177  {
178  auto eval
179  = Teuchos::rcp(new ElementLength<EvalType, panzer::Traits>(*ir));
180  evaluators->push_back(eval);
181  }
182 
183  // Loop over closure models
184  for (const auto& closure_model : closure_model_list)
185  {
186  bool found_model = false;
187 
188  const auto closure_name = closure_model.first;
189  if (closure_name == "Closure Factory Type")
190  continue;
191  if (closure_name == "Model Parameters")
192  continue;
193 
194  // Get closure parameters for current closure model
195  const auto& closure_params
196  = Teuchos::getValue<Teuchos::ParameterList>(closure_model.second);
197 
198  if (closure_params.isType<std::string>("Type"))
199  {
200  const auto closure_type = closure_params.get<std::string>("Type");
201 
202  // Check if 'closure_type' is a default closure model
203  if (default_closure_models.find(closure_type) != std::string::npos)
204  {
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);
210  }
211 
212  // Constant Vector Field
213  if (closure_type == "ConstantVectorField")
214  {
215  auto eval = Teuchos::rcp(
217  *ir, closure_params));
218  evaluators->push_back(eval);
219  found_model = true;
220  }
221 
222  // External Interpolation With ArborX
223 #ifdef VERTEXCFD_HAVE_ARBORX
224  if (closure_type == "ExternalInterpolation")
225  {
226  auto eval = Teuchos::rcp(
227  new ExternalInterpolation<EvalType, panzer::Traits, num_space_dim>(
228  *ir, closure_params));
229  evaluators->push_back(eval);
230  found_model = true;
231  }
232 #endif
233 
234  // RAD local time step size
235  if (closure_type == "RADLocalTimeStepSize")
236  {
237  auto eval_rad = Teuchos::rcp(
239  *ir, rad_species_prop_params, neutron_flux_name));
240  evaluators->push_back(eval_rad);
241  found_model = true;
242  }
243 
244  // RAD exact solution
245  if (closure_type == "RADBADExactSolution")
246  {
247  auto eval_rad = Teuchos::rcp(
249  *ir, rad_species_prop_params, closure_params));
250  evaluators->push_back(eval_rad);
251  found_model = true;
252  }
253 
254  // RAD fission source exact solution
255  if (closure_type == "RADFissionSourceExactSolution")
256  {
257  auto eval_rad = Teuchos::rcp(
259  *ir, rad_species_prop_params, closure_params));
260  evaluators->push_back(eval_rad);
261  found_model = true;
262  }
263 
264  // Error message if closure model not found
265  if (!found_model)
266  {
267  std::string msg = "\n\nRAD closure model/type " + closure_name
268  + "/" + closure_type
269  + " failed to build in model id " + model_id
270  + ".\n";
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,";
277  msg += "\n";
278 
279  throw std::runtime_error(msg);
280  }
281  }
282  }
283 
284  return evaluators;
285 }
286 
287 //---------------------------------------------------------------------------//
288 
289 } // end namespace ClosureModel
290 } // end namespace VertexCFD
291 
292 #endif // end VERTEXCFD_RADCLOSUREMODELFACTORY_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23
VertexCFD::ClosureModel::RADReaction
Definition: VertexCFD_Closure_RADReaction.hpp:29
VertexCFD::ClosureModel::RADFissionSourceExactSolution
Definition: VertexCFD_Closure_RADFissionSourceExactSolution.hpp:30
VertexCFD::SpeciesProperties::ConstantSpeciesProperties
Definition: VertexCFD_ConstantSpeciesProperties.hpp:17
VertexCFD::ClosureModel::RADFactory::buildClosureModels
Teuchos::RCP< std::vector< Teuchos::RCP< PHX::Evaluator< panzer::Traits > > > > buildClosureModels(const std::string &model_id, const Teuchos::ParameterList &model_params, const panzer::FieldLayoutLibrary &fl, const Teuchos::RCP< panzer::IntegrationRule > &ir, const Teuchos::ParameterList &default_params, const Teuchos::ParameterList &user_params, const Teuchos::RCP< panzer::GlobalData > &global_data, PHX::FieldManager< panzer::Traits > &fm) const override
Definition: VertexCFD_RADClosureModelFactory_impl.hpp:29
VertexCFD::ClosureModel::RADLocalTimeStepSize
Definition: VertexCFD_Closure_RADLocalTimeStepSize.hpp:29
VertexCFD::ClosureModel::RADAdvectionFlux
Definition: VertexCFD_Closure_RADAdvectionFlux.hpp:29
VertexCFD::ClosureModel::RADErrorNorms
Definition: VertexCFD_Closure_RADErrorNorms.hpp:29
VertexCFD::ClosureModel::RADTimeDerivative
Definition: VertexCFD_Closure_RADTimeDerivative.hpp:27
VertexCFD::ClosureModel::RADFissionSource
Definition: VertexCFD_Closure_RADFissionSource.hpp:29
VertexCFD::ClosureModel::RADDiffusionFlux
Definition: VertexCFD_Closure_RADDiffusionFlux.hpp:29
VertexCFD::ClosureModel::ConstantVectorField
Definition: VertexCFD_Closure_ConstantVectorField.hpp:26
VertexCFD::ClosureModel::ElementLength
Definition: VertexCFD_Closure_ElementLength.hpp:24
VertexCFD::ClosureModel::RADBADExactSolution
Definition: VertexCFD_Closure_RADBADExactSolution.hpp:29