Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-18 09:09:09

0001 //------------------------------- -*- C++ -*- -------------------------------//
0002 // Copyright Celeritas contributors: see top-level COPYRIGHT file for details
0003 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
0004 //---------------------------------------------------------------------------//
0005 //! \file celeritas/optical/action/detail/PreStepExecutor.hh
0006 //---------------------------------------------------------------------------//
0007 #pragma once
0008 
0009 #include "corecel/Assert.hh"
0010 #include "corecel/Macros.hh"
0011 #include "celeritas/Types.hh"
0012 #include "celeritas/optical/CoreTrackView.hh"
0013 #include "celeritas/optical/SimTrackView.hh"
0014 
0015 namespace celeritas
0016 {
0017 namespace optical
0018 {
0019 namespace detail
0020 {
0021 //---------------------------------------------------------------------------//
0022 /*!
0023  * Set up the beginning of a physics step.
0024  */
0025 struct PreStepExecutor
0026 {
0027     inline CELER_FUNCTION void operator()(CoreTrackView const& track);
0028 };
0029 
0030 //---------------------------------------------------------------------------//
0031 CELER_FUNCTION void PreStepExecutor::operator()(CoreTrackView const& track)
0032 {
0033     auto sim = track.sim();
0034     if (sim.status() == TrackStatus::killed)
0035     {
0036         // Deactivate tracks killed in previous loop
0037         sim.status(TrackStatus::inactive);
0038     }
0039     if (sim.status() == TrackStatus::inactive)
0040     {
0041         // Clear step limit and actions for an empty track slot
0042         sim.reset_step_limit();
0043         return;
0044     }
0045 
0046     if (CELER_UNLIKELY(sim.status() == TrackStatus::errored))
0047     {
0048         // Failed during initialization: don't calculate step limits
0049         return;
0050     }
0051 
0052     CELER_ASSERT(sim.status() == TrackStatus::initializing
0053                  || sim.status() == TrackStatus::alive);
0054 
0055     if (sim.status() == TrackStatus::initializing)
0056     {
0057         sim.reset_step_limit();
0058         sim.status(TrackStatus::alive);
0059     }
0060 
0061     // TODO: reset secondaries
0062     // TODO: calculate step limit
0063     CELER_ENSURE(sim.step_length() > 0);
0064 }
0065 
0066 //---------------------------------------------------------------------------//
0067 }  // namespace detail
0068 }  // namespace optical
0069 }  // namespace celeritas