Mundy: Multibody Nonlocal Dynamics Version of the Day
Loading...
Searching...
No Matches
mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric > Class Template Reference

Rebuilder that triggers when any OBB escapes its inflated snapshot. More...

#include <NeighborListRebuilder.hpp>

Public Types

Aliases
using memory_space = MemorySpace
using execution_space = typename MemorySpace::execution_space
using metric_type = Metric
using scalar_type = Scalar
using obb_type = OBB<Scalar>
using obb_component_type = mundy::mesh::OBBFieldComponent<Scalar>

Public Member Functions

Constructors
 RebuildOnOBBDisplacement (obb_component_type obbs, Scalar max_displacement)
 Construct with a symmetric OBB component and a single threshold (aperiodic).
 RebuildOnOBBDisplacement (obb_component_type target_obbs, obb_component_type source_obbs, Scalar max_displacement)
 Construct with separate target/source OBB components and a single threshold (aperiodic).
 RebuildOnOBBDisplacement (obb_component_type target_obbs, obb_component_type source_obbs, Scalar target_max_displacement, Scalar source_max_displacement)
 Construct with separate target/source OBB components and asymmetric thresholds (aperiodic).
 RebuildOnOBBDisplacement (obb_component_type obbs, Scalar max_displacement, const Metric &metric)
 Construct with a symmetric OBB component, a single threshold, and an explicit metric.
 RebuildOnOBBDisplacement (obb_component_type target_obbs, obb_component_type source_obbs, Scalar target_max_displacement, Scalar source_max_displacement, const Metric &metric)
 Construct with separate target/source OBB components, asymmetric thresholds, and a metric.
Rebuild policy
void setup (const stk::mesh::BulkData &, const stk::mesh::Selector &, const stk::mesh::Selector &) noexcept
 No per-update setup needed; OBBs are read on demand from the stored OBB components.
template<typename TargetInput, typename SourceInput>
requires NeighborListInputType<TargetInput> && NeighborListInputType<SourceInput>
bool needs_rebuild (const stk::mesh::BulkData &bulk, const TargetInput &targets, const SourceInput &sources)
 Return true if any OBB has escaped its inflated snapshot containment region.
template<typename TargetInput, typename SourceInput>
requires NeighborListInputType<TargetInput> && NeighborListInputType<SourceInput>
void snapshot (const stk::mesh::BulkData &bulk, const TargetInput &targets, const SourceInput &sources)
 Snapshot the current OBBs into the per-side scratch fields.
Chaining
template<RebuilderType Next>
RebuilderChain< RebuildOnOBBDisplacement, Next > rebuild_if (const Next &next) const
template<RebuilderType Next>
RebuilderChain< RebuildOnOBBDisplacement, Next > operator| (const Next &next) const

Detailed Description

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
class mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >

After each build, snapshot() records every target and source OBB. needs_rebuild() checks whether each current OBB is still fully contained within the inflated snapshot OBB (half-extents expanded by the displacement threshold d).

Containment check
For a pair of OBBs obb_old (snapshot) and obb_new (current), the check is obb_new ⊆ expand(obb_old, d). Using obb_old's three face normals as projection axes — sufficient for containment in any convex body — this reduces to:
T = R_old^T * (c_new - c_old) // center displacement in obb_old's local frame
R_rel = R_old^T * R_new // relative rotation matrix
for axis i = 0, 1, 2:
|T[i]| + sum_k |R_rel(i,k)| * h_new[k] <= h_old[i] + d

All eight corners of obb_new are implicitly checked: the first term is the center displacement and the second is the maximum extent of obb_new along axis i, achieved at the worst-case corner. If the inequality fails for any axis, the OBB has escaped its inflated containment region and a rebuild is required.

Note that the check uses only the face normals of the snapshot OBB (not all 15 SAT axes). This is correct because containment in a convex set is determined entirely by its own supporting halfspaces — the three axis-pairs that define the OBB.

Relationship to RebuildOnAABBDisplacement
For axis-aligned boxes, the containment check above degenerates to the per-corner scalar displacement check in RebuildOnAABBDisplacement: axes are fixed so T[i] = corner_disp[i] and R_rel = I. RebuildOnOBBDisplacement is the correct generalisation when orientations can change between rebuilds.
Input and views
Unlike RebuildOnAABBDisplacement (which reads boxes from the search input), OBBs are not part of the standard search input and must be supplied as caller-owned Kokkos views at construction. The user is responsible for keeping those views up to date before each call.

Member Typedef Documentation

◆ memory_space

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
using mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::memory_space = MemorySpace

