Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-11-07 10:11:33

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/global/PrimaryCapacity.hh
0006 //! \sa PrimaryCapacity.test.cc
0007 //---------------------------------------------------------------------------//
0008 #pragma once
0009 
0010 #include <algorithm>
0011 
0012 #include "corecel/Assert.hh"
0013 #include "corecel/Types.hh"
0014 
0015 namespace celeritas
0016 {
0017 namespace detail
0018 {
0019 //---------------------------------------------------------------------------//
0020 struct PrimaryCapacityInput
0021 {
0022     size_type track_slots{};
0023     size_type initializer_capacity{};
0024     size_type secondary_capacity{};
0025     size_type queued{};
0026     size_type alive{};
0027 };
0028 
0029 //---------------------------------------------------------------------------//
0030 /*!
0031  * Calculate how many primaries can be added without reducing secondary space.
0032  *
0033  * Primaries must first fit alongside existing initializers. At the start of
0034  * the step, queued initializers and primaries fill vacant track slots. Any
0035  * initializers left after that must preserve the usable secondary capacity.
0036  */
0037 inline size_type calc_primary_capacity(PrimaryCapacityInput const& input)
0038 {
0039     CELER_EXPECT(input.queued <= input.initializer_capacity);
0040     CELER_EXPECT(input.alive <= input.track_slots);
0041 
0042     size_type const available_before_init = input.initializer_capacity
0043                                             - input.queued;
0044     size_type const vacancies = input.track_slots - input.alive;
0045     size_type const unfilled_vacancies
0046         = vacancies > input.queued ? vacancies - input.queued : 0;
0047     if (unfilled_vacancies >= available_before_init)
0048     {
0049         // Every admitted primary will be consumed during initialization.
0050         return available_before_init;
0051     }
0052 
0053     size_type const queued_after_init
0054         = input.queued > vacancies ? input.queued - vacancies : 0;
0055     size_type const secondary_reserve
0056         = std::min(input.secondary_capacity, input.initializer_capacity);
0057     size_type const queue_capacity = input.initializer_capacity
0058                                      - secondary_reserve;
0059     size_type const available_after_init = queued_after_init < queue_capacity
0060                                                ? queue_capacity
0061                                                      - queued_after_init
0062                                                : 0;
0063 
0064     // Limit the addition before summing to avoid overflowing size_type.
0065     return unfilled_vacancies
0066            + std::min(available_after_init,
0067                       available_before_init - unfilled_vacancies);
0068 }
0069 
0070 //---------------------------------------------------------------------------//
0071 }  // namespace detail
0072 }  // namespace celeritas