VertexCFD  0.0-dev
VertexCFD_IncompressibleClosureModelFactory_impl.hpp
1 #ifndef VERTEXCFD_INCOMPRESSIBLECLOSUREMODELFACTORY_IMPL_HPP
2 #define VERTEXCFD_INCOMPRESSIBLECLOSUREMODELFACTORY_IMPL_HPP
3 
4 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleBuoyancySource.hpp"
5 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleConstantSource.hpp"
6 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleConvectiveFlux.hpp"
7 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleConvectiveFluxMachineLearning.hpp"
8 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleEnstrophy.hpp"
9 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleErrorNorms.hpp"
10 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleGradDiv.hpp"
11 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleLiftDrag.hpp"
12 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleLocalTimeStepSize.hpp"
13 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleNusseltNumber.hpp"
14 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressiblePlanarPoiseuilleExact.hpp"
15 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleRotatingAnnulusExact.hpp"
16 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleSUPGExactSolution.hpp"
17 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleSUPGFlux.hpp"
18 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleShearVariables.hpp"
19 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleTauSUPG.hpp"
20 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleTaylorGreenVortexExactSolution.hpp"
21 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleTimeDerivative.hpp"
22 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleViscousFlux.hpp"
23 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleViscousHeat.hpp"
24 #include "incompressible_solver/closure_models/VertexCFD_IncompressibleClosureModelFactory.hpp"
25 
26 #include "closure_models/VertexCFD_Closure_MethodManufacturedSolution.hpp"
27 #include "closure_models/VertexCFD_Closure_MethodManufacturedSolutionSource.hpp"
28 
29 namespace VertexCFD
30 {
31 namespace ClosureModel
32 {
33 //---------------------------------------------------------------------------//
34 template<class EvalType, int NumSpaceDim>
35 void IncompressibleFactory<EvalType, NumSpaceDim>::buildClosureModel(
36  const std::string& closure_type,
37  const Teuchos::RCP<panzer::IntegrationRule>& ir,
38  const Teuchos::RCP<panzer::GlobalData>& global_data,
39  const Teuchos::ParameterList& fluid_params,
40  const Teuchos::ParameterList& user_params,
41  const Teuchos::ParameterList& closure_params,
42  const bool use_turbulence_model,
43  bool& found_model,
44  std::string& error_msg,
45  Teuchos::RCP<std::vector<Teuchos::RCP<PHX::Evaluator<panzer::Traits>>>>
46  evaluators)
47 {
48  // Define local variables
49  constexpr int num_space_dim = NumSpaceDim;
50  const Teuchos::RCP<PHX::Evaluator<panzer::Traits>> eval;
51 
52  // Stability parameter list
53  const Teuchos::ParameterList stability_param_list
54  = user_params.sublist("Stability Parameters");
55 
56  // Closure models
57  if (closure_type == "IncompressibleTimeDerivative")
58  {
59  auto eval = Teuchos::rcp(
60  new IncompressibleTimeDerivative<EvalType, panzer::Traits, num_space_dim>(
61  *ir, fluid_params));
62  evaluators->push_back(eval);
63  found_model = true;
64  }
65 
66  if (closure_type == "IncompressibleLiftDrag")
67  {
68  auto eval = Teuchos::rcp(
69  new IncompressibleLiftDrag<EvalType, panzer::Traits, num_space_dim>(
70  *ir, user_params, use_turbulence_model));
71  evaluators->push_back(eval);
72  found_model = true;
73  }
74 
75  if (closure_type == "IncompressibleConvectiveFlux")
76  {
77  auto eval = Teuchos::rcp(
78  new IncompressibleConvectiveFlux<EvalType, panzer::Traits, num_space_dim>(
79  *ir, fluid_params));
80  evaluators->push_back(eval);
81  found_model = true;
82  }
83 
84 #ifdef VERTEXCFD_HAVE_TENSORFLOW
85  if (closure_type == "IncompressibleConvectiveFluxMachineLearning")
86  {
87  auto eval = Teuchos::rcp(
88  new IncompressibleConvectiveFluxMachineLearning<EvalType,
89  panzer::Traits,
90  num_space_dim>(
91  *ir, fluid_params, closure_params));
92  evaluators->push_back(eval);
93  found_model = true;
94  }
95 #else
96  (void)closure_params;
97 #endif
98 
99  if (closure_type == "IncompressibleViscousFlux")
100  {
101  auto eval = Teuchos::rcp(
102  new IncompressibleViscousFlux<EvalType, panzer::Traits, num_space_dim>(
103  *ir, fluid_params, user_params, use_turbulence_model));
104  evaluators->push_back(eval);
105  found_model = true;
106  }
107 
108  if (closure_type == "IncompressibleGradDiv")
109  {
110  auto eval = Teuchos::rcp(
111  new IncompressibleGradDiv<EvalType, panzer::Traits, num_space_dim>(
112  *ir, stability_param_list));
113  evaluators->push_back(eval);
114  found_model = true;
115  }
116 
117  if (closure_type == "IncompressibleLocalTimeStepSize")
118  {
119  auto eval = Teuchos::rcp(
120  new IncompressibleLocalTimeStepSize<EvalType,
121  panzer::Traits,
122  num_space_dim>(*ir));
123  evaluators->push_back(eval);
124  found_model = true;
125  }
126 
127  if (closure_type == "IncompressibleConstantSource")
128  {
129  auto eval = Teuchos::rcp(
130  new IncompressibleConstantSource<EvalType, panzer::Traits, num_space_dim>(
131  *ir, fluid_params, global_data, closure_params));
132  evaluators->push_back(eval);
133  found_model = true;
134  }
135 
136  if (closure_type == "IncompressibleBuoyancySource")
137  {
138  auto eval = Teuchos::rcp(
139  new IncompressibleBuoyancySource<EvalType, panzer::Traits, num_space_dim>(
140  *ir, fluid_params, user_params));
141  evaluators->push_back(eval);
142  found_model = true;
143  }
144 
145  if (closure_type == "IncompressibleViscousHeat")
146  {
147  auto eval = Teuchos::rcp(
148  new IncompressibleViscousHeat<EvalType, panzer::Traits, num_space_dim>(
149  *ir));
150  evaluators->push_back(eval);
151  found_model = true;
152  }
153 
154  if (closure_type == "IncompressibleRotatingAnnulusExact")
155  {
156  auto eval = Teuchos::rcp(
157  new IncompressibleRotatingAnnulusExact<EvalType,
158  panzer::Traits,
159  num_space_dim>(
160  *ir, closure_params));
161  evaluators->push_back(eval);
162  found_model = true;
163  }
164 
165  if (closure_type == "IncompressiblePlanarPoiseuilleExact")
166  {
167  auto eval = Teuchos::rcp(
168  new IncompressiblePlanarPoiseuilleExact<EvalType,
169  panzer::Traits,
170  num_space_dim>(
171  *ir, closure_params));
172  evaluators->push_back(eval);
173  found_model = true;
174  }
175 
176  if (closure_type == "IncompressibleErrorNorm")
177  {
178  auto eval = Teuchos::rcp(
179  new IncompressibleErrorNorms<EvalType, panzer::Traits, num_space_dim>(
180  *ir, fluid_params));
181  evaluators->push_back(eval);
182  found_model = true;
183  }
184 
185  if (closure_type == "IncompressibleTaylorGreenVortexExactSolution")
186  {
187  auto eval = Teuchos::rcp(
188  new IncompressibleTaylorGreenVortexExactSolution<EvalType,
189  panzer::Traits,
190  num_space_dim>(
191  *ir, closure_params));
192  evaluators->push_back(eval);
193  found_model = true;
194  }
195 
196  if (closure_type == "IncompressibleShearVariables")
197  {
198  auto eval = Teuchos::rcp(
199  new IncompressibleShearVariables<EvalType, panzer::Traits, num_space_dim>(
200  *ir));
201  evaluators->push_back(eval);
202  found_model = true;
203  }
204 
205  if (closure_type == "IncompressibleNusseltNumber")
206  {
207  auto eval = Teuchos::rcp(
208  new IncompressibleNusseltNumber<EvalType, panzer::Traits>(*ir));
209  evaluators->push_back(eval);
210  found_model = true;
211  }
212 
213  if (closure_type == "IncompressibleEnstrophy")
214  {
215  auto eval = Teuchos::rcp(
216  new IncompressibleEnstrophy<EvalType, panzer::Traits, num_space_dim>(
217  *ir));
218  evaluators->push_back(eval);
219  found_model = true;
220  }
221 
222  if (closure_type == "IncompressibleTauSUPG")
223  {
224  auto eval = Teuchos::rcp(
225  new IncompressibleTauSUPG<EvalType, panzer::Traits, num_space_dim>(
226  *ir, fluid_params, closure_params));
227  evaluators->push_back(eval);
228  found_model = true;
229  }
230 
231  if (closure_type == "IncompressibleSUPGFlux")
232  {
233  auto eval = Teuchos::rcp(
234  new IncompressibleSUPGFlux<EvalType, panzer::Traits, num_space_dim>(
235  *ir, fluid_params, closure_params));
236  evaluators->push_back(eval);
237  found_model = true;
238  }
239 
240  if (closure_type == "IncompressibleSUPGExactSolution")
241  {
242  auto eval
243  = Teuchos::rcp(new IncompressibleSUPGExactSolution<EvalType,
244  panzer::Traits,
245  num_space_dim>(
246  *ir, closure_params));
247  evaluators->push_back(eval);
248  found_model = true;
249  }
250 
251  // NOTE: the method of manufactured solution (MMS) is kept here
252  // as a template for future use. This is currently not used in any input
253  // files.
254  if (closure_type == "MethodManufacturedSolution")
255  {
256  auto eval = Teuchos::rcp(
257  new MethodManufacturedSolution<EvalType, panzer::Traits, num_space_dim>(
258  *ir));
259  evaluators->push_back(eval);
260  found_model = true;
261  }
262 
263  if (closure_type == "MethodManufacturedSolutionSource")
264  {
265  bool build_viscous_flux = true;
266  if (fluid_params.isType<bool>("Build Viscous Flux"))
267  {
268  build_viscous_flux = fluid_params.get<bool>("Build Viscous Flux");
269  }
270  auto eval
271  = Teuchos::rcp(new MethodManufacturedSolutionSource<EvalType,
272  panzer::Traits,
273  num_space_dim>(
274  *ir, build_viscous_flux, closure_params));
275  evaluators->push_back(eval);
276  found_model = true;
277  }
278 
279  // Initialize 'error_msg' with list of closure models for incompressible
280  // NS equations
281  error_msg += "IncompressibleBuoyancySource\n";
282  error_msg += "IncompressibleConstantSource\n";
283  error_msg += "IncompressibleConvectiveFlux\n";
284  error_msg += "IncompressibleConvectiveFluxMachineLearning\n";
285  error_msg += "IncompressibleEnstrophy\n";
286  error_msg += "IncompressibleErrorNorm\n";
287  error_msg += "IncompressibleGradDiv\n";
288  error_msg += "IncompressibleLiftDrag\n";
289  error_msg += "IncompressibleLocalTimeStepSize\n";
290  error_msg += "IncompressibleNusseltNumber\n";
291  error_msg += "IncompressiblePlanarPoiseuilleExact\n";
292  error_msg += "IncompressibleRotatingAnnulusExact\n";
293  error_msg += "IncompressibleShearVariables\n";
294  error_msg += "IncompressibleSUPGExactSolution\n";
295  error_msg += "IncompressibleSUPGFlux\n";
296  error_msg += "IncompressibleTauSUPG\n";
297  error_msg += "IncompressibleTimeDerivative\n";
298  error_msg += "IncompressibleViscousFlux\n";
299  error_msg += "IncompressibleViscousHeat\n";
300  error_msg += "MethodManufacturedSolution\n";
301  error_msg += "MethodManufacturedSolutionSource\n";
302 }
303 
304 //---------------------------------------------------------------------------//
305 
306 } // end namespace ClosureModel
307 } // end namespace VertexCFD
308 
309 #endif // end VERTEXCFD_INCOMPRESSIBLECLOSUREMODELFACTORY_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23