ARTS 2.5.11 (git: 725533f0)
field.h
Go to the documentation of this file.
1
9#ifndef FIELD_HEADER
10#define FIELD_HEADER
11#include "interpolation.h"
12#include <vector>
13
15template <class base>
16class Field3D {
17 private:
18 size_t mpages, mrows, mcols;
19 std::vector<base> data;
20
21 public:
27 Field3D(const Field3D& g) = default;
28
35 Field3D& operator=(const Field3D& g) = default;
36
43 Field3D& operator=(Field3D&& g) noexcept = default;
44
50 Field3D(Field3D&& g) noexcept
51 : mpages(std::move(g.mpages)),
52 mrows(std::move(g.mrows)),
53 mcols(std::move(g.mcols)),
54 data(std::move(g.data)) {}
55
64 Field3D(size_t pages = 0,
65 size_t rows = 0,
66 size_t cols = 0,
67 const base& init = base())
68 : mpages(pages),
69 mrows(rows),
70 mcols(cols),
71 data(cols * rows * pages, init) {}
72
83 base& operator()(size_t page = 0, size_t row = 0, size_t col = 0) {
84 return data[col + row * mcols + page * mrows * mcols];
85 }
86
97 const base& operator()(size_t col = 0,
98 size_t row = 0,
99 size_t page = 0) const {
100 return data[col + row * mcols + page * mrows * mcols];
101 }
102
103
116 base operator()(const GridPos& page = {0, {0, 1}},
117 const GridPos& row = {0, {0, 1}},
118 const GridPos& col = {0, {0, 1}}) const {
119 const std::array pos{
120 col.idx + 0 + (row.idx + 0) * mcols + (page.idx + 0) * mrows * mcols,
121 col.idx + 1 + (row.idx + 0) * mcols + (page.idx + 0) * mrows * mcols,
122 col.idx + 0 + (row.idx + 1) * mcols + (page.idx + 0) * mrows * mcols,
123 col.idx + 1 + (row.idx + 1) * mcols + (page.idx + 0) * mrows * mcols,
124 col.idx + 0 + (row.idx + 0) * mcols + (page.idx + 1) * mrows * mcols,
125 col.idx + 1 + (row.idx + 0) * mcols + (page.idx + 1) * mrows * mcols,
126 col.idx + 0 + (row.idx + 1) * mcols + (page.idx + 1) * mrows * mcols,
127 col.idx + 1 + (row.idx + 1) * mcols + (page.idx + 1) * mrows * mcols};
128
129 const std::array w{page.fd[1] * row.fd[1] * col.fd[1],
130 page.fd[1] * row.fd[1] * col.fd[0],
131 page.fd[1] * row.fd[0] * col.fd[1],
132 page.fd[1] * row.fd[0] * col.fd[0],
133 page.fd[0] * row.fd[1] * col.fd[1],
134 page.fd[0] * row.fd[1] * col.fd[0],
135 page.fd[0] * row.fd[0] * col.fd[1],
136 page.fd[0] * row.fd[0] * col.fd[0]};
137
138 bool any_base = false;
139 base out;
140 for (size_t i = 0; i < 8; i++) {
141 if (w[i] not_eq 0) {
142 if (any_base)
143 out += w[i] * data[pos[i]];
144 else
145 out = w[i] * data[pos[i]];
146 any_base = true;
147 }
148 }
149 return out;
150 }
151
153 [[nodiscard]] size_t npages() const { return mpages; }
154
156 [[nodiscard]] size_t nrows() const { return mrows; }
157
159 [[nodiscard]] size_t ncols() const { return mcols; }
160
161 friend std::ostream& operator<<(std::ostream& os, const Field3D& v) {
162 for (size_t i = 0; i < v.npages(); i++)
163 for (size_t j = 0; j < v.nrows(); j++)
164 for (size_t k = 0; k < v.ncols(); k++) os << v(i, j, k) << '\n';
165 return os;
166}
167};
168
169#endif // FIELD_HEADER
Creates a 3D field of a base unit.
Definition field.h:16
base operator()(const GridPos &page={0, {0, 1}}, const GridPos &row={0, {0, 1}}, const GridPos &col={0, {0, 1}}) const
Weighted access operator by GridPos.
Definition field.h:116
size_t ncols() const
Number of columns.
Definition field.h:159
std::vector< base > data
Definition field.h:19
Field3D(const Field3D &g)=default
Construct a new Field3D object.
friend std::ostream & operator<<(std::ostream &os, const Field3D &v)
Definition field.h:161
size_t mpages
Definition field.h:18
size_t npages() const
Number of pages.
Definition field.h:153
Field3D(Field3D &&g) noexcept
Construct a new Field3D object.
Definition field.h:50
Field3D & operator=(Field3D &&g) noexcept=default
Default move operator.
base & operator()(size_t page=0, size_t row=0, size_t col=0)
Access operator.
Definition field.h:83
size_t mcols
Definition field.h:18
Field3D(size_t pages=0, size_t rows=0, size_t cols=0, const base &init=base())
Construct a new Field 3 D object.
Definition field.h:64
size_t mrows
Definition field.h:18
size_t nrows() const
Number of rows.
Definition field.h:156
Field3D & operator=(const Field3D &g)=default
Default assignment operator.
const base & operator()(size_t col=0, size_t row=0, size_t page=0) const
Access operator.
Definition field.h:97
Header file for interpolation.cc.
Structure to store a grid position.
std::array< Numeric, 2 > fd
Index idx
#define v
#define w