1 #ifndef VERTEXCFD_SOLIDFULLINDUCTIONCLOSUREMODELFACTORY_IMPL_HPP
2 #define VERTEXCFD_SOLIDFULLINDUCTIONCLOSUREMODELFACTORY_IMPL_HPP
4 #include "closure_models/VertexCFD_Closure_ConstantScalarField.hpp"
5 #include "closure_models/VertexCFD_Closure_ElementLength.hpp"
6 #include "closure_models/VertexCFD_Closure_ExternalMagneticField.hpp"
7 #include "closure_models/VertexCFD_Closure_VectorFieldDivergence.hpp"
9 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleVariableTimeDerivative.hpp"
11 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_InductionConstantSource.hpp"
12 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_InductionResistiveFlux.hpp"
13 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_MagneticCorrectionDampingSource.hpp"
14 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_SolidFullInductionConvectiveFlux.hpp"
15 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_SolidFullInductionLocalTimeStepSize.hpp"
16 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_TotalMagneticField.hpp"
17 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_TotalMagneticFieldGradient.hpp"
19 #include "full_induction_mhd_solver/mhd_properties/VertexCFD_FullInductionMHDProperties.hpp"
21 #include <Panzer_String_Utilities.hpp>
28 namespace ClosureModel
31 template<
class EvalType,
int NumSpaceDim>
32 Teuchos::RCP<std::vector<Teuchos::RCP<PHX::Evaluator<panzer::Traits>>>>
34 const std::string& model_id,
35 const Teuchos::ParameterList& model_params,
36 const panzer::FieldLayoutLibrary&,
37 const Teuchos::RCP<panzer::IntegrationRule>& ir,
38 const Teuchos::ParameterList& ,
39 const Teuchos::ParameterList& user_params,
40 const Teuchos::RCP<panzer::GlobalData>& ,
41 PHX::FieldManager<panzer::Traits>&)
const
43 auto evaluators = Teuchos::rcp(
44 new std::vector<Teuchos::RCP<PHX::Evaluator<panzer::Traits>>>);
46 if (!model_params.isSublist(model_id))
48 throw std::runtime_error(
"Solid Full Induction closure model id "
49 + model_id +
"not in list.");
52 constexpr
int num_space_dim = NumSpaceDim;
55 const Teuchos::ParameterList& closure_model_list
56 = model_params.sublist(model_id);
60 const std::string factory_type
61 = closure_model_list.isType<std::string>(
"Closure Factory Type")
62 ? closure_model_list.get<std::string>(
"Closure Factory Type")
65 if (factory_type !=
"Solid Full Induction")
69 const auto full_induction_params
70 = closure_model_list.sublist(
"Full Induction MHD Properties");
72 full_induction_params);
73 const bool build_magn_corr = mhd_props.buildMagnCorr();
78 const std::string default_closure_models
80 "ExternalMagneticField,\n"
81 "FullInductionTimeDerivative,\n"
83 "InductionResistiveFlux,\n"
84 "SolidFullInductionConvectiveFlux,\n"
85 "SolidFullInductionLocalTimeStepSize,\n"
86 "TotalMagneticField,\n"
87 "TotalMagneticFieldGradient,\n";
93 evaluators->push_back(eval);
100 auto eval = Teuchos::rcp(
103 evaluators->push_back(eval);
107 auto eval = Teuchos::rcp(
109 *ir,
"local_dt", 1e6));
110 evaluators->push_back(eval);
116 std::vector<Teuchos::ParameterList> mhd_names_list_vct;
117 for (
int dim = 0; dim < num_space_dim; ++dim)
119 Teuchos::ParameterList ind_names_list;
121 "Field Name",
"induced_magnetic_field_" + std::to_string(dim));
122 ind_names_list.set(
"Equation Name",
123 "induction_" + std::to_string(dim));
124 mhd_names_list_vct.push_back(ind_names_list);
128 Teuchos::ParameterList magn_corr_names_list;
129 magn_corr_names_list.set(
"Field Name",
"scalar_magnetic_potential");
130 magn_corr_names_list.set(
"Equation Name",
131 "magnetic_correction_potential");
132 mhd_names_list_vct.push_back(magn_corr_names_list);
134 for (
auto& mhd_names_list : mhd_names_list_vct)
136 auto eval_time = Teuchos::rcp(
138 *ir, mhd_names_list));
139 evaluators->push_back(eval_time);
148 evaluators->push_back(eval);
153 auto eval = Teuchos::rcp(
156 evaluators->push_back(eval);
168 evaluators->push_back(eval);
172 if (mhd_props.buildResistiveFlux())
176 auto eval = Teuchos::rcp(
179 num_space_dim>(*ir));
180 evaluators->push_back(eval);
185 if (mhd_props.variableResistivity())
187 throw std::runtime_error(
188 "No closure models currently exist to evaluate variable "
189 "resistivity. Use a constant resistivity only.");
193 auto eval = Teuchos::rcp(
195 *ir,
"resistivity", mhd_props.resistivity()));
196 evaluators->push_back(eval);
202 auto eval = Teuchos::rcp(
205 evaluators->push_back(eval);
210 for (
const auto& closure_model : closure_model_list)
212 bool found_model =
false;
215 const auto closure_name = closure_model.first;
216 if (closure_name ==
"Closure Factory Type"
217 || closure_name ==
"Full Induction MHD Properties")
221 const auto& closure_params
222 = Teuchos::getValue<Teuchos::ParameterList>(closure_model.second);
224 if (closure_params.isType<std::string>(
"Type"))
226 const auto closure_type = closure_params.get<std::string>(
"Type");
229 if (default_closure_models.find(closure_type) != std::string::npos)
231 const std::string msg =
"\n\nSolidFullInduction closure model/type '"
232 + closure_name +
"'/'" + closure_type
233 +
"' found in model id '" + model_id
234 +
"' is a default closure model and should "
235 "not be added to the input file.\n"
236 "The list of default closure models for "
237 "the solid full induction equations is:\n"
238 + default_closure_models;
239 throw std::runtime_error(msg);
242 if (closure_type ==
"ConstantMaterialProperties")
245 auto eval_rho = Teuchos::rcp(
249 closure_params.get<
double>(
"Density Value")));
250 evaluators->push_back(eval_rho);
254 if (closure_type ==
"InductionConstantSource")
256 auto eval = Teuchos::rcp(
258 *ir, closure_params));
259 evaluators->push_back(eval);
263 if (closure_type ==
"MagneticCorrectionDampingSource")
265 auto eval = Teuchos::rcp(
268 evaluators->push_back(eval);
272 if (std::string::npos != closure_type.find(
"VectorFieldDivergence"))
274 const auto field_names
275 = closure_params.get<std::string>(
"Field Names");
276 std::vector<std::string> tokens;
277 panzer::StringTokenizer(tokens, field_names,
",",
true);
278 for (
auto& field : tokens)
280 auto eval = Teuchos::rcp(
284 *ir, field, closure_type));
285 evaluators->push_back(eval);
293 const std::string msg
294 =
"\n\nSolidFullInduction closure model/type "
295 + closure_name +
"/" + closure_type
296 +
" failed to build in model id " + model_id +
".\n"
297 "Solid full induction closure models available in Vertex-CFD are:\n"
298 "ConstantMaterialProperties\n"
299 "InductionConstantSource,\n"
300 "MagneticCorrectionDampingSource,\n"
301 "(Abs)VectorFieldDivergence\n"
303 throw std::runtime_error(msg);
316 #endif // end VERTEXCFD_SOLIDFULLINDUCTIONCLOSUREMODELFACTORY_IMPL_HPP