36 for (
int i = 0; i < N; ++i) {
37 for (
int j = 0; j < N; ++j) {
62 for (
int i = 0; i < N; ++i) {
63 int ip = (i + 1) % N, im = (i + N - 1) % N;
64 const T* row = x.
data() + i * N;
65 const T* row_p = x.
data() + ip * N;
66 const T* row_m = x.
data() + im * N;
67 T* d = y.
data() + i * N;
70 d[0] = row_p[0] + row_m[0] + row[1] + row[N - 1] - T(4) * row[0];
72 for (
int j = 1; j < N - 1; ++j)
73 d[j] = row_p[j] + row_m[j] + row[j + 1] + row[j - 1]
76 d[N - 1] = row_p[N - 1] + row_m[N - 1] + row[0] + row[N - 2]
96 for (
int i = 0; i < N; ++i) {
97 for (
int j = 0; j < N; ++j) {
99 T val = T(-30) * x[k];
101 if (i > 0) val += T(16) * x[(i - 1) * N + j];
102 if (i < N - 1) val += T(16) * x[(i + 1) * N + j];
104 if (i > 1) val -= x[(i - 2) * N + j];
105 if (i < N - 2) val -= x[(i + 2) * N + j];
107 if (j > 0) val += T(16) * x[k - 1];
108 if (j < N - 1) val += T(16) * x[k + 1];
110 if (j > 1) val -= x[k - 2];
111 if (j < N - 2) val -= x[k + 2];
144 real fx = std::fmod((px - ox) / h,
static_cast<real>(N));
145 real fy = std::fmod((py - oy) / h,
static_cast<real>(N));
150 idx i0 =
static_cast<idx>(fx) % N;
151 idx i1 = (i0 + 1) % N;
152 real fi = fx - std::floor(fx);
153 idx j0 =
static_cast<idx>(fy) % N;
154 idx j1 = (j0 + 1) % N;
155 real fj = fy - std::floor(fy);
156 return (1 - fi) * (1 - fj) * field[i0 * N + j0]
157 + fi * (1 - fj) * field[i1 * N + j0]
158 + (1 - fi) * fj * field[i0 * N + j1] + fi * fj * field[i1 * N + j1];
167template<
typename T,
typename F>
169 std::vector<T> fiber(N);
170 for (
int j = 0; j < N; ++j) {
171 for (
int i = 0; i < N; ++i)
172 fiber[i] = data[i * N + j];
174 for (
int i = 0; i < N; ++i)
175 data[i * N + j] = fiber[i];
183template<
typename T,
typename F>
185 std::vector<T> fiber(N);
186 for (
int i = 0; i < N; ++i) {
187 for (
int j = 0; j < N; ++j)
188 fiber[j] = data[i * N + j];
190 for (
int j = 0; j < N; ++j)
191 data[i * N + j] = fiber[j];
201 for (
int i = 0; i < N; ++i) {
202 double xi = (i + 1) * h;
203 for (
int j = 0; j < N; ++j) {
204 u[
static_cast<std::size_t
>(i) * N + j] = f(xi, (j + 1) * h);
213 s.reserve(
static_cast<std::size_t
>(N));
214 for (
int j = 0; j < N; ++j) {
215 s.
store((j + 1) * h, u[
static_cast<std::size_t
>(row) * N + j]);
224 s.reserve(
static_cast<std::size_t
>(N));
225 for (
int i = 0; i < N; ++i) {
226 s.
store((i + 1) * h, u[
static_cast<std::size_t
>(i) * N + col]);
262 heatmap<ScalarField2D>(g, g.
N(), g.
h(), vmin, vmax);
279 auto flat = [&](
int i,
int j,
int k) ->
idx {
280 return static_cast<idx>(k * ny * nx + j * nx + i);
282 for (
int k = 0; k < nz; ++k)
283 for (
int j = 0; j < ny; ++j)
284 for (
int i = 0; i < nx; ++i) {
285 idx id = flat(i, j, k);
286 if (i == 0 || i == nx - 1 || j == 0 || j == ny - 1 || k == 0
291 * (6.0 * x[id] - x[flat(i + 1, j, k)]
292 - x[flat(i - 1, j, k)] - x[flat(i, j + 1, k)]
293 - x[flat(i, j - 1, k)] - x[flat(i, j, k + 1)]
294 - x[flat(i, j, k - 1)]);
303 int nx =
phi.nx(), ny =
phi.ny(), nz =
phi.nz();
304 double inv2dx = 1.0 / (2.0 *
phi.dx());
305 for (
int k = 0; k < nz; ++k)
306 for (
int j = 0; j < ny; ++j)
307 for (
int i = 0; i < nx; ++i) {
308 int ip = std::min(i + 1, nx - 1), im = std::max(i - 1, 0);
309 int jp = std::min(j + 1, ny - 1), jm = std::max(j - 1, 0);
310 int kp = std::min(k + 1, nz - 1), km = std::max(k - 1, 0);
311 gx(i, j, k) = (
phi(ip, j, k) -
phi(im, j, k)) * inv2dx;
312 gy(i, j, k) = (
phi(i, jp, k) -
phi(i, jm, k)) * inv2dx;
313 gz(i, j, k) = (
phi(i, j, kp) -
phi(i, j, km)) * inv2dx;
324 int nx = fx.
nx(), ny = fx.
ny(), nz = fx.
nz();
325 double inv2dx = 1.0 / (2.0 * fx.
dx());
326 for (
int k = 0; k < nz; ++k)
327 for (
int j = 0; j < ny; ++j)
328 for (
int i = 0; i < nx; ++i) {
329 int ip = std::min(i + 1, nx - 1), im = std::max(i - 1, 0);
330 int jp = std::min(j + 1, ny - 1), jm = std::max(j - 1, 0);
331 int kp = std::min(k + 1, nz - 1), km = std::max(k - 1, 0);
332 out(i, j, k) = ((fx(ip, j, k) - fx(im, j, k))
333 + (fy(i, jp, k) - fy(i, jm, k))
334 + (fz(i, j, kp) - fz(i, j, km)))
348 int nx = ax.
nx(), ny = ax.
ny(), nz = ax.
nz();
349 double inv2dx = 1.0 / (2.0 * ax.
dx());
350 for (
int k = 0; k < nz; ++k)
351 for (
int j = 0; j < ny; ++j)
352 for (
int i = 0; i < nx; ++i) {
353 int ip = std::min(i + 1, nx - 1), im = std::max(i - 1, 0);
354 int jp = std::min(j + 1, ny - 1), jm = std::max(j - 1, 0);
355 int kp = std::min(k + 1, nz - 1), km = std::max(k - 1, 0);
356 bx(i, j, k) = (az(i, jp, k) - az(i, jm, k) - ay(i, j, kp)
359 by(i, j, k) = (ax(i, j, kp) - ax(i, j, km) - az(ip, j, k)
362 bz(i, j, k) = (ay(ip, j, k) - ay(im, j, k) - ax(i, jp, k)
Dense vector with optional GPU storage, templated over scalar type T.
Vector & vec()
Satisfy VecField concept: exposes the underlying flat vector.
2D uniform interior grid: geometry only, no field data.
3D Cartesian scalar grid backed by num::Vector storage.
void heatmap(const ScalarField2D &g, double vmin=0.0, double vmax=1.0)
Heatmap overload for ScalarField2D – no need to pass N or h separately.
void laplacian_stencil_2d(const BasicVector< T > &x, BasicVector< T > &y, int N)
void row_fiber_sweep(BasicVector< T > &data, int N, F &&f)
constexpr real phi
Golden ratio.
void curl_3d(const Grid3D &ax, const Grid3D &ay, const Grid3D &az, Grid3D &bx, Grid3D &by, Grid3D &bz)
void neg_laplacian_3d(const Vector &x, Vector &y, int nx, int ny, int nz, double inv_dx2)
real sample_2d_periodic(const Vector &field, idx N, real h, real px, real py, real ox, real oy)
void laplacian_stencil_2d_4th(const BasicVector< T > &x, BasicVector< T > &y, int N)
Series col_slice(const Vector &u, int N, double h, int col)
void laplacian_stencil_2d_periodic(const BasicVector< T > &x, BasicVector< T > &y, int N)
void divergence_3d(const Grid3D &fx, const Grid3D &fy, const Grid3D &fz, Grid3D &out)
void gradient_3d(const Grid3D &phi, Grid3D &gx, Grid3D &gy, Grid3D &gz)
void col_fiber_sweep(BasicVector< T > &data, int N, F &&f)
Series row_slice(const Vector &u, int N, double h, int row)
void fill_grid(Vector &u, int N, double h, F &&f)
Matplotlib-style plotting via a gnuplot pipe.
Scalar field on a 2D uniform interior grid.
void store(double x, double y)
Append a point to the series.