VertexCFD  0.0-dev
VertexCFD_InitialConditionFactory_impl.hpp
1 #ifndef VERTEXCFD_INITIALCONDITIONFACTORY_IMPL_HPP
2 #define VERTEXCFD_INITIALCONDITIONFACTORY_IMPL_HPP
3 
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"
11 
12 #ifdef VERTEXCFD_ENABLE_FULL_INDUCTION_MHD
13 #include "full_induction_mhd_solver/initial_conditions/VertexCFD_FullInductionInitialConditionFactory.hpp"
14 #endif
15 
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"
21 
22 #include <Panzer_FieldLibrary.hpp>
23 #include <Panzer_PureBasis.hpp>
24 #include <Panzer_STK_GatherFields.hpp>
25 #include <Panzer_String_Utilities.hpp>
26 
27 #include <Teuchos_RCP.hpp>
28 
29 #include <vector>
30 
31 namespace VertexCFD
32 {
33 namespace InitialCondition
34 {
35 //---------------------------------------------------------------------------//
36 template<class EvalType, int NumSpaceDim>
37 Factory<EvalType, NumSpaceDim>::Factory(
38  Teuchos::RCP<const panzer_stk::STK_Interface> mesh)
39  : _mesh{mesh}
40 {
41 }
42 
43 //---------------------------------------------------------------------------//
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
55 {
56  auto evaluators = Teuchos::rcp(
57  new std::vector<Teuchos::RCP<PHX::Evaluator<panzer::Traits>>>);
58 
59  // Space dimension
60  constexpr int num_dim_space = NumSpaceDim;
61 
62  if (!block_params.isSublist(block_id))
63  {
64  throw std::runtime_error("Initial condition block id not in list");
65  }
66 
67  // Initial conditions apply to the bases.
68  std::vector<Teuchos::RCP<const panzer::PureBasis>> bases;
69  fl.uniqueBases(bases);
70 
71 #ifdef VERTEXCFD_ENABLE_FULL_INDUCTION_MHD
72  // Full induction solver factory objects
73  FullInductionICFactory<EvalType, NumSpaceDim> full_induction_factory;
74  std::string full_ind_error_msg = "None";
75 #endif
76 
77  // Loop over initial conditions
78  const Teuchos::ParameterList& ic_params = block_params.sublist(block_id);
79  for (auto param_itr = ic_params.begin(); param_itr != ic_params.end();
80  ++param_itr)
81  {
82  bool found_model = false;
83 
84  auto key = param_itr->first;
85  const auto& p
86  = Teuchos::getValue<Teuchos::ParameterList>(param_itr->second);
87 
88  if (p.isType<std::string>("Type"))
89  {
90  const std::string type = p.get<std::string>("Type");
91 
92  // Read initial conditions from corresponding fields of the input
93  // mesh file.
94  if (type == "From File")
95  {
96  std::vector<std::string> field_names;
97  panzer::StringTokenizer(
98  field_names, p.get<std::string>("Field Names"), ",", true);
99 
100  // Assume we use the same basis for all DoFs.
101  auto basis = fl.lookupLayout(field_names.at(0));
102 
103  auto plist
104  = Teuchos::ParameterList{}
105  .set("Field Names", Teuchos::rcpFromRef(field_names))
106  .set("Basis", basis);
107 
108  auto eval = Teuchos::rcp(
109  new panzer_stk::GatherFields<EvalType, panzer::Traits>(
110  _mesh, plist));
111  evaluators->push_back(eval);
112  found_model = true;
113  }
114 
115 #ifdef VERTEXCFD_ENABLE_FULL_INDUCTION_MHD
116  if (std::string::npos
117  != full_induction_factory.availableInitialConditions().find(
118  type))
119  {
120  full_induction_factory.buildClosureModel(type,
121  bases,
122  user_params,
123  p,
124  found_model,
125  full_ind_error_msg,
126  evaluators);
127  }
128 #endif
129 
130  if (type == "Constant")
131  {
132  for (const auto& b : bases)
133  {
134  auto eval = Teuchos::rcp(
135  new Constant<EvalType, panzer::Traits>(p, *b));
136  evaluators->push_back(eval);
137  found_model = true;
138  }
139  }
140 
141  if (type == "Gaussian")
142  {
143  for (const auto& b : bases)
144  {
145  auto eval = Teuchos::rcp(
146  new Gaussian<EvalType, panzer::Traits, num_dim_space>(
147  p, *b));
148  evaluators->push_back(eval);
149  found_model = true;
150  }
151  }
152 
153  if (type == "Step")
154  {
155  for (const auto& b : bases)
156  {
157  auto eval = Teuchos::rcp(
158  new Step<EvalType, panzer::Traits>(p, *b));
159  evaluators->push_back(eval);
160  found_model = true;
161  }
162  }
163 
164  if (type == "Circle")
165  {
166  for (const auto& b : bases)
167  {
168  auto eval = Teuchos::rcp(
169  new Circle<EvalType, panzer::Traits, num_dim_space>(
170  p, *b));
171  evaluators->push_back(eval);
172  found_model = true;
173  }
174  }
175 
176  if (type == "InverseGaussian")
177  {
178  for (const auto& b : bases)
179  {
180  auto eval = Teuchos::rcp(
181  new InverseGaussian<EvalType, panzer::Traits, num_dim_space>(
182  p, *b));
183  evaluators->push_back(eval);
184  found_model = true;
185  }
186  }
187 
188  if (type == "MethodManufacturedSolution")
189  {
190  for (const auto& b : bases)
191  {
192  auto eval = Teuchos::rcp(
193  new MethodManufacturedSolution<EvalType,
194  panzer::Traits,
195  num_dim_space>(*b));
196  evaluators->push_back(eval);
197  found_model = true;
198  }
199  }
200 
201  if (type == "IncompressibleVortexInBox")
202  {
203  for (const auto& b : bases)
204  {
205  auto eval = Teuchos::rcp(
206  new IncompressibleVortexInBox<EvalType, panzer::Traits>(
207  *b));
208  evaluators->push_back(eval);
209  found_model = true;
210  }
211  }
212 
213  if (type == "IncompressibleTaylorGreenVortex")
214  {
215  for (const auto& b : bases)
216  {
217  auto eval = Teuchos::rcp(
218  new IncompressibleTaylorGreenVortex<EvalType,
219  panzer::Traits,
220  num_dim_space>(*b));
221  evaluators->push_back(eval);
222  found_model = true;
223  }
224  }
225 
226  if (type == "IncompressibleLaminarFlow")
227  {
228  for (const auto& b : bases)
229  {
230  auto eval = Teuchos::rcp(
231  new IncompressibleLaminarFlow<EvalType,
232  panzer::Traits,
233  num_dim_space>(p, *b));
234  evaluators->push_back(eval);
235  found_model = true;
236  }
237  }
238 
239  if (type == "IncompressibleTurbulentChannel")
240  {
241  for (const auto& b : bases)
242  {
243  auto eval = Teuchos::rcp(
244  new IncompressibleTurbulentChannel<EvalType,
245  panzer::Traits,
246  num_dim_space>(p,
247  *b));
248  evaluators->push_back(eval);
249  found_model = true;
250  }
251  }
252 
253  if (type == "Sinusoidal")
254  {
255  for (const auto& b : bases)
256  {
257  auto eval = Teuchos::rcp(
258  new Sinusoidal<EvalType, panzer::Traits>(p, *b));
259  evaluators->push_back(eval);
260  found_model = true;
261  }
262  }
263 
264  if (type == "IncompressibleLSVOFBubble")
265  {
266  for (const auto& b : bases)
267  {
268  auto eval = Teuchos::rcp(
269  new IncompressibleLSVOFBubble<EvalType,
270  panzer::Traits,
271  num_dim_space>(p, *b));
272  evaluators->push_back(eval);
273  found_model = true;
274  }
275  }
276  }
277 
278  if (!found_model)
279  {
280  std::string msg = "Initial condition " + key
281  + " failed to build.\n";
282  msg += "The initial conditions implemented in VertexCFD are:\n";
283  msg += "Circle\n";
284  msg += "Constant\n";
285  msg += "From File\n";
286  msg += "Gaussian\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";
295  msg += "Step\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;
300 #endif
301  throw std::runtime_error(msg);
302  }
303  }
304 
305  return evaluators;
306 }
307 
308 //---------------------------------------------------------------------------//
309 
310 } // end namespace InitialCondition
311 } // end namespace VertexCFD
312 
313 #endif // end VERTEXCFD_INITIALCONDITIONFACTORY_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23