33 for (
int i = 0;
i < N; ++
i) {
34 for (
int j = 0;
j < N; ++
j) {
37 if (
i > 0)
val += x[
k - N];
38 if (
i < N-1)
val += x[
k + N];
39 if (
j > 0)
val += x[
k - 1];
40 if (
j < N-1)
val += x[
k + 1];
53 for (
int i = 0;
i < N; ++
i) {
54 int ip = (
i + 1) % N,
im = (
i + N - 1) % N;
63 for (
int j = 1;
j < N - 1; ++
j)
76template<
typename T,
typename F>
78 std::vector<T>
fiber(N);
79 for (
int j = 0;
j < N; ++
j) {
80 for (
int i = 0;
i < N; ++
i)
fiber[
i] = data[
i*N +
j];
82 for (
int i = 0;
i < N; ++
i) data[
i*N +
j] =
fiber[
i];
90template<
typename T,
typename F>
92 std::vector<T>
fiber(N);
93 for (
int i = 0;
i < N; ++
i) {
94 for (
int j = 0;
j < N; ++
j)
fiber[
j] = data[
i*N +
j];
96 for (
int j = 0;
j < N; ++
j) data[
i*N +
j] =
fiber[
j];
110 int nx,
int ny,
int nz,
double inv_dx2) {
111 auto flat = [&](
int i,
int j,
int k) ->
idx {
112 return static_cast<idx>(
k * ny * nx +
j * nx +
i);
114 for (
int k = 0;
k < nz; ++
k)
115 for (
int j = 0;
j < ny; ++
j)
116 for (
int i = 0;
i < nx; ++
i) {
118 if (
i==0||
i==nx-1||
j==0||
j==ny-1||
k==0||
k==nz-1) {
122 - x[flat(
i+1,
j,
k)] - x[flat(
i-1,
j,
k)]
123 - x[flat(
i,
j+1,
k)] - x[flat(
i,
j-1,
k)]
124 - x[flat(
i,
j,
k+1)] - x[flat(
i,
j,
k-1)]);
134 int nx =
phi.nx(), ny =
phi.ny(), nz =
phi.nz();
136 for (
int k = 0;
k < nz; ++
k)
137 for (
int j = 0;
j < ny; ++
j)
138 for (
int i = 0;
i < nx; ++
i) {
139 int ip = std::min(
i+1,nx-1),
im = std::max(
i-1,0);
140 int jp = std::min(
j+1,ny-1),
jm = std::max(
j-1,0);
141 int kp = std::min(
k+1,nz-1),
km = std::max(
k-1,0);
153 int nx =
fx.
nx(), ny =
fx.ny(), nz =
fx.nz();
154 double inv2dx = 1.0 / (2.0 *
fx.dx());
155 for (
int k = 0;
k < nz; ++
k)
156 for (
int j = 0;
j < ny; ++
j)
157 for (
int i = 0;
i < nx; ++
i) {
158 int ip = std::min(
i+1,nx-1),
im = std::max(
i-1,0);
159 int jp = std::min(
j+1,ny-1),
jm = std::max(
j-1,0);
160 int kp = std::min(
k+1,nz-1),
km = std::max(
k-1,0);
172 int nx = ax.
nx(), ny = ax.
ny(), nz = ax.
nz();
173 double inv2dx = 1.0 / (2.0 * ax.
dx());
174 for (
int k = 0;
k < nz; ++
k)
175 for (
int j = 0;
j < ny; ++
j)
176 for (
int i = 0;
i < nx; ++
i) {
177 int ip = std::min(
i+1,nx-1),
im = std::max(
i-1,0);
178 int jp = std::min(
j+1,ny-1),
jm = std::max(
j-1,0);
179 int kp = std::min(
k+1,nz-1),
km = std::max(
k-1,0);
180 bx(
i,
j,
k) = (az(
i,
jp,
k) - az(
i,
jm,
k) - ay(
i,
j,
kp) + ay(
i,
j,
km)) *
inv2dx;
181 by(
i,
j,
k) = (ax(
i,
j,
kp) - ax(
i,
j,
km) - az(
ip,
j,
k) + az(
im,
j,
k)) *
inv2dx;
182 bz(
i,
j,
k) = (ay(
ip,
j,
k) - ay(
im,
j,
k) - ax(
i,
jp,
k) + ax(
i,
jm,
k)) *
inv2dx;
Dense vector with optional GPU storage, templated over scalar type T.
3D Cartesian scalar grid backed by num::Vector storage.
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)
constexpr T ipow(T x) noexcept
Compute x^N at compile time via repeated squaring.
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)