1 #ifndef VERTEXCFD_INITIALCONDITIONFACTORY_IMPL_HPP
2 #define VERTEXCFD_INITIALCONDITIONFACTORY_IMPL_HPP
4 #include "VertexCFD_InitialCondition_Circle.hpp"
5 #include "VertexCFD_InitialCondition_Constant.hpp"
6 #include "VertexCFD_InitialCondition_Gaussian.hpp"
7 #include "VertexCFD_InitialCondition_InverseGaussian.hpp"
8 #include "VertexCFD_InitialCondition_MethodManufacturedSolution.hpp"
9 #include "VertexCFD_InitialCondition_Sinusoidal.hpp"
10 #include "VertexCFD_InitialCondition_Step.hpp"
12 #ifdef VERTEXCFD_ENABLE_FULL_INDUCTION_MHD
13 #include "full_induction_mhd_solver/initial_conditions/VertexCFD_FullInductionInitialConditionFactory.hpp"
16 #include "incompressible_lsvof_solver/initial_conditions/VertexCFD_InitialCondition_IncompressibleLSVOFBubble.hpp"
17 #include "incompressible_solver/initial_conditions/VertexCFD_InitialCondition_IncompressibleLaminarFlow.hpp"
18 #include "incompressible_solver/initial_conditions/VertexCFD_InitialCondition_IncompressibleTaylorGreenVortex.hpp"
19 #include "incompressible_solver/initial_conditions/VertexCFD_InitialCondition_IncompressibleTurbulentChannel.hpp"
20 #include "incompressible_solver/initial_conditions/VertexCFD_InitialCondition_IncompressibleVortexInBox.hpp"
22 #include <Panzer_FieldLibrary.hpp>
23 #include <Panzer_PureBasis.hpp>
24 #include <Panzer_STK_GatherFields.hpp>
25 #include <Panzer_String_Utilities.hpp>
27 #include <Teuchos_RCP.hpp>
33 namespace InitialCondition
36 template<
class EvalType,
int NumSpaceDim>
37 Factory<EvalType, NumSpaceDim>::Factory(
38 Teuchos::RCP<const panzer_stk::STK_Interface> mesh)
44 template<
class EvalType,
int NumSpaceDim>
45 Teuchos::RCP<std::vector<Teuchos::RCP<PHX::Evaluator<panzer::Traits>>>>
46 Factory<EvalType, NumSpaceDim>::buildClosureModels(
47 const std::string& block_id,
48 const Teuchos::ParameterList& block_params,
49 const panzer::FieldLayoutLibrary& fl,
50 const Teuchos::RCP<panzer::IntegrationRule>&,
51 const Teuchos::ParameterList&,
52 const Teuchos::ParameterList& user_params,
53 const Teuchos::RCP<panzer::GlobalData>&,
54 PHX::FieldManager<panzer::Traits>&)
const
56 auto evaluators = Teuchos::rcp(
57 new std::vector<Teuchos::RCP<PHX::Evaluator<panzer::Traits>>>);
60 constexpr
int num_dim_space = NumSpaceDim;
62 if (!block_params.isSublist(block_id))
64 throw std::runtime_error(
"Initial condition block id not in list");
68 std::vector<Teuchos::RCP<const panzer::PureBasis>> bases;
69 fl.uniqueBases(bases);
71 #ifdef VERTEXCFD_ENABLE_FULL_INDUCTION_MHD
73 FullInductionICFactory<EvalType, NumSpaceDim> full_induction_factory;
74 std::string full_ind_error_msg =
"None";
78 const Teuchos::ParameterList& ic_params = block_params.sublist(block_id);
79 for (
auto param_itr = ic_params.begin(); param_itr != ic_params.end();
82 bool found_model =
false;
84 auto key = param_itr->first;
86 = Teuchos::getValue<Teuchos::ParameterList>(param_itr->second);
88 if (p.isType<std::string>(
"Type"))
90 const std::string type = p.get<std::string>(
"Type");
94 if (type ==
"From File")
96 std::vector<std::string> field_names;
97 panzer::StringTokenizer(
98 field_names, p.get<std::string>(
"Field Names"),
",",
true);
101 auto basis = fl.lookupLayout(field_names.at(0));
104 = Teuchos::ParameterList{}
105 .set(
"Field Names", Teuchos::rcpFromRef(field_names))
106 .set(
"Basis", basis);
108 auto eval = Teuchos::rcp(
109 new panzer_stk::GatherFields<EvalType, panzer::Traits>(
111 evaluators->push_back(eval);
115 #ifdef VERTEXCFD_ENABLE_FULL_INDUCTION_MHD
116 if (std::string::npos
117 != full_induction_factory.availableInitialConditions().find(
120 full_induction_factory.buildClosureModel(type,
130 if (type ==
"Constant")
132 for (
const auto& b : bases)
134 auto eval = Teuchos::rcp(
135 new Constant<EvalType, panzer::Traits>(p, *b));
136 evaluators->push_back(eval);
141 if (type ==
"Gaussian")
143 for (
const auto& b : bases)
145 auto eval = Teuchos::rcp(
146 new Gaussian<EvalType, panzer::Traits, num_dim_space>(
148 evaluators->push_back(eval);
155 for (
const auto& b : bases)
157 auto eval = Teuchos::rcp(
158 new Step<EvalType, panzer::Traits>(p, *b));
159 evaluators->push_back(eval);
164 if (type ==
"Circle")
166 for (
const auto& b : bases)
168 auto eval = Teuchos::rcp(
169 new Circle<EvalType, panzer::Traits, num_dim_space>(
171 evaluators->push_back(eval);
176 if (type ==
"InverseGaussian")
178 for (
const auto& b : bases)
180 auto eval = Teuchos::rcp(
181 new InverseGaussian<EvalType, panzer::Traits, num_dim_space>(
183 evaluators->push_back(eval);
188 if (type ==
"MethodManufacturedSolution")
190 for (
const auto& b : bases)
192 auto eval = Teuchos::rcp(
193 new MethodManufacturedSolution<EvalType,
196 evaluators->push_back(eval);
201 if (type ==
"IncompressibleVortexInBox")
203 for (
const auto& b : bases)
205 auto eval = Teuchos::rcp(
206 new IncompressibleVortexInBox<EvalType, panzer::Traits>(
208 evaluators->push_back(eval);
213 if (type ==
"IncompressibleTaylorGreenVortex")
215 for (
const auto& b : bases)
217 auto eval = Teuchos::rcp(
218 new IncompressibleTaylorGreenVortex<EvalType,
221 evaluators->push_back(eval);
226 if (type ==
"IncompressibleLaminarFlow")
228 for (
const auto& b : bases)
230 auto eval = Teuchos::rcp(
231 new IncompressibleLaminarFlow<EvalType,
233 num_dim_space>(p, *b));
234 evaluators->push_back(eval);
239 if (type ==
"IncompressibleTurbulentChannel")
241 for (
const auto& b : bases)
243 auto eval = Teuchos::rcp(
244 new IncompressibleTurbulentChannel<EvalType,
248 evaluators->push_back(eval);
253 if (type ==
"Sinusoidal")
255 for (
const auto& b : bases)
257 auto eval = Teuchos::rcp(
258 new Sinusoidal<EvalType, panzer::Traits>(p, *b));
259 evaluators->push_back(eval);
264 if (type ==
"IncompressibleLSVOFBubble")
266 for (
const auto& b : bases)
268 auto eval = Teuchos::rcp(
269 new IncompressibleLSVOFBubble<EvalType,
271 num_dim_space>(p, *b));
272 evaluators->push_back(eval);
280 std::string msg =
"Initial condition " + key
281 +
" failed to build.\n";
282 msg +=
"The initial conditions implemented in VertexCFD are:\n";
285 msg +=
"From File\n";
287 msg +=
"IncompressibleLaminarFlow\n";
288 msg +=
"IncompressibleLSVOFBubble\n";
289 msg +=
"IncompressibleTaylorGreenVortex\n";
290 msg +=
"IncompressibleTurbulentFlow\n";
291 msg +=
"IncompressibleVortexInBox\n";
292 msg +=
"InverseGaussian\n";
293 msg +=
"MethodManufacturedSolution\n";
294 msg +=
"Sinusoidal\n";
296 #ifdef VERTEXCFD_ENABLE_FULL_INDUCTION_MHD
297 msg +=
"=================================\n";
298 msg +=
"Full induction MHD closure models:\n";
299 msg += full_ind_error_msg;
301 throw std::runtime_error(msg);
313 #endif // end VERTEXCFD_INITIALCONDITIONFACTORY_IMPL_HPP