peclet.voro 1.0.4
Device-native moving-particle Voronoi dynamics
Loading...
Searching...
No Matches
peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf > Struct Template Reference

#include <repair.hpp>

Collaboration diagram for peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >:

Public Types

using Mem = peclet::core::MemSpace
 
using Exec = peclet::core::ExecSpace
 
using PlanePolicy = std::conditional_t< Weighted, Power, Voronoi >
 
using CertCell = ConvexCell< Real, MAXP, MAXT, false >
 
using BuildCell = ConvexCell< Real, MAXP, MAXT, true >
 
using Store = TopologyStore< MAXP, MAXT >
 

Public Member Functions

BuildReport report () const
 A2a validity diagnostics of the last cold (re)build (counts over the maintained cells).
 
void setWeights (const Kokkos::View< Real *, Mem > &w)
 Set the per-seed power weights (Weighted only). Held by reference; the caller keeps it alive.
 
void alloc (int n, const Real Lbox[3], Real tol_, Real skin_, int sw_=kSearchWindow, int densityCount_=-1, int nProc_=-1)
 
void rebuild (const Kokkos::View< Real *, Mem > &pos, bool eagerAdj=true)
 
int compact (const Kokkos::View< int *, Mem > &m, const Kokkos::View< int *, Mem > &wl)
 Compact the nonzero entries of m[0..nProc) into wl, returning the count.
 
template<bool Local>
void certify (const Kokkos::View< Real *, Mem > &pos, const Kokkos::View< int *, Mem > &outMask, const Kokkos::View< int *, Mem > &outMover, bool useSkin)
 
template<bool Local>
void certifyList (const Kokkos::View< Real *, Mem > &pos, const Kokkos::View< int *, Mem > &list, int n, const Kokkos::View< int *, Mem > &outMask)
 
void rebuildAdjAll (const Kokkos::View< Real *, Mem > &pos)
 
void maybeBuildAdj (const Kokkos::View< Real *, Mem > &pos)
 
void gatherSet (const TessGrid< Real > &grid, const Kokkos::View< int *, Mem > &wl, int n, const Kokkos::View< Real *, Mem > &pos)
 
void collectNewNbrs (const Kokkos::View< int *, Mem > &wl, int n, const Kokkos::View< int *, Mem > &outMask)
 
void surgicalRepair (const Kokkos::View< int *, Mem > &wl, int n, const Kokkos::View< Real *, Mem > &pos)
 
bool dilate (const TessGrid< Real > &grid, const Kokkos::View< Real *, Mem > &pos)
 
void certifyDispatch (const Kokkos::View< Real *, Mem > &pos, const Kokkos::View< int *, Mem > &outMask, const Kokkos::View< int *, Mem > &outMover, bool useSkin)
 
void certifyListDispatch (const Kokkos::View< Real *, Mem > &pos, const Kokkos::View< int *, Mem > &list, int n, const Kokkos::View< int *, Mem > &outMask)
 
RepairStats step (const Kokkos::View< Real *, Mem > &pos)
 One moving-point update step. Updates store + vol in place from pos.
 

Static Public Member Functions

static KOKKOS_INLINE_FUNCTION void dispFromRef (const Kokkos::View< Real *, Mem > &P, const Kokkos::View< Real *, Mem > &XR, int i, Real Lx, Real Ly, Real Lz, Real &dx, Real &dy, Real &dz)
 

Public Attributes

int N = 0
 total cells in the resident arrays (single-domain: all; MPI: owned+ghost)
 
int nProc
 
int sw = kSearchWindow
 
int densityCount = -1
 
Real L [3] = {1, 1, 1}
 
Real tol
 certificate tolerance (absolute distance); ~1e-4·spacing FP64, ~2e-3·spacing FP32
 
Real skin = 0
 Verlet skin width (absolute); a particle moving > skin/2 is a Pass-1 mover.
 
int verifyCap = 2
 max verify extra-passes before falling back to a full rebuild
 
bool useGate = true
 high-churn → rebuild routing (the "never slower than rebuild" guard)
 
bool profile = false
 the cold build's timing / over-buffer report on stderr
 
int lastOverBufferRebuilds = 0
 of the last cold (re)build (BuildReport)
 
bool useDilation
 
double churnThresh
 
double dilateMaxChurn
 
