diff --git a/include/fiction/algorithms/simulation/sidb/quicksim.hpp b/include/fiction/algorithms/simulation/sidb/quicksim.hpp index b24b0b16b..a459d5a5a 100644 --- a/include/fiction/algorithms/simulation/sidb/quicksim.hpp +++ b/include/fiction/algorithms/simulation/sidb/quicksim.hpp @@ -135,19 +135,22 @@ void quicksim(const Lyt& lyt, const quicksim_params& ps = quicksim_params{}, qui st.valid_lyts.push_back(charge_distribution_surface{charge_lyt}); } + // If the number of threads is initially set to zero, the simulation is run with one thread. + uint64_t num_threads = std::max(ps.number_threads, uint64_t{1}); + // split the iterations among threads const auto iter_per_thread = - std::max(ps.interation_steps / ps.number_threads, + std::max(ps.interation_steps / num_threads, uint64_t{1}); // If the number of set threads is greater than the number of iterations, the // number of threads defines how many times QuickSim is repeated const auto bound = static_cast(std::round(0.6 * static_cast(charge_lyt.num_cells()))); std::vector threads{}; - threads.reserve(ps.number_threads); + threads.reserve(num_threads); std::mutex mutex{}; // used to control access to shared resources - for (uint64_t z = 0ul; z < ps.number_threads; z++) + for (uint64_t z = 0ul; z < num_threads; z++) { threads.emplace_back( [&] diff --git a/test/algorithms/simulation/sidb/quicksim.cpp b/test/algorithms/simulation/sidb/quicksim.cpp index 0539c6d62..1df72e093 100644 --- a/test/algorithms/simulation/sidb/quicksim.cpp +++ b/test/algorithms/simulation/sidb/quicksim.cpp @@ -93,7 +93,8 @@ TEMPLATE_TEST_CASE( const sidb_simulation_parameters params{2, -0.30}; const quicksim_params quicksim_params{params, 80, 0.7, 0}; quicksim(lyt, quicksim_params, &quicksimstats); - CHECK(quicksimstats.valid_lyts.empty()); + CHECK(!quicksimstats.valid_lyts.empty()); + CHECK(quicksimstats.time_total.count() > 0); } SECTION("one thread")