Celeritas  0.5.0-56+6b053cd
Public Member Functions | List of all members
celeritas::SimpleUnitTracker Class Reference

Track a particle in a universe of well-connected volumes. More...

#include <SimpleUnitTracker.hh>

Public Types

Type aliases
using ParamsRef = NativeCRef< OrangeParamsData >
 
using Initialization = detail::Initialization
 
using Intersection = detail::Intersection
 
using LocalState = detail::LocalState
 

Public Member Functions

CELER_FUNCTION SimpleUnitTracker (ParamsRef const &params, SimpleUnitId id)
 Construct with reference to persistent parameter data. More...
 
CELER_FUNCTION LocalVolumeId::size_type num_volumes () const
 Number of local volumes.
 
CELER_FUNCTION LocalSurfaceId::size_type num_surfaces () const
 Number of local surfaces.
 
CELER_FUNCTION SimpleUnitRecord const & unit_record () const
 SimpleUnitRecord for this tracker.
 
CELER_FUNCTION DaughterId daughter (LocalVolumeId vol) const
 DaughterId of universe embedded in a given volume.
 
CELER_FUNCTION Initialization initialize (LocalState const &state) const
 Find the local volume from a position. More...
 
CELER_FUNCTION Initialization cross_boundary (LocalState const &state) const
 Find the local volume on the opposite side of a surface.
 
CELER_FUNCTION Intersection intersect (LocalState const &state) const
 Calculate distance-to-intercept for the next surface.
 
CELER_FUNCTION Intersection intersect (LocalState const &state, real_type max_dist) const
 Calculate distance-to-intercept for the next surface.
 
CELER_FUNCTION real_type safety (Real3 const &pos, LocalVolumeId vol) const
 Calculate nearest distance to a surface in any direction. More...
 
CELER_FUNCTION Real3 normal (Real3 const &pos, LocalSurfaceId surf) const
 Calculate the local surface normal.
 
template<class F >
CELER_FUNCTION auto intersect_impl (LocalState const &state, F &&is_valid) const -> Intersection
 Calculate distance-to-intercept for the next surface. More...
 

Detailed Description

Track a particle in a universe of well-connected volumes.

The simple unit tracker is based on a set of non-overlapping volumes comprised of surfaces. It is a faster but less "user-friendly" version of the masked unit tracker because it requires all volumes to be exactly defined by their connected surfaces. It does not check for overlaps.

Constructor & Destructor Documentation

◆ SimpleUnitTracker()

CELER_FUNCTION celeritas::SimpleUnitTracker::SimpleUnitTracker ( ParamsRef const &  params,
SimpleUnitId  suid 
)
inline

Construct with reference to persistent parameter data.

Todo:
When adding multiple universes, this will calculate range of LocalVolumeIds that belong to this unit. For now we assume all volumes and surfaces belong to us.

Member Function Documentation

◆ initialize()

CELER_FUNCTION auto celeritas::SimpleUnitTracker::initialize ( LocalState const &  state) const
inline

Find the local volume from a position.

To avoid edge cases and inconsistent logical/physical states, it is prohibited to initialize from an arbitrary point directly onto a surface.

Todo:
This prohibition currently also extends to internal surfaces, even if both sides of that surface are "in" the current cell. We may need to relax that.

◆ intersect_impl()

template<class F >
CELER_FUNCTION auto celeritas::SimpleUnitTracker::intersect_impl ( LocalState const &  state,
F &&  is_valid 
) const -> Intersection

Calculate distance-to-intercept for the next surface.

The algorithm is:

  • Use the current volume to find potential intersecting surfaces and maximum number of intersections.
  • Loop over all surfaces and calculate the distance to intercept based on the given physical and logical state. Save to the thread-local buffer only intersections that are valid (either finite or less than the user-supplied maximum). The buffer contains the distances, the face indices, and an index used for sorting (if the volume has internal surfaes).
  • If no intersecting surfaces are found, return immediately. (Rely on the caller to set the "maximum distance" if we're not searching to infinity.)
  • If the volume has no special cases, find the closest surface by calling simple_intersect.
  • If the volume has internal surfaces call complex_intersect.
  • If the volume is the "background" then search externally for the next volume with background_intersect (equivalent of DistanceToIn for Geant4)

◆ safety()

CELER_FUNCTION real_type celeritas::SimpleUnitTracker::safety ( Real3 const &  pos,
LocalVolumeId  volid 
) const
inline

Calculate nearest distance to a surface in any direction.

The safety calculation uses a very limited method for calculating the safety distance: it's the nearest distance to any surface, for a certain subset of surfaces. Other surface types will return a safety distance of zero. Complex surfaces might return the distance to internal surfaces that do not represent the edge of a volume. Such distances are conservative but will necessarily slow down the simulation.


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