int clusterNbhd = 18
 
bool surgical
 repair flip cells by re-clipping known candidates instead of gathering
 
bool localCert
 
bool adjFresh
 
bool useLocalNow = false
 this step's certify uses the local cert (= localCert && adjFresh)
 
Kokkos::View< int *, Mem > lastStatus
 
Store store
 
Kokkos::View< Real *, Mem > vol
 
Kokkos::View< Real *, Mem > xRef
 
Kokkos::View< Real *, Mem > weight
 
bool useNearMiss = true
 
int kNearCap = 32
 per-cell list capacity (overflow ⇒ re-gather every step)
 
Real nearMarginFrac = Real(0.5)
 margin = nearMarginFrac · skin
 
bool nearFresh = false
 
Kokkos::View< int *, Mem > near
 
Kokkos::View< int *, Mem > nearCnt
 
Kokkos::View< int, Mem > nearCounter
 
Sdf sdf
 the geometry provider (replicated on every rank under MPI)
 
WallStore< Real > wall
 persisted wall planes (allocated by alloc() when kHasSdf)
 
bool wallExact = true
 re-gather every wall-clipped cell that moved (== cold build)
 
Real wallSkin = 0
 skin mode (wallExact=false): re-gather a wall cell only past this
 
Kokkos::View< int, Mem > wallCounter
 
Kokkos::View< int *, Mem > mask
 
Kokkos::View< int *, Mem > mask2
 
Kokkos::View< int *, Mem > mover
 
Kokkos::View< int *, Mem > rebuilt
 
Kokkos::View< int *, Mem > wl1
 
Kokkos::View< int *, Mem > wl2
 
Kokkos::View< int *, Mem > wlM
 
Kokkos::View< int *, Mem > cellFlag
 
Kokkos::View< int *, Mem > extraNbr
 
Kokkos::View< int *, Mem > extraCnt
 
Kokkos::View< int, Mem > counter
 
int gridNcell = 0
 

Static Public Attributes

static constexpr bool kHasSdf = !std::is_same_v<Sdf, NoSdf>
 
static constexpr int kExtraCap = 8
 per-cell capacity for partner-discovered new neighbours
 

Detailed Description

template<class Real, int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
struct peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >

Resident moving-point tessellation with two-pass gather repair. MAXP/MAXT must match CellBuilder::kMaxP / kMaxT (params.hpp: kMaxPlanes / kMaxTriangles).

Member Typedef Documentation

◆ BuildCell

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
using peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::BuildCell = ConvexCell<Real, MAXP, MAXT, true>

◆ CertCell

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
using peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::CertCell = ConvexCell<Real, MAXP, MAXT, false>

◆ Exec

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
using peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::Exec = peclet::core::ExecSpace

◆ Mem

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
using peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::Mem = peclet::core::MemSpace

◆ PlanePolicy

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
using peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::PlanePolicy = std::conditional_t<Weighted, Power, Voronoi>

◆ Store

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
using peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::Store = TopologyStore<MAXP, MAXT>

Member Function Documentation

◆ alloc()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::alloc ( int  n,
const Real  Lbox[3],
Real  tol_,
Real  skin_,
int  sw_ = kSearchWindow,
int  densityCount_ = -1,
int  nProc_ = -1 
)
inline
Parameters
nProc_cells to maintain (default n = single-domain). For the distributed driver pass the owned count: cells [0,nProc) are repaired, [nProc,N) are ghost cut-candidates only.

◆ certify()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
template<bool Local>
void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::certify ( const Kokkos::View< Real *, Mem > &  pos,
const Kokkos::View< int *, Mem > &  outMask,
const Kokkos::View< int *, Mem > &  outMover,
bool  useSkin 
)
inline

Re-eval every cell on pos over its stored topology, write its volume, and classify it: outMask(i)=1 if the cell is inconsistent (lost-face) OR is a violated-plane partner of some flagging cell (the flip side — fully covered by Pass 1) OR is a skin-mover; outMover(i)=1 if the cell moved > skin/2 since its last (re)build (the INSERTION trigger — only these need their new neighbours expanded in Pass 2, §1c). useSkin gates the mover trigger (off during verify passes — movers are a once-per-step trigger already folded into Pass 1, and the verify only needs to re-close residual flips).

