19#ifndef PECLET_FLOW_CUT_CELL_IBM_HPP
20#define PECLET_FLOW_CUT_CELL_IBM_HPP
22#include <Kokkos_Core.hpp>
23#include <Kokkos_MathematicalFunctions.hpp>
30using IMem = Kokkos::DefaultExecutionSpace::memory_space;
142template <
class Space,
class Real =
float>
162template <
int SCHEME,
class OV>
164 typename OV::value_type
sdf_c,
166 const typename OV::value_type*
thEx,
167 const typename OV::value_type*
lamAxis =
nullptr,
169 using Real =
typename OV::value_type;
174 for (
int k = 0; k < 6; ++k) {
179 if (
thEx !=
nullptr && Kokkos::isfinite(
thEx[k]))
181 if (theta <
Real(1e-4))
204 for (
int a = 0; a < 3; ++a)
215 for (
int axis = 0; axis < 3; ++axis) {
227 for (
int axis = 0; axis < 3; ++axis) {
228 int km = 2 * axis + 1, kp = 2 * axis;
268 for (
int side = 0; side < 2; ++side) {
269 int kk = side == 0 ? kp : km;
299 for (
int k = 0; k < 6; ++k) {
311template <
int SCHEME,
class OV>
313 typename OV::value_type
sdf_c,
328 int ez,
double bx,
double by,
double bz,
double idiag) {
329 Kokkos::DefaultExecutionSpace
space;
330 const std::size_t n = (std::size_t)ex * ey * ez;
331 using MVreal =
typename MV::non_const_value_type;
334 Kokkos::parallel_for(
335 "peclet::flow::ibm_build_diff", Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>(0, n),
351 int ez,
double beta,
double idiag) {
352 ibmBuildDiffusion(
AC, AW, AE, AS, AN, AB, AT, ex, ey, ez, beta, beta, beta, idiag);
360template <
class FaceProps,
class MV>
367 "peclet::flow::ibm_build_diff_var",
C3{g, g, g},
C3{ex - g, ey - g, ez - g},
369 const long sx = 1, sy = ex, sz = (
long)ex * ey;
373 const double bw =
fp.beta(i, i -
sx) *
wx, be =
fp.beta(i, i +
sx) *
wx;
374 const double bs =
fp.beta(i, i - sy) *
wy,
bn =
fp.beta(i, i + sy) *
wy;
375 const double bb =
fp.beta(i, i - sz) *
wz,
bt =
fp.beta(i, i + sz) *
wz;
376 AW(i) = (
typename MV::non_const_value_type)(-
bw);
377 AE(i) = (
typename MV::non_const_value_type)(-be);
378 AS(i) = (
typename MV::non_const_value_type)(-
bs);
379 AN(i) = (
typename MV::non_const_value_type)(-
bn);
380 AB(i) = (
typename MV::non_const_value_type)(-
bb);
381 AT(i) = (
typename MV::non_const_value_type)(-
bt);
382 AC(i) = (
typename MV::non_const_value_type)(
fp.idiag(i) +
bw + be +
bs +
bn +
bb +
bt);
394template <
class MV,
class OV>
399 Kokkos::View<const double*, IMem>
u_bc = Kokkos::View<const double*, IMem>()) {
400 Kokkos::DefaultExecutionSpace
space;
403 Kokkos::parallel_for(
404 "peclet::flow::ibm_modify", Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>(0,
numActive),
406 const int OPP[6] = {1, 0, 3, 2, 5, 4};
412 const double orig[6] = {AE(c), AW(c), AN(c), AS(c), AT(c), AB(c)};
414 double mod[6] = {0, 0, 0, 0, 0, 0};
416 for (
int k = 0; k < 6; ++k) {
425 AC(c) = (
typename MV::non_const_value_type)
aC;
426 AE(c) = (
typename MV::non_const_value_type)(
orig[0] +
mod[0]);
427 AW(c) = (
typename MV::non_const_value_type)(
orig[1] +
mod[1]);
428 AN(c) = (
typename MV::non_const_value_type)(
orig[2] +
mod[2]);
429 AS(c) = (
typename MV::non_const_value_type)(
orig[3] +
mod[3]);
430 AT(c) = (
typename MV::non_const_value_type)(
orig[4] +
mod[4]);
431 AB(c) = (
typename MV::non_const_value_type)(
orig[5] +
mod[5]);
flow — portable (Kokkos) cut-cell pressure-operator face openness from an SDF.
Real poly_Nc_slip(Real xi, Real lam)
Kokkos::DefaultExecutionSpace::memory_space IMem
Real poly_D_slip(Real xi, Real lam)
Real poly_N_c_sandwich_avg(Real xi_m, Real xi_p)
Real poly_Nbc_pp_sw_avg(Real xi_m, Real xi_p)
Real poly_Nbc_mp_sw(Real xi_m, Real xi_p)
void ibmBuildDiffusionVar(MV AC, MV AW, MV AE, MV AS, MV AN, MV AB, MV AT, int ex, int ey, int ez, int g, FaceProps fp, double wx=1.0, double wy=1.0, double wz=1.0)
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 >())
Real poly_D_sandwich(Real xi_m, Real xi_p)
Real poly_N_c_sandwich(Real xi_m, Real xi_p)
void ccFor3(const char *name, C3 lo, C3 hi, F f)
Real poly_Nbc_pp_sw(Real xi_m, Real xi_p)
Real poly_D_sandwich_avg(Real xi_m, Real xi_p)
Real poly_N_nb_slip(Real xi, Real lam)
Real poly_Nc_avg(Real xi)
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)
Real poly_Nnb_avg(Real xi)
Real poly_Nbc_mp_sw_avg(Real xi_m, Real xi_p)
void ibmFillEntry(const OV &o, int list_idx, int c_idx, typename OV::value_type sdf_c, const typename OV::value_type sdf_n[6], int bc_type, const typename OV::value_type *thEx, const typename OV::value_type *lamAxis=nullptr, int *sandwichSkipped=nullptr)
flow — the multidimensional iteration policies: iteration order follows storage.
Kokkos::View< int *, Space > cell_index
Kokkos::View< Real *, Space > M_val
Kokkos::View< Real *, Space > R_val
Kokkos::View< Real *, Space > X_val
Kokkos::View< Real *, Space > Nbc_val
Kokkos::View< Real *, Space > K_val
Kokkos::View< Real *, Space > D_rescale
Kokkos::View< int *, Space > num_boundaries
Kokkos::View< int *, Space > dir_code
static constexpr double AC