numerics 0.1.0
Loading...
Searching...
No Matches
field3d.hpp
Go to the documentation of this file.
1/// @file fields/field3d.hpp
2/// @brief 3D scalar and vector fields on uniform Cartesian grids.
3///
4/// A ScalarField3D is geometry (Grid3D) + values (num::Vector), mirroring the
5/// 2D ScalarField2D design. Because the values live in a num::Vector, the field
6/// plugs straight into linear solvers and operators via .vec() with no copy.
7#pragma once
8
9#include "core/vector.hpp"
10#include "fields/grid3d.hpp"
11#include <array>
12#include <utility>
13
14namespace num {
15
17public:
19 int ny,
20 int nz,
21 float dx,
22 float ox = 0.0f,
23 float oy = 0.0f,
24 float oz = 0.0f)
25 : grid_{nx,
26 ny,
27 nz,
28 static_cast<double>(dx),
29 static_cast<double>(ox),
30 static_cast<double>(oy),
31 static_cast<double>(oz)},
32 data_(static_cast<idx>(grid_.size())) {}
33
34 template<typename F>
36 int ny,
37 int nz,
38 float dx,
39 F&& f,
40 float ox = 0.0f,
41 float oy = 0.0f,
42 float oz = 0.0f)
43 : ScalarField3D(nx, ny, nz, dx, ox, oy, oz) {
44 fill(std::forward<F>(f));
45 }
46
47 const Grid3D& grid() const { return grid_; }
48
49 int nx() const { return grid_.nx; }
50 int ny() const { return grid_.ny; }
51 int nz() const { return grid_.nz; }
52 float dx() const { return static_cast<float>(grid_.dx); }
53 float ox() const { return static_cast<float>(grid_.ox); }
54 float oy() const { return static_cast<float>(grid_.oy); }
55 float oz() const { return static_cast<float>(grid_.oz); }
56
57 real& operator()(int i, int j, int k) { return data_[grid_.flat(i, j, k)]; }
58 real operator()(int i, int j, int k) const { return data_[grid_.flat(i, j, k)]; }
59
60 void set(int i, int j, int k, double v) {
61 data_[grid_.flat(i, j, k)] = static_cast<real>(v);
62 }
63
64 void fill(double v) {
65 for (idx n = 0; n < data_.size(); ++n)
66 data_[n] = static_cast<real>(v);
67 }
68
69 /// Fill every node with f(i, j, k).
70 template<typename F>
71 void fill(F&& f) {
72 for (int k = 0; k < grid_.nz; ++k)
73 for (int j = 0; j < grid_.ny; ++j)
74 for (int i = 0; i < grid_.nx; ++i)
75 data_[grid_.flat(i, j, k)] = static_cast<real>(f(i, j, k));
76 }
77
78 Vector& vec() { return data_; }
79 const Vector& vec() const { return data_; }
80 real* data() { return data_.data(); }
81 const real* data() const { return data_.data(); }
82 idx size() const { return data_.size(); }
83
84 float sample(float x, float y, float z) const;
85
86private:
87 Grid3D grid_;
88 Vector data_;
89};
90
93
94 VectorField3D(int nx,
95 int ny,
96 int nz,
97 float dx,
98 float ox = 0.0f,
99 float oy = 0.0f,
100 float oz = 0.0f);
101
102 std::array<float, 3> sample(float px, float py, float pz) const;
103
104 void scale(float s);
105};
106
107} // namespace num
constexpr idx size() const noexcept
Definition vector.hpp:83
void set(int i, int j, int k, double v)
Definition field3d.hpp:60
idx size() const
Definition field3d.hpp:82
float oy() const
Definition field3d.hpp:54
real operator()(int i, int j, int k) const
Definition field3d.hpp:58
const real * data() const
Definition field3d.hpp:81
Vector & vec()
Definition field3d.hpp:78
const Vector & vec() const
Definition field3d.hpp:79
float ox() const
Definition field3d.hpp:53
void fill(F &&f)
Fill every node with f(i, j, k).
Definition field3d.hpp:71
int nx() const
Definition field3d.hpp:49
ScalarField3D(int nx, int ny, int nz, float dx, F &&f, float ox=0.0f, float oy=0.0f, float oz=0.0f)
Definition field3d.hpp:35
real & operator()(int i, int j, int k)
Definition field3d.hpp:57
float dx() const
Definition field3d.hpp:52
float sample(float x, float y, float z) const
Definition fields.cpp:9
ScalarField3D(int nx, int ny, int nz, float dx, float ox=0.0f, float oy=0.0f, float oz=0.0f)
Definition field3d.hpp:18
int ny() const
Definition field3d.hpp:50
const Grid3D & grid() const
Definition field3d.hpp:47
float oz() const
Definition field3d.hpp:55
int nz() const
Definition field3d.hpp:51
void fill(double v)
Definition field3d.hpp:64
3D uniform Cartesian grid: geometry only, no field data.
double real
Definition types.hpp:10
std::size_t idx
Definition types.hpp:11
idx flat(int i, int j, int k) const
Definition grid3d.hpp:21
double dx
uniform cell size
Definition grid3d.hpp:16
double ox
Definition grid3d.hpp:17
double oy
Definition grid3d.hpp:17
double oz
origin (physical coordinate of node 0)
Definition grid3d.hpp:17
int nz
nodes per axis
Definition grid3d.hpp:15
std::array< float, 3 > sample(float px, float py, float pz) const
Definition fields.cpp:46
ScalarField3D z
Definition field3d.hpp:92
ScalarField3D x
Definition field3d.hpp:92
void scale(float s)
Definition fields.cpp:50
ScalarField3D y
Definition field3d.hpp:92
Dense vector storage and operations.