◆ certifyDispatch()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::certifyDispatch ( const Kokkos::View< Real *, Mem > &  pos,
const Kokkos::View< int *, Mem > &  outMask,
const Kokkos::View< int *, Mem > &  outMover,
bool  useSkin 
)
inline

Launch-time dispatch of the certificate kernel (Change 7): the gate decides local vs brute, then launches the corresponding COMPILE-TIME specialization — there is no runtime cert branch inside the kernel. useLocalNow is the only place this is decided per step.

◆ certifyList()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
template<bool Local>
void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::certifyList ( const Kokkos::View< Real *, Mem > &  pos,
const Kokkos::View< int *, Mem > &  list,
int  n,
const Kokkos::View< int *, Mem > &  outMask 
)
inline

Scoped re-certify: reeval + certificate over ONLY the n cells in list (refresh their vol), set outMask(i)=1 for any inconsistent + OR-mark their partners. The verify uses this instead of a full re-certify: after the gathers, every NON-gathered cell's reeval is bit-identical to the Pass-1 certify (its store + its neighbours' positions are unchanged), and every gained edge has BOTH endpoints gathered (a flip's partner endpoints in Pass 1, a mover's new neighbours in Pass 2), so only the gathered cells can differ — re-checking just them is provably equivalent to a full re-certify at a fraction of the cost (this is what lets the small-displacement speedup rise instead of being pinned by a second full-N reeval).

◆ certifyListDispatch()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::certifyListDispatch ( const Kokkos::View< Real *, Mem > &  pos,
const Kokkos::View< int *, Mem > &  list,
int  n,
const Kokkos::View< int *, Mem > &  outMask 
)
inline

◆ collectNewNbrs()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::collectNewNbrs ( const Kokkos::View< int *, Mem > &  wl,
int  n,
const Kokkos::View< int *, Mem > &  outMask 
)
inline

Collect into outMask the face-neighbours (planes with ≥3 incident live triangles) of the n cells in wl[0..n) that have NOT already been rebuilt — the Pass-2 / expansion set.

◆ compact()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
int peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::compact ( const Kokkos::View< int *, Mem > &  m,
const Kokkos::View< int *, Mem > &  wl 
)
inline

Compact the nonzero entries of m[0..nProc) into wl, returning the count.

◆ dilate()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
bool peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::dilate ( const TessGrid< Real > &  grid,
const Kokkos::View< Real *, Mem > &  pos 
)
inline

