Cholla 3.0.1-dev
Cholla - Massively parallel hydro on GPUs
Loading...
Searching...
No Matches
field_info.h
Go to the documentation of this file.
1
5#pragma once
6
7#include <optional>
8#include <string>
9#include <string_view>
10#include <vector>
11
12#include "../utils/FrozenKeyIdxBiMap.h"
13
14namespace field
15{
16
17// note: HYDRO includes GasEnergy (if present)
18enum class Kind { HYDRO, PASSIVE_SCALAR, MAGNETIC };
19
21enum class IOBuf { HOST, DEVICE };
22
30{
31 const std::vector<int>& id_vec_;
32
33 public:
34 explicit IdRange(const std::vector<int>& id_vec) : id_vec_(id_vec) {}
35
36 // the fact that the iterator aliases a const iterator of a std::vector is an
37 // implementation detail
38 using iterator = std::vector<int>::const_iterator;
39
40 iterator begin() const { return id_vec_.begin(); }
41 iterator end() const { return id_vec_.end(); }
42};
43
44} // namespace field
45
49{
50 utils::FrozenKeyIdxBiMap name_id_bimap_;
51 std::vector<int> hydro_field_ids_;
52 std::vector<int> scalar_field_ids_;
53 std::vector<int> magnetic_field_ids_;
54 std::vector<field::IOBuf> io_buf_;
55
56 // We make the default-constructor private to force the use of the factory method
57 FieldInfo() = default;
58
62 const std::vector<int>& get_kind_ids_(field::Kind kind) const;
63
64 public:
70 static FieldInfo create();
71
72 FieldInfo(FieldInfo&&) = default;
73 FieldInfo& operator=(FieldInfo&&) = default;
74
75 // we delete copy constructor and copy-assignment to prevent accidental copies
76 // (of course move constructors/move assignment remain possible)
77 // In the unlikely event we decide to support copies, this can always change later...
78 FieldInfo(const FieldInfo&) = delete;
79 FieldInfo& operator=(const FieldInfo&) = delete;
80
82 const utils::FrozenKeyIdxBiMap& get_field_id_map() const { return name_id_bimap_; }
83
85 std::optional<int> field_id(const char* field_name) const { return name_id_bimap_.find(field_name); }
86 std::optional<int> field_id(std::string_view field_name) const { return name_id_bimap_.find(field_name); }
87
89 std::optional<std::string> field_name(int field_id) const
90 {
91 bool bad_id = (field_id < 0 || field_id >= n_fields());
92 return bad_id ? std::nullopt : std::optional<std::string>{name_id_bimap_.inverse_find(field_id)};
93 }
94
105 std::optional<bool> is_cell_centered(int field_id) const
106 {
107 if (field_id < 0 || field_id >= n_fields()) {
108 return std::nullopt;
109 }
110 for (int id : magnetic_field_ids_) {
111 if (field_id == id) {
112 return std::optional<bool>{false};
113 }
114 }
115 return std::optional<bool>{true};
116 }
117
122 std::optional<field::IOBuf> io_buf(int field_id) const
123 {
124 bool bad_id = (field_id < 0 || field_id >= n_fields());
125 return bad_id ? std::nullopt : std::optional<field::IOBuf>{io_buf_[field_id]};
126 }
127
129 int n_fields() const { return static_cast<int>(name_id_bimap_.size()); }
130
132 int n_fields(field::Kind kind) const { return static_cast<int>(get_kind_ids_(kind).size()); }
133
135 std::optional<int> scalar_start() const
136 {
137 return scalar_field_ids_.empty() ? std::nullopt : std::optional<int>{scalar_field_ids_[0]};
138 }
139
149 field::IdRange get_id_range(field::Kind kind) const { return field::IdRange(get_kind_ids_(kind)); }
150};
Definition field_info.h:49
std::optional< bool > is_cell_centered(int field_id) const
Definition field_info.h:105
std::optional< field::IOBuf > io_buf(int field_id) const
Definition field_info.h:122
static FieldInfo create()
Definition field_info.cpp:73
std::optional< int > field_id(const char *field_name) const
Definition field_info.h:85
int n_fields() const
Definition field_info.h:129
std::optional< std::string > field_name(int field_id) const
Definition field_info.h:89
field::IdRange get_id_range(field::Kind kind) const
Definition field_info.h:149
const utils::FrozenKeyIdxBiMap & get_field_id_map() const
Definition field_info.h:82
std::optional< int > scalar_start() const
Definition field_info.h:135
int n_fields(field::Kind kind) const
Definition field_info.h:132
Definition field_info.h:30
A bidirectional map (bimap), specialized to map n unique string keys to unique indexes with values of...
Definition FrozenKeyIdxBiMap.h:111
std::size_t size() const noexcept
Definition FrozenKeyIdxBiMap.h:186
std::optional< int > find(const char *key) const noexcept
Definition FrozenKeyIdxBiMap.cpp:144
std::string inverse_find(int index) const
Definition FrozenKeyIdxBiMap.h:179
IOBuf
Definition field_info.h:21