Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1fa498c7d7 | ||
|
|
781333407e |
No files matched your search
@@ -168,21 +168,15 @@ extern "C" __global__ void BlockStep(const fpxx* in, fpxx* out, unsigned int hal
|
|||||||
stream_pull_load(k, f, in + base, j);
|
stream_pull_load(k, f, in + base, j);
|
||||||
if (cell_kind == KIND_ACTIVE) {
|
if (cell_kind == KIND_ACTIVE) {
|
||||||
if (d_block_wall.nx != 0) {
|
if (d_block_wall.nx != 0) {
|
||||||
const unsigned int bx = NX - 2 * halo, by = NY - 2 * halo;
|
unsigned int gx, gy;
|
||||||
const unsigned int nbx = d_block_wall.nx / bx;
|
block_global_xy(x, y, halo, d_block_wall.nx, gx, gy);
|
||||||
const unsigned int gx = (blockIdx.z % nbx) * bx + x - halo;
|
|
||||||
const unsigned int gy = (blockIdx.z / nbx) * by + y - halo;
|
|
||||||
if (gy == 1)
|
if (gy == 1)
|
||||||
reconstruct_bottom_velocity(f, 0.0f, bottom_wall_normal_velocity(
|
reconstruct_bottom_velocity(f, 0.0f, bottom_wall_normal_velocity(
|
||||||
gx, d_block_wall.nx, d_block_wall.slot_width, d_block_wall.amplitude));
|
gx, d_block_wall.nx, d_block_wall.slot_width, d_block_wall.amplitude));
|
||||||
else if (gy == d_block_wall.ny - 2) reconstruct_top_reservoir(f, RHO);
|
else if (gy == d_block_wall.ny - 2) reconstruct_top_reservoir(f, RHO);
|
||||||
}
|
}
|
||||||
#if COLLISION_MODEL == 2
|
#if COLLISION_MODEL == 2
|
||||||
// Uniform MRT sequence (collide_dispatch, zero forcing); SRT path below unchanged.
|
collide_mrt_unforced(f); // SRT path below unchanged.
|
||||||
float rho, ux, uy;
|
|
||||||
compute_rho_u(f, rho, ux, uy);
|
|
||||||
collide_mrt_no_force(f, rho, ux, uy,
|
|
||||||
fminf(OMEGA_COLLISION_MAX, fmaxf(OMEGA_COLLISION_MIN, d_params.omega)));
|
|
||||||
#else
|
#else
|
||||||
float rho, ux, uy, feq[NQ];
|
float rho, ux, uy, feq[NQ];
|
||||||
compute_rho_u(f, rho, ux, uy);
|
compute_rho_u(f, rho, ux, uy);
|
||||||
|
|||||||
@@ -53,6 +53,18 @@ __device__ __forceinline__ void index_from_thread(unsigned int& x,
|
|||||||
k = (unsigned long)y * NX + x;
|
k = (unsigned long)y * NX + x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Global cell of window cell (x, y) in block blockIdx.z of a row-major,
|
||||||
|
// full-domain block layout domain_nx cells wide. NX/NY are the local strides.
|
||||||
|
__device__ __forceinline__ void block_global_xy(unsigned int x, unsigned int y,
|
||||||
|
unsigned int halo, unsigned int domain_nx,
|
||||||
|
unsigned int& gx, unsigned int& gy)
|
||||||
|
{
|
||||||
|
const unsigned int bx = NX - 2 * halo, by = NY - 2 * halo;
|
||||||
|
const unsigned int nbx = domain_nx / bx;
|
||||||
|
gx = (blockIdx.z % nbx) * bx + x - halo;
|
||||||
|
gy = (blockIdx.z / nbx) * by + y - halo;
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Neighbor list (periodic BCs via modular arithmetic)
|
// Neighbor list (periodic BCs via modular arithmetic)
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -114,6 +114,16 @@ __device__ __forceinline__ void collide_mrt_no_force(float* __restrict__ g,
|
|||||||
collide_mrt(g, rho, ux, uy, Fin, omega);
|
collide_mrt(g, rho, ux, uy, Fin, omega);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unforced MRT with the clamped device omega, as in collide_dispatch with zero
|
||||||
|
// forcing. Shared by the blocked, channel-root and dense-patch collisions.
|
||||||
|
__device__ __forceinline__ void collide_mrt_unforced(float* __restrict__ g)
|
||||||
|
{
|
||||||
|
float rho, ux, uy;
|
||||||
|
compute_rho_u(g, rho, ux, uy);
|
||||||
|
collide_mrt_no_force(g, rho, ux, uy,
|
||||||
|
fminf(OMEGA_COLLISION_MAX, fmaxf(OMEGA_COLLISION_MIN, d_params.omega)));
|
||||||
|
}
|
||||||
|
|
||||||
#elif LATTICE_MODEL == LATTICE_D3Q19
|
#elif LATTICE_MODEL == LATTICE_D3Q19
|
||||||
|
|
||||||
__device__ __forceinline__ void collide_mrt(float* __restrict__ g,
|
__device__ __forceinline__ void collide_mrt(float* __restrict__ g,
|
||||||
|
|||||||
@@ -37,10 +37,7 @@ __device__ unsigned int incoming_counts[NQ * TOTAL_CELLS];
|
|||||||
|
|
||||||
__device__ __forceinline__ void patch_collide(float* f, unsigned long k) {
|
__device__ __forceinline__ void patch_collide(float* f, unsigned long k) {
|
||||||
#if COLLISION_MODEL == 2
|
#if COLLISION_MODEL == 2
|
||||||
float rho, ux, uy;
|
collide_mrt_unforced(f);
|
||||||
compute_rho_u(f, rho, ux, uy);
|
|
||||||
collide_mrt_no_force(f, rho, ux, uy,
|
|
||||||
fminf(OMEGA_COLLISION_MAX, fmaxf(OMEGA_COLLISION_MIN, d_params.omega)));
|
|
||||||
#else
|
#else
|
||||||
float rho, ux, uy, feq[NQ];
|
float rho, ux, uy, feq[NQ];
|
||||||
compute_rho_u(f, rho, ux, uy);
|
compute_rho_u(f, rho, ux, uy);
|
||||||
|
|||||||
@@ -15,10 +15,8 @@ extern "C" __global__ void BlockChannelStep(
|
|||||||
unsigned int x, y; unsigned long k;
|
unsigned int x, y; unsigned long k;
|
||||||
index_from_thread(x, y, k);
|
index_from_thread(x, y, k);
|
||||||
if (x < halo || y < halo || x >= NX - halo || y >= NY - halo) return;
|
if (x < halo || y < halo || x >= NX - halo || y >= NY - halo) return;
|
||||||
const unsigned int bx = NX - 2 * halo, by = NY - 2 * halo;
|
unsigned int gx, gy;
|
||||||
const unsigned int nbx = d_block_channel.nx / bx;
|
block_global_xy(x, y, halo, d_block_channel.nx, gx, gy);
|
||||||
const unsigned int gx = (blockIdx.z % nbx) * bx + x - halo;
|
|
||||||
const unsigned int gy = (blockIdx.z / nbx) * by + y - halo;
|
|
||||||
const unsigned long base = (unsigned long)blockIdx.z * NQ * TOTAL_CELLS;
|
const unsigned long base = (unsigned long)blockIdx.z * NQ * TOTAL_CELLS;
|
||||||
const unsigned long cell = (unsigned long)blockIdx.z * TOTAL_CELLS + k;
|
const unsigned long cell = (unsigned long)blockIdx.z * TOTAL_CELLS + k;
|
||||||
float f[NQ];
|
float f[NQ];
|
||||||
@@ -55,11 +53,7 @@ extern "C" __global__ void BlockChannelStep(
|
|||||||
}
|
}
|
||||||
if (!wall && !outlet) {
|
if (!wall && !outlet) {
|
||||||
#if COLLISION_MODEL == 2
|
#if COLLISION_MODEL == 2
|
||||||
// Match uniform MRT arithmetic (collide_dispatch, zero forcing).
|
collide_mrt_unforced(f);
|
||||||
float rho, ux, uy;
|
|
||||||
compute_rho_u(f, rho, ux, uy);
|
|
||||||
collide_mrt_no_force(f, rho, ux, uy,
|
|
||||||
fminf(OMEGA_COLLISION_MAX, fmaxf(OMEGA_COLLISION_MIN, d_params.omega)));
|
|
||||||
#else
|
#else
|
||||||
// Match uniform SRT arithmetic, including its shifted equilibrium path.
|
// Match uniform SRT arithmetic, including its shifted equilibrium path.
|
||||||
float rho, ux, uy, feq[NQ], forcing[NQ] = {};
|
float rho, ux, uy, feq[NQ], forcing[NQ] = {};
|
||||||
|
|||||||
@@ -37,8 +37,13 @@ class RefinementMRTHost(unittest.TestCase):
|
|||||||
self.assertIn("STORE_PRECISION != 0", source)
|
self.assertIn("STORE_PRECISION != 0", source)
|
||||||
self.assertIn('#if COLLISION_MODEL == 2\n#include "operators/collision_mrt.cuh"\n#endif', source)
|
self.assertIn('#if COLLISION_MODEL == 2\n#include "operators/collision_mrt.cuh"\n#endif', source)
|
||||||
self.assertIn("USE_DDF_SHIFTING ||", refinement) # dense/mixed shifted stays rejected
|
self.assertIn("USE_DDF_SHIFTING ||", refinement) # dense/mixed shifted stays rejected
|
||||||
|
# One shared unforced MRT body; each blocked/patch path calls it exactly once.
|
||||||
|
mrt = (KERNELS / "operators/collision_mrt.cuh").read_text()
|
||||||
|
self.assertEqual(mrt.count("void collide_mrt_unforced("), 1)
|
||||||
for source in (blocks, channel, refinement):
|
for source in (blocks, channel, refinement):
|
||||||
self.assertEqual(source.count("collide_mrt_no_force("), 1)
|
self.assertEqual(source.count("collide_mrt_unforced(f);"), 1)
|
||||||
|
self.assertNotIn("collide_mrt_no_force(", source)
|
||||||
|
self.assertNotIn("compute_rho_u(f, rho, ux, uy);\n collide_mrt", source)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__": unittest.main()
|
if __name__ == "__main__": unittest.main()
|
||||||
Reference in new issue
Block a user