Dense-cluster dilation (Phase 3): bin the flagged cells into the linear grid, then add every owned cell whose 27-grid-cell neighbourhood holds > clusterNbhd flagged seeds to the Pass-1 mask. This over-covers a local cascade in ONE regional gather instead of paying a kernel-launch per verify iteration. Over-coverage is always safe (a gathered cell is just re-clipped correctly). Returns true if it added any cell. Uses the linear grid index (independent of the grid's Morton ordering).

◆ dispFromRef()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
static KOKKOS_INLINE_FUNCTION void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::dispFromRef ( const Kokkos::View< Real *, Mem > &  P,
const Kokkos::View< Real *, Mem > &  XR,
int  i,
Real  Lx,
Real  Ly,
Real  Lz,
Real &  dx,
Real &  dy,
Real &  dz 
)
inlinestatic

Min-imaged displacement of seed i from its Verlet/wall reference (the position at its last (re)build). The wall planes are restored relative to this.

◆ gatherSet()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::gatherSet ( const TessGrid< Real > &  grid,
const Kokkos::View< int *, Mem > &  wl,
int  n,
const Kokkos::View< Real *, Mem > &  pos 
)
inline

Gather the n cells listed in wl[0..n) off grid (updating store + vol in place), mark them rebuilt, and RESET their Verlet reference to the current position (their neighbourhood is now fresh, so the skin/2 mover test for these cells restarts from here — proper per-cell Verlet). Reuses the per-step grid.

◆ maybeBuildAdj()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::maybeBuildAdj ( const Kokkos::View< Real *, Mem > &  pos)
inline

Lazily repopulate store.poke4 on a low-churn step so later steps use the cheap local certificate. A gate-rebuild clears adjFresh; gating steps return before this runs, so a sustained high-churn regime keeps falling back to the brute certificate (no adj overhead), and a low-churn streak pays the full rebuildAdjAll exactly once (then gathers maintain adj incrementally).

◆ rebuild()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::rebuild ( const Kokkos::View< Real *, Mem > &  pos,
bool  eagerAdj = true 
)
inline

Full cold (re)build: the production tessellator emitting the resident topology + volume, then reset the Verlet reference. This is the oracle, the fallback, and the initial build.

Parameters
eagerAdjpopulate store.poke4 now (default; the cheap initial/explicit rebuild → next step is local). A GATE-rebuild passes false: in a high-churn regime we keep rebuilding, so paying rebuildAdjAll every step is wasted — fall back to the brute certificate until churn drops, then maybeBuildAdj rebuilds the adjacency once.

◆ rebuildAdjAll()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::rebuildAdjAll ( const Kokkos::View< Real *, Mem > &  pos)
inline

Repopulate store.poke4 for ALL owned cells from the resident topology — pure topology (brute findSharing, ConvexCell::rebuildAdjacency), no incremental stitch. Used only after a cold buildTessellation (which does not emit adjacency); the frequent gathers maintain adj incrementally. The result is element-for-element identical to the gather's incremental adj (validated foundation gate), so the two adj sources mix cleanly across the store.

◆ report()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
BuildReport peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::report ( ) const
inline

A2a validity diagnostics of the last cold (re)build (counts over the maintained cells).

◆ setWeights()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::setWeights ( const Kokkos::View< Real *, Mem > &  w)
inline

Set the per-seed power weights (Weighted only). Held by reference; the caller keeps it alive.

◆ step()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
RepairStats peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::step ( const Kokkos::View< Real *, Mem > &  pos)
inline

One moving-point update step. Updates store + vol in place from pos.

◆ surgicalRepair()

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
void peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::surgicalRepair ( const Kokkos::View< int *, Mem > &  wl,
int  n,
const Kokkos::View< Real *, Mem > &  pos 
)
inline

Phase-4 single-face surgical repair: rebuild each flip cell in wl[0..n) by re-clipping the box with its KNOWN candidate set — stored neighbours ∪ partner-discovered extras (extraNbr) — at the current positions, with NO grid gather (the clip is order-independent and only commits planes that cut, so stale/lost-face neighbours are harmless no-ops). Updates store + vol, marks rebuilt, resets the Verlet reference. A cell whose candidate set is incomplete comes out wrong and is caught + re-gathered by the verify loop (the exact fallback) — so surgical is safe by construction. Used only for FLIP cells; far-mover insertions keep the full gather (their new neighbours aren't in any candidate list).

Member Data Documentation

◆ adjFresh

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
bool peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::adjFresh
Initial value:
=
false

store.poke4 is valid for the whole current topology. Gathers maintain it incrementally (TrackAdj clip + outAdj); a cold buildTessellation does NOT emit adj, so it clears this and maybeBuildAdj repopulates lazily (skipped on a gate-rebuild so a sustained high-churn regime stays on the brute cert).

◆ cellFlag

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::cellFlag

◆ churnThresh

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
double peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::churnThresh
Initial value:
=
0.55

flagged-fraction above which a full rebuild is cheaper than repairing (per-backend, set in alloc — GPU rebuild is cheap so it gives up sooner).

◆ clusterNbhd

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
int peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::clusterNbhd = 18

a cell whose 27-grid-cell neighbourhood has > this many flagged seeds is "dense" (≈ a region far above the field average) and gets dilated.

◆ counter

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::counter

◆ densityCount

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
int peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::densityCount = -1

◆ dilateMaxChurn

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
double peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::dilateMaxChurn
Initial value:
=
0.15

only consider dilation when GLOBAL churn is low (a real local cluster, not a uniformly-moderate field where every neighbourhood looks "dense").

◆ extraCnt

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::extraCnt

◆ extraNbr

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::extraNbr

◆ gridNcell

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
int peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::gridNcell = 0

◆ kExtraCap

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
constexpr int peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::kExtraCap = 8
staticconstexpr

per-cell capacity for partner-discovered new neighbours

◆ kHasSdf

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
constexpr bool peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::kHasSdf = !std::is_same_v<Sdf, NoSdf>
staticconstexpr

◆ kNearCap

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
int peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::kNearCap = 32

per-cell list capacity (overflow ⇒ re-gather every step)

◆ L

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Real peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::L[3] = {1, 1, 1}

◆ lastOverBufferRebuilds

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
int peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::lastOverBufferRebuilds = 0

of the last cold (re)build (BuildReport)

◆ lastStatus

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::lastStatus

per-cell StatusBit mask of the last cold (re)build

◆ localCert

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
bool peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::localCert
Initial value:
=
true

use ConvexCell::isLocallyConvexPartners (read each triangle's 4 precomputed poke4 planes — 3 edge-opposite + 4th-face — O(nt)) instead of the brute O(nt·np) form. The gather derives poke4 from the clip-maintained edge adjacency (computePoke4, no findSharing) into store.poke4, so it is fused into the build with no separate maintenance pass, and the cert reads it directly each step. With the 4th-face plane the local cert is COMPLETE (matches the brute flag set — bench GATE 2), so there is no fallback gate.

◆ mask

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::mask

◆ mask2

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::mask2

◆ mover

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::mover

◆ N

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
int peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::N = 0

total cells in the resident arrays (single-domain: all; MPI: owned+ghost)

◆ near

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::near

◆ nearCnt

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::nearCnt

◆ nearCounter

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::nearCounter

◆ nearFresh

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
bool peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::nearFresh = false

the lists cover every owned cell (a gate-rebuild skips emitting them — its wider search reach costs a third of a cold build — and the first low-churn step afterwards pays ONE emitting rebuild, the adjacency's lazy pattern)

◆ nearMarginFrac

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Real peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::nearMarginFrac = Real(0.5)

margin = nearMarginFrac · skin

◆ nProc

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
int peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::nProc
Initial value:
=
0

cells this instance MAINTAINS (single-domain: N; MPI: owned, [0,nProc)). The grid

  • gather candidates always span all N (ghosts are cut candidates, not maintained).

◆ profile

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
bool peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::profile = false

the cold build's timing / over-buffer report on stderr

◆ rebuilt

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::rebuilt

◆ sdf

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Sdf peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::sdf

the geometry provider (replicated on every rank under MPI)

◆ skin

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Real peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::skin = 0

Verlet skin width (absolute); a particle moving > skin/2 is a Pass-1 mover.

◆ store

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Store peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::store

◆ surgical

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
bool peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::surgical
Initial value:
=
false

repair flip cells by re-clipping known candidates instead of gathering

◆ sw

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
int peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::sw = kSearchWindow

◆ tol

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Real peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::tol
Initial value:
=
0

certificate tolerance (absolute distance); ~1e-4·spacing FP64, ~2e-3·spacing FP32

◆ useDilation

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
bool peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::useDilation
Initial value:
=
false

dense-cluster regional dilation branch. DEFAULT OFF: on Poisson/lattice workloads there are no genuine clusters, the verify loop already closes the rare cascade, and the per-step count/mark scan is pure overhead. Turn on for strongly clustered inputs (the regime it is meant for).

◆ useGate

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
bool peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::useGate = true

high-churn → rebuild routing (the "never slower than rebuild" guard)

◆ useLocalNow

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
bool peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::useLocalNow = false

this step's certify uses the local cert (= localCert && adjFresh)

◆ useNearMiss

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
bool peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::useNearMiss = true

◆ verifyCap

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
int peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::verifyCap = 2

max verify extra-passes before falling back to a full rebuild

◆ vol

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<Real*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::vol

◆ wall

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
WallStore<Real> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::wall

persisted wall planes (allocated by alloc() when kHasSdf)

◆ wallCounter

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::wallCounter

◆ wallExact

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
bool peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::wallExact = true

re-gather every wall-clipped cell that moved (== cold build)

◆ wallSkin

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Real peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::wallSkin = 0

skin mode (wallExact=false): re-gather a wall cell only past this

◆ weight

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<Real*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::weight

◆ wl1

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::wl1

◆ wl2

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::wl2

◆ wlM

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<int*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::wlM

◆ xRef

template<class Real , int MAXP = kMaxPlanes, int MAXT = kMaxTriangles, bool Weighted = false, class Sdf = NoSdf>
Kokkos::View<Real*, Mem> peclet::voro::MovingTessellation< Real, MAXP, MAXT, Weighted, Sdf >::xRef

The documentation for this struct was generated from the following file: