86KOKKOS_INLINE_FUNCTION
void ibmFillEntry(
const OV& o,
int list_idx,
int c_idx,
float sdf_c,
87 const float sdf_n[6],
int bc_type) {
88 o.cell_index(list_idx) = c_idx;
89 o.num_boundaries(list_idx) = 6;
91 float xi_vals[6], D_vals[6];
92 for (
int k = 0; k < 6; ++k) {
93 if (sdf_n[k] < 0.0f) {
96 float theta = sdf_c / (sdf_c - sdf_n[k]);
115 bool is_sandwich[3] = {is_ghost[0] && is_ghost[1], is_ghost[2] && is_ghost[3],
116 is_ghost[4] && is_ghost[5]};
117 float D_sandwich[3] = {0, 0, 0};
118 for (
int a = 0; a < 3; ++a)
120 D_sandwich[a] = (SCHEME == 0) ?
poly_D_sandwich(xi_vals[2 * a + 1], xi_vals[2 * a])
122 float min_D_abs = 1e30f, D_rescale = 1.0f;
123 auto update_min = [&](
float val) {
124 if (Kokkos::fabs(val) < min_D_abs) {
125 min_D_abs = Kokkos::fabs(val);
129 for (
int axis = 0; axis < 3; ++axis) {
130 if (is_sandwich[axis])
131 update_min(D_sandwich[axis]);
133 if (is_ghost[2 * axis])
134 update_min(D_vals[2 * axis]);
135 if (is_ghost[2 * axis + 1])
136 update_min(D_vals[2 * axis + 1]);
139 o.D_rescale(list_idx) = D_rescale;
141 for (
int axis = 0; axis < 3; ++axis) {
142 int km = 2 * axis + 1, kp = 2 * axis;
143 bool sandwich = is_sandwich[axis], g_p = is_ghost[kp], g_m = is_ghost[km];
145 sandwich ? D_sandwich[axis] : (g_p ? D_vals[kp] : (g_m ? D_vals[km] : D_rescale));
146 float R = D_rescale / D_axis;
147 if (Kokkos::fabs(D_axis) < 1e-9f)
149 o.R_val(list_idx * 6 + kp) = R;
150 o.R_val(list_idx * 6 + km) = R;
155 o.Nbc_val(list_idx * 6 + kp) = (
poly_Nbc_pp_sw(xi_vals[km], xi_vals[kp]) +
158 o.Nbc_val(list_idx * 6 + km) = (
poly_Nbc_pp_sw(xi_vals[kp], xi_vals[km]) +
171 o.M_val(list_idx * 6 + kp) = 0.0f;
172 o.X_val(list_idx * 6 + kp) = 0.0f;
173 o.M_val(list_idx * 6 + km) = 0.0f;
174 o.X_val(list_idx * 6 + km) = 0.0f;
176 for (
int side = 0; side < 2; ++side) {
177 int kk = side == 0 ? kp : km;
180 o.K_val(list_idx * 6 + kk) =
poly_Nc(xi_vals[kk]) * R;
181 o.X_val(list_idx * 6 + kk) =
poly_N_nb(xi_vals[kk]) * R;
182 o.Nbc_val(list_idx * 6 + kk) =
poly_Nbc(xi_vals[kk]) * R;
184 o.K_val(list_idx * 6 + kk) =
poly_Nc_avg(xi_vals[kk]) * R;
185 o.X_val(list_idx * 6 + kk) =
poly_Nnb_avg(xi_vals[kk]) * R;
186 o.Nbc_val(list_idx * 6 + kk) =
poly_Nbc_avg(xi_vals[kk]) * R;
188 o.M_val(list_idx * 6 + kk) = 0.0f;
190 o.K_val(list_idx * 6 + kk) = 0.0f;
191 o.M_val(list_idx * 6 + kk) = 1.0f;
192 o.X_val(list_idx * 6 + kk) = 0.0f;
193 o.Nbc_val(list_idx * 6 + kk) = 0.0f;
197 o.dir_code(list_idx * 6 + kp) = kp;
198 o.dir_code(list_idx * 6 + km) = km;
201 o.D_rescale(list_idx) = 1.0f;
202 for (
int k = 0; k < 6; ++k) {
203 o.dir_code(list_idx * 6 + k) = k;
204 o.R_val(list_idx * 6 + k) = 1.0f;
205 o.K_val(list_idx * 6 + k) = is_ghost[k] ? 1.0f : 0.0f;
206 o.M_val(list_idx * 6 + k) = is_ghost[k] ? 0.0f : 1.0f;
207 o.X_val(list_idx * 6 + k) = 0.0f;
208 o.Nbc_val(list_idx * 6 + k) = 0.0f;
216 Kokkos::View<float*, IMem> AE, Kokkos::View<float*, IMem> AS,
217 Kokkos::View<float*, IMem> AN, Kokkos::View<float*, IMem> AB,
218 Kokkos::View<float*, IMem> AT,
int ex,
int ey,
int ez,
double beta,
220 Kokkos::DefaultExecutionSpace space;
221 const std::size_t n = (std::size_t)ex * ey * ez;
222 const float nb = (float)(-beta), c = (float)(idiag + 6.0 * beta);
223 Kokkos::parallel_for(
224 "peclet::flow::ibm_build_diff", Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>(0, n),
225 KOKKOS_LAMBDA(std::size_t i) {
243 Kokkos::View<float*, IMem> AE, Kokkos::View<float*, IMem> AS,
244 Kokkos::View<float*, IMem> AN, Kokkos::View<float*, IMem> AB,
245 Kokkos::View<float*, IMem> AT,
int ex,
int ey,
int ez,
int g,
247 Kokkos::DefaultExecutionSpace space;
248 using MD = Kokkos::MDRangePolicy<Kokkos::DefaultExecutionSpace, Kokkos::Rank<3>>;
249 Kokkos::parallel_for(
250 "peclet::flow::ibm_build_diff_var", MD(space, {g, g, g}, {ex - g, ey - g, ez - g}),
251 KOKKOS_LAMBDA(
int lx,
int ly,
int lz) {
252 const long sx = 1, sy = ex, sz = (long)ex * ey;
253 const long i = (long)lx + (
long)ly * sy + (long)lz * sz;
254 const double bw = fp.beta(i, i - sx), be = fp.beta(i, i + sx);
255 const double bs = fp.beta(i, i - sy), bn = fp.beta(i, i + sy);
256 const double bb = fp.beta(i, i - sz), bt = fp.beta(i, i + sz);
257 AW(i) = (float)(-bw);
258 AE(i) = (float)(-be);
259 AS(i) = (float)(-bs);
260 AN(i) = (float)(-bn);
261 AB(i) = (float)(-bb);
262 AT(i) = (float)(-bt);
263 AC(i) = (float)(fp.idiag(i) + bw + be + bs + bn + bb + bt);
272 Kokkos::View<float*, IMem> AE, Kokkos::View<float*, IMem> AS,
273 Kokkos::View<float*, IMem> AN, Kokkos::View<float*, IMem> AB,
274 Kokkos::View<float*, IMem> AT, Kokkos::View<double*, IMem> a_inhom,
275 Kokkos::View<double*, IMem> rhs_scale,
const IbmOverlay& ibm,
276 int numActive,
float u_bc_val) {
277 Kokkos::DefaultExecutionSpace space;
278 const bool hasInhom = (a_inhom.extent(0) != 0), hasScale = (rhs_scale.extent(0) != 0);
279 Kokkos::parallel_for(
280 "peclet::flow::ibm_modify", Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>(0, numActive),
281 KOKKOS_LAMBDA(
int list_idx) {
282 const int OPP[6] = {1, 0, 3, 2, 5, 4};
284 const float descale = ibm.
D_rescale(list_idx);
286 rhs_scale(c) = descale;
287 const double orig[6] = {AE(c), AW(c), AN(c), AS(c), AT(c), AB(c)};
288 double aC = (double)
AC(c) * (double)descale;
289 double mod[6] = {0, 0, 0, 0, 0, 0};
291 for (
int k = 0; k < 6; ++k) {
292 const float K = ibm.
K_val(list_idx * 6 + k), M = ibm.
M_val(list_idx * 6 + k);
293 const float X = ibm.
X_val(list_idx * 6 + k), Nbc = ibm.
Nbc_val(list_idx * 6 + k);
294 const double vnb = orig[k];
296 inhom += (double)Nbc * u_bc_val * vnb;
297 mod[k] += vnb * ((double)descale * M - 1.0);
298 mod[OPP[k]] += vnb * X;
301 AE(c) = (float)(orig[0] + mod[0]);
302 AW(c) = (float)(orig[1] + mod[1]);
303 AN(c) = (float)(orig[2] + mod[2]);
304 AS(c) = (float)(orig[3] + mod[3]);
305 AT(c) = (float)(orig[4] + mod[4]);
306 AB(c) = (float)(orig[5] + mod[5]);