VertexCFD  0.0-dev
VertexCFD_ClosureModelFactoryTestHarness.hpp
1 #ifndef VERTEXCFD_CLOSUREMODELFACTORYTESTHARNESS_HPP
2 #define VERTEXCFD_CLOSUREMODELFACTORYTESTHARNESS_HPP
3 
4 #include "closure_models/VertexCFD_ClosureModelFactory.hpp"
5 #include "drivers/VertexCFD_MeshManager.hpp"
6 
7 #ifdef VERTEXCFD_ENABLE_FULL_INDUCTION_MHD
8 #include "full_induction_mhd_solver/closure_models/VertexCFD_FullInductionClosureModelFactory.hpp"
9 #include "full_induction_mhd_solver/closure_models/VertexCFD_SolidFullInductionClosureModelFactory.hpp"
10 #endif
11 
12 #include <Panzer_FieldLibrary.hpp>
13 #include <Panzer_IntegrationDescriptor.hpp>
14 #include <Panzer_IntegrationRule.hpp>
15 #include <Panzer_Traits.hpp>
16 
17 #include <Phalanx_FieldManager.hpp>
18 
19 #include <Shards_BasicTopologies.hpp>
20 #include <Shards_CellTopology.hpp>
21 
22 #include <Teuchos_ParameterList.hpp>
23 #include <Teuchos_RCP.hpp>
24 
25 #include <gtest/gtest.h>
26 
27 #include <optional>
28 #include <string>
29 
30 namespace VertexCFD
31 {
32 namespace Test
33 {
34 //---------------------------------------------------------------------------//
35 // Closure model factory test fixture.
36 template<class EvalType>
38 {
39  int num_evaluators = 1;
40  int eval_index = 0;
41  std::string type_name{"!!! UNDEFINED !!!"};
42  std::string eval_name{"!!! UNDEFINED !!!"};
43  std::optional<std::string> factory_type;
44  Teuchos::ParameterList user_params{"User Data"};
45  Teuchos::ParameterList model_params{"Model Data"};
46  Teuchos::ParameterList closure_params{"Closure Models"};
47  const std::string model_id{"Test Model"};
48 
50  {
51  auto comm = Teuchos::rcp_dynamic_cast<const Teuchos::MpiComm<int>>(
52  Teuchos::DefaultComm<int>::getComm());
53  const Parameter::ParameterDatabase parameter_db(comm);
54 
55  auto mesh_params = parameter_db.meshParameters();
56  mesh_params->set("Mesh Input Type", "Inline");
57  auto& inline_params = mesh_params->sublist("Inline");
58  inline_params.set("Element Type", "Tet4");
59  auto& mesh_details = inline_params.sublist("Mesh");
60  mesh_details.set("X0", 0.0);
61  mesh_details.set("Xf", 1.0);
62  mesh_details.set("X Elements", 1);
63  mesh_details.set("Y0", -1.0);
64  mesh_details.set("Yf", 1.0);
65  mesh_details.set("Y Elements", 1);
66  mesh_details.set("Z0", -1.0);
67  mesh_details.set("Zf", 1.0);
68  mesh_details.set("Z Elements", 1);
69 
70  const Teuchos::RCP<MeshManager> mesh_manager{
71  Teuchos::rcp(new MeshManager(parameter_db, comm))};
72  user_params.set<const Teuchos::RCP<MeshManager>>("MeshManager",
73  mesh_manager);
74  mesh_manager->completeMeshConstruction();
75  }
76 
77  template<class Evaluator, int NumSpaceDim>
78  void buildAndTest()
79  {
80  constexpr int num_space_dim = NumSpaceDim;
81 
82  // Set up closure parameter model
83  model_params.set("Type", type_name);
84  closure_params
85  .sublist(model_id) // Model ID sublist
86  .set("Model Data", model_params); // sublist for Model Data
87  if (factory_type)
88  {
89  closure_params.sublist(model_id).set("Closure Factory Type",
90  *factory_type);
91  }
92  else // Navier-Stokes case
93  {
94  num_evaluators = 2;
95  eval_index = 1;
96  }
97 
98  // Set up a trivial integration_rule for the factory.
99  const panzer::IntegrationDescriptor integration_desc(
100  0, panzer::IntegrationDescriptor::VOLUME);
101  auto cell_topo = Teuchos::rcp(new shards::CellTopology(
102  shards::getCellTopologyData<shards::Quadrilateral<4>>()));
103  const int num_cells = 0;
104  auto integration_rule = Teuchos::rcp(new panzer::IntegrationRule(
105  integration_desc, cell_topo, num_cells));
106 
107  // This is unused but passed by non-const reference, so cannot be
108  // constructed in the argument list.
109  PHX::FieldManager<panzer::Traits> fm;
110 
112  auto evaluators = factory.buildClosureModels(
113  model_id,
114  closure_params,
115  panzer::FieldLayoutLibrary{}, // unused
116  integration_rule,
117  Teuchos::ParameterList{}, // unused (default_params)
118  user_params,
119  Teuchos::null, // unused (global_data)
120  fm);
121 
122 #ifdef VERTEXCFD_ENABLE_FULL_INDUCTION_MHD
124  fim_factory{};
125  auto fim_evals = fim_factory.buildClosureModels(
126  model_id,
127  closure_params,
128  panzer::FieldLayoutLibrary{}, // unused
129  integration_rule,
130  Teuchos::ParameterList{}, // unused (default_params)
131  user_params,
132  Teuchos::null, // unused (global_data)
133  fm);
134  evaluators->insert(
135  evaluators->end(), fim_evals->begin(), fim_evals->end());
136 
138  sfim_factory{};
139  auto sfim_evals = sfim_factory.buildClosureModels(
140  model_id,
141  closure_params,
142  panzer::FieldLayoutLibrary{}, // unused
143  integration_rule,
144  Teuchos::ParameterList{}, // unused (default_params)
145  user_params,
146  Teuchos::null, // unused (global_data)
147  fm);
148  evaluators->insert(
149  evaluators->end(), sfim_evals->begin(), sfim_evals->end());
150 #endif
151 
152  // Make sure the factory returned something.
153  ASSERT_FALSE(evaluators.is_null());
154 
155  // The factory should return the given number of evaluators.
156  ASSERT_EQ(num_evaluators, evaluators->size());
157 
158  // Check evaluator at the given index
159  auto eval = evaluators->at(eval_index);
160 
161  // The evaluator should be castable to the derived evaluator type.
162  auto evalPtr = dynamic_cast<Evaluator*>(eval.get());
163  EXPECT_NE(nullptr, evalPtr) << "Factory returned unexpected "
164  "evaluator.";
165 
166  // The evaluator should have the expected name.
167  EXPECT_EQ(eval_name, eval->getName());
168  }
169 };
170 
171 } // namespace Test
172 } // namespace VertexCFD
173 
174 #endif // VERTEXCFD_CLOSUREMODELFACTORYTESTHARNESS_HPP
VertexCFD::ClosureModel::SolidFullInductionFactory
Definition: VertexCFD_SolidFullInductionClosureModelFactory.hpp:19
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23
VertexCFD::Parameter::ParameterDatabase
Definition: VertexCFD_ParameterDatabase.hpp:16
VertexCFD::ClosureModel::FullInductionFactory::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_FullInductionClosureModelFactory_impl.hpp:34
VertexCFD::ClosureModel::FullInductionFactory
Definition: VertexCFD_FullInductionClosureModelFactory.hpp:19
VertexCFD::ClosureModel::SolidFullInductionFactory::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_SolidFullInductionClosureModelFactory_impl.hpp:33
VertexCFD::Test::ClosureModelFactoryTestFixture
Definition: VertexCFD_ClosureModelFactoryTestHarness.hpp:38
VertexCFD::MeshManager
Definition: VertexCFD_MeshManager.hpp:24
VertexCFD::ClosureModel::Factory
Definition: VertexCFD_ClosureModelFactory.hpp:15