27template <
typename ScalarType >
49 domain.subdomains().size(),
50 domain.domain_info().subdomain_num_nodes_per_side_laterally() + 1,
51 domain.domain_info().subdomain_num_nodes_per_side_laterally() + 1,
52 domain.domain_info().subdomain_num_nodes_radially() + 1 )
55 domain.subdomains().size(),
56 domain.domain_info().subdomain_num_nodes_per_side_laterally() + 1,
57 domain.domain_info().subdomain_num_nodes_per_side_laterally() + 1,
58 domain.domain_info().subdomain_num_nodes_radially() + 1,
62 domain.subdomains().size(),
63 domain.domain_info().subdomain_num_nodes_per_side_laterally() + 1,
64 domain.domain_info().subdomain_num_nodes_per_side_laterally() + 1,
65 domain.domain_info().subdomain_num_nodes_radially() + 1 )
68 domain.subdomains().size(),
69 domain.domain_info().subdomain_num_nodes_per_side_laterally() + 1,
70 domain.domain_info().subdomain_num_nodes_per_side_laterally() + 1,
71 domain.domain_info().subdomain_num_nodes_radially() + 1 )
81template <
typename ScalarT >
110template <
typename ScalarT >
125 KOKKOS_INLINE_FUNCTION
126 void operator()(
const int id,
const int x,
const int y,
const int r, ScalarT& local_min )
const
128 constexpr int cell_offset_x[
num_neighbors] = { -1, 1, 0, 0, 0, 0 };
129 constexpr int cell_offset_y[
num_neighbors] = { 0, 0, -1, 1, 0, 0 };
130 constexpr int cell_offset_r[
num_neighbors] = { 0, 0, 0, 0, -1, 1 };
133 ScalarT M_ii = ScalarT( 0 );
135 GH::compute_geometry(
grid_,
radii_,
cell_centers_,
vel_grid_,
id, x, y, r, beta, M_ii, S_f );
140 ScalarT lambda = ScalarT( 0 );
144 if ( beta[n] < ScalarT( 0 ) )
156 const ScalarT denom = dx.dot( S_f[n] );
157 if ( denom > ScalarT( 0 ) )
162 const ScalarT dt_cell = ( lambda > ScalarT( 0 ) ) ? ( M_ii / lambda ) : ScalarT( 1e30 );
163 local_min = Kokkos::min( local_min, dt_cell );
192template <
typename ScalarT >
199 const ScalarT diffusivity = ScalarT( 0 ) )
203 Kokkos::parallel_reduce(
209 .cell_centers_ = cell_centers,
211 .diffusivity_ = diffusivity,
213 Kokkos::Min< ScalarT >( local_min ) );
217 ScalarT global_min = local_min;
218 MPI_Allreduce( &local_min, &global_min, 1, mpi::mpi_datatype< ScalarT >(), MPI_MIN, MPI_COMM_WORLD );
261template <
typename ScalarT >
301 KOKKOS_INLINE_FUNCTION
302 void operator()(
const int id,
const int x,
const int y,
const int r )
const
304 constexpr int cell_offset_x[
num_neighbors] = { -1, 1, 0, 0, 0, 0 };
305 constexpr int cell_offset_y[
num_neighbors] = { 0, 0, -1, 1, 0, 0 };
306 constexpr int cell_offset_r[
num_neighbors] = { 0, 0, 0, 0, -1, 1 };
311 GH::compute_geometry(
grid_,
radii_,
cell_centers_,
vel_grid_,
id, x, y, r, beta, M_ii, S_f );
313 const ScalarT T_i =
T_old_(
id, x, y, r );
324 ScalarT lo_diag = ScalarT( 0 );
325 ScalarT lo_update = ScalarT( 0 );
326 ScalarT beta_sum = ScalarT( 0 );
333 const ScalarT T_j =
T_old_(
id, nx, ny, nr );
336 if ( beta[n] >= ScalarT( 0 ) )
339 lo_update += beta[n] * T_j;
344 const Vec3 neighbor_center{
348 const Vec3 cell_center{
349 cell_centers_(
id, x, y, r, 0 ),
cell_centers_(
id, x, y, r, 1 ),
cell_centers_(
id, x, y, r, 2 ) };
350 const Vec3 dx = neighbor_center - cell_center;
351 const ScalarT denom = dx.
dot( S_f[n] );
352 const ScalarT diff_coeff =
diffusivity_ * ( S_f[n].
dot( S_f[n] ) / denom );
353 lo_diag += diff_coeff;
354 lo_update -= diff_coeff * T_j;
357 const ScalarT abs_beta = Kokkos::abs( beta[n] );
358 antidiff_(
id, x, y, r, n ) = (
dt_ / M_ii ) * ( abs_beta / ScalarT( 2 ) ) * ( T_i - T_j );
367 ScalarT T_L_val = T_i - (
dt_ / M_ii ) * ( lo_diag * T_i + lo_update );
375 T_L_(
id, x, y, r ) = T_L_val;
404template <
typename ScalarT >
414 const ScalarT diffusivity = ScalarT( 0 ),
416 const bool subtract_divergence = true )
425 FCTPredictorKernel< ScalarT > kernel{
428 .cell_centers_ = cell_centers,
434 .diffusivity_ = diffusivity,
436 .has_source_ = ( source.data() != nullptr ),
437 .subtract_divergence_ = subtract_divergence,
441 util::Timer timer_kernel(
"fct_predictor_kernel" );
442 Kokkos::parallel_for(
485template <
typename ScalarT >
496 KOKKOS_INLINE_FUNCTION
497 void operator()(
const int id,
const int x,
const int y,
const int r )
const
499 constexpr int cell_offset_x[
num_neighbors] = { -1, 1, 0, 0, 0, 0 };
500 constexpr int cell_offset_y[
num_neighbors] = { 0, 0, -1, 1, 0, 0 };
501 constexpr int cell_offset_r[
num_neighbors] = { 0, 0, 0, 0, -1, 1 };
503 const ScalarT T_L_i =
T_L_(
id, x, y, r );
505 ScalarT P_plus = ScalarT( 0 );
506 ScalarT P_minus = ScalarT( 0 );
507 ScalarT T_max = T_L_i;
508 ScalarT T_min = T_L_i;
512 const ScalarT f_ij =
antidiff_(
id, x, y, r, n );
513 if ( f_ij > ScalarT( 0 ) ) P_plus += f_ij;
514 else P_minus += f_ij;
516 const ScalarT T_L_j =
T_L_(
521 T_max = Kokkos::max( T_max, T_L_j );
522 T_min = Kokkos::min( T_min, T_L_j );
525 const ScalarT Q_plus = T_max - T_L_i;
526 const ScalarT Q_minus = T_min - T_L_i;
529 ( P_plus > ScalarT( 0 ) ) ? Kokkos::min( ScalarT( 1 ), Q_plus / P_plus ) : ScalarT( 1 );
531 ( P_minus < ScalarT( 0 ) ) ? Kokkos::min( ScalarT( 1 ), Q_minus / P_minus ) : ScalarT( 1 );
548template <
typename ScalarT >
567 Kokkos::parallel_for(
605template <
typename ScalarT >
617 KOKKOS_INLINE_FUNCTION
618 void operator()(
const int id,
const int x,
const int y,
const int r )
const
620 constexpr int cell_offset_x[
num_neighbors] = { -1, 1, 0, 0, 0, 0 };
621 constexpr int cell_offset_y[
num_neighbors] = { 0, 0, -1, 1, 0, 0 };
622 constexpr int cell_offset_r[
num_neighbors] = { 0, 0, 0, 0, -1, 1 };
624 ScalarT correction = ScalarT( 0 );
626 const ScalarT R_plus_i =
R_plus_(
id, x, y, r );
627 const ScalarT R_minus_i =
R_minus_(
id, x, y, r );
635 const ScalarT f_ij =
antidiff_(
id, x, y, r, n );
636 const ScalarT R_plus_j =
R_plus_(
id, jx, jy, jr );
637 const ScalarT R_minus_j =
R_minus_(
id, jx, jy, jr );
640 if ( f_ij > ScalarT( 0 ) )
641 alpha = Kokkos::min( R_plus_i, R_minus_j );
643 alpha = Kokkos::min( R_minus_i, R_plus_j );
645 correction += alpha * f_ij;
648 T_new_(
id, x, y, r ) =
T_L_(
id, x, y, r ) + correction;
661template <
typename ScalarT >
678 util::Timer timer_kernel(
"fct_correction_kernel" );
679 Kokkos::parallel_for(
720template <
typename ScalarT >
730 const ScalarT diffusivity = ScalarT( 0 ),
732 const bool subtract_divergence =
true,
734 const DirichletBCs< ScalarT >& bcs = {} )
737 fct_predictor( domain, T, vel, cell_centers, grid, radii, dt, bufs, diffusivity, source, subtract_divergence );
744 if ( boundary_mask.extent( 0 ) > 0 )
776template <
typename ScalarT >
786 const ScalarT diffusivity = ScalarT( 0 ),
788 const bool subtract_divergence = true )
790 util::Timer timer_upwind(
"upwind_explicit_step" );
791 fct_predictor( domain, T, vel, cell_centers, grid, radii, dt, bufs, diffusivity, source, subtract_divergence );
811template <
typename ScalarT >
827 KOKKOS_INLINE_FUNCTION
828 void operator()(
const int id,
const int x,
const int y,
const int r )
const
833 GH::compute_geometry(
grid_,
radii_,
cell_centers_,
vel_grid_,
id, x, y, r, beta, M_ii, S_f );
835 const ScalarT T_i =
T_old_(
id, x, y, r );
838 const ScalarT T_j =
T_old_(
843 const ScalarT abs_beta = Kokkos::abs( beta[n] );
844 antidiff_(
id, x, y, r, n ) = (
dt_ / M_ii ) * ( abs_beta / ScalarT( 2 ) ) * ( T_i - T_j );
864template <
typename ScalarT >
880 .cell_centers_ = cell_centers,
887 Kokkos::parallel_for(
927template <
typename ScalarT >
940 fct_antidiff( domain, T, vel, cell_centers, grid, radii, dt, bufs );
Pre-allocated send/recv buffers and sorted face-pair lists for FV ghost layer comm.
Definition fv_communication.hpp:184
Parallel data structure organizing the thick spherical shell metadata for distributed (MPI parallel) ...
Definition spherical_shell.hpp:2518
Finite volume vector on distributed shell grid with one DoF per hex (merging 2 wedges) and ghost-laye...
Definition vector_fv.hpp:23
const grid::Grid4DDataScalar< ScalarType > & grid_data() const
Get const reference to grid data.
Definition vector_fv.hpp:145
const grid::Grid4DDataVec< ScalarType, VecDim > & grid_data() const
Get const reference to grid data.
Definition vector_q1.hpp:288
Timer supporting RAII scope or manual stop.
Definition timer.hpp:342
Ghost layer communication for scalar finite volume (FV) fields on the shell grid.
Shared FV hex cell geometry: face-normal surface integrals, velocity fluxes, cell volume.
void update_fv_ghost_layers(const grid::shell::DistributedDomain &domain, const grid::Grid4DDataScalar< ScalarType > &data, FVGhostLayerBuffers< ScalarType > &bufs)
Fills all ghost layers of a scalar FV field from neighbouring subdomains.
Definition fv_communication.hpp:316
Definition advection_diffusion.hpp:9
void fct_correction(const grid::shell::DistributedDomain &domain, linalg::VectorFVScalar< ScalarT > &T_new, FVFCTBuffers< ScalarT > &bufs)
Stage 3: apply the Zalesak-limited antidiffusive correction.
Definition fct_advection_diffusion.hpp:662
ScalarT compute_dt_stable(const grid::shell::DistributedDomain &domain, const linalg::VectorQ1Vec< ScalarT, 3 > &vel, const grid::Grid4DDataVec< ScalarT, 3 > &cell_centers, const grid::Grid3DDataVec< ScalarT, 3 > &grid, const grid::Grid2DDataScalar< ScalarT > &radii, const ScalarT diffusivity=ScalarT(0))
Compute the largest explicit time step that keeps the FCT low-order predictor stable.
Definition fct_advection_diffusion.hpp:193
void fct_semiimplicit_step(const grid::shell::DistributedDomain &domain, linalg::VectorFVScalar< ScalarT > &T, const linalg::VectorFVScalar< ScalarT > &T_L, const linalg::VectorQ1Vec< ScalarT, 3 > &vel, const grid::Grid4DDataVec< ScalarT, 3 > &cell_centers, const grid::Grid3DDataVec< ScalarT, 3 > &grid, const grid::Grid2DDataScalar< ScalarT > &radii, const ScalarT dt, FVFCTBuffers< ScalarT > &bufs)
One semi-implicit FCT advection–diffusion timestep.
Definition fct_advection_diffusion.hpp:928
void fct_predictor(const grid::shell::DistributedDomain &domain, const linalg::VectorFVScalar< ScalarT > &T_old, const linalg::VectorQ1Vec< ScalarT, 3 > &vel, const grid::Grid4DDataVec< ScalarT, 3 > &cell_centers, const grid::Grid3DDataVec< ScalarT, 3 > &grid, const grid::Grid2DDataScalar< ScalarT > &radii, const ScalarT dt, FVFCTBuffers< ScalarT > &bufs, const ScalarT diffusivity=ScalarT(0), const grid::Grid4DDataScalar< ScalarT > &source={}, const bool subtract_divergence=true)
Stage 1: low-order predictor + antidiffusive flux computation.
Definition fct_advection_diffusion.hpp:405
void fct_limiter(const grid::shell::DistributedDomain &domain, FVFCTBuffers< ScalarT > &bufs)
Stage 2: compute Zalesak / correction factors.
Definition fct_advection_diffusion.hpp:549
void fct_antidiff(const grid::shell::DistributedDomain &domain, const linalg::VectorFVScalar< ScalarT > &T_old, const linalg::VectorQ1Vec< ScalarT, 3 > &vel, const grid::Grid4DDataVec< ScalarT, 3 > &cell_centers, const grid::Grid3DDataVec< ScalarT, 3 > &grid, const grid::Grid2DDataScalar< ScalarT > &radii, const ScalarT dt, FVFCTBuffers< ScalarT > &bufs)
Computes pre-scaled antidiffusive fluxes from (semi-implicit FCT stage 1).
Definition fct_advection_diffusion.hpp:865
void upwind_explicit_step(const grid::shell::DistributedDomain &domain, linalg::VectorFVScalar< ScalarT > &T, const linalg::VectorQ1Vec< ScalarT, 3 > &vel, const grid::Grid4DDataVec< ScalarT, 3 > &cell_centers, const grid::Grid3DDataVec< ScalarT, 3 > &grid, const grid::Grid2DDataScalar< ScalarT > &radii, const ScalarT dt, FVFCTBuffers< ScalarT > &bufs, const ScalarT diffusivity=ScalarT(0), const grid::Grid4DDataScalar< ScalarT > &source={}, const bool subtract_divergence=true)
One explicit first-order upwind advection–diffusion timestep (no FCT correction).
Definition fct_advection_diffusion.hpp:777
void fct_explicit_step(const grid::shell::DistributedDomain &domain, linalg::VectorFVScalar< ScalarT > &T, const linalg::VectorQ1Vec< ScalarT, 3 > &vel, const grid::Grid4DDataVec< ScalarT, 3 > &cell_centers, const grid::Grid3DDataVec< ScalarT, 3 > &grid, const grid::Grid2DDataScalar< ScalarT > &radii, const ScalarT dt, FVFCTBuffers< ScalarT > &bufs, const ScalarT diffusivity=ScalarT(0), const grid::Grid4DDataScalar< ScalarT > &source={}, const bool subtract_divergence=true, const grid::Grid4DDataScalar< grid::shell::ShellBoundaryFlag > &boundary_mask={}, const DirichletBCs< ScalarT > &bcs={})
One complete explicit FCT advection–diffusion timestep.
Definition fct_advection_diffusion.hpp:721
void apply_dirichlet_bcs(grid::Grid4DDataScalar< ScalarT > data, const grid::Grid4DDataScalar< grid::shell::ShellBoundaryFlag > &boundary_mask, const DirichletBCs< ScalarT > &bcs, const grid::shell::DistributedDomain &domain)
Strongly enforce Dirichlet boundary conditions on the radial shell boundaries.
Definition helpers.hpp:66
Kokkos::MDRangePolicy< Kokkos::Rank< 4 > > local_domain_md_range_policy_cells_fv_skip_ghost_layers(const DistributedDomain &distributed_domain)
Definition spherical_shell.hpp:2763
Kokkos::View< ScalarType *****, Layout > Grid5DDataScalar
Definition grid_types.hpp:30
Kokkos::View< ScalarType ***[VecDim], Layout > Grid3DDataVec
Definition grid_types.hpp:42
Kokkos::View< ScalarType ****, Layout > Grid4DDataScalar
Definition grid_types.hpp:27
Kokkos::View< ScalarType **, Layout > Grid2DDataScalar
Definition grid_types.hpp:21
T dot(const Vec &other) const
Definition vec.hpp:39
Kokkos kernel that computes the local maximum stable explicit dt for each FV cell.
Definition fct_advection_diffusion.hpp:112
static constexpr int num_neighbors
Definition fct_advection_diffusion.hpp:117
grid::Grid3DDataVec< ScalarT, 3 > grid_
Definition fct_advection_diffusion.hpp:119
grid::Grid4DDataVec< ScalarT, 3 > vel_grid_
Definition fct_advection_diffusion.hpp:122
grid::Grid2DDataScalar< ScalarT > radii_
Definition fct_advection_diffusion.hpp:120
grid::Grid4DDataVec< ScalarT, 3 > cell_centers_
Definition fct_advection_diffusion.hpp:121
ScalarT diffusivity_
Definition fct_advection_diffusion.hpp:123
ScalarT ScalarType
Definition fct_advection_diffusion.hpp:113
void operator()(const int id, const int x, const int y, const int r, ScalarT &local_min) const
Definition fct_advection_diffusion.hpp:126
Kokkos kernel that computes only the pre-scaled antidiffusive fluxes from .
Definition fct_advection_diffusion.hpp:813
grid::Grid4DDataScalar< ScalarT > T_old_
with ghost layers filled.
Definition fct_advection_diffusion.hpp:823
grid::Grid3DDataVec< ScalarT, 3 > grid_
Definition fct_advection_diffusion.hpp:819
ScalarT dt_
Time step .
Definition fct_advection_diffusion.hpp:825
grid::Grid5DDataScalar< ScalarT > antidiff_
Output: , shape .
Definition fct_advection_diffusion.hpp:824
void operator()(const int id, const int x, const int y, const int r) const
Definition fct_advection_diffusion.hpp:828
static constexpr int num_neighbors
Definition fct_advection_diffusion.hpp:817
grid::Grid4DDataVec< ScalarT, 3 > cell_centers_
Definition fct_advection_diffusion.hpp:821
grid::Grid2DDataScalar< ScalarT > radii_
Definition fct_advection_diffusion.hpp:820
ScalarT ScalarType
Definition fct_advection_diffusion.hpp:814
grid::Grid4DDataVec< ScalarT, 3 > vel_grid_
Definition fct_advection_diffusion.hpp:822
Kokkos kernel that applies the Zalesak-limited antidiffusive correction to .
Definition fct_advection_diffusion.hpp:607
grid::Grid4DDataScalar< ScalarT > R_minus_
correction factor (ghost layers filled).
Definition fct_advection_diffusion.hpp:614
grid::Grid5DDataScalar< ScalarT > antidiff_
: pre-scaled antidiff fluxes.
Definition fct_advection_diffusion.hpp:612
static constexpr int num_neighbors
Definition fct_advection_diffusion.hpp:609
grid::Grid4DDataScalar< ScalarT > R_plus_
correction factor (ghost layers filled).
Definition fct_advection_diffusion.hpp:613
grid::Grid4DDataScalar< ScalarT > T_L_
: low-order predictor.
Definition fct_advection_diffusion.hpp:611
grid::Grid4DDataScalar< ScalarT > T_new_
Output: .
Definition fct_advection_diffusion.hpp:615
void operator()(const int id, const int x, const int y, const int r) const
Definition fct_advection_diffusion.hpp:618
Kokkos kernel that computes the Zalesak nodal correction factors and from the low-order predictor ...
Definition fct_advection_diffusion.hpp:487
grid::Grid4DDataScalar< ScalarT > R_minus_
Output: correction factor.
Definition fct_advection_diffusion.hpp:494
grid::Grid4DDataScalar< ScalarT > T_L_
with ghost layers filled.
Definition fct_advection_diffusion.hpp:491
grid::Grid4DDataScalar< ScalarT > R_plus_
Output: correction factor.
Definition fct_advection_diffusion.hpp:493
static constexpr int num_neighbors
Definition fct_advection_diffusion.hpp:489
void operator()(const int id, const int x, const int y, const int r) const
Definition fct_advection_diffusion.hpp:497
grid::Grid5DDataScalar< ScalarT > antidiff_
: pre-scaled antidiff fluxes.
Definition fct_advection_diffusion.hpp:492
Kokkos kernel for the explicit low-order predictor and antidiffusive flux assembly.
Definition fct_advection_diffusion.hpp:263
static constexpr int num_neighbors
Definition fct_advection_diffusion.hpp:268
bool has_source_
Definition fct_advection_diffusion.hpp:290
ScalarT dt_
Time step .
Definition fct_advection_diffusion.hpp:281
bool subtract_divergence_
Whether to subtract the discrete divergence error .
Definition fct_advection_diffusion.hpp:299
grid::Grid4DDataScalar< ScalarT > T_old_
: scalar at time level (ghost layers must be filled).
Definition fct_advection_diffusion.hpp:276
void operator()(const int id, const int x, const int y, const int r) const
Definition fct_advection_diffusion.hpp:302
grid::Grid4DDataScalar< ScalarT > source_
Definition fct_advection_diffusion.hpp:289
ScalarT ScalarType
Definition fct_advection_diffusion.hpp:264
grid::Grid3DDataVec< ScalarT, 3 > grid_
Definition fct_advection_diffusion.hpp:270
grid::Grid4DDataScalar< ScalarT > T_L_
: low-order predictor output.
Definition fct_advection_diffusion.hpp:277
grid::Grid2DDataScalar< ScalarT > radii_
Definition fct_advection_diffusion.hpp:271
grid::Grid5DDataScalar< ScalarT > antidiff_
: pre-scaled antidiff flux per face, shape .
Definition fct_advection_diffusion.hpp:279
grid::Grid4DDataVec< ScalarT, 3 > vel_grid_
Definition fct_advection_diffusion.hpp:273
grid::Grid4DDataVec< ScalarT, 3 > cell_centers_
Definition fct_advection_diffusion.hpp:272
ScalarT diffusivity_
Physical diffusivity ; set to 0 for pure advection.
Definition fct_advection_diffusion.hpp:282
All working storage for a single FCT timestep, allocated once and reused every step.
Definition fct_advection_diffusion.hpp:29
grid::Grid4DDataScalar< ScalarType > T_L
Low-order (upwind) predictor ; same cell layout as the transported scalar.
Definition fct_advection_diffusion.hpp:31
grid::Grid4DDataScalar< ScalarType > R_minus
Zalesak correction factor — limits incoming negative antidiff flux.
Definition fct_advection_diffusion.hpp:38
communication::shell::FVGhostLayerBuffers< ScalarType > ghost_T
MPI ghost-layer buffers for (reused for T_L as well via the same slot).
Definition fct_advection_diffusion.hpp:41
grid::Grid4DDataScalar< ScalarType > R_plus
Zalesak correction factor — limits incoming positive antidiff flux.
Definition fct_advection_diffusion.hpp:36
communication::shell::FVGhostLayerBuffers< ScalarType > ghost_R_plus
MPI ghost-layer buffers for (needed so the correction kernel reads neighbours).
Definition fct_advection_diffusion.hpp:43
grid::Grid5DDataScalar< ScalarType > antidiff
Definition fct_advection_diffusion.hpp:34
communication::shell::FVGhostLayerBuffers< ScalarType > ghost_R_minus
MPI ghost-layer buffers for .
Definition fct_advection_diffusion.hpp:45
FVFCTBuffers(const grid::shell::DistributedDomain &domain)
Definition fct_advection_diffusion.hpp:47
Stateless geometry helper for a single FV hex cell.
Definition geometry_helper.hpp:32
static constexpr int cell_offset_y(int n)
Definition geometry_helper.hpp:42
static constexpr int cell_offset_r(int n)
Definition geometry_helper.hpp:47
static constexpr int cell_offset_x(int n)
Definition geometry_helper.hpp:37
static constexpr int num_neighbors
Definition geometry_helper.hpp:35
static void compute_geometry(const grid::Grid3DDataVec< ScalarT, 3 > &grid, const grid::Grid2DDataScalar< ScalarT > &radii, const grid::Grid4DDataVec< ScalarT, 3 > &cell_centers, const grid::Grid4DDataVec< ScalarT, 3 > &vel_grid, const int local_subdomain_id, const int x_cell, const int y_cell, const int r_cell, ScalarT(&beta)[num_neighbors], ScalarT &M_ii, Vec3(&S_f)[num_neighbors])
Compute beta[6], M_ii, and S_f[6] for the cell at (x_cell, y_cell, r_cell).
Definition geometry_helper.hpp:191