16 Kokkos::initialize(
argc, argv);
20 const int nx = 4, nz = 4, ny = 48;
24 const double ylo = 6.5, yhi = ny - 6.5;
25 const double H = yhi - ylo;
26 const double rho = 1.0, mu = 0.1, dt = 50.0,
F = 0.01;
27 const double idiag = rho / dt, beta = mu;
28 C3 e{nx + 2 * g, ny + 2 * g, nz + 2 * g};
29 const std::size_t n = (std::size_t)e.x * e.y * e.z;
36 auto h = Kokkos::create_mirror_view(sdf);
37 for (
int z = 0; z < e.z; ++z)
38 for (
int y = 0; y < e.y; ++y)
39 for (
int x = 0; x < e.x; ++x) {
41 double s = std::min((
double)
iy - ylo, yhi - (
double)
iy);
42 h((
long)x + (
long)y * e.x + (
long)z * (
long)e.x * e.y) = s;
44 Kokkos::deep_copy(sdf, h);
48 const int maxCut = (int)((
long)nx * ny * nz);
51 Kokkos::View<int*, CCMem>(
"nb",
maxCut),
52 Kokkos::View<mreal*, CCMem>(
"dr",
maxCut),
53 Kokkos::View<int*, CCMem>(
"dc", (std::size_t)
maxCut * 6),
54 Kokkos::View<mreal*, CCMem>(
"K", (std::size_t)
maxCut * 6),
55 Kokkos::View<mreal*, CCMem>(
"M", (std::size_t)
maxCut * 6),
56 Kokkos::View<mreal*, CCMem>(
"X", (std::size_t)
maxCut * 6),
57 Kokkos::View<mreal*, CCMem>(
"Nbc", (std::size_t)
maxCut * 6),
58 Kokkos::View<mreal*, CCMem>(
"R", (std::size_t)
maxCut * 6)};
59 Kokkos::View<int*, CCMem> idMap(
"idMap", n);
60 Kokkos::View<int, CCMem> counter(
"counter");
65 using FV = Kokkos::View<float*, CCMem>;
66 FV AC(
"AC", n), AW(
"AW", n), AE(
"AE", n), AS(
"AS", n), AN(
"AN", n), AB(
"AB", n), AT(
"AT", n);
67 Kokkos::View<double*, CCMem> inhom(
"inhom", n), rscale(
"rscale", n);
68 Kokkos::deep_copy(rscale, 1.0);
69 ibmBuildDiffusion(
AC, AW, AE, AS, AN, AB, AT, e.x, e.y, e.z, beta, idiag);
70 ibmModifyStencil(
AC, AW, AE, AS, AN, AB, AT, inhom, rscale, ov, nCut, 0.0f);
77 Kokkos::deep_copy(u, 0.0);
83 const int Nx = nx,
Nz = nz;
87 long base = (
long)y * e.x + (
long)z * (
long)e.x * e.y;
88 for (
int gl = 0;
gl < g; ++
gl) {
96 long base = (
long)x + (
long)y * e.x;
97 long sz = (
long)e.x * e.y;
98 for (
int gl = 0;
gl < g; ++
gl) {
99 uu(base + (
long)
gl * sz) =
uu(base + (
long)(
gl +
Nz) * sz);
100 uu(base + (
long)(g +
Nz +
gl) * sz) =
uu(base + (
long)(g +
gl) * sz);
107 for (
int step = 0; step < 600; ++step) {
112 double id = idiag,
ff =
F;
113 Kokkos::parallel_for(
114 "rhs", Kokkos::RangePolicy<CCExec>(
space, 0, n),
118 for (
int it = 0; it < 200; ++it) {
131 auto hu = Kokkos::create_mirror_view(u);
132 Kokkos::deep_copy(
hu, u);
133 const double Uana =
F * H * H / (8.0 * mu);
135 for (
int iy = 0;
iy < ny; ++
iy) {
136 long i = (
long)g + (
long)(
iy + g) * e.x + (
long)g * (
long)e.x * e.y;
138 umax = std::fmax(umax,
un);
139 if (
iy > ylo &&
iy < yhi) {
141 double ue = (
F / (2.0 * mu)) * (
yy - ylo) * (yhi -
yy);
149 "[poiseuille_ibm] cut cells=%d; U_max=%.5f analytic=%.5f (err %.2e); profile L2 err=%.2e\n",
152 std::fprintf(
stderr,
"FAIL: no cut cells found\n");
156 std::fprintf(
stderr,
"FAIL: U_max off analytic\n");
160 std::fprintf(
stderr,
"FAIL: profile not parabolic\n");
164 std::printf(
"[poiseuille_ibm] PASS: IBM cut-cell channel reproduces Poiseuille (exec %s)\n",
165 Kokkos::DefaultExecutionSpace::name());
void ibmModifyStencil(MV AC, MV AW, MV AE, MV AS, MV AN, MV AB, MV AT, Kokkos::View< double *, IMem > a_inhom, Kokkos::View< double *, IMem > rhs_scale, const OV &ibm, int numActive, typename OV::value_type u_bc_val, Kokkos::View< const double *, IMem > u_bc=Kokkos::View< const double *, IMem >())
void ibmBuildDiffusion(MV AC, MV AW, MV AE, MV AS, MV AN, MV AB, MV AT, int ex, int ey, int ez, double bx, double by, double bz, double idiag)
void ibmRbgsStencilColor(CCField x, CCConst b, MC AC, MC AW, MC AE, MC AS, MC AN, MC AB, MC AT, CCConst solidmask, C3 ext, C3 og, int g, int color)