VertexCFD  0.0-dev
VertexCFD_Utils_ScalarToVector.hpp
1 #ifndef VERTEXCFD_UTILS_SCALARTOVECTOR_HPP
2 #define VERTEXCFD_UTILS_SCALARTOVECTOR_HPP
3 
4 #include <Panzer_Dimension.hpp>
5 #include <Panzer_Evaluator_WithBaseImpl.hpp>
6 #include <Panzer_IntegrationRule.hpp>
7 #include <Panzer_Traits.hpp>
8 
9 #include <Teuchos_RCP.hpp>
10 
11 #include <Phalanx_DataLayout.hpp>
12 #include <Phalanx_Evaluator_Derived.hpp>
13 #include <Phalanx_MDField.hpp>
14 
15 #include <optional>
16 #include <string>
17 #include <vector>
18 
19 namespace VertexCFD
20 {
21 namespace Utils
22 {
23 //---------------------------------------------------------------------------//
24 template<typename EvalType, typename NewTag>
25 class ScalarToVector : public panzer::EvaluatorWithBaseImpl<panzer::Traits>,
26  public PHX::EvaluatorDerived<EvalType, panzer::Traits>
27 {
28  public:
29  // Create a vector field, vector_name, from a set of scalar fields,
30  // vector_name_0, vector_name_1, ...
31  static auto createFromIndexed(const panzer::IntegrationRule& ir,
32  const std::string& vector_name,
33  const int num_scalars,
34  const bool time_deriv,
35  const bool grads);
36 
37  // Create a vector field, vector_name, from a set of scalar fields,
38  // vector_name_(scalar_suffixes[0]), vector_name_(scalar_suffixes[1]), ...
39  //
40  // If an (optional) suffix is unset, the respective entry in the vector
41  // field will be initialized to NaN and must be set elsewhere.
42  static auto createFromSuffixed(
43  const panzer::IntegrationRule& ir,
44  const std::string& vector_name,
45  const std::vector<std::optional<std::string>>& scalar_suffixes,
46  const bool time_deriv,
47  const bool grads);
48 
49  // Create a vector field, vector_name, from a list of scalar field names
50  static auto createFromList(const panzer::IntegrationRule& ir,
51  const std::string& vector_name,
52  const std::vector<std::string>& num_scalars,
53  const bool time_deriv,
54  const bool grads);
55 
56  void evaluateFields(typename panzer::Traits::EvalData) override;
57 
58  private:
59  template<typename T>
60  using VecOpt = std::vector<std::optional<T>>;
61 
62  // Constuct the evaluator
63  ScalarToVector(const panzer::IntegrationRule& ir,
64  const std::string& vector_name,
65  const VecOpt<std::string>& scalar_names,
66  const bool time_deriv,
67  const bool grads);
68 
69  using ScalarT = typename EvalType::ScalarT;
70 
71  // Helper to add fields
72  template<typename... ScalarTags>
73  void
74  addFields(const char* prefix,
75  PHX::MDField<ScalarT, ScalarTags..., NewTag>& vector_field,
76  VecOpt<PHX::MDField<const ScalarT, ScalarTags...>>& scalar_fields,
77  const Teuchos::RCP<PHX::DataLayout>& scalar_layout);
78 
79  // Helper to evaluate/copy fields
80  template<typename... ScalarTags>
81  void copyFields(
82  PHX::MDField<ScalarT, ScalarTags..., NewTag>& vector_field,
83  VecOpt<PHX::MDField<const ScalarT, ScalarTags...>>& scalar_fields);
84 
85  const std::string _vector_name;
86  const VecOpt<std::string> _scalar_names;
87 
88  // Dependent scalar fields
89  VecOpt<PHX::MDField<const ScalarT, panzer::Cell, panzer::Point>> _scalar_fields;
90  VecOpt<PHX::MDField<const ScalarT, panzer::Cell, panzer::Point>>
91  _scalar_dxdt_fields;
92  VecOpt<PHX::MDField<const ScalarT, panzer::Cell, panzer::Point, panzer::Dim>>
93  _scalar_grad_fields;
94 
95  public:
96  // Evaluated vector fields
97  PHX::MDField<ScalarT, panzer::Cell, panzer::Point, NewTag> _vector_field;
98  PHX::MDField<ScalarT, panzer::Cell, panzer::Point, NewTag> _vector_dxdt_field;
99  PHX::MDField<ScalarT, panzer::Cell, panzer::Point, panzer::Dim, NewTag>
100  _vector_grad_field;
101 };
102 //---------------------------------------------------------------------------//
103 
104 } // namespace Utils
105 } // namespace VertexCFD
106 
107 #include "VertexCFD_Utils_ScalarToVector_impl.hpp"
108 
109 #endif // VERTEXCFD_UTILS_SCALARTOVECTOR_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23
VertexCFD::Utils::ScalarToVector
Definition: VertexCFD_Utils_ScalarToVector.hpp:27