◆ execution_space

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
using mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::execution_space = typename MemorySpace::execution_space

◆ metric_type

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
using mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::metric_type = Metric

◆ scalar_type

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
using mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::scalar_type = Scalar

◆ obb_type

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
using mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::obb_type = OBB<Scalar>

◆ obb_component_type

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
using mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::obb_component_type = mundy::mesh::OBBFieldComponent<Scalar>

Constructor & Destructor Documentation

◆ RebuildOnOBBDisplacement() [1/5]

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::RebuildOnOBBDisplacement ( obb_component_type obbs,
Scalar max_displacement )
inlineexplicit

The same OBB component is read for both target and source sides (over each input's selector). Available only for the default aperiodic FreeSpaceMetric; supply a metric explicitly for periodic simulations.

Parameters
obbs[in] OBB component supplying each entity's OBB; shared by both sides.
max_displacement[in] Rebuild when any OBB corner exits its inflated snapshot.

◆ RebuildOnOBBDisplacement() [2/5]

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::RebuildOnOBBDisplacement ( obb_component_type target_obbs,
obb_component_type source_obbs,
Scalar max_displacement )
inline
Parameters
target_obbs[in] OBB component for target entities.
source_obbs[in] OBB component for source entities.
max_displacement[in] Threshold applied to both targets and sources.

◆ RebuildOnOBBDisplacement() [3/5]

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::RebuildOnOBBDisplacement ( obb_component_type target_obbs,
obb_component_type source_obbs,
Scalar target_max_displacement,
Scalar source_max_displacement )
inline
Parameters
target_obbs[in] OBB component for target entities.
source_obbs[in] OBB component for source entities.
target_max_displacement[in] Threshold for target OBBs.
source_max_displacement[in] Threshold for source OBBs.

◆ RebuildOnOBBDisplacement() [4/5]

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::RebuildOnOBBDisplacement ( obb_component_type obbs,
Scalar max_displacement,
const Metric & metric )
inline

Use this for periodic simulations where the center-displacement term must respect the periodic cell geometry.

Parameters
obbs[in] OBB component shared by both target and source sides.
max_displacement[in] Threshold applied to both sides.
metric[in] Metric used to compute minimum-image center displacement.

◆ RebuildOnOBBDisplacement() [5/5]

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::RebuildOnOBBDisplacement ( obb_component_type target_obbs,
obb_component_type source_obbs,
Scalar target_max_displacement,
Scalar source_max_displacement,
const Metric & metric )
inline

This is the canonical constructor that all others delegate to. Because the OBB components — hence their fields and metadata — are available here, the per-side scratch snapshot field(s) are declared now: one shared field when both sides read the same field, otherwise one field per side. On a committed mesh the declaration is scoped as a late field.

Parameters
target_obbs[in] OBB component for target entities.
source_obbs[in] OBB component for source entities.
target_max_displacement[in] Threshold for target OBBs.
source_max_displacement[in] Threshold for source OBBs.
metric[in] Metric for minimum-image center displacement.

Member Function Documentation

◆ setup()

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
void mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::setup ( const stk::mesh::BulkData & ,
const stk::mesh::Selector & ,
const stk::mesh::Selector &  )
inlinenoexcept

◆ needs_rebuild()

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
template<typename TargetInput, typename SourceInput>
requires NeighborListInputType<TargetInput> && NeighborListInputType<SourceInput>
bool mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::needs_rebuild ( const stk::mesh::BulkData & bulk,
const TargetInput & targets,
const SourceInput & sources )
inline

The current OBBs (from the stored components) are compared against the snapshot OBBs (held in the per-side scratch fields), read at the same FastMeshIndex per entity over each input's selector. On the first call (no snapshot yet), always returns true.

◆ snapshot()

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
template<typename TargetInput, typename SourceInput>
requires NeighborListInputType<TargetInput> && NeighborListInputType<SourceInput>
void mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::snapshot ( const stk::mesh::BulkData & bulk,
const TargetInput & targets,
const SourceInput & sources )
inline

◆ rebuild_if()

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
template<RebuilderType Next>
RebuilderChain< RebuildOnOBBDisplacement, Next > mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::rebuild_if ( const Next & next) const
inline

◆ operator|()

template<typename Scalar = double, typename MemorySpace = stk::ngp::MemSpace, typename Metric = FreeSpaceMetric<Scalar>>
template<RebuilderType Next>
RebuilderChain< RebuildOnOBBDisplacement, Next > mundy::search::RebuildOnOBBDisplacement< Scalar, MemorySpace, Metric >::operator| ( const Next & next) const
inline