omega_h
Reliable mesh adaptation
Omega_h_tag.hpp
1 #ifndef OMEGA_H_TAG_HPP
2 #define OMEGA_H_TAG_HPP
3 
4 #include <unordered_map>
5 #include <Omega_h_array.hpp>
6 #ifdef OMEGA_H_USE_MPI
7 #include <mpi.h>
8 #endif
9 
10 namespace Omega_h {
11 
12 inline void check_tag_name(std::string const& name) {
13  OMEGA_H_CHECK(!name.empty());
14 }
15 
16 enum class ArrayType {
17  VectorND, // vector with N components
18  SymmetricSquareMatrix, // symmetric matrix with dim*(dim+1)/2 components
19 };
20 
21  const std::unordered_map<ArrayType, std::string> ArrayTypeNames = {
22  {ArrayType::VectorND, "VectorND"},
23  {ArrayType::SymmetricSquareMatrix, "SymmetricSquareMatrix"}
24 };
25 
26 const std::unordered_map<std::string, ArrayType> NamesToArrayType = {
27  {"VectorND", ArrayType::VectorND},
28  {"SymmetricSquareMatrix", ArrayType::SymmetricSquareMatrix}
29 };
30 
31 class TagBase {
32  public:
33  TagBase(std::string const& name_in, Int ncomps_in);
34  TagBase(std::string const& name_in, Int ncomps_in, LOs class_ids_in);
35  TagBase(std::string const& name_in, Int ncomps_in, ArrayType array_type_in);
36  TagBase(std::string const& name_in, Int ncomps_in, LOs class_ids_in,
37  ArrayType array_type_in);
38  virtual ~TagBase();
39  std::string const& name() const;
40  Int ncomps() const;
41  virtual Omega_h_Type type() const = 0;
42  LOs class_ids() const;
43  ArrayType array_type() const;
44 
45  private:
46  std::string name_;
47  Int ncomps_;
48  LOs class_ids_;
49  ArrayType array_type_ = ArrayType::VectorND;
50 };
51 
52 template <typename T>
53 class Tag : public TagBase {
54  public:
55  Tag(std::string const& name_in, Int ncomps_in);
56  Tag(std::string const& name_in, Int ncomps_in, LOs class_ids_in);
57  Tag(std::string const& name_in, Int ncomps_in, ArrayType array_type_in);
58  Tag(std::string const& name_in, Int ncomps_in, LOs class_ids_in,
59  ArrayType array_type_in);
60  Read<T> array() const;
61  void set_array(Read<T> array_in);
62  virtual Omega_h_Type type() const override;
63 
64  private:
65  Read<T> array_;
66 };
67 
68 template <typename T>
69 bool is(TagBase const* t);
70 
71 template <typename T>
72 Tag<T> const* as(TagBase const* t);
73 template <typename T>
74 Tag<T>* as(TagBase* t);
75 
76 #define OMEGA_H_EXPL_INST_DECL(T) \
77  extern template bool is<T>(TagBase const* t); \
78  extern template Tag<T> const* as<T>(TagBase const* t); \
79  extern template Tag<T>* as<T>(TagBase * t); \
80  extern template class Tag<T>;
81 OMEGA_H_EXPL_INST_DECL(I8)
82 OMEGA_H_EXPL_INST_DECL(I32)
83 OMEGA_H_EXPL_INST_DECL(I64)
84 OMEGA_H_EXPL_INST_DECL(Real)
85 #undef OMEGA_H_EXPL_INST_DECL
86 
87 } // namespace Omega_h
88 
89 #endif
Definition: Omega_h_tag.hpp:31
Definition: Omega_h_tag.hpp:53
Definition: amr_mpi_test.cpp:6