peclet.voro 1.0.0
Device-native moving-particle Voronoi dynamics
Loading...
Searching...
No Matches
Static Public Member Functions | Static Public Attributes | List of all members
peclet::voro::Power Struct Reference

#include <plane_policy.hpp>

Static Public Member Functions

template<class Real >
static KOKKOS_INLINE_FUNCTION Real offsetFromRel (const Real r[3], Real wSelf, Real wNbr)
 
template<class Real >
static KOKKOS_INLINE_FUNCTION Real blockReachSq (Real rSqMax, Real wSelf, Real wMaxAll)
 
template<class Real >
static KOKKOS_INLINE_FUNCTION void planeFromNeighbour (const Real pSelf[3], const Real pNbr[3], Real wSelf, Real wNbr, Real L, Real pdir[3], Real &off)
 
template<class Real >
static KOKKOS_INLINE_FUNCTION void buildNormal (const Real pSelf[3], const Real pNbr[3], Real wSelf, Real wNbr, Real L, Real nOut[3])
 Foot-point normal n = (off/|pdir|²) pdir = α r.
 
template<class Real >
static KOKKOS_INLINE_FUNCTION void chain (const Real g[3], const Real r[3], Real rho, Real c, Real fSelf[3], Real fNbr[3], Real &fwSelf, Real &fwNbr)
 

Static Public Attributes

static constexpr bool kHasWeightDof = true
 

Detailed Description

Power / Laguerre plane policy: the radical plane between weighted seeds. With r = p_j − p_i, ρ = |r|², c = w_i − w_j, α = (ρ+c)/(2ρ), the foot-point normal is n = α r and the half-space offset is d = ½(ρ+c). Unlike the bisector, d can be negative (the seed can lie OUTSIDE its own cell) — the generic ConvexCell::clip already tolerates that. Both positions and weights are DOFs.

Member Function Documentation

◆ blockReachSq()

template<class Real >
static KOKKOS_INLINE_FUNCTION Real peclet::voro::Power::blockReachSq ( Real  rSqMax,
Real  wSelf,
Real  wMaxAll 
)
inlinestatic

Squared reachability radius for the sorted-worklist early-out (weight-aware). A radical plane to a neighbour with weight w_nbr ≤ W_max cuts iff some vertex v has r·v > d = ½(|r|²+w_self− w_nbr) ≥ ½(|r|²+w_self−W_max). With |r|·√rSqMax ≥ r·v the worst (heaviest) neighbour can cut only while |r| < √rSqMax + √(rSqMax + max(0, W_max−w_self)); beyond that block, break. Reduces to 4·rSqMax when weights are equal (W_max = w_self), matching the Voronoi bound.

◆ buildNormal()

template<class Real >
static KOKKOS_INLINE_FUNCTION void peclet::voro::Power::buildNormal ( const Real  pSelf[3],
const Real  pNbr[3],
Real  wSelf,
Real  wNbr,
Real  L,
Real  nOut[3] 
)
inlinestatic

Foot-point normal n = (off/|pdir|²) pdir = α r.

◆ chain()

template<class Real >
static KOKKOS_INLINE_FUNCTION void peclet::voro::Power::chain ( const Real  g[3],
const Real  r[3],
Real  rho,
Real  c,
Real  fSelf[3],
Real  fNbr[3],
Real &  fwSelf,
Real &  fwNbr 
)
inlinestatic

Chain g = dGeom/dn_k to the seed DOFs. n = α r, α = ½ + c/(2ρ), c = w_self − w_nbr. Position: J = ∂n/∂r = α I − (c/ρ²) r rᵀ, ∂r/∂p_nbr = +I ⇒ dGeom/dp_nbr = α g − (c/ρ²)(r·g) r , dGeom/dp_self = −(that). Weight: ∂n/∂w_self = r/(2ρ), ∂n/∂w_nbr = −r/(2ρ) ⇒ dGeom/dw_self = (g·r)/(2ρ) , dGeom/dw_nbr = −(that). c = 0 recovers the Voronoi split (∓½ g, zero weight force).

◆ offsetFromRel()

template<class Real >
static KOKKOS_INLINE_FUNCTION Real peclet::voro::Power::offsetFromRel ( const Real  r[3],
Real  wSelf,
Real  wNbr 
)
inlinestatic

Half-space offset for the forward clip {x : r·x ≤ off} given the min-image relative vector r = p_j − p_i (pdir == r). Power: off = d = ½(|r|² + w_self − w_nbr), which can be negative.

◆ planeFromNeighbour()

template<class Real >
static KOKKOS_INLINE_FUNCTION void peclet::voro::Power::planeFromNeighbour ( const Real  pSelf[3],
const Real  pNbr[3],
Real  wSelf,
Real  wNbr,
Real  L,
Real  pdir[3],
Real &  off 
)
inlinestatic

FORWARD clip: pdir = r (min-image), off = d = ½(|r|² + w_self − w_nbr). ConvexCell::clip then stores n = (off/|pdir|²) pdir = α r.

Member Data Documentation

◆ kHasWeightDof

constexpr bool peclet::voro::Power::kHasWeightDof = true
staticconstexpr

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