89KOKKOS_INLINE_FUNCTION
void ibmFillEntry(
const OV& o,
int list_idx,
int c_idx,
float sdf_c,
90 const float sdf_n[6],
int bc_type,
92 o.cell_index(list_idx) = c_idx;
93 o.num_boundaries(list_idx) = 6;
95 float xi_vals[6], D_vals[6];
96 for (
int k = 0; k < 6; ++k) {
97 if (sdf_n[k] < 0.0f) {
100 float theta = sdf_c / (sdf_c - sdf_n[k]);
101 if (thEx !=
nullptr && Kokkos::isfinite(thEx[k]))
121 bool is_sandwich[3] = {is_ghost[0] && is_ghost[1], is_ghost[2] && is_ghost[3],
122 is_ghost[4] && is_ghost[5]};
123 float D_sandwich[3] = {0, 0, 0};
124 for (
int a = 0; a < 3; ++a)
126 D_sandwich[a] = (SCHEME == 0) ?
poly_D_sandwich(xi_vals[2 * a + 1], xi_vals[2 * a])
128 float min_D_abs = 1e30f, D_rescale = 1.0f;
129 auto update_min = [&](
float val) {
130 if (Kokkos::fabs(val) < min_D_abs) {
131 min_D_abs = Kokkos::fabs(val);
135 for (
int axis = 0; axis < 3; ++axis) {
136 if (is_sandwich[axis])
137 update_min(D_sandwich[axis]);
139 if (is_ghost[2 * axis])
140 update_min(D_vals[2 * axis]);
141 if (is_ghost[2 * axis + 1])
142 update_min(D_vals[2 * axis + 1]);
145 o.D_rescale(list_idx) = D_rescale;
147 for (
int axis = 0; axis < 3; ++axis) {
148 int km = 2 * axis + 1, kp = 2 * axis;
149 bool sandwich = is_sandwich[axis], g_p = is_ghost[kp], g_m = is_ghost[km];
151 sandwich ? D_sandwich[axis] : (g_p ? D_vals[kp] : (g_m ? D_vals[km] : D_rescale));
152 float R = D_rescale / D_axis;
153 if (Kokkos::fabs(D_axis) < 1e-9f)
155 o.R_val(list_idx * 6 + kp) = R;
156 o.R_val(list_idx * 6 + km) = R;
161 o.Nbc_val(list_idx * 6 + kp) = (
poly_Nbc_pp_sw(xi_vals[km], xi_vals[kp]) +
164 o.Nbc_val(list_idx * 6 + km) = (
poly_Nbc_pp_sw(xi_vals[kp], xi_vals[km]) +
177 o.M_val(list_idx * 6 + kp) = 0.0f;
178 o.X_val(list_idx * 6 + kp) = 0.0f;
179 o.M_val(list_idx * 6 + km) = 0.0f;
180 o.X_val(list_idx * 6 + km) = 0.0f;
182 for (
int side = 0; side < 2; ++side) {
183 int kk = side == 0 ? kp : km;
186 o.K_val(list_idx * 6 + kk) =
poly_Nc(xi_vals[kk]) * R;
187 o.X_val(list_idx * 6 + kk) =
poly_N_nb(xi_vals[kk]) * R;
188 o.Nbc_val(list_idx * 6 + kk) =
poly_Nbc(xi_vals[kk]) * R;
190 o.K_val(list_idx * 6 + kk) =
poly_Nc_avg(xi_vals[kk]) * R;
191 o.X_val(list_idx * 6 + kk) =
poly_Nnb_avg(xi_vals[kk]) * R;
192 o.Nbc_val(list_idx * 6 + kk) =
poly_Nbc_avg(xi_vals[kk]) * R;
194 o.M_val(list_idx * 6 + kk) = 0.0f;
196 o.K_val(list_idx * 6 + kk) = 0.0f;
197 o.M_val(list_idx * 6 + kk) = 1.0f;
198 o.X_val(list_idx * 6 + kk) = 0.0f;
199 o.Nbc_val(list_idx * 6 + kk) = 0.0f;
203 o.dir_code(list_idx * 6 + kp) = kp;
204 o.dir_code(list_idx * 6 + km) = km;
207 o.D_rescale(list_idx) = 1.0f;
208 for (
int k = 0; k < 6; ++k) {
209 o.dir_code(list_idx * 6 + k) = k;
210 o.R_val(list_idx * 6 + k) = 1.0f;
211 o.K_val(list_idx * 6 + k) = is_ghost[k] ? 1.0f : 0.0f;
212 o.M_val(list_idx * 6 + k) = is_ghost[k] ? 0.0f : 1.0f;
213 o.X_val(list_idx * 6 + k) = 0.0f;
214 o.Nbc_val(list_idx * 6 + k) = 0.0f;
229 Kokkos::View<float*, IMem> AE, Kokkos::View<float*, IMem> AS,
230 Kokkos::View<float*, IMem> AN, Kokkos::View<float*, IMem> AB,
231 Kokkos::View<float*, IMem> AT,
int ex,
int ey,
int ez,
double beta,
233 Kokkos::DefaultExecutionSpace
space;
234 const std::size_t n = (std::size_t)ex * ey *
ez;
235 const float nb = (float)(-beta), c = (float)(idiag + 6.0 * beta);
236 Kokkos::parallel_for(
237 "peclet::flow::ibm_build_diff", Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>(0, n),
256 Kokkos::View<float*, IMem> AE, Kokkos::View<float*, IMem> AS,
257 Kokkos::View<float*, IMem> AN, Kokkos::View<float*, IMem> AB,
258 Kokkos::View<float*, IMem> AT,
int ex,
int ey,
int ez,
int g,
260 Kokkos::DefaultExecutionSpace
space;
261 using MD = Kokkos::MDRangePolicy<Kokkos::DefaultExecutionSpace, Kokkos::Rank<3>>;
262 Kokkos::parallel_for(
263 "peclet::flow::ibm_build_diff_var",
MD(
space, {g, g, g}, {ex - g, ey - g,
ez - g}),
265 const long sx = 1,
sy = ex,
sz = (
long)ex * ey;
270 AW(
i) = (float)(-
bw);
271 AE(
i) = (float)(-
be);
272 AS(
i) = (float)(-
bs);
273 AN(
i) = (float)(-
bn);
274 AB(
i) = (float)(-
bb);
275 AT(
i) = (float)(-
bt);
285 Kokkos::View<float*, IMem> AE, Kokkos::View<float*, IMem> AS,
286 Kokkos::View<float*, IMem> AN, Kokkos::View<float*, IMem> AB,
287 Kokkos::View<float*, IMem> AT, Kokkos::View<double*, IMem>
a_inhom,
290 Kokkos::DefaultExecutionSpace
space;
292 Kokkos::parallel_for(
293 "peclet::flow::ibm_modify", Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>(0,
numActive),
295 const int OPP[6] = {1, 0, 3, 2, 5, 4};
300 const double orig[6] = {AE(c), AW(c), AN(c), AS(c), AT(c), AB(c)};
302 double mod[6] = {0, 0, 0, 0, 0, 0};
304 for (
int k = 0;
k < 6; ++
k) {
314 AE(c) = (float)(
orig[0] +
mod[0]);
315 AW(c) = (float)(
orig[1] +
mod[1]);
316 AN(c) = (float)(
orig[2] +
mod[2]);
317 AS(c) = (float)(
orig[3] +
mod[3]);
318 AT(c) = (float)(
orig[4] +
mod[4]);
319 AB(c) = (float)(
orig[5] +
mod[5]);