From a15bcc44ef5f93af047cea3c3de4230946739f32 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Wed, 26 Nov 2025 16:42:18 +0100 Subject: [PATCH 01/50] Add new variables into /include folder --- include/openmc/bank.h | 4 ++++ include/openmc/particle_data.h | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/include/openmc/bank.h b/include/openmc/bank.h index c4e940bc877..6ce396b2ad1 100644 --- a/include/openmc/bank.h +++ b/include/openmc/bank.h @@ -26,10 +26,14 @@ extern SharedArray fission_bank; extern vector> ifp_source_delayed_group_bank; +extern vector> ifp_source_ancestor_nuclide_bank; + extern vector> ifp_source_lifetime_bank; extern vector> ifp_fission_delayed_group_bank; +extern vector> ifp_fission_ancestor_nuclide_bank; + extern vector> ifp_fission_lifetime_bank; extern vector progeny_per_particle; diff --git a/include/openmc/particle_data.h b/include/openmc/particle_data.h index fdacfa765b3..e9b6b59562a 100644 --- a/include/openmc/particle_data.h +++ b/include/openmc/particle_data.h @@ -47,6 +47,7 @@ struct SourceSite { double time {0.0}; double wgt {1.0}; int delayed_group {0}; + int ancestor_event_nuclide {0}; int surf_id {SURFACE_NONE}; ParticleType particle; @@ -528,6 +529,8 @@ class ParticleData : public GeometryState { // Iterated Fission Probability double lifetime_ {0.0}; //!< neutron lifetime [s] + int ancestor_event_nuclide_ {0}; + int n_collision_ {0}; bool write_track_ {false}; @@ -642,6 +645,10 @@ class ParticleData : public GeometryState { double& lifetime() { return lifetime_; } const double& lifetime() const { return lifetime_; } + // Particle event nuclide + int& ancestor_event_nuclide() { return ancestor_event_nuclide_; } + const int& ancestor_event_nuclide() const { return ancestor_event_nuclide_; } + // What event took place, described in greater detail below TallyEvent& event() { return event_; } const TallyEvent& event() const { return event_; } From 4dea4b59672d3d163949e2e9d529c14b28dce1a1 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Wed, 26 Nov 2025 16:48:38 +0100 Subject: [PATCH 02/50] Add ancestors in functions inside ifp.h --- include/openmc/ifp.h | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/include/openmc/ifp.h b/include/openmc/ifp.h index 01904d13c94..879ab4c4e38 100644 --- a/include/openmc/ifp.h +++ b/include/openmc/ifp.h @@ -21,13 +21,15 @@ bool is_generation_time_or_both(); //! Resize IFP vectors //! //! \param[in,out] delayed_groups List of delayed group numbers +//! \param[in,out] ancestors List of event nuclides //! \param[in,out] lifetimes List of lifetimes //! \param[in] n Dimension to resize vectors template -void resize_ifp_data(vector& delayed_groups, vector& lifetimes, int64_t n) +void resize_ifp_data(vector& delayed_groups, vector& ancestors, vector& lifetimes, int64_t n) { if (is_beta_effective_or_both()) { delayed_groups.resize(n); + ancestors.resize(n); } if (is_generation_time_or_both()) { lifetimes.resize(n); @@ -84,9 +86,10 @@ void resize_simulation_ifp_banks(); //! //! \param[in] i_bank Index in the fission banks //! \param[in,out] delayed_groups Delayed group numbers +//! \param[in,out] ancestors List of Ancestor nuclides //! \param[in,out] lifetimes Lifetimes lists void copy_ifp_data_from_fission_banks( - int i_bank, vector& delayed_groups, vector& lifetimes); + int i_bank, vector& delayed_groups, vector& ancestors, vector& lifetimes); #ifdef OPENMC_MPI @@ -101,9 +104,11 @@ struct DeserializationInfo { //! //! \param[in] n_generation Number of generations //! \param[in] delayed_groups List of delayed group numbers lists +//! \param[in,out] ancestors List of Ancestor nuclide //! \param[in] lifetimes List of lifetimes lists void broadcast_ifp_n_generation(int& n_generation, const vector>& delayed_groups, + const vector>& ancestors, const vector>& lifetimes); //! Send IFP data using MPI. @@ -115,11 +120,14 @@ void broadcast_ifp_n_generation(int& n_generation, //! \param[in] requests MPI requests //! \param[in] delayed_groups List of delayed group numbers lists //! \param[out] send_delayed_groups Delayed group numbers buffer +//! \param[in] ancestors List of event nuclide lists +//! \param[out] send_ancestors Event nuclide buffer //! \param[in] lifetimes List of lifetimes lists //! \param[out] send_lifetimes Lifetimes buffer void send_ifp_info(int64_t idx, int64_t n, int n_generation, int neighbor, vector& requests, const vector>& delayed_groups, - vector& send_delayed_groups, const vector>& lifetimes, + vector& send_delayed_groups, const vector>& ancestors, + vector& ancestors, const vector>& lifetimes, vector& send_lifetimes); //! Receive IFP data using MPI. @@ -130,11 +138,13 @@ void send_ifp_info(int64_t idx, int64_t n, int n_generation, int neighbor, //! \param[in] neighbor Index of the neighboring processor //! \param[in] requests MPI requests //! \param[in] delayed_groups List of delayed group numbers +//! \param[in] ancestors List of event nuclide //! \param[in] lifetimes List of lifetimes //! \param[out] deserialization Information to deserialize the received data void receive_ifp_data(int64_t idx, int64_t n, int n_generation, int neighbor, vector& requests, vector& delayed_groups, - vector& lifetimes, vector& deserialization); + vector& ancestors, vector& lifetimes, + vector& deserialization); //! Copy partial IFP data from local lists to source banks. //! @@ -142,9 +152,11 @@ void receive_ifp_data(int64_t idx, int64_t n, int n_generation, int neighbor, //! \param[in] n Number of sites to copy //! \param[in] i_bank Index in the IFP source banks //! \param[in] delayed_groups List of delayed group numbers lists +//! \param[in] ancestors List of event nuclide //! \param[in] lifetimes List of lifetimes lists void copy_partial_ifp_data_to_source_banks(int64_t idx, int n, int64_t i_bank, const vector>& delayed_groups, + const vector>& ancestors, const vector>& lifetimes); //! Deserialize IFP information received using MPI and store it in @@ -153,34 +165,42 @@ void copy_partial_ifp_data_to_source_banks(int64_t idx, int n, int64_t i_bank, //! \param[in] n_generation Number of generations //! \param[out] deserialization Information to deserialize the received data //! \param[in] delayed_groups List of delayed group numbers +//! \param[in] ancestors List of event nuclide //! \param[in] lifetimes List of lifetimes void deserialize_ifp_info(int n_generation, const vector& deserialization, - const vector& delayed_groups, const vector& lifetimes); + const vector& delayed_groups, const vector& ancestors, + const vector& lifetimes); #endif //! Copy IFP temporary vectors to source banks. //! //! \param[in] delayed_groups List of delayed group numbers lists +//! \param[in] ancestors List of event nuclide lists //! \param[in] lifetimes List of lifetimes lists void copy_complete_ifp_data_to_source_banks( const vector>& delayed_groups, + const vector>& ancestors, const vector>& lifetimes); //! Allocate temporary vectors for IFP data. //! //! \param[in,out] delayed_groups List of delayed group numbers lists +//! \param[in,out] ancestors List of event nuclide lists //! \param[in,out] lifetimes List of delayed group numbers lists void allocate_temporary_vector_ifp( - vector>& delayed_groups, vector>& lifetimes); + vector>& delayed_groups, vector>& ancestors, + vector>& lifetimes); //! Copy local IFP data to IFP fission banks. //! //! \param[in] delayed_groups_ptr Pointer to delayed group numbers +//! \param[in] ancestors_ptr Pointer to delayed group numbers //! \param[in] lifetimes_ptr Pointer to lifetimes void copy_ifp_data_to_fission_banks( - const vector* delayed_groups_ptr, const vector* lifetimes_ptr); + const vector* delayed_groups_ptr, const vector* ancestors_ptr, + const vector* lifetimes_ptr); } // namespace openmc From 1b0d36b04975a35f1c849fd9053884532650e6c1 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Wed, 26 Nov 2025 16:55:02 +0100 Subject: [PATCH 03/50] Add ancestor functions in bank.cpp and eigenvalue.cpp --- src/bank.cpp | 19 ++++++++++++++++--- src/eigenvalue.cpp | 25 +++++++++++++++---------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/bank.cpp b/src/bank.cpp index 33790379b85..356e8b2acba 100644 --- a/src/bank.cpp +++ b/src/bank.cpp @@ -31,10 +31,14 @@ SharedArray fission_bank; vector> ifp_source_delayed_group_bank; +vector> ifp_source_ancestor_nuclide_bank; + vector> ifp_source_lifetime_bank; vector> ifp_fission_delayed_group_bank; +vector> ifp_fission_ancestor_nuclide_bank; + vector> ifp_fission_lifetime_bank; // Each entry in this vector corresponds to the number of progeny produced @@ -56,8 +60,10 @@ void free_memory_bank() simulation::fission_bank.clear(); simulation::progeny_per_particle.clear(); simulation::ifp_source_delayed_group_bank.clear(); + simulation::ifp_source_ancestor_nuclide_bank.clear(); simulation::ifp_source_lifetime_bank.clear(); simulation::ifp_fission_delayed_group_bank.clear(); + simulation::ifp_fission_ancestor_nuclide_bank.clear(); simulation::ifp_fission_lifetime_bank.clear(); } @@ -92,6 +98,7 @@ void sort_fission_bank() SourceSite* sorted_bank; vector sorted_bank_holder; vector> sorted_ifp_delayed_group_bank; + vector> sorted_ifp_ancestor_nuclide_bank; vector> sorted_ifp_lifetime_bank; // If there is not enough space, allocate a temporary vector and point to it @@ -105,7 +112,9 @@ void sort_fission_bank() if (settings::ifp_on) { allocate_temporary_vector_ifp( - sorted_ifp_delayed_group_bank, sorted_ifp_lifetime_bank); + sorted_ifp_delayed_group_bank, + sorted_ifp_ancestor_nuclide_bank, + sorted_ifp_lifetime_bank); } // Use parent and progeny indices to sort fission bank @@ -120,7 +129,9 @@ void sort_fission_bank() sorted_bank[idx] = site; if (settings::ifp_on) { copy_ifp_data_from_fission_banks( - i, sorted_ifp_delayed_group_bank[idx], sorted_ifp_lifetime_bank[idx]); + i, sorted_ifp_delayed_group_bank[idx], + sorted_ifp_ancestor_nuclide_bank[idx], + sorted_ifp_lifetime_bank[idx]); } } @@ -129,7 +140,9 @@ void sort_fission_bank() simulation::fission_bank.data()); if (settings::ifp_on) { copy_ifp_data_to_fission_banks( - sorted_ifp_delayed_group_bank.data(), sorted_ifp_lifetime_bank.data()); + sorted_ifp_delayed_group_bank.data(), + sorted_ifp_ancestor_nuclide_bank.data(), + sorted_ifp_lifetime_bank.data()); } } diff --git a/src/eigenvalue.cpp b/src/eigenvalue.cpp index a2120a006d5..77a459f2e85 100644 --- a/src/eigenvalue.cpp +++ b/src/eigenvalue.cpp @@ -137,10 +137,11 @@ void synchronize_bank() // Temporary banks for IFP vector> temp_delayed_groups; + vector> temp_ancestors; vector> temp_lifetimes; if (settings::ifp_on) { resize_ifp_data( - temp_delayed_groups, temp_lifetimes, 3 * simulation::work_per_rank); + temp_delayed_groups, temp_ancestors, temp_lifetimes, 3 * simulation::work_per_rank); } // ========================================================================== @@ -169,7 +170,8 @@ void synchronize_bank() temp_sites[index_temp] = simulation::fission_bank[idx]; if (settings::ifp_on) { copy_ifp_data_from_fission_banks( - idx, temp_delayed_groups[index_temp], temp_lifetimes[index_temp]); + idx, temp_delayed_groups[index_temp], temp_ancestors[index_temp], + temp_lifetimes[index_temp]); } ++index_temp; @@ -211,7 +213,7 @@ void synchronize_bank() int ifp_n_generation; if (settings::ifp_on) { broadcast_ifp_n_generation( - ifp_n_generation, temp_delayed_groups, temp_lifetimes); + ifp_n_generation, temp_delayed_groups, temp_ancestors, temp_lifetimes); } int64_t index_local = 0; @@ -219,6 +221,7 @@ void synchronize_bank() // IFP send buffers vector send_delayed_groups; + vector send_ancestors; vector send_lifetimes; if (start < settings::n_particles) { @@ -229,7 +232,7 @@ void synchronize_bank() // Resize IFP send buffers if (settings::ifp_on && mpi::n_procs > 1) { - resize_ifp_data(send_delayed_groups, send_lifetimes, + resize_ifp_data(send_delayed_groups, send_ancestors, send_lifetimes, ifp_n_generation * 3 * simulation::work_per_rank); } @@ -249,8 +252,8 @@ void synchronize_bank() if (settings::ifp_on) { // Send IFP data send_ifp_info(index_local, n, ifp_n_generation, neighbor, requests, - temp_delayed_groups, send_delayed_groups, temp_lifetimes, - send_lifetimes); + temp_delayed_groups, send_delayed_groups, temp_ancestors, + send_ancestors, temp_lifetimes, send_lifetimes); } } @@ -275,6 +278,7 @@ void synchronize_bank() // IFP receive buffers vector recv_delayed_groups; + vector recv_ancestors; vector recv_lifetimes; vector deserialization_info; @@ -291,7 +295,7 @@ void synchronize_bank() // Resize IFP receive buffers if (settings::ifp_on && mpi::n_procs > 1) { - resize_ifp_data(recv_delayed_groups, recv_lifetimes, + resize_ifp_data(recv_delayed_groups, recv_ancestors, recv_lifetimes, ifp_n_generation * simulation::work_per_rank); } @@ -317,7 +321,7 @@ void synchronize_bank() if (settings::ifp_on) { // Receive IFP data receive_ifp_data(index_local, n, ifp_n_generation, neighbor, requests, - recv_delayed_groups, recv_lifetimes, deserialization_info); + recv_delayed_groups, recv_ancestors, recv_lifetimes, deserialization_info); } } else { @@ -349,14 +353,15 @@ void synchronize_bank() if (settings::ifp_on) { deserialize_ifp_info(ifp_n_generation, deserialization_info, - recv_delayed_groups, recv_lifetimes); + recv_delayed_groups, recv_ancestors, recv_lifetimes); } #else std::copy(temp_sites.data(), temp_sites.data() + settings::n_particles, simulation::source_bank.begin()); if (settings::ifp_on) { - copy_complete_ifp_data_to_source_banks(temp_delayed_groups, temp_lifetimes); + copy_complete_ifp_data_to_source_banks(temp_delayed_groups, + temp_ancestors, temp_lifetimes); } #endif From cd7a9c84bd1d9cf8932e07c46779c7b310fc44d2 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Wed, 26 Nov 2025 16:58:00 +0100 Subject: [PATCH 04/50] Modification in particle_data.h and add ancestor_nuclide in particle.cpp --- include/openmc/particle_data.h | 8 ++++---- src/particle.cpp | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/include/openmc/particle_data.h b/include/openmc/particle_data.h index e9b6b59562a..3b091f8631c 100644 --- a/include/openmc/particle_data.h +++ b/include/openmc/particle_data.h @@ -47,7 +47,7 @@ struct SourceSite { double time {0.0}; double wgt {1.0}; int delayed_group {0}; - int ancestor_event_nuclide {0}; + int ancestor_nuclide {0}; int surf_id {SURFACE_NONE}; ParticleType particle; @@ -529,7 +529,7 @@ class ParticleData : public GeometryState { // Iterated Fission Probability double lifetime_ {0.0}; //!< neutron lifetime [s] - int ancestor_event_nuclide_ {0}; + int ancestor_nuclide_ {0}; int n_collision_ {0}; @@ -646,8 +646,8 @@ class ParticleData : public GeometryState { const double& lifetime() const { return lifetime_; } // Particle event nuclide - int& ancestor_event_nuclide() { return ancestor_event_nuclide_; } - const int& ancestor_event_nuclide() const { return ancestor_event_nuclide_; } + int& ancestor_nuclide() { return ancestor_nuclide_; } + const int& ancestor_nuclide() const { return ancestor_nuclide_; } // What event took place, described in greater detail below TallyEvent& event() { return event_; } diff --git a/src/particle.cpp b/src/particle.cpp index 2d70d715e22..b80275b2787 100644 --- a/src/particle.cpp +++ b/src/particle.cpp @@ -149,6 +149,7 @@ void Particle::from_source(const SourceSite* src) time_last() = src->time; parent_nuclide() = src->parent_nuclide; delayed_group() = src->delayed_group; + ancestor_nuclide() = src->ancestor_nuclide; // Convert signed surface ID to signed index if (src->surf_id != SURFACE_NONE) { @@ -990,6 +991,7 @@ void add_surf_source_to_bank(Particle& p, const Surface& surf) site.time = p.time(); site.wgt = p.wgt(); site.delayed_group = p.delayed_group(); + site.ancestor_nuclide = p.ancestor_nuclide(); site.surf_id = surf.id_; site.particle = p.type(); site.parent_id = p.id(); From fef14953fc605517934a3b5012bd11d38458bdb6 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Wed, 26 Nov 2025 17:06:59 +0100 Subject: [PATCH 05/50] Add ancestor_nuclide vector in all functions inside ifp.cpp --- src/ifp.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/src/ifp.cpp b/src/ifp.cpp index cc4a76538b1..648807fe369 100644 --- a/src/ifp.cpp +++ b/src/ifp.cpp @@ -35,6 +35,10 @@ void ifp(const Particle& p, int64_t idx) simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; simulation::ifp_fission_delayed_group_bank[idx] = _ifp(p.delayed_group(), delayed_groups); + const auto& ancestor_nuclides = + simulation::ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; + simulation::ifp_fission_ancestor_nuclide_bank[idx] = + _ifp(p.event_nuclide(), ancestor_nuclides); } if (is_generation_time_or_both()) { const auto& lifetimes = @@ -46,16 +50,20 @@ void ifp(const Particle& p, int64_t idx) void resize_simulation_ifp_banks() { resize_ifp_data(simulation::ifp_source_delayed_group_bank, + simulation::ifp_source_ancestor_nuclide_bank, simulation::ifp_source_lifetime_bank, simulation::work_per_rank); resize_ifp_data(simulation::ifp_fission_delayed_group_bank, + simulation::ifp_fission_ancestor_nuclide_bank, simulation::ifp_fission_lifetime_bank, 3 * simulation::work_per_rank); } void copy_ifp_data_from_fission_banks( - int i_bank, vector& delayed_groups, vector& lifetimes) + int i_bank, vector& delayed_groups, vector& ancestors, + vector& lifetimes) { if (is_beta_effective_or_both()) { delayed_groups = simulation::ifp_fission_delayed_group_bank[i_bank]; + ancestors = simulation::ifp_fission_ancestor_nuclide_bank[i_bank]; } if (is_generation_time_or_both()) { lifetimes = simulation::ifp_fission_lifetime_bank[i_bank]; @@ -66,6 +74,7 @@ void copy_ifp_data_from_fission_banks( void broadcast_ifp_n_generation(int& n_generation, const vector>& delayed_groups, + const vector>& ancestors, const vector>& lifetimes) { if (mpi::rank == 0) { @@ -80,7 +89,8 @@ void broadcast_ifp_n_generation(int& n_generation, void send_ifp_info(int64_t idx, int64_t n, int n_generation, int neighbor, vector& requests, const vector>& delayed_groups, - vector& send_delayed_groups, const vector>& lifetimes, + vector& send_delayed_groups, const vector>& ancestors, + vector& send_ancestors, const vector>& lifetimes, vector& send_lifetimes) { // Copy data in send buffers @@ -88,6 +98,8 @@ void send_ifp_info(int64_t idx, int64_t n, int n_generation, int neighbor, if (is_beta_effective_or_both()) { std::copy(delayed_groups[i].begin(), delayed_groups[i].end(), send_delayed_groups.begin() + i * n_generation); + std::copy(ancestors[i].begin(), ancestors[i].end(), + send_ancestors.begin() + i * n_generation); } if (is_generation_time_or_both()) { std::copy(lifetimes[i].begin(), lifetimes[i].end(), @@ -100,6 +112,10 @@ void send_ifp_info(int64_t idx, int64_t n, int n_generation, int neighbor, MPI_Isend(&send_delayed_groups[n_generation * idx], n_generation * static_cast(n), MPI_INT, neighbor, mpi::rank, mpi::intracomm, &requests.back()); + // Is it needed also for the ancestor nuclide + MPI_Isend(&send_ancestors[n_generation * idx], + n_generation * static_cast(n), MPI_INT, neighbor, mpi::rank, + mpi::intracomm, &requests.back()); } // Send lifetimes if (is_generation_time_or_both()) { @@ -112,7 +128,7 @@ void send_ifp_info(int64_t idx, int64_t n, int n_generation, int neighbor, void receive_ifp_data(int64_t idx, int64_t n, int n_generation, int neighbor, vector& requests, vector& delayed_groups, - vector& lifetimes, vector& deserialization) + vector& ancestors, vector& lifetimes, vector& deserialization) { // Receive delayed groups if (is_beta_effective_or_both()) { @@ -127,6 +143,10 @@ void receive_ifp_data(int64_t idx, int64_t n, int n_generation, int neighbor, MPI_Irecv(&lifetimes[n_generation * idx], n_generation * static_cast(n), MPI_DOUBLE, neighbor, neighbor, mpi::intracomm, &requests.back()); + // Is it needed also for the ancestor nuclide + MPI_Irecv(&ancestors[n_generation * idx], + n_generation * static_cast(n), MPI_INT, neighbor, neighbor, + mpi::intracomm, &requests.back()); } // Deserialization info to reconstruct data later DeserializationInfo info = {idx, n}; @@ -135,11 +155,14 @@ void receive_ifp_data(int64_t idx, int64_t n, int n_generation, int neighbor, void copy_partial_ifp_data_to_source_banks(int64_t idx, int n, int64_t i_bank, const vector>& delayed_groups, + const vector>& ancestors, const vector>& lifetimes) { if (is_beta_effective_or_both()) { std::copy(&delayed_groups[idx], &delayed_groups[idx + n], &simulation::ifp_source_delayed_group_bank[i_bank]); + std::copy(&ancestors[idx], &ancestors[idx + n], + &simulation::ifp_source_ancestor_nuclide_bank[i_bank]); } if (is_generation_time_or_both()) { std::copy(&lifetimes[idx], &lifetimes[idx + n], @@ -149,7 +172,8 @@ void copy_partial_ifp_data_to_source_banks(int64_t idx, int n, int64_t i_bank, void deserialize_ifp_info(int n_generation, const vector& deserialization, - const vector& delayed_groups, const vector& lifetimes) + const vector& delayed_groups, const vector& ancestors, + const vector& lifetimes) { for (auto info : deserialization) { int64_t index_local = info.index_local; @@ -161,6 +185,10 @@ void deserialize_ifp_info(int n_generation, delayed_groups.begin() + n_generation * i, delayed_groups.begin() + n_generation * (i + 1)); simulation::ifp_source_delayed_group_bank[i] = delayed_groups_received; + vector ancestors_received( + ancestors.begin() + n_generation * i, + ancestors.begin() + n_generation * (i + 1)); + simulation::ifp_source_ancestor_nuclide_bank[i] = ancestors_received; } if (is_generation_time_or_both()) { vector lifetimes_received(lifetimes.begin() + n_generation * i, @@ -175,12 +203,16 @@ void deserialize_ifp_info(int n_generation, void copy_complete_ifp_data_to_source_banks( const vector>& delayed_groups, + const vector>& ancestors, const vector>& lifetimes) { if (is_beta_effective_or_both()) { std::copy(delayed_groups.data(), delayed_groups.data() + settings::n_particles, simulation::ifp_source_delayed_group_bank.begin()); + std::copy(ancestors.data(), + ancestors.data() + settings::n_particles, + simulation::ifp_source_ancestor_nuclide_bank.begin()); } if (is_generation_time_or_both()) { std::copy(lifetimes.data(), lifetimes.data() + settings::n_particles, @@ -189,10 +221,13 @@ void copy_complete_ifp_data_to_source_banks( } void allocate_temporary_vector_ifp( - vector>& delayed_groups, vector>& lifetimes) + vector>& delayed_groups, + vector>& ancestors, + vector>& lifetimes) { if (is_beta_effective_or_both()) { delayed_groups.resize(simulation::fission_bank.size()); + ancestors.resize(simulation::fission_bank.size()); } if (is_generation_time_or_both()) { lifetimes.resize(simulation::fission_bank.size()); @@ -200,12 +235,15 @@ void allocate_temporary_vector_ifp( } void copy_ifp_data_to_fission_banks(const vector* const delayed_groups_ptr, - const vector* lifetimes_ptr) + const vector* const ancestors_ptr, const vector* lifetimes_ptr) { if (is_beta_effective_or_both()) { std::copy(delayed_groups_ptr, delayed_groups_ptr + simulation::fission_bank.size(), simulation::ifp_fission_delayed_group_bank.data()); + std::copy(ancestors_ptr, + ancestors_ptr + simulation::fission_bank.size(), + simulation::ifp_fission_ancestor_nuclide_bank.data()); } if (is_generation_time_or_both()) { std::copy(lifetimes_ptr, lifetimes_ptr + simulation::fission_bank.size(), From 19d13076df2c474d5c568d7499867047b3a30f96 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Wed, 26 Nov 2025 17:09:39 +0100 Subject: [PATCH 06/50] Add ancestor condition to tally_scoring.py --- src/tallies/tally_scoring.cpp | 37 +++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index 67e851644a9..52bc5db04ea 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -962,16 +962,33 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, const auto& delayed_groups = simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; if (delayed_groups.size() == settings::ifp_n_generation) { - if (delayed_groups[0] > 0) { - score = p.wgt_last(); - if (tally.delayedgroup_filter_ != C_NONE) { - auto i_dg_filt = tally.filters()[tally.delayedgroup_filter_]; - const DelayedGroupFilter& filt { - *dynamic_cast( - model::tally_filters[i_dg_filt].get())}; - score_fission_delayed_dg(i_tally, delayed_groups[0] - 1, - score, score_index, p.filter_matches()); - continue; + if (delayed_groups[1] > 0) { + if (tally.nuclides_[0] == -1) { + score = p.wgt_last(); + if (tally.delayedgroup_filter_ != C_NONE) { + auto i_dg_filt = tally.filters()[tally.delayedgroup_filter_]; + const DelayedGroupFilter& filt { + *dynamic_cast( + model::tally_filters[i_dg_filt].get())}; + score_fission_delayed_dg(i_tally, delayed_groups[0] - 1, + score, score_index, p.filter_matches()); + continue; + } + } else { + const auto& ancestor_event_nuclide = + simulation::ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; + if (ancestor_event_nuclide[0] == i_nuclide) { + score = p.wgt_last(); + if (tally.delayedgroup_filter_ != C_NONE) { + auto i_dg_filt = tally.filters()[tally.delayedgroup_filter_]; + const DelayedGroupFilter& filt { + *dynamic_cast( + model::tally_filters[i_dg_filt].get())}; + score_fission_delayed_dg(i_tally, delayed_groups[0] - 1, + score, score_index, p.filter_matches()); + continue; + } + } } } } From 9ac8e39957e89dc423bca9b96d9bbaacc4bdcd70 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Wed, 26 Nov 2025 17:13:41 +0100 Subject: [PATCH 07/50] Implementation of a bool to avoid ancestor_nuclide vector to be always filled --- include/openmc/settings.h | 1 + src/ifp.cpp | 23 +++++++++++++++-------- src/settings.cpp | 1 + src/tallies/tally.cpp | 6 ++++++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/include/openmc/settings.h b/include/openmc/settings.h index b369c99fef8..77e79c14f9b 100644 --- a/include/openmc/settings.h +++ b/include/openmc/settings.h @@ -71,6 +71,7 @@ extern "C" bool entropy_on; //!< calculate Shannon entropy? extern "C" bool event_based; //!< use event-based mode (instead of history-based) extern bool ifp_on; //!< Use IFP for kinetics parameters? +extern bool ifp_beta_nuclide; //!< Use IFP for beta calculation by nuclide? extern bool legendre_to_tabular; //!< convert Legendre distributions to tabular? extern bool material_cell_offsets; //!< create material cells offsets? extern "C" bool output_summary; //!< write summary.h5? diff --git a/src/ifp.cpp b/src/ifp.cpp index 648807fe369..e0345d6b76b 100644 --- a/src/ifp.cpp +++ b/src/ifp.cpp @@ -31,14 +31,21 @@ bool is_generation_time_or_both() void ifp(const Particle& p, int64_t idx) { if (is_beta_effective_or_both()) { - const auto& delayed_groups = - simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; - simulation::ifp_fission_delayed_group_bank[idx] = - _ifp(p.delayed_group(), delayed_groups); - const auto& ancestor_nuclides = - simulation::ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; - simulation::ifp_fission_ancestor_nuclide_bank[idx] = - _ifp(p.event_nuclide(), ancestor_nuclides); + if (settings::ifp_beta_nuclide == true) { + const auto& delayed_groups = + simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; + simulation::ifp_fission_delayed_group_bank[idx] = + _ifp(p.delayed_group(), delayed_groups); + const auto& ancestor_nuclides = + simulation::ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; + simulation::ifp_fission_ancestor_nuclide_bank[idx] = + _ifp(p.event_nuclide(), ancestor_nuclides); + }else{ + const auto& delayed_groups = + simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; + simulation::ifp_fission_delayed_group_bank[idx] = + _ifp(p.delayed_group(), delayed_groups); + } } if (is_generation_time_or_both()) { const auto& lifetimes = diff --git a/src/settings.cpp b/src/settings.cpp index 9dcf7c8dbc8..5a51a86cc11 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -56,6 +56,7 @@ bool delayed_photon_scaling {true}; bool entropy_on {false}; bool event_based {false}; bool ifp_on {false}; +bool ifp_beta_nuclide {false}; bool legendre_to_tabular {true}; bool material_cell_offsets {true}; bool output_summary {true}; diff --git a/src/tallies/tally.cpp b/src/tallies/tally.cpp index 9daeb1d69f9..985d29c6ed4 100644 --- a/src/tallies/tally.cpp +++ b/src/tallies/tally.cpp @@ -235,6 +235,12 @@ Tally::Tally(pugi::xml_node node) } break; case SCORE_IFP_BETA_NUM: + // This bool indicates if the ancestor_nuclide vector has to be filled + if (nuclides_[0] > -1) { + settings::ifp_beta_nuclide = true; + }else{ + continue; + } case SCORE_IFP_DENOM: if (settings::ifp_parameter == IFPParameter::None) { settings::ifp_parameter = IFPParameter::BetaEffective; From 687f77dafcd3111992488c5f7a48b1704debda89 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Wed, 26 Nov 2025 17:14:10 +0100 Subject: [PATCH 08/50] Implementation of a bool to avoid ancestor_nuclide vector to be always filled_2 --- src/tallies/tally_scoring.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index 52bc5db04ea..028c790cc2c 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -962,8 +962,8 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, const auto& delayed_groups = simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; if (delayed_groups.size() == settings::ifp_n_generation) { - if (delayed_groups[1] > 0) { - if (tally.nuclides_[0] == -1) { + if (tally.nuclides_[0] == -1) { + if (delayed_groups[0] > 0) { score = p.wgt_last(); if (tally.delayedgroup_filter_ != C_NONE) { auto i_dg_filt = tally.filters()[tally.delayedgroup_filter_]; @@ -974,7 +974,9 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, score, score_index, p.filter_matches()); continue; } - } else { + } + } else { + if (delayed_groups[1] > 0) { const auto& ancestor_event_nuclide = simulation::ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; if (ancestor_event_nuclide[0] == i_nuclide) { @@ -984,7 +986,7 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, const DelayedGroupFilter& filt { *dynamic_cast( model::tally_filters[i_dg_filt].get())}; - score_fission_delayed_dg(i_tally, delayed_groups[0] - 1, + score_fission_delayed_dg(i_tally, delayed_groups[1] - 1, score, score_index, p.filter_matches()); continue; } From 45cdf11d70be5d20be021b5b963feceadcbcae35 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Wed, 26 Nov 2025 17:17:57 +0100 Subject: [PATCH 09/50] Add Documentation --- docs/source/usersguide/kinetics.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/source/usersguide/kinetics.rst b/docs/source/usersguide/kinetics.rst index 9024ff8227a..53768ceb082 100644 --- a/docs/source/usersguide/kinetics.rst +++ b/docs/source/usersguide/kinetics.rst @@ -84,6 +84,11 @@ total :math:`\beta_{\text{eff}}` specified by providing a 6-group # Add DelayedGroupFilter to enable group-wise tallies beta_tally.filters = [openmc.DelayedGroupFilter(list(range(1, 7)))] +A breakdown on isotopes of the :math:`\beta_{\text{eff}}` can be estimated, +e.g., for :math:`^{U235}U` and :math:`^{U238}U`, by defining:: + + beta_tally.nuclides = ['U235', 'U238'] + Here is an example showing how to declare the three available IFP scores in a single tally:: From 5f242e4313bbc258c5527b2d054a9018df2ce4a2 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Thu, 27 Nov 2025 10:28:23 +0100 Subject: [PATCH 10/50] Fix errors + modifications in Python API --- openmc/lib/core.py | 4 ++- openmc/source.py | 20 +++++++++----- src/initialize.cpp | 44 +++++++++++++++--------------- src/state_point.cpp | 2 ++ tests/geometry.xml | 65 +++++++++++++++++++++++++++++++++++++++++++++ tests/model.xml | 38 ++++++++++++++++++++++++++ 6 files changed, 144 insertions(+), 29 deletions(-) create mode 100644 tests/geometry.xml create mode 100644 tests/model.xml diff --git a/openmc/lib/core.py b/openmc/lib/core.py index 9f8db69d577..bc7ed6dcf3b 100644 --- a/openmc/lib/core.py +++ b/openmc/lib/core.py @@ -25,6 +25,7 @@ class _SourceSite(Structure): ('time', c_double), ('wgt', c_double), ('delayed_group', c_int), + ('ancestor_nuclide', c_int), ('surf_id', c_int), ('particle', c_int), ('parent_nuclide', c_int), @@ -511,7 +512,8 @@ def sample_external_source( # Convert to list of SourceParticle and return return openmc.ParticleList([openmc.SourceParticle( r=site.r, u=site.u, E=site.E, time=site.time, wgt=site.wgt, - delayed_group=site.delayed_group, surf_id=site.surf_id, + delayed_group=site.delayed_group, ancestor_nuclide=site.ancestor_nuclide, + surf_id=site.surf_id, particle=openmc.ParticleType(site.particle) ) for site in sites_array diff --git a/openmc/source.py b/openmc/source.py index 84d8a9619dc..f04157e75ae 100644 --- a/openmc/source.py +++ b/openmc/source.py @@ -1005,6 +1005,7 @@ def __init__( time: float = 0.0, wgt: float = 1.0, delayed_group: int = 0, + ancestor_nuclide: int = 0, surf_id: int = 0, particle: ParticleType = ParticleType.NEUTRON ): @@ -1015,6 +1016,7 @@ def __init__( self.time = float(time) self.wgt = float(wgt) self.delayed_group = delayed_group + self.ancestor_nuclide = ancestor_nuclide self.surf_id = surf_id self.particle = particle @@ -1032,7 +1034,8 @@ def to_tuple(self) -> tuple: """ return (self.r, self.u, self.E, self.time, self.wgt, - self.delayed_group, self.surf_id, self.particle.value) + self.delayed_group, self.ancestor_nuclide, + self.surf_id, self.particle.value) def write_source_file( @@ -1178,12 +1181,12 @@ def to_dataframe(self) -> pd.DataFrame: """ # Extract the attributes of the source particles into a list of tuples data = [(sp.r[0], sp.r[1], sp.r[2], sp.u[0], sp.u[1], sp.u[2], - sp.E, sp.time, sp.wgt, sp.delayed_group, sp.surf_id, - sp.particle.name.lower()) for sp in self] + sp.E, sp.time, sp.wgt, sp.delayed_group, sp.ancestor_nuclide, + sp.surf_id, sp.particle.name.lower()) for sp in self] # Define the column names for the DataFrame columns = ['x', 'y', 'z', 'u_x', 'u_y', 'u_z', 'E', 'time', 'wgt', - 'delayed_group', 'surf_id', 'particle'] + 'delayed_group', 'ancestor_nuclide', 'surf_id', 'particle'] # Create the pandas DataFrame from the data return pd.DataFrame(data, columns=columns) @@ -1215,6 +1218,7 @@ def export_to_hdf5(self, filename: PathLike, **kwargs): ('time', '= 0; --i) { + MPI_Get_address(&b.ancestor_nuclide, &disp[6]); + MPI_Get_address(&b.surf_id, &disp[7]); + MPI_Get_address(&b.particle, &disp[8]); + MPI_Get_address(&b.parent_nuclide, &disp[9]); + MPI_Get_address(&b.parent_id, &disp[10]); + MPI_Get_address(&b.progeny_id, &disp[11]); + for (int i = 11; i >= 0; --i) { disp[i] -= disp[0]; } - int blocks[] {3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + int blocks[] {3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; MPI_Datatype types[] {MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, - MPI_DOUBLE, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_LONG, MPI_LONG}; - MPI_Type_create_struct(11, blocks, disp, types, &mpi::source_site); + MPI_DOUBLE, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_LONG, MPI_LONG}; + MPI_Type_create_struct(12, blocks, disp, types, &mpi::source_site); MPI_Type_commit(&mpi::source_site); CollisionTrackSite bc; @@ -189,25 +190,26 @@ void initialize_mpi(MPI_Comm intracomm) MPI_Get_address(&bc.wgt, &dispc[5]); // double MPI_Get_address(&bc.event_mt, &dispc[6]); // int MPI_Get_address(&bc.delayed_group, &dispc[7]); // int - MPI_Get_address(&bc.cell_id, &dispc[8]); // int - MPI_Get_address(&bc.nuclide_id, &dispc[9]); // int - MPI_Get_address(&bc.material_id, &dispc[10]); // int - MPI_Get_address(&bc.universe_id, &dispc[11]); // int - MPI_Get_address(&bc.n_collision, &dispc[12]); // int - MPI_Get_address(&bc.particle, &dispc[13]); // int - MPI_Get_address(&bc.parent_id, &dispc[14]); // int64_t - MPI_Get_address(&bc.progeny_id, &dispc[15]); // int64_t - for (int i = 15; i >= 0; --i) { + MPI_Get_address(&bc.ancestor_nuclide, &dispc[8]); // int + MPI_Get_address(&bc.cell_id, &dispc[9]); // int + MPI_Get_address(&bc.nuclide_id, &dispc[10]); // int + MPI_Get_address(&bc.material_id, &dispc[11]); // int + MPI_Get_address(&bc.universe_id, &dispc[12]); // int + MPI_Get_address(&bc.n_collision, &dispc[13]); // int + MPI_Get_address(&bc.particle, &dispc[14]); // int + MPI_Get_address(&bc.parent_id, &dispc[15]); // int64_t + MPI_Get_address(&bc.progeny_id, &dispc[16]); // int64_t + for (int i = 16; i >= 0; --i) { dispc[i] -= dispc[0]; } - int blocksc[] = {3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + int blocksc[] = {3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; MPI_Datatype typesc[] = {MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, - MPI_DOUBLE, MPI_DOUBLE, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, + MPI_DOUBLE, MPI_DOUBLE, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT64_T, MPI_INT64_T}; MPI_Type_create_struct( - 16, blocksc, dispc, typesc, &mpi::collision_track_site); + 17, blocksc, dispc, typesc, &mpi::collision_track_site); MPI_Type_commit(&mpi::collision_track_site); } #endif // OPENMC_MPI diff --git a/src/state_point.cpp b/src/state_point.cpp index 47296da3a51..e92c58b6172 100644 --- a/src/state_point.cpp +++ b/src/state_point.cpp @@ -577,6 +577,8 @@ hid_t h5banktype() H5Tinsert(banktype, "wgt", HOFFSET(SourceSite, wgt), H5T_NATIVE_DOUBLE); H5Tinsert(banktype, "delayed_group", HOFFSET(SourceSite, delayed_group), H5T_NATIVE_INT); + H5Tinsert(banktype, "ancestor_nuclide", HOFFSET(SourceSite, ancestor_nuclide), + H5T_NATIVE_INT); H5Tinsert(banktype, "surf_id", HOFFSET(SourceSite, surf_id), H5T_NATIVE_INT); H5Tinsert( banktype, "particle", HOFFSET(SourceSite, particle), H5T_NATIVE_INT); diff --git a/tests/geometry.xml b/tests/geometry.xml new file mode 100644 index 00000000000..b5e29c3bbaa --- /dev/null +++ b/tests/geometry.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.0 1.0 +
0.0 0.0 0.0
+ + 9 + 20 10 +19 3 11 + 8 4 +18 2 12 + 7 5 +17 6 13 + 16 14 + 15 + 29 + 40 30 +39 23 31 + 28 24 +38 22 32 + 27 25 +37 26 33 + 36 34 + 35 +
+
diff --git a/tests/model.xml b/tests/model.xml new file mode 100644 index 00000000000..c4ecfd151f8 --- /dev/null +++ b/tests/model.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + fixed source + 7 + 1 + + + 0.0 0.0 0.0 + + + 5000000.0 1.0 + + + led + 513836 + + + + photon electron positron + + + 9 + heating + + + From 9a530f0990f48880053db9a07310c3628199e7f3 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Thu, 27 Nov 2025 12:12:17 +0100 Subject: [PATCH 11/50] Modify surface_source and surface_source_write tests to add ancestor_nuclide value --- tests/model.xml | 50 ++++++++++-------- .../mgxs_library_hdf5/mgxs/mgxs.xlsx | Bin 0 -> 8466 bytes .../source_mcpl_file/source.10.mcpl | Bin 0 -> 36120 bytes .../surface_source/surface_source_true.h5 | Bin 106144 -> 114216 bytes .../surface_source/surface_source_true.mcpl | Bin 36120 -> 36120 bytes .../case-01/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-02/surface_source_true.h5 | Bin 13896 -> 14872 bytes .../case-03/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-04/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-05/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-06/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-07/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-08/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-09/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-10/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-11/surface_source_true.h5 | Bin 5160 -> 5464 bytes .../case-12/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-13/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-14/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-15/surface_source_true.h5 | Bin 2144 -> 2216 bytes .../case-16/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-17/surface_source_true.h5 | Bin 2144 -> 2216 bytes .../case-18/surface_source_true.h5 | Bin 2144 -> 2216 bytes .../case-19/surface_source_true.h5 | Bin 2144 -> 2216 bytes .../case-20/surface_source_true.h5 | Bin 33344 -> 35816 bytes .../case-21/surface_source_true.h5 | Bin 2144 -> 2216 bytes .../case-a01/surface_source_true.h5 | Bin 6720 -> 7144 bytes .../surface_source_write/test.py | 7 +-- 28 files changed, 31 insertions(+), 26 deletions(-) create mode 100644 tests/regression_tests/mgxs_library_hdf5/mgxs/mgxs.xlsx create mode 100644 tests/regression_tests/source_mcpl_file/source.10.mcpl diff --git a/tests/model.xml b/tests/model.xml index c4ecfd151f8..bcba5e66cb6 100644 --- a/tests/model.xml +++ b/tests/model.xml @@ -1,38 +1,42 @@ - - - - + + + + + + - - + + + + + + + fixed source - 7 - 1 - - - 0.0 0.0 0.0 - - - 5000000.0 1.0 - - - led - 513836 + 2000 + 10 - - photon electron positron + + 0.0 1.25 2.5 3.75 5.0 + 0.0 0.3141592653589793 0.6283185307179586 0.9424777960769379 1.2566370614359172 1.5707963267948966 1.8849555921538759 2.199114857512855 2.5132741228718345 2.827433388230814 3.141592653589793 3.4557519189487724 3.7699111843077517 4.084070449666731 4.39822971502571 4.71238898038469 5.026548245743669 5.340707511102648 5.654866776461628 5.969026041820607 6.283185307179586 + -5.0 -4.0 -3.0 -2.0 -1.0 0.0 1.0 2.0 3.0 4.0 5.0 + 0.0 5.001 0.0 + + + 1 - - 9 - heating + + 1 + flux + collision diff --git a/tests/regression_tests/mgxs_library_hdf5/mgxs/mgxs.xlsx b/tests/regression_tests/mgxs_library_hdf5/mgxs/mgxs.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4f1fb895c826c925c8f7d3ff5ab990e2b5aab882 GIT binary patch literal 8466 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 delta 19356 zcmZ8pcXUnqsM>pG58rhwy2I&<86(PNI~D`1x7t7|^VSIq5emgcKtD(4TX zISK;*{As`KAMtMD?>MDM z6|sJ`Md}aNWR{97^xuS-?xlxOI*K_q-6wAS>6+j&>{fBd_?KmJlLb5`vK|v_Bd+zC=(9;(h3Mxoxeb^Y?3nOIOsr$0x(m_YV-g!P zv94o-!{tN;5yU1eRu4gJ#!!97#`X|qAw;n`i#0$LTd-#hZBj4stgy!fhcK~`V`4*@ z*x2Uu7Ge<;XDcQ)!9CN4p{B@NU-7l5$3(Yfv1X1*ZO2e^$NKjdW-+u<2Nr9ARuZTs z%JVs47WbIYPRtC!RnVECP+UI)gjvF4GP|%?D>QyLhFUu|dXO+ndQ5D07HflxD~zGG zh|pkRmO?gruvk0TjAp1k>L5axrD1b2i*>-^z40p$%gg z>W`3(6J-@}nZ=6xw_@4-0SMRx;Z?-3=d=2O=!gXj4MM;s3bPXWcOi=n#x1yrp&Ut?d!yFqvMVM95`O73eN0xDXM&Pb_L3q{B zgUea{NNfr#7#fAPnI_EYDE<{d8=8`L?m{$D5`}XS}lr(tYKah_LOV3$rdp&w3V{fdbsX&`cEI zQeoCZ0d8cmSs0X?7@CdCe7P{|qtQ0A*c>#PVQ4NoXbVI0(0eOISpy_@D~rWo3|NL@ zQJ1TP*$`u3JB!UnxDyy!fPE%Tn2k`;i7d7d-tJ&%5$5%a!fcGAf6iiy5$<);P6Y5UHPRD3_guQ~u?ZQ$~QLx=`SqEtcWV?#U?Sb8@g6+j* z(P7#V$JHMy_Q7rq;qJ%9rQ@`d$0pVixdUk5I)c3fpX&*B5H@BA*4blY8whp?8E+)m zVO(glB=lWuTw@9S5twKq)Fgyuj!?VWgl0lbMx>ex^(eBY^R*kwwx!4&Lj*zuJB|X1 z6|>!Km_Fp6z^G{>)RSoM1wsw8N$terQ?S}zsHYLTMM4d?zD`1Y8CE+B^$gVMpzVRf zb``m^kn1McIiwq-mhRY|HY`lczJg0uAG6OR?wGYi?Pari2=xLE)=R9W;OfPEBx-LP zrw_-eD2hHpy@(BHwNU$5Uq7*W331Zr-pe?I&epzIo{sTQd(|L=@k}BcTD6}hHm4sGQu2;UFkIz zd($z|uQPN9^}I!xL$E8o!D4SY#{ULGZzHx_g&Bbe-DI)5h|n#D?xA0{2{RIpuxTvz z4i?PY484oHVY@Jg;+f-37Q2rKy~WUbj>)~t&;yjWDjSAy-)FJ+aexO5Jwz!dh#SL^ z;)g7j;h5k|hBDE#JA^p`50oFU*awaY{fMCt(FDpIi52Y;i+zNkeZtTq+yFbp<|v%= zF^hfdnDi$MeS#*~E%(G|6ZaXfa-X7-zhL5Hgm#Y*$C#KbCO$!AzhdH3G>;O;nv8Fl z_!;hq@0s{HZpeLd$Z@!req^yPa4-GL(3fcbUm40mtoMtu@hI(QES8N6CzqkG&`!#n zfG54*S?p`r{F9+?Ffm^en-gL4Zx;I&1%w@$UUGbgJNckslRP%lBiQ$l%Olti=%_=2 zMR{ywKEZy(4U=E6pKxCt7A)Fhqx}T?8U5}r*e}p`M6k(N>k0|>D_X6vV80;-NrFwm zI$2b(XDIw)g5}`WN*3&StaT-%T61k$DH(^q!>lgKf8c0GMcoT{$`0oY{fQRo#n4|k z*a=}yMOXG=vA-RY-G_&~V*^i#Ytt|d`?8d4lKOGicw8HOS}ab-wcDSGUX$@06Z5z> z{AD4|z>FBc#Jnb9AQSVsHu#JXXX3US#Kin2Z7@Hf7BEReSe2h^{m+W3S-AcpSe3tt ziezFz*T(8Iz-&Av4`pH@;~U1r!mf>Q9OH2RzAOHU*+!kBt z2K@7nrsRDrevTN&y2_Ze@tm`=CTRk@72w(+-KpneE14)iw5^%QKePoQfXgHf3lIn8 zO`62K@~%x^A-sjSd?$&$?orIEi11+@rXw#xeMd1=$u)`59EHj@D_&Z0F?x716RY60 zu|QQ_o2)+xQ@*oh&aa8oMS)URE?gD<_K0H7H>bYl=@8 zU)}erEGP5ljKwjLpvl$1(+4V3fFYepBCOnvR zb#QH}Zde=e@KA@vI-(BhGSmq(M3k7VCpLYr{}qw9`ppS~Pz<7VC$rt35;gF~v^_b30t? z$YRf-&N?wP0F9{31QeRQs2_+z>&nbQ$bc?di6}IAQ9l@kCNJfOphR`k+JOkkIvIfo z^f^lXzN%kUiZkP?${Xjz8mnwW8HaUQO}RI!+h#Exf+F(yRz+*tIU5|4Up zkiHg}j|EJB?q2}xq8L5qv8hc3TZpP_DcB-7+*+{3=w|4nUxkm`w6=0PFF{G^ujfnA zyz0scyld(xCYHhF&VnsR|6UTaCv936F}ngS&`qc-(ZQh7_I(Nw2or1-O!O3NHJbRc zV5i}7U%}SE#&d$jA)???q+Yf;1I6Wd1bK*1UqoNwmjI%ku@R9%U5nEW6Y4tDN}y2B z+OQEqU5_;C*FhU_h|!{MBLYxf)Sa_AV@2I29Abh{H{%c$g!+n&nJ82P3sFMd0(F&z zdfrA&7V1`<^?9Lg!y&2)^@2^CDpZRbXogU?!{O>eO|dbvg_?l8&K0pln}TnQDPO5J zC03X_P+<$j=uR|6ZP9koMlBKQF7$-H$JuS;>WI-xHe{tR_u!seBS!Zk`|*P9L*N>U zBbRO9I#IVD>NW`V0D{>>sIS_XO+tMM7B-96LF>b-LJHg!8>kO(hj7X3tAN7@W((1F z)h1XmdIVw#B9>$WL&WGco0KTbWSnZJob)Ih2^DRx*_2&EJ%+->@7i?b97hJ*2=#TF zwpXYp(9`>cdJ>)-5b7x#f;W~FxHqitplCad>e2^`m!YkLXuEDhjtKP(ZgBk(^eoQR zNvJn$*ioULgP895uOJUyOmUOTSHm;kT^_ERKDOOWllN--5Per=A zi_tVJZ);iXqHBWJF?0#p>LJW@40#c|?3&p1?Ch&Ht*3Z)8>`KF)_(=hRq{dARb;-m zn0ynv`9@}5b4~mv*{_~$;{ED%q_~f$x`W+DzOZ`3HL3E2)pewz+7_>hNuwFhm@E7qQvFj^0IVb~1Div563a_YoTrdk2$csEECX z+Sw_74cW!#xsP-Y7v2LzaF_5}?q=QtjMFGn9?G(Y@=p>7Mhvt*7JHAIcXNt|I@K(O=_yPCJ8CLcq(m7k0pWzpp zvn=+LYr{~nyVMV07?mO$JZyvr!xZmM({(v~X$Iy?c+V>gy3FRoCF8mDQhb;9A z)XSFzze4H>OZ^7*pE2|dSAl#Vkb`#3VyRsGO!O5)zvJ%thM_;u0N*k6C!F|!p}$bF zKQZ(-y#IwE$7^DLW61TI&>Rl5$3*?kdz{z!{$wPN$@+_tyj$_(EhQ|Ujq(VT-}>?h zRKRBCmF)X@ZD@YUzQ4^WAYui*Hr!vDp^(=m78Gh>8&O!OMZ7k-h=>)nQN_f!V%Aqe zpyDUnJ@o@ofHkM@)K+`wznWfnK|nq-;9jl3pahHPW6iI#!d#B0Kju*Ifc z6D-rSnb-Ks^la`m*#fnIUot#fdQFf_#SpK_6(|%=$OLTVHHoL#uhy_AL$M7mBAIq= zacr4v?Yt)Q9JfMy<2%nkYj!}KFR;OmI8O@mI+?hO+{m3x*k#t#1@U{8HFbq@`8=^3 zlwW1#-A&RpRvu<@USlNOguTH?50h}6k)9^&1|z*p$SroVHxiS^PWC}{q%+jlYf^7B z)DNX_hyCtvvhJ|G=S;}kj0`Y=ciDr1Fn5m?4KiWxFm13&c$bkOChI;cia;b~dPkxN zWO@%pjb-prhM~sf!^7dIu@6{k1X@czG8~B#e#EYiG8rGUqoYm2r;Lm-S&!NEv8dmt zY;GKM%Vsbh1@$FMO@N=W8B9b*zhK{0y^yy2WF~Cc$LF2&179+WV#8t#vaT-0_CgRnb7?@o12BeTxV!DI_(BSb5I{Q z*{QiEE{$E7XEM?mi7~!68HqJ9ci7GOQ2iFGUSN`>^cR}AyR2xD$+*Xg7ULxEvfE2= zlKZTCsR?<&nwFWI_ZeAkQZg7>Vf;Q|Yb)XQhpc*)34Fw~)h6m=rmcaKpR$v2aPl#0 ziZ@A5nfD?x_c;r#H3?s`&^q{(&C1uK45gwszy(=sH-h*BYu{v|e&)k$HojjOF(ym? zzSkC$l*2x4g#+^C>NfPjAMB<@4E|zhyLYSZ00~~3>&k3T^x9OfU^~1vHm_hiv1b$z zY!~*2LW1pvjiQ3>fsNvV?S+k!g6+djR$8$AUK?FjumjK+AlOUL7bMt0uT3u}*dd&w zf?$WeHoTHxN1(5YU`g<=nqbMezzcBXkK$tVW9S$P#Gj$#xYG+VbOJX{A%;$3LKSA{ z6mHZa44pyVT(ZR&Is?B1It#ywv(!2GRf3^c;8#h8&cm-#3|&B3mS!jg!70N~ zDk`-sLl?a!GJv5=7)pT*UB*=(#L%l=lPk~_^m#d!x(dI_Gjt7pRbc2f_*Idi*Wp(s zhTec*l^MDYzp5~F1Hq}v&`l(*8bh~`wCW6{!HF6Sr6WT%8M+ONwHbO77JUref%-ZO zy#@7k8G0M)>oIf}>Kib059%8-^bVrhh@p2;a!nYzj}SIx=sna|Glm`@kIfl+AMuip znI0l(AuN@FiVkHc6B%mF&<7}A`AX?Slu28b`UvroFOnW1UL9EKW5i27Ncsfv>daD~ zB3@k>dW?8=W#|dw)t#ZIh*uaxpFw>OhCYY-o(z3~c=d{;FNVML{`)`8`rp6*4~^6; AaR2}S diff --git a/tests/regression_tests/surface_source/surface_source_true.mcpl b/tests/regression_tests/surface_source/surface_source_true.mcpl index ca4b7c2c4257c88baff2f9bd1c2a756fdfde92bf..f71134bd46cbf030a7b3de5c5da5736e1b97e7a9 100644 GIT binary patch delta 3986 zcmWmFKUAyr9mnzGEoxM1>1}Fbi*4HbyBZZWYVI{w)Tr@_ii%2GR8&+{yrzm8ZLHX0 z#Y!s!HxEOOCj&zUh71`P7#J8bWME)m$dDleLk4;d0|Ns?Ul~5<^ZtCFJikBR-}5}F z{CKAF3WtA)0u=bzV}d z@``-GcjPV}c{)U~^C3!QLsY~Qcph)#foDRrhAV30xP!ZR4TlHabE_II;CURL4bdjv z!i7H5>4Tws8-w{jhG-1u$3wJ&SMdto$8EfihaaNnLX=E}XqGR_bGVN8a04IX#At|4 z@aXd)n!!svcYBC7@Gf4)M>zh1`|vc+KJ30bLR7@Soi$Z_3Fh9E9AFPvttEQwwQh4mb?CAs6J)zZhHX zL|($1YWs37?@;7ZdH8CFGUb5O=I%ANyoVdOjuTHBlb^^lc=Q_g-{)|iJRf~`&ADh9 zAF1!EXD_)|j$i9QapHalgj;w9*YMC&?!||A3LoK2%z@%;Mh!3WCa>|q>$IPSE@(TS z;s<=>dTpgHrEbuE+PWc>2ep+}sZGhB+7>nFgmO3979G>*&$NYhDL!PW)S{uEn}*h@ zN9nVkBU*n&ru3^a?NIDB4-QqROQ~r~p{?mqe%(@NmD-ei!&0b0CzN|r*J+OuGde^Y zbVS*=bb(ql^tR>DI`t_1j_GNKVzZ{F3Uw*^l zNw3lzHRyzLUXNwkql8yrhBoMkvR;ElYSEB$o}!trJRcNa@O)5>4k`1sj|eqs@E;yg zs?q_C{L`aJ+f=#AtGzfDb@}|FrJk`&K7S^Zzp+%>Qd<2clz(Ey{Sr_9ONr0%HgE9c zfF1DMx9WJAH~1bu;Vr95EV+KQRr4V$TgDssi1zT5TJ}4?yT(rW3}07k;SD_WZ@=YJ zJbSHcyyyBN?%}lEweaNkV^IkY#T>}@gcopZ**$%?^9kI;6a6mW^mQC}aS5mXgXQ%L zx`B7p#&xDCZ^^Oiee@PX`M(-`(J*4ibak(H5Yxfr3#IxUq@`Hwib>%Uf z_l-Hmt9S*E>UY&`XQdh8J%C2>v#e0;bYvy z3E!^KQ7v)`Gk6K7@dn<-lRN*-ZB}dcYmZus`nXz0ZSbtDwkB8A zgJYXitEzR>3i5&afgEnrZh7Rdl+$lqP%Gl1TK)&~<88cx2OiV!zJFvsyy>^YD_CBW zXYr|82d}Bs<$OxUdpJC9965Zf&+pP+4RgEOY15^GpVjdx-h4b<+3{;JKdTES~lSnw48}o!8Y4@iDHsb}VN`%<-hU zyx!+e%^~-2<`pdO%IUkDiX6WrtCi$w-0asr^WModdGJ;1yxTRk2|g*;a0OTKA@1S> zoGE&L?{ONh85_^zBHrT7VkoB_hB)}SmjVw=8xF7Haa_f1yoQta8dC1yJRbQ%n|OHL zka!;#@bG=clxO*-T<6C$@Hbn(U(3~&_%4mB#WTix!*=+Zyn97?uw!Psxw z1~167xQ91!9iQ@Jp8wK3GsfXde4p>~;lG>fE%)(hUgtG_%n$kKSLS%zJ$!+0@FqXv zgYOvQ125!){@_Jk2yh#J^I^u#o^Ag{oH5~IY zboc}h?>RMuI&I0veDs4*_K+`G>KI?8Htn2seDkLI zg=uIGS9pVWc`ELkhUa}OWTbHCCd zyv$pCk0%oTgo;+kt7m=A@De`2yL?@a->id{)5Fuah|{0zEIy=dxg<~hS~ugih1YS9 zVqfU2TKYG(h}Uol?@$L<)MCRrZ0%hH&+{E!}U-F6E#%(-ox5?k>3?;vGMsfq!`J8-$b4fLPthS7266*3EPW)bX<(%ho z1|Q*NywPXc!`YkZ54y|~p3gPsFvM>;aaGkl%*XaP5AP)8=IN(VGz=SAA40lOWi uHR@2Xrvh!#Ddnwwh4yLKT4$+F$24kfOSDUIYni4R9a5%0KQ(DEg#QD5WXv!C delta 3986 zcmWmEKUiz^9S7j2w^5^_Mw=>X)U@|!n<`q`#@?t=(TmrpQKLqUSF}{4a+S8UjT$v7 zDr#&qh`IFo(wa$z_czad1!7eiEfBSh1Q5EaKll(;c;-VD*gjUk#l7oze_A&TWfw8tWA zzX;JRW698Y&}lM61%_XSsLeLFnZDWaP>5DI!I4`+w8bN)9uCpWV2G+r-WsAl7n#p{ z`fVXvVui^^LbSm#4&NT4P0lm%Xo%t|pJ9y~+~x3NO1vXP>+CYz8KR*PpK(k&-{mTc zkE@Ygrtk8xWFcd3%8U;EzkA-&wTbHwR~yE6FhnoJ+5;s`mu#)FE&o!=dmqTig{pf$p zaE(P~^f1L)&i)uWTIjkA++q9c(D{!pT?VFgRA7sfJZ76IovpITZ65K2gSt!qS7#jM zAt#vBWsB2X;Q_ap(CslBOtnI^&k+vjxXLn{oaZw4*k@daN38wKvjiw}#=Qln%dGH( zpPLZdtP9U*%tVA|g}Y2$p?l$JG6>HRw>fjAdS6jDQ?ClnRW|mTO>nGYOL4VxgN@fs z|7taJp5=?4agFD3j(dzoV(oN)RsM)wK-Our>=MXmTO1T`N&_) z)vImEvFtqQ)iyXTC0t^~yDj%ub#Rk)@3!pQX5`)0;2igv@p3D_t-oo>K31U*Rwdw@xjn}&qxN9%2mhot-i(sPQ33iw<(wVJZAZJWltCZt1PA5j%z$( z<_;}fa(j+n3Y|N3;-5ve!{Mo2E zsux+9a|}M|ZjN2&xeMlf#$C9>##5dm69WZzVmfAC&Rg8$F-uP?`U=Ie&&)H5yi&33 zafi99+~-+4V4I1!U2?SO7wUY416P}+mtCDr?(vAFYury}*LcX{wYojcE)%EOm5GJZ z?6NGoCydMNgnX>=m_^yGULQIl+ZT~l=EY-FbbH+5n0Snc@Bx?E5RXAo9uSWi&NC^> zCGnW%E-RuubsCS0p(7PT61&PZj!H*NVvjk?rgQ{p9TbZ;mzaLbV^1T&O>QwO5>=^P z;1LIIzdQPF{A^SgjYH{O=a|$EiN*ovQsMHvN8J%FuPa7C;`X@15@+sF4G$T!&)mIc z!9~uV?)l!(vDUltP3R1}h0DNGqk?6%7SSGmeNWU5>LL7Bk%D5+}r>$1NVRDjvzKdojnnc#N^fY39UZktd?F$zxGDU{gdA5BR)j zWZC1wS>F+j4JO_;VJ>hWINnh^>nwARb(X5O%U!Os_^$u4%lO?!|DGP%W{K(dZH6t* zF*Tug_PNWMOSb(Ry)nb-58RUnoMPoeE93^d9GJ9imM25!w@PstxW@vA{$|^(vCTEE zGWK^PWsxVGWjft>Tx_St0qU)IeT z_SxeRlmE8vd#s0fPIH`#T;c(HOw@e#UTt%X4Nh}`2i#|N$QVBI8J4-gf_nFP!r}Y$ zq|Q1gxXu;E?-vIyzMyvX?w8cg^%t$?C3QQWdRe_Jl+~;D^egJ*3YS=Y)vDO%*l7=5 zc$++AR&9$Ft75_nZ}_w});Vy|t~k$i#=ZICAA2rq%y{#yvCGUSb|}76+~y8jVjSw` zF2)7++2*(yZ!;;zqn~;{TdaujF*i8!nOekmne!a{+_S}ZiE~Ug2RxHqN8^FevHAsnn&bvoxzFaq#{Xw+=RJ-+ zmO1^1$8zCOW8uJK9?yC1F+Sor=g}Nu>~ZCAinVj0^Ms9^D@1K(a*}f1zqrCKM@CJN zeTD~Z>Pe+Bc|mDh|?vs8XC0%cFjTJwXjIIa#P-Z#L zozrQ&WXal(`O$2%%Teu5`tfY>gjMagUQsfSIb#gXSJlcRP8&o1H8rxwiZSFWYU3ue JuN%$l;s4;+%nJYj diff --git a/tests/regression_tests/surface_source_write/case-01/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-01/surface_source_true.h5 index a43646158be4af47fc9ed18b9c2e2246ca57e35e..2566f8a8fbbae42cbd85b8cafda6a199b22f7967 100644 GIT binary patch delta 7869 zcmaKxOH7nk6vyWQ!wkb?kbxOMWv~c?ijK9WrivMm7)(rxRg-D8Iux{E6%oN;A9hH) zAnAtAX;PMSH=8D7+?aGT-LV{ZEXN&7mM)sK-@WHZznt?O?t)?X%{l+`y7#+4<>$c8 z?}7DnVCR=#kG%-w8{lx=z{|?EA4-9$zXs2PL(!F>-{j`(mp=%no6&^J!)7b0aP=VgTQEtk9|To@ zJEpWI+lD~Mmk4lqh#kPVnppOAx_a$^qCU~CsFw){^<-SJD8#*+Qg6cYoQaT`2}^ia zLZ&O0@Un!=P*}nv3#n}h>4nK9lx!*q?;m$lePkn&EJ+@|yVU2)$2rbyvK(1eL zRUzQs0oGOes1nsWfd=z2XT5*Sz&j1(2NYLZ1Vn zW4!ffuxHTICxy8CEB{uBcDbXl;aflLN1oI9gk zCL3$9;SIVWbo#PA_1zaG$D$kN3Apb_*46F_Jj3027_m0EGOXfID8} z3-V{sf|n7t2yk`Ce1sMPY$%|377c{@bqIwoP&n4PT=AO^Bc6dpIr{2Er zw6udWE!HE~imO_2RV%))R$SHUP_;T#t&V-QI#jJreR>M#y*FH^kt$yB-fx|%QbNrt zp=M=B0yam+?Nf{Q5_U(FQOaG!(D^7O)abg@=(^PCy7sMkm#WpR*E}=oJ?h=I5am(t zLKMfa4&wNo9Yc5g`0Z9>>rv~_qt>Cv)*&_SJrO;s)fkocdIqBWjn5pW;U1m4jIV z;ucjUAhzDQNp$7@UCcbyV3UCR+F?QXnj*eHKxk|e;3bCaXXuL0CzJ>X@z`}7Po7}E zJ$TlydmlVdBQu_5zbU@mq9TOy4OHSG95p@mKIaQJ(S+xDRBiEqI!XiTC=IBiG@$AX zsyc&uI+dJvI)kcAT9rxbGWjpOWzwq5kSa5zR&7YF+K|!lo`LFZoKHRjaPCV4d<hhX^NGA0JEqE_sjeyYDB_R5nTT~LP zEMmdje^M};{1fMYFL>s-|E6FFtUvYM_UGaBauV8>F4^OoJB0iah9LZH5fJ%jmc3)U z08>i|C@*6(xxeBw@9;+8??uc=gjOXJ?rH=+U-Z5&Uo_6_O_e*ls26Tw1uG!Vg>3?& z0@>$iAr7Sy0WkrwZ_z@WRx1RAMvZ_N@rm!yl^F3d0WrzR@6kfIDi9FjI|PKrL{a9L`o+Oq#tN- zQiy0Nl|!Y7>LFn^S$hFURX0XRRhNcE1PdgyL0x*)wb>NzJO}CBd#7GB$I<_Olc8tttg_PSTYt2HH)D53yA6sidSO`hFYAU_!)?54)S=b z9VFgNCyBQVK-CJf%Qkc+-WG0cbP=o5O{_Hl$eN3j7L_mNw=|RG!~7XWvif_68emFMuaBH`Zv)oZ1lMbzO&gsy}Rc}X43>S}(XcodH*Tg9fb zx|*6y!3bMFoJGjIfT`@jXhqox8sWg+D!qs@cV2@A8@(3F+K)u}X9^Tep`@ zLTc+~wm7rJy=)RvTb$W?n61aP?YxLrp@b(+;#JtgY`x6Z>lK@XPfn4Ake?>=Rh_mC zb-sGpcztZVKCkg4q_yZ{wtm-!55n5ZHd+|{uKsM6L|(~~y>GpOZ{B`3)&Prqz$TWpbwWfP06LQMXNaSE#*VA={LJpj84@EibNF^G z=ZW2%x6u=SznjPQJjtU0t<)&@vxIS3+9fQD#drThhxWA+;r$ZH(E*ylfKA zzKd7V7_(W-W_j6~@I7p^m@UO@DKDFZG}Dx8!}D8upUkhei060QwQntw`K>RKRhU0d zuInlQbX{jYuyytL7i9qIn@5-zNSERTd}BR&H2`Rs+!D#K0sy^rt&6s9 zC=Uryx`W(aKuw?#IaQzv4k6|B;wjC87=oINudG&t!%467E}oU zNsG*;*sBQHNIQY{*tC>mVGkb z1_0E>`J8mA0YF`H8+Kgn^1|*;Y88L1&!MNnaj!@vgheD)HqJNacqB$m!pKSJ05W3PIgdTPN#Rp H|Nr<8B7H*; diff --git a/tests/regression_tests/surface_source_write/case-02/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-02/surface_source_true.h5 index 5a73e7ab2ae7b7b582c93eeba57e8beadfef4515..40ad40b62cb818f902cc44ab9c113fde9c6d5a5c 100644 GIT binary patch delta 2998 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ǽKLnk)T*M zfGJ867#qV-Y(et|u)c&o7RpZ>z|6NKMdBugq78#}353T5#fktj6SyX{jB$89A>4}# z6M{$N69HrmpeEqGB`A^-*pNVU(mq_%xLqct?UKL@*!nIRz*ei6KqET$Rr;h!ObI7V zZptpJf!D(U2;Ua+OWj5p-Ar}hu4#t9Z{rt%mD%gdXkvOu?^-H@wP~!E0cXZ;)S%1C z&Io0dW-uOW)7TxsC~p88hS03#X05)}{B>5ih;Gda9*Iu{ur7h{oS;}SfbPM}ydap9 zKtTeL&xBA}16XstpQC~%1xW+waKeTJqIWSAQ>+@mJpA|UlZ@BE^gUrxiucfnt$Xag zP)yDMHmku0Le41zSk9XUuujI4SWM*(QdiAG`q(HWg>C69*mn!cvI~N&B*>0vx8$NA z%P$HY3Oy7++5pzNElH7hgcZ@&9oM&jKOPCUfbe6?fc6ho450BcUkGbAX8;vI!2q^) zkuNb6D>5qq?~-7iG=O<*7{IcMJ`v1U4PXlYSEyiMNdiR!Sb?#x1@oK%td8JQL6I_m zE#RgBEZz7w7>b=3YX&fL=NZlx1sC<$XP*gUUotX!Vhreyq~vpyQ40Cz=tjYyzM)4` jf?GO;WllRmURy_X#^qeRK delta 5685 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ǽKLnk)T*M zfGJ867#qV-Y(et|u)c&o7RpZ>z|6NKMdBugq78#}353T5#fktj6SyX{jB$89A>4}# z6M{$N69HrmpeEqGB`A^-*pNVU(mq_%xLqct?UKL@*!nIRz*ei6KqET$Rr;h!ObI7V zZptpJf!D(U2;Ua+OWj5p-Ar}hu4#t9Z{rt%mD%gdXkvOu?^-H@wP~!E0cXZ;)S%1C z&Io0dW-uOW)7TxsC~p88hS03#X05)}{B>5ih;Gda9*Iu{ur7h{oS;}SfbPM}ydap9 zKtTeL&xBA}16XstpQC~%1xW+waKeTJqIWSAQ>+@mJpA|UlZ@BE^gUrxiucfnt$Xag zP)yDMHmku0Le41zSk9XUuujI4SWM*(QdiAG`q(HWg>C69*mn!cvI~N&B*>0vx8$NA z%P$HY3Oy7++5pzNElH7hgcZ@&9oM&jKOPCUfbe6?fc6ho450BcUkGbAX8;vI!2q^) zkuNb6D>5qq?~-7iG=O<*7{IcMJ`v1U4PXlYSEyiMNdiR!Sb?#x1@oK%td8JQL6I_m zE#RgBEZz7w7>b=3YX&fL=NZlx1sC<$XP*gUUotX!Vhreyq~vpyQ40Cz=tjYyzM)4` jf?GO;WllRmURy_X#^qeRK delta 5685 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
Zkarbf`8#AwO+6%* zO!O{T7xrDUr^U7|1Cyz#B&ouh|Z3fcg4&sIoC#VW7eEZgGeUz zoq5wXu)k)_2Y`s+tb3pcnR}q6n^MqPnz(NcaHnuox(^&hzb8lP;$m4TXq6}|$u)7%pf-3Fri zpOQIk39dXf=R@yJtt@bq$(k{GZCXKC;u*-QCLMw~FQDu=FX_=;f oAVItBN>b2nyLb-7oJYbo671JxO6%wP>+$`(v1*z3@h@H1f96*>0RR91 delta 5641 zcmZ{o-*1yu7{}LkbnmtnC(zOTDg)VQL4|09GPkk~EM*J^46)FcF@#`MoPr3QLfK$I z(ZooOiREUAcdvrh4rj0RejA>^~J7WTj2`Gln zLn;JQUP2+-X$M-gnG!`5tc|cJa#GNzQdCh$hv6$_6yjYF!|Aev`r-`o!4$gffWD|i zt=kUzwA^1&t25t|46e~d@lSUqpkpG{3u7*!5bd)Aty&OK?6ZTq(4nj%5xNmNloiS7 zRfVlak^wyta~9!dAA?)VdkgV~Wo;Nj4BKqNHZyFC!dBjdSqbliZCluBhxE1m zT4P=M#ow`M+Do##=nmh?JO@mv4KQrbgbgxmn+e;-u&4=(GAw4oVhW?9bl!mzH@q9R zazP6ERu(lRvU}*-e?xTb#v?2aK}u2}hjMf;9CF3IHtE2-)QBQOFvGbaNVkeY`dx4; zOF=)nMSPe#y``L1hQTR3LaDbEwLAh;Z3ObkCSc?hDUgw;_CcR0?W0b6lv839oQk6m z#~K5t+!&3sSH)Q!gE;ANN)0LM`FJv*-wKe#zkAVl~85QPJFNGFCHdu@$4KR!*S zcBElRu4yCU^fJzwO)%`R2|LWN$p!{(aT+Ukl6H$Djmou(#VNXikD7ds zGT$kqZ|)SW+%cCrMJsoV1v_r?JkGEaChP>mrcKy1!%iwJe}?9El40*RqR|4EGIXG) z6qT^yKq}g>p{=vD6MrBc+w^9V7OiJ9=U~1aDd;;zgl9o0%+j0F z8J0?hrIKNc%@~`f8@&MDMJdo@>>_;x&M>2M%;+3rW)%Ys@e<5{bBP`y=NlWrFMhV+ z+En<6PS%HfWZA48)XRK<<#dtfRQec3AN>UDBL!NYPoc5qq(F!&66wp(2+Eh~-KJTb zz6^I8=QHRg;W@g@{c4#n&%rXU&4E?+bBI%s0_jSrFMudXLH~b;h+cs;Uc5qcX;ZmG zuG0N0U-Vb#sod`F->Z;v`b(%^SqkKd8^1>Ff-26+HHZ`b3eqk}LGO;DhD7!{5S8oH z$$jC@+<<0Sx&awSb8u}bN`b5iYaWE06iAV)QXtu;zlN`rr9kWQ4G4}Dh;8^L9gq9q zUA_sGs{vJi@7@Bcatnf|^0;vF)Xja=CT>HV;%$gyEx?}3EzmgbBX@NH;-nWT<-T#B zF9H?618$BK^m9Ul@4|*CNP)gh?oucBWt(4uRZ&@jIH`LOr*x0Tao@Cw`w*viA2PNc zK*qTTG>-e4U41}rSgtr%fZ*i# CvQ*dr diff --git a/tests/regression_tests/surface_source_write/case-07/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-07/surface_source_true.h5 index c276af40f4302f4e0feff883bc3c472bc4df7ca1..63b599bcb101e38dba41e676e1d06ed4fcd6690b 100644 GIT binary patch delta 7893 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 delta 5641 zcmZvfOKcNY6ozew#A9Lyl8`VwYMu#`5YZB#9Ud{SV9YB#!edCL<_*IuK%Y(v=GoQ- zDJq&ubvIehqK$;uSgM3rdKI-&7hWNj(+z8{Xzv}n()_>2i&*+{?tjib=iGa)-CrWF zpG1DrB0C;E@6SinsGXeC`{H#aY&(%Z!$o_tsju~;rf?_}>Q+J_>*eoFe?;uxS`_<1 z%Ygm1Wq$aG{jg=Ny*#?O_pC6GpSP2>@7mvvPz_6oGu!{RUY?Eq9FEsbL;s48t;Ebk zq`pRi@bed4_Ean#pW}nJE38_4AY%U$8;|>mU7l+q&|7g$bK@E{jwVrQ0*;gh5^ErH z8%V1p7)`0o#Eon7%y`tdCA%nqKNGex-;B%5$&Z(-oB&|q3IN$O+Hpf|GMjJO)A8n- zOif4cAlFWZnTYu;=F4U4I@1Y%5j;5ENm|uTGv4G|YFi7;F27bs{hv+tU+tp_e;l3l z-~cWNf?X1(y3=6UUAM%&DGPBc3xo6)N%(#t>MahkToMGAN;t9zmwzDPD}u=&%Vj}u zc@SJ7VSWiZS}EbXB~*vZQZwOih1EfNJwdQH2(Af&S{-7>-6S{RGBfV)0K3dUUrrW| z0B{)86()Kq2mpOnU4a{3FN4dk#9R$Z_--ZVY8AOJt-@ooNiIvRre(#|*jl=@O7@_~ z%@R%t=s!AJBz)gPmzvRQcKNNg)lW*Z{jg^g)(_Q1@ltfwP~ugM_EpgEEbjDsKryS2 z#43Fz#4s#l$oA77O8rzgZ7nWK2jye0gvkNSTqX$a3xfND;DI1`P{NUQ=`R1hbEuw$ znB6{rH_}Lu#$gGkKg3{<1X&&pg2#g3sD#<|sChid@`Qw`L2kuCZ2nXBuY=<_3UV8$ zpsoOL#*B?PddH*)Tq5I*vd$(_Q9s7BlWkBr)2L#7LMjyj{MVPA(anTE+6#>$+GY|d z3IJ~cWeb6v0B|+ATkuRb%XCj{rF56K(lUJ;0cRT)Bqnv%4Pk-jN;o}4;?*HcU|d?| zQ)E?1ae}s^$9Zzu>~_3(yqTTaL5H@ugB}*jP7==v0GV`mnhF0~#GBm{yKsNC*}aP* z*LP!zy}A8rH(9B}SZ~$K)i65n=62g2T59c~KB(+LkKVk_rYQ@hG+KGHI<=RqihD6G zZ%!vOWR=TM0$l<8`Ld0D1j_r+y*JiJ_LH!)p9-NKpv@KpfR?VZg>{ggjTHg#upJ_c zk^uhEWNRashJIO|nGvdla+rp6P5{tx1%POcBLvC<_z%9VAEgvH0)U2kjB;BzhG%1= zjJ9o*a%+u}a76&j%W>54CjRVk($P+!mG=agIe{n9djcd+Vn1({aZQ~hJ@+KNeT-As zDk-__%_&O0ZqPDE0O&#WG$pPe0OY!Q+D!OgS-YjD{1`^Y$OBMwIz@jPuq|`b`7L{`* z{7Ui0fA&0;xOASjpj{xHq5!Z-vd3><9qOtA0tKz@W;&`ik=+0N&1DQ^89Nv>aI!1pp0Y z66cyXg{LO*?p`Ge_kNOcYkWgmWdUH<`nTlX5dhq)cPY1pyI9sfuV?O2?^*X~S%pC+ zk4@yw>)AZ%X!p@-Kzf_GPgcqUiaN)@6##Z_JftOM2KpoXowz}|e)Wi4tB*;iAOH-5 zDqC1jI5z^oC7$_?qAdvkqT2VQQ4|0)lpiRtoB)slmo1C}J+jIIKsV?=5^w|nQS~Xs bQFw|K+~xJlGfJcN%v|dCG+h4${QuW~+?`<0 diff --git a/tests/regression_tests/surface_source_write/case-09/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-09/surface_source_true.h5 index ebce87b36aff8050b2b6b9df2bf4292296045da5..214d234c69d29d8625d39227c1cbf3042fa6804d 100644 GIT binary patch delta 7761 zcmZ{oOK@6M9L9NtkX9>c9$=lcH>OQ*TH8_|k(gGANm|;Z%}o;xHrSA-pfw>cr9LX1 zx?si)a-1iX{9 z*3Q!A{_4Zn+Io}HgKRl3b?ol%Y%ImrEC$(jj#}rNuNQR++bk{%wXxZ3^sV{HOW!PZ zYtCiKL$NWIc-14W7hNl`~2GzF}R2C0MZCFIFNc0xzDVmkuPx|DSV3{_yGW!Fc3r$C?nwi6l9x4!1Vwq z;s{g_2rRJ`6k8Q0V@qJ??T&!x2@d2F1Sx{cz$(A2PHTlcTLx(*SD2R+y@r6X$`sNx z6gZHqv^5YTg+LvF&^oXxt}8Z+bl2Im%st0DsWE=V`cfwWK!4y5xxvZubST`(V!|Ft)1K9Ue0 zkrUrO$oT+(%vV4VMWBp;|7&2CWz~5*$d2RYi*6 zw;*_)18I4^-vLFE1L>!74JnN8fmMM6sX*;9P^37J6mCe4Z`*-`_zFeEr7VAg;vhQq^f6Q0Y|D`|w(2r0mR<%>x z2B%`x3hlss$ctM_vzDzXNK%xfOOkF$N|KZ%Q6#BIvO|)cl2lXSE7x|x$~}T|X5~WZ zv3Q9?klh;*_gHLeYVt5)uT?8%y6zIc_cp6p5q=*GtoB>AN~Wequ1WeW-o)N*4P?9a zb?S@a&)x=`L4Vqf$!=t#NjZ1 zlpYbQ!?0`q2t2atD1b|leNIGz3Hu=^i4cta&?6wo?x4^P0C)(>7$h8o7{MIp=X9uZ zPTgXAtij&HInf$}*WEt|@2;xB1YC{3LG#)6e0lZ+pUJUol+9!zeM#0P7pq;J$o*S4 znB?`x|F?coUWqcrFC9ZvruYqgLXwk`ETzI%r9aANb*eL~is+r<`+Hh0b|2%jT9!sU zBgt7w8j`G}!sn??!^wHm{H{1JZcX#M!c2v~Uhxyq#eCALW$*tBQkSMAmfTl;if_c4 zRJ1M^*-u*o*-w^>ovkm4pQrg1v?;Z_B)8LMU~L|PG7AZ3mR~MiqBRSbi}?)Hgaqs^ z(GLOm1le^7b&l`O4pEejyzN@DP-F=;08s9x*{F`x=|i zLLx-ak3qsmP!}NKA|wd*aVUuh*f|)BkO&A^LVFGp9)e=2 z0yeaM5)wXwx&#RqAwjU8hmweZKO?8$`(8l6&R07P;2|h4z*-yv)+5G*xeO&C0V~nZ z0QdxK$JDcsa0%Gr5=__)D2WJIiLn9@tndS$Ne}$+IXH0d986Am5k_(lVg&O%l!OSn z2?-xTU4?nL1Z-auOxPD75fQMBHkyzK2v|b1AmJe>FG0dVh!M;+zVl0Bbqy{>eI2^` z2XbvPi0@g!m0XPI~>M?@(DU^f+tVI6|z$akCs#hT460oC8uJDU$GX03y zy1H1+{s}-tSD}xw1rQ);pF_e!P_9A3Az;&wF=1{)Nl3s-^y`rD5!5fB#3f++nqb1d z0f~r!ZKLreBmx5V%~Jac5*~u`HB8JQU=xcmVY*NfBIw^h!becQg_*hpY}f?B{?2+J NyXy;`uh9Sf`WLLW=Oq9D diff --git a/tests/regression_tests/surface_source_write/case-10/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-10/surface_source_true.h5 index fded9d987e392214edeb3fccd50c3ecc5f8a7728..31099a16a4f47b910f0387f899166b887c6a0643 100644 GIT binary patch delta 7925 zcmZ{oOHh+n6vvYQLZsD5k$gUYfQYHJ8dPi$TB9H!pnUiu6@*aKLbVc~jn9T@r^8G) zF{d+SnI)Uf#Bsw+H(7O9#vRLa$Ep){EIQNXyXUr(Ip>}%RPytG{^xbST$20Iv+=7Z z74&TU{O0g$Pplf6D%;=Y*4?n;$-4{itm5O^M1|Ysay58euK2s(Dt`CunYllE`_bct zhtv0;%-);7b-P5>Yvj$_W=L)O!29UQ!#mUSw_G;9vEO}Flc4kes$4ZLC!)vWasDd( zWI2DiD%>kI>L0Gi5AgRktMd5K;QTwQ`WN?Z=WWeg|CC&b@csXR2U@%nNYuo|5>afLCG*)Kkq$A-sXuL2yxNE^opw~Fl zE*NXYX_r3@9J|x%!ywcmd>ABKFiR@yfz1OrR!YEb#a1w|ssUX^2pkZ`w?5D!6Sx3!FbHj(^eP|wl-UO|r_hL=5vci0s5GttQ><%1Gk{1KTR_21 z^{CH<`^?wE_Aa~@(uWx&x-c~w4+GDvu-uDPMroiVyyd@3FcfomLLQw5hVS-j9$%zzDbSp(YV^f{r(ISr@)@*1#|!@U@aC6(#LT4<=lYBd6V z!fM3(gm~*3u)##m3&pHxKr;YeKPp(i5*jd%LO&Km%Ri|G6B`f)lN}I@tU&}c9wZ0N zMy0!=&!4^^_}CZBsxFmYUXlfdP)1K%w~}Rs1h?W4CQoG$9Y(;~mm4-4ol(D~Mn;5P zNR0^bwlrXqja@Vw^{S;STojB#mxPLzHJ}xxN6kJ1u(;rd%-oR9%mik@ro5~HomqMkedzL6s7jNQLZx{@Rt1|wrEj=y3h8BTq8mL?)!?q$ z4NX({MO%6D>W-M48Zmz@x;};F(s&S=HXGHdvU1ZxS-u#?qg{f82F$3S0o^(noH1N@ zov#!Bm=Ugr)>lF?NeOI7z@8OCt!luIRp6GOSdu_d0@2$-sGJ6@yTLoCU|FR!pxX&s z5{P|`p_pP#1LhH$GoJvw-eu>^tCF5aA2##fk<@;rmulBs5^@79=ouA44&ZtOhKUwSWo+k_$LRI*$|1^D-S5 zo=0|E2)C*MTcf}OL9wI(n@LdvR%G-chGHH$4Opn)Bf&hS0rS|B6tTxbs5J?Mo}hwx zENej1O+Ph1gU_j3(&AI$mXv=gWETDo0qa*r1DXKTBv8RXJb|gvtshh$55I9Hr_FwaMzpcl z)$Jtz3XN!YA@CZF7+BJP#)F~;EQ9FxLJx8pFpppo6>NV~8ZgC{q=+pF4O?5BY;&Hs MbVa9~H_KlC0_7hp+W-In delta 5685 zcmZvfOKcNY6ozew#N)gOl)ym21SnwwD7=da#1IH(c$q*Tm}GE5lY;vS@8a}f-Y|d^ z6-}kiinSLl5@KViQpD1$sEaPVLUiYDvUWGL_g-9S{@;^DB7HjNzvp%D$&`Nyy?GG& z$q4Pc_k4XWq=%j8yv|o|NG=YP(8WO1?jWwi65{$-d zwVJ(oIt2m3o|GJ8K3TZ)F}hY&nzlr9z1J<-?Zmg;?>z za+*0~h1Kkx0LNvZMad#701R?j0Pn0gsg;=D78%Ril~|gs5+*ySH2DrXO<#qVVuy5l zv5MR(!pfUQOj_ku$E#I{I9I#y0ZRI5oRIMSMhteq&+?=nJmm)mC7kI-&C`CCXC!>F ziAQl04*yx_pG_mU3QC))q2?B=#e1cOr4Kw2Beg2-R_d>|4X;YNMrE{CCAFPYiUPpm zitWJQ#%o3NPf5fU0Je37L1rgih|*5H!u7Jc=@?bF5FK2Tzoy%>VpySX?R~ zVgc38o!v`T#y;$(E`xo!4-Zf~H`+(8**@xWxerfNyLNIv<=V5CGn1;}BW60>Hh{Obg%XtcfYCm!*AgVre(1 znL11X77x?$u_FZX0(hSYM?XqA*#bZcm7_S9+vU-@V{~-s80nbDDbd1l)KSYdo+KSN ziB@XcMo-`^P}_D|K<}f!Th-|V>7@qfzl!1jwmL4|k|$|M^C!toKSgD+Php$(OP$t1 zjOl=?)gXzN21(pJjWMZ}I(wSjj59PTt^m+XZHStX9l~m=75aXNgi~iprzil-KrBTT zc>%yeKS#hmXF+?^mTVoS_GE@B;*tO$Y>tpcK>)ZxhDE?-pqj@GZ!f!{SxJ2UqUzaA={cEw@e1_ zj@poOY-N5yK^7PoUy_B(K>Lcim=ys2Jt;FteN7fc2C;7_>%0Ik-ufgp%4Seukhx46 zrOWtOsr{C|g0Jct*_PQWRA1vNX}JPG*4i}+Fe?D0P`-ve>XIi-UZ+7SUdMi`#h1K6 zR{0xfwNYwy-y|#hCWTO8kolIjo3{uQZsC{DHhFYBOGmp|a?_@`J_5i=WdY#P zOMOSd6$OAh9s8bK@&bUU{sU>)0)Rz@LFPxYCinhm@o7h;-aXnDmgGu;^n<`mBW0kEz7v$0VMzNxW#|j!|1M`Gj=x iPcRir-LI!)Wk03Cs0aZ4%RIA|dnb0Z`c3}-pZ@^et#!lz diff --git a/tests/regression_tests/surface_source_write/case-11/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-11/surface_source_true.h5 index b5b6036201bede37dac2749563dcd68620584009..ba52e9db16b185d91ce81e774b611e121ee5a0d6 100644 GIT binary patch delta 908 zcmZ3XaYJi@22+ISM6Eie1op{tENUAM++du%g6RU|gUOZ5n%ou4j0_A6Vw?;N1)JA0 z?`9HD%u7x!F3B&7&nr#N$xKNF%7Vb;d^TOq;?knD_{U=3R295rbBr0K`!yh0z58Yi!jVf;KAX^6Ho~Z9R|D*9T;w&0hK^^ z!6ZJ226XYs8Bhu2U;(*)@&%{_ayWt|EckKwegQwk_vl8kfPJqZfW!9%0ub}iwN1VO zmB4VbgCIl)MzE}aN?_;^5P~=jJ-m#;PMaWv!)Xto+R&3_$Yeua@yQ9o5N+s&PTn9K PqXG&lbRWfo1d#v$mvG4e delta 657 zcmcbiwL)Wp29t)!M6Eg|3HHfyENUAM++du%g6RU|jLDVEn%oA=j0_A6VjK(%8JpKK z?`E33hK*x#1Dnp|2W$e20h1fqv?nXDOQ|IQ6@b7AZU_w_g%}{hAR}&Tp32yqz&?eM z2db3eKM+jj;EX{Pr~nGELk$6|c!4eu!4<>HiKIec;zrTQ_qg16S&;PZ&+>58)VIj^1rkiHbN~Ua(y1-pEV&!hCERDL!(x_FNMb*~to}0?L_x@gF`t;xbKj)tNa_#gd zo|&&aaldEg^QW60dh9Z)EnfdTJ?*ARPsW|4yG0upM2p-mmup$M%N2R?ebJAe%E2o` z=WpD+dVS!^t)a`K!{_tVdC}FrgvUB56eI_wJ5wbDBG$^6&Neg~Gg=DD0@JRXnp zE&rR(`Q|EePtFrRxI&NV?^0j!&TanD7rwGD-AkQ6OXm7F|8jnJ)2i~`CC*Q!&X@da zj*wN}X9nX4lRM_vS7DjcF06DnCk*+oapO%7Io?k6kE_KR^T5id(hoPOqCb6dQWu6cd**4r$) zrqX43%KcPHr9(t)m5}#cvsE=*Y&j$=uuW>Q*`^jQwh|Hx+k}^zZC2+cm6Tc9Vs3)9 z%q&|AGpvJTJtP|(Vh-TrdJAKq?bs3*0O->dgX%?25)h$Na0(GrImt14kwL#rMNZKLkfaDM)haF-*q4s)n z8;{C1&WCM02JMcEcBD3#cP`-v&x8>_4}yAvPLSKr>D95P;6}6Lq$3fVs7g+WY}O|8 zR-J~rGdM(OGbm_svpHQ4bm_$|*)8BP(!P~l3hyV*=ADBs1K1_D4YLOp{8d%F<}MCJVmBi@%#%jx9l*%HlYwRwmq3d)D}h$O{T?r+ zMx!YN0`CL!2?#4aEhkw85$l#xIS72Mq??tg`VocmvDH@N@J+r#FXM??axRnrm_ zdN{jAp&&1%{nwb3KrNiSds(4*L?zHXvU_<_R7I7T6nh_-l+-?8i$z+z-|p-w)QyA<*3b3Q9|$Me{eZLO(1LXuX+5zz*?J z+AvKa5I6t|w5xoSI$&-~qRHIMt)iK+CbNn%O`tWwW)M5sY&O~{jI0)56lvl0)FGv5 z3A8;3wX%^4b_=6)D=_l5v5_{1Q3EqLl6%T%L!Aq%tvS*)F9 zYK#U)mgoSgaEDnH5@s1Bvkrmn9hX3@nR18BMtt9k90vK)huKJ5&wm6Yh)baLbrvb? zqr8-Uk|a=DN`YhMVvdTgrH+}4NgM}}M-a#$5DbI1B*UCct))vOvpUVmDAEa{O(PIG z!3wR-lM<-Mi@aUtrk$lXdwuk@%lwH&j}yGRf41WHW398VzKiu|zxm^zSHGsaJ}d2= zY4m@+^Oxwe-x~j#-1F@Zf4*+)48Q*Q%9Ezhr;po58t#rY@D(T5$lvvMIMjX;6rMuB zcM2$C5~$~vW{@I$nmeK@2E~&obDB3xrDUBkH*!eqaqNULW%&;btEsKG&HN^8qL-Ia$1l;x$<)6u5XoYFAX%ml zBn$QfknCrp!pP3}RR|;NT#L9g7SjBsv6`NoYcsx6en-f1=Rm&DfZ1)akfjHJERz3> z&~F16wLxiFo6Xb-@(DA05UiIPF|=-F_ydB}27rVi5@dOOT-uT?_n^X#P7x{jV+V2Mg7e!(o+K!X>7 z#J&hRIwgVDxWEW2w7?SpBt|)vD%dJI9UBFm&H&kVAq!suvg9Q&JM%tdpcNF6Kx^kT z0-?)Xk-F3_z7SsKXzFB<_al%XDuI?Di$MDoun8#yd{==YcGbK+4NftM2&g3-0kyo8 zKt1wgU1Nn-^i zCp#{Z#cqRS87Whrot=Da?yyXyl)PgeX?YEd0$C&qs+yKSJt7pk%L)xlN}vsn_a5+w zB9OgjE~Z!Xz`hTPN!>Tg`h_g;0LWqwIG@(j840vf!ykhlyp%vYBi2Kp7)K!Y&^$hF z`soq>FVGsDe#9mk@W%j%$Jj(w$lKc(=$JjmGPPr6VzjekEo+_s_UeI{YvbJC{{tUr BOaTA@ delta 5802 zcmZvgT})GF7{^P6_EeyV2-dGEGFe4d9r#hd3aFGSQqd|FdZc#|L1w1 z^FHTL_|p91w)u0Hx%=j$wxro%WzNdhCol39EMxw)BF(NWSYN$qL50a=YEn$5*we=g zeloM~EDD>nw6oWiMHPeWhGhd=V_n`FQkln@l;b2t1uyn6dkeY$U+^d7KEzF*Q&H6 zzn$i`>!Q@@qonJgNM(`QsBOdIa+9i9y)8&8Y0$-A^5{t;i`V;Vt2CW$6mS+`lab|8 zBe+aJcLR;N+{ki;5nO2mR|z<`gvN9lS*|vMYm8vCfHO@r=2`)rOMQ*nhP0HMQ_05a zgQQh&83kTv1Y3>Z+htgz&Bijz)LQN6uNPMCwhNd9_)Zzt zXx*8ArCMXv#A8_wh&IK35Tdg)~1$xTbENo&$ zkW{|isK^}xx|@Bp$W*gRL9tmShq_z1+1Jv3dyQb1fRPp-?NPQxCF9dmR_$OFYw7sx zF$%g@K<7G|exH$LuYmJl=`*tIGlG62xZemKFoOL?@Sue2>GLyCZoooa0|G`d4ha}( z!>+c$aJV+mK|8{JYzxy1R%xduM}-M_wvLHh^X;_RLprnL`q&;f=*hTgvJqXBus%w0 zBRoE_O>`$jbWu*|qh#NOD6S3=m+qkA#&uy&iB3#)Le~qOux&z{)f$`jikPrAvDwYE zft4awU<<^`Y=Kygt#Fy7IMCjFtjGb$7TX3O&w+OPF~0|5WH}%fuINXCAm{ybLCUQe z-w$V&+YjyV9H7d#idfGM&{*39boYbMR6htU_S2h3ZqMXFIuJWWtT_&~Yk8M|kpU2! z9iRgyH>fuNR_Oq>>K3t_hrlXv2*egRAaf8Jq;ceKoE?NXp2Ogl;ebq>;|ShK91x2l z2Xvl-V37|}Ed#PYM?p*WD7d+f0Z1cIhCqH|h|W?_WSSp>OrhftICq>191?DU5V&PR zFl~-u>NYIgribZ-jBwbgbe|~J{T=8nK7Twp`ugjC=AZxZB6!~tE_5|dcl?(4>d&sf zGTXlS;op~Cfx(wQ$M5dxPO+Ym2KpWq8v)sQ1pY7;6cK`6g<;ZNDz%CVs~MHf@R)$k zQE*L+QrB@|HP5ZcOK~Uy$C5+fIRO?K4#-qFqBK*L$TS^=OvNa~iH*^5ee``3n;Qc! z|4BH=>`8iUREuQZad1nILo($Qy&>$vZR!*~|2o+sfQtl-zeg?W1)K#a7ir*qYS|zx zp8=H1)O{L6r%r?D;%O>c?#*Nj-10HnN9O+kp7JaL*BN?Za#zlrp<^XKN1bPBIi>Xo zP=1cip9Ni^bM&NI*zmb9eOd9G2c?{gTM#3Kpm>XF2@A!^+n_jq zn_7(utH>Q%Y-!!y0aw>u5Sd1x+yjvb4oIPedo;cLIE<&@xN|9bwVK&4Dfpjf<~}y) f0re^Exd*f`i>TKAkV30$)I;A&?W^Y-)oj^1rkiHbN~Ua(y1-pEV&!hCERDL!(x_FNMb*~to}0?L_x@gF`t;xbKj)tNa_#gd zo|&&aaldEg^QW60dh9Z)EnfdTJ?*ARPsW|4yG0upM2p-mmup$M%N2R?ebJAe%E2o` z=WpD+dVS!^t)a`K!{_tVdC}FrgvUB56eI_wJ5wbDBG$^6&Neg~Gg=DD0@JRXnp zE&rR(`Q|EePtFrRxI&NV?^0j!&TanD7rwGD-AkQ6OXm7F|8jnJ)2i~`CC*Q!&X@da zj*wN}X9nX4lRM_vS7DjcF06DnCk*+oapO%7Io?k6kE_KR^T5id(hoPOqCb6dQWu6cd**4r$) zrqX43%KcPHr9(t)m5}#cvsE=*Y&j$=uuW>Q*`^jQwh|Hx+k}^zZC2+cm6Tc9Vs3)9 z%q&|AGpvJTJtP|(Vh-TrdJAKq?bs3*0O->dgX%?25)h$Na0(GrImt14kwL#rMNZKLkfaDM)haF-*q4s)n z8;{C1&WCM02JMcEcBD3#cP`-v&x8>_4}yAvPLSKr>D95P;6}6Lq$3fVs7g+WY}O|8 zR-J~rGdM(OGbm_svpHQ4bm_$|*)8BP(!P~l3hyV*=ADBs1K1_D4YLOp{8d%F<}MCJVmBi@%#%jx9l*%HlYwRwmq3d)D}h$O{T?r+ zMx!YN0`CL!2?#4aEhkw85$l#xIS72Mq??tg`VocmvDH@N@J+r#FXM??axRnrm_ zdN{jAp&&1%{nwb3KrNiSds(4*L?zHXvU_<_R7I7T6nh_-l+-?8i$z+z-|p-w)QyA<*3b3Q9|$Me{eZLO(1LXuX+5zz*?J z+AvKa5I6t|w5xoSI$&-~qRHIMt)iK+CbNn%O`tWwW)M5sY&O~{jI0)56lvl0)FGv5 z3A8;3wX%^4b_=6)D=_l5v5_{1Q3EqLl6%T%L!Aq%tvS*)F9 zYK#U)mgoSgaEDnH5@s1Bvkrmn9hX3@nR18BMtt9k90vK)huKJ5&wm6Yh)baLbrvb? zqr8-Uk|a=DN`YhMVvdTgrH+}4NgM}}M-a#$5DbI1B*UCct))vOvpUVmDAEa{O(PIG z!3wR-lM<-Mi@aUtrk$lXdwuk@%lwH&j}yGRf41WHW398VzKiu|zxm^zSHGsaJ}d2= zY4m@+^Oxwe-x~j#-1F@Zf4*+)48Q*Q%9Ezhr;po58t#rY@D(T5$lvvMIMjX;6rMuB zcM2$C5~$~vW{@I$nmeK@2E~&obDB3xrDUBkH*!eqaqNULW%&;btEsKG&HN^8qL-Ia$1l;x$<)6u5XoYFAX%ml zBn$QfknCrp!pP3}RR|;NT#L9g7SjBsv6`NoYcsx6en-f1=Rm&DfZ1)akfjHJERz3> z&~F16wLxiFo6Xb-@(DA05UiIPF|=-F_ydB}27rVi5@dOOT-uT?_n^X#P7x{jV+V2Mg7e!(o+K!X>7 z#J&hRIwgVDxWEW2w7?SpBt|)vD%dJI9UBFm&H&kVAq!suvg9Q&JM%tdpcNF6Kx^kT z0-?)Xk-F3_z7SsKXzFB<_al%XDuI?Di$MDoun8#yd{==YcGbK+4NftM2&g3-0kyo8 zKt1wgU1Nn-^i zCp#{Z#cqRS87Whrot=Da?yyXyl)PgeX?YEd0$C&qs+yKSJt7pk%L)xlN}vsn_a5+w zB9OgjE~Z!Xz`hTPN!>Tg`h_g;0LWqwIG@(j840vf!ykhlyp%vYBi2Kp7)K!Y&^$hF z`soq>FVGsDe#9mk@W%j%$Jj(w$lKc(=$JjmGPPr6VzjekEo+_s_UeI{YvbJC{{tUr BOaTA@ delta 5802 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 CJWK)r delta 5802 zcmZvgT})GF7{^P6_EeyV2-dGEGFe4d9r#hd3aFGSQqd|FdZc#|L1w1 z^FHTL_|p91w)u0Hx%=j$wxro%WzNdhCol39EMxw)BF(NWSYN$qL50a=YEn$5*we=g zeloM~EDD>nw6oWiMHPeWhGhd=V_n`FQkln@l;b2t1uyn6dkeY$U+^d7KEzF*Q&H6 zzn$i`>!Q@@qonJgNM(`QsBOdIa+9i9y)8&8Y0$-A^5{t;i`V;Vt2CW$6mS+`lab|8 zBe+aJcLR;N+{ki;5nO2mR|z<`gvN9lS*|vMYm8vCfHO@r=2`)rOMQ*nhP0HMQ_05a zgQQh&83kTv1Y3>Z+htgz&Bijz)LQN6uNPMCwhNd9_)Zzt zXx*8ArCMXv#A8_wh&IK35Tdg)~1$xTbENo&$ zkW{|isK^}xx|@Bp$W*gRL9tmShq_z1+1Jv3dyQb1fRPp-?NPQxCF9dmR_$OFYw7sx zF$%g@K<7G|exH$LuYmJl=`*tIGlG62xZemKFoOL?@Sue2>GLyCZoooa0|G`d4ha}( z!>+c$aJV+mK|8{JYzxy1R%xduM}-M_wvLHh^X;_RLprnL`q&;f=*hTgvJqXBus%w0 zBRoE_O>`$jbWu*|qh#NOD6S3=m+qkA#&uy&iB3#)Le~qOux&z{)f$`jikPrAvDwYE zft4awU<<^`Y=Kygt#Fy7IMCjFtjGb$7TX3O&w+OPF~0|5WH}%fuINXCAm{ybLCUQe z-w$V&+YjyV9H7d#idfGM&{*39boYbMR6htU_S2h3ZqMXFIuJWWtT_&~Yk8M|kpU2! z9iRgyH>fuNR_Oq>>K3t_hrlXv2*egRAaf8Jq;ceKoE?NXp2Ogl;ebq>;|ShK91x2l z2Xvl-V37|}Ed#PYM?p*WD7d+f0Z1cIhCqH|h|W?_WSSp>OrhftICq>191?DU5V&PR zFl~-u>NYIgribZ-jBwbgbe|~J{T=8nK7Twp`ugjC=AZxZB6!~tE_5|dcl?(4>d&sf zGTXlS;op~Cfx(wQ$M5dxPO+Ym2KpWq8v)sQ1pY7;6cK`6g<;ZNDz%CVs~MHf@R)$k zQE*L+QrB@|HP5ZcOK~Uy$C5+fIRO?K4#-qFqBK*L$TS^=OvNa~iH*^5ee``3n;Qc! z|4BH=>`8iUREuQZad1nILo($Qy&>$vZR!*~|2o+sfQtl-zeg?W1)K#a7ir*qYS|zx zp8=H1)O{L6r%r?D;%O>c?#*Nj-10HnN9O+kp7JaL*BN?Za#zlrp<^XKN1bPBIi>Xo zP=1cip9Ni^bM&NI*zmb9eOd9G2c?{gTM#3Kpm>XF2@A!^+n_jq zn_7(utH>Q%Y-!!y0aw>u5Sd1x+yjvb4oIPedo;cLIE<&@xN|9bwVK&4Dfpjf<~}y) f0re^Exd*f`i>TKAkV30$)I;A&?W^Y-)oI-4zv Nv7SceW(jr=MgSDIAn^bI delta 81 zcmV-X0IvV25#SJzC;?!RDSrYO2a_HICb7WS0h6c#&;gi}c>^g6FarSq000&U003yS ntpmFPldJ{^lYj;+li&sr0Z@~H1}l>w2RsDcDavTGU0pBwJKDrsiLByhSt`!qC`Ojf8hEbtJOH|f|+h& zzRonuEVJoMI&PThCQFuCW|{7?%#uZC+T8D)Y43dJzGT7QGw(U?dCzyh0HvRUwcmo7 zNU-+H`(1B>$#%85W$=$urAZZn<)*57*}Ste)!Y;a1lD&10?vouoBs^<-kh7d{p9KV zQuA$lJDxmyd}nfYIuKWn+Kx6|X?)xrabas96mZJ~gF*LG<2%d! z6liWLg!C7I*iY*3Hml{}zR2tctNqueZuiG6!~*{`UhbD_F*Kn;y9w+L0u7t`^`Bya zfl$;DNPGl(ln{t?g60_pVvc2`NUow%LXqjTRCU#ee=O0Df#niVQ?^tD6)8 zq#1~{*N`IK1DY=)V6O*?1qNb+bp#TwYAN0=m(~xFw8q(ebhIBT8dKCm> zn}MRhz;vL(TadM`wY@5{g{+Bisw^|ZX;rQ)X#-i&rfz0*B#UkZvh-H4qZ$J-R(u;N z#Ccm}U>aBUcK?IerVnC%JJ?ZuMVT`IWTgS}X9l4nI|vAWnH~Powd=&ggCM%(Aj!-P zw(GH~EE6$BKLP%70AwR8*-J-&y)w(BJ@*{NcLG^{C)qP)Dzppub{GgnWtacnDc8jA zk+6F`d1cCO=~j!o$29QnsR8=b;GQ!Ycq7${g*~M3-b@SFR2j+a=nBnLJ_@?kSClyifUI}lqwzf&v}iu z7CQl~Wlm5%bE|5Zf$*G+O~~6c*4nKqF}fSQaVi(YzVx{?T~J`)?V%OnlcX>}pL%nW zE@rP?t*ElX8(0JMsY|DTqIe3pvPQs-?TmozD-68N_3afqO-u3GbwQV2O6fFMO85*l zGVcSGVjvn-&-ibDt-e8$XQ`2>S3J9tEIJBg=~3XX#z36s_&I81Iv{`LbD)uZo@Cx5 z<>t3ekCi_UWc3wg&IKSVU7)edZYnZHK#Y|cL;l>~e8Ly0k-2@9ya*aCG4P&ycU~2} zL<+I^+$DbpJ^F-Mm;LYT9-UwMG6$SD|IItG` zit3pMNfj6f2jQ>5FewJ6165@p&cWyvP^yT4^$k#@5vVZ`uHxTY(5tvkklb}(GfoN1kiqV^( zRFQ#bZrvi!=6%T@(+BYu31JhdzxhCxcxf5{4|KKJ`MJs zxJ|&Ur%DXWsZ`_+D3!V6KT*H>YuHj3v+k3g1%1jaGwqQqeh-#-VN-h%E^Be9Oy1FC0^r3ws8<0||R zHagL`h#u0OM6OkqnZVZhCFej8#X0I`u7hOJc_2&A(^#fV)#gz>_rJR{4v1;d0kPYU zKz<7d)DcKL20cm$M4kXehJhG=8G+Q#$SLdA^!r*5=s#evp5XQ!>K9^gtgd9P^!Q{J~uy*LOf|H2BJrmfjPb! zeFd5qU-_Tz0euNXUxU+~eogg6qZ$JdSo}v)h$$Bt2!;KI6k^H+20~G1AY3Khf>I?0 gqEsXe6d44T5lFrRrIy}J47h*Zn9X;%KlHr*1$xvjH2?qr delta 5649 zcmZvgPfQeN7{-?cVUgVxq0r%vQ$(Nx;)>Sl`frO>aV@%1s&(3~h!*Wwbrq~Qv~>l= zI&BkDGEKTC&U0u*@ z7JR)J{6z~6KV2Tk29-Knt?7ID+N-ji;6GJ4d#<{_VW_$)5D2t}0s-UIAJu;a?cZxd z_I&N2{ie3DYRq1!-EDW(wf9Xj0sne4xAAl1dsAQo^Ag4Wzl~Rub-z}HYc?hSvM)PS zpAOggfyqF7_3zkeN=G(NFu;!`DE8Al65irh zS;qN&T{sno0sqjpqS5*4c*qrv&L?2BUjnoJ z(9!FMj>!Q4`2k7C#BNFPRT)$VCCa5i*nMeG(j>D7RPG+SL@{S71}Y~;ceeZ|d;Ipo z+}2*Wm1P9R5N%e^H@!Xtb&~sNaG@&fqcaPb*bg~#`y~z3_axRO8LY@)=77XrJOG{J z@5As80_7kmECl6)^bge!2FM#hJ4{#8ARfiTw77uk5h!jR zkytCJ(vLy}_b9c6dB@Z-x=jJsj=?sSdjqrNW1cWsbFu2D6eZ7AGAkP5Z z)i8kEFdZezTdOA^wRr-b^AZE(Ril3htz8DlXGZ)aoqQYbw04qCE@12ww6{)4tkKh; zGET#69s_hgBakUSLJK$YOo=m4ICqBLUZGNxpfZ!tt;7J`(OGEko~4Di^Y*Ea=t=}! z1K7lsu~E1o)+j_MkJ9;sEqe}Z-Z_bC;yitTgtc%UtXhg*AE8=JNv!Gxu$mX>CulPt zse&qfOrk1|L9O`5aP$rXWcSLrq|VAXoMCw!>KLEEk$DWzJ9Uv3ZsB7TF48j;FmVY| z=Pp6W(5KMNWPprOVt};QFVnMYZ6s(xJVhLviIZ02Tw}87?zG-Y3TAVDS(n zzW_xZftH3YIR?nop)2&3DSXJKD|AQ!D>9gwkSL2Xn7WEPx(eBpNyug)C?hbgfyKK< zuZ&1OaUELcuY*nd5%j`C1aXXPQyB#K98B``Y+ zLA_aerG$0j5vcNyV1b$`v8|dgPG}C&n+%XQTM2>wEht$t=C&LRH9uN_!$vtv;c5Tv*k4u$uFbt28gkm05t}aTmZAe+nCL z7$93zp2422XEb#W-#~N`0vd}@*juClg>B+F9ag}?bEu{L0JU-qkdUDlpfDLA=T>?_ r+xPO+84EhO7TDrHLScsiQds#3fQ6up!1y`c>HpoNck{n{|Nr<82H|YW diff --git a/tests/regression_tests/surface_source_write/case-17/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-17/surface_source_true.h5 index aadcc3fa407a973be80196cab5f3cc4051c1a724..cd1b24a7bd70089876b700d3fa980dbcc9c7ad6e 100644 GIT binary patch delta 115 zcmaDLutIQx2IGo}n)OTx?33kK)HWWt!8myZ(*?!{lPj4uxht3%85kJEI2jlUHm_yg z%_N?fmz-K$l3x^`SDKuYnUV^W1%b)=Y`UDqrA2A+nJEkblMC6b8AE`iHZw@>I-4zv NiJnI0W(jr=MgSDRAo2hJ delta 81 zcmV-X0IvV25#SJzC;?!RDSrYO2a_HICb7WS0h6c#&;gi}c>^g6FarSq000&U003yS ntpmFPldJ{^lYj;+li&sr0Z@~H1}l>w2RsDdDavTGUI-4zv NiJnI0W(jr=MgSDRAo2hJ delta 81 zcmV-X0IvV25#SJzC;?!RDSrYO2a_HICb7WS0h6c#&;gi}c>^g6FarSq000&U003yS ntpmFPldJ{^lYj;+li&sr0Z@~H1}l>w2RsDeDavTGUI-4zv NiJnI0W(jr=MgSDRAo2hJ delta 81 zcmV-X0IvV25#SJzC;?!RDSrYO2a_HICb7WS0h6c#&;gi}c>^g6FarSq000&U003yS ntpmFPldJ{^lYj;+li&sr0Z@~H1}l>w2RsDfDavTGUu6LLwo#*o*)Q&rv<^g_S?iC{e5TGmR2?|u5T=^Z7rQ& zU0&JN?nu_Bj!tiGZJb+NT^6k5!qkc0>FwJiYKOZ7QRrs+{eE}1{Y>uego$1%{_{XE zen|eDk|&QJQ&+FayMO7;b}vu>)z6%1E zpd`@mhN&Tecn=gFK}BHfhpCi6x)%zcU`${tFf}5O?}H*Bs0pn5VJag~9)KbwXb9{B zFqIRi4?+z*I({Xi$U%4T1eAOyvaXV^Bl{ErIhmOcey$6Hp8Q;^Ppw1SNs~ zBuotn#HXO}2r2?YhpCi6dKwC!U`${>15+ac`2-XJK}}#i3sV_^@*ET)K|^3a4^ugT z`T`UYK}+BmFjWv}FG4W@h+l%hB`68>mtks1Aie^HM^F(MufkMHAiV~KPcSAhUx%p? zfowt%5Yz210`VOvJc5eAco(Kp0%;x!e}0E=-PkpoH1l)+znJg9J`Io)sAu2@49>u(stK(3 zpvVZ6_n`<08UovfshmLl0E&p9C2&53se(ZJ2#Ntfya0hqP!i}L!_<&K`~(V*pdv69 zVJan%94LH(F@bp&rbYzvr%(h0HG#DRQyGD>3`I!L5ZEg)l@qAvpoj=s0_QWBDhMr%1h6JJyg-1{k7?)rwC6K;> z!Y3FLnBT(Gh(P`hih!Udu)c?>j6k^zMM%&P*jHdGCr|?@B7&B{xe8Oo)rAB9{Y$HR KeyY20TH9N+RkyFHSK_ah*39M$13v( zS?I!IlPWhXQ?6WQiMu>PcG6V4z%Pq)PW|fpp9e_$b#mh9-RapdPM2Pbl7*tBBy zj}vt~q{-joI4n-ht=c{{9*sup#c1S?|33BSWcY1b42Pz-4JW79jQ0$Or?(E9XEw|( zECr{}$;IXO@^kHInNR=XpSi!>@r9XR#;aHSm;AeQ2C;Jf|KJIYV9&y&5cDb(i6B>_ z2!u{>XJb+c<{T86pw2}R31STjPiO>t9wvpL*P=)Sc|M9j=mfV8lS(ibpvVNZ9z`UG z3sHDNBUp(^A?S-xB!b+4A`m*kU5rU3n2jhhL0y6(62vAHp3n&PQcMa#Z$^;_@-h^G z&t4JL)4uSJmv@;VfO&f_n^oGwF5;Yh_eCof_@l9BFINj1VSgc zM=_}c^B9UuP`gn?f_NN-Cp3cHgGnLiy(khv?n4m>o#39pq!P@26q%r&L=g$%018iN z1p5>wg`h2pM37IT2!u{>&tOss=2;Y(pyp9Tf_M&vCp3b69+N`QFQ7;Sxqu=NI>Eh& zNhO$jfa1N77FmIs91obA0NDyzK@PtON zZ(~vj`W+OBAm2q12%X^G!=w_-`zSI&eSjho#D^$6p%Lsym=uEk7)2t;Pf!FxC%8{B zsRZ*GicC-*MI?wt6rRus_H#@ML4ScF5#*OB0-+P!SC~|SIfxI-4zv Nsh&pWW(jr=MgSDaAoBnK delta 81 zcmV-X0IvV25#SJzC;?!RDSrYO2a_HICb7WS0h6c#&;gi}c>^g6FarSq000&U003yS ntpmFPldJ{^lYj;+li&sr0Z@~H1}l>w2RsDgDavTGUQSkyKixWPDi1=9t_2a_wAHMuL885tND#5frk3O280 z-pwSQn3tSdT#{cDpI4fklbMnVlm&sw`E0tJ#id1Q@tG+M0h0^atQkXqq_ze~l9hpj z0b~pl6BCF6@+3eM12f|a4lskkL3r{XHVGC}J&nxG66{kLML@z#5IKhbKmcM+-oX)r zT|$8qA^|oXs1mND11f=G)CZ^pGrAoSTsZ7F0F}Vdp}`#^3Ni)Va+AqFxudblI8L63 zLq=%wNgjwEbZeX^CqiY=?Gc`A$Qum~7j&7)GkCFw%OpPR;*&FQNnC(RU<9NEKaTKP z0F^-Z$Yc%y9F`XdU=K*^$&P|JJh(y-yB4v@Hw7T!i0)wf$q$8a80I02!(khQvD>0G zSrBR#h9@h8AX?C^kD4qgg2Va-5r`IavsfkviegVk_LEALIF)G;dV;nTALyH^+06r!e=l}o! delta 889 zcmZ9LzfQtX6o+qH(iUlzw)|@~#)$wrIFLx&2hjtsEH1S zg~WvsHwOpY82bn~>8)kxIcI2-FW>#0b5GjnVA{N|$w%Hp<3_G%u$`&CP3IDX@~1R{ zYo(ssS0u(*NoOn=zbfxCyr??ds(Y|d^U^uosk^YFdDX5E;#yeAJ9*kH!EwY@`zsiC zwMWU2SIVy_(6bzaz5uZw*S`@_qqD{hB@q&1CIAX;<%kjHxS0-Z!qD&$vB4$e7Ux0L9hy+Mq2s#$N;UPTRzL`#K!-qv? zZQ1xx33>$|H<}kXO1S{nAt?ig%(8TFYy-}U Date: Thu, 27 Nov 2025 14:24:25 +0100 Subject: [PATCH 12/50] Formatting with clang-format --- include/openmc/ifp.h | 17 +- include/openmc/output.h | 89 ---- include/openmc/particle_data.h | 60 ++- include/openmc/settings.h | 2 +- src/bank.cpp | 18 +- src/eigenvalue.cpp | 18 +- src/ifp.cpp | 40 +- src/initialize.cpp | 39 +- src/output.cpp | 722 --------------------------------- src/tallies/tally.cpp | 2 +- src/tallies/tally_scoring.cpp | 10 +- 11 files changed, 115 insertions(+), 902 deletions(-) delete mode 100644 include/openmc/output.h delete mode 100644 src/output.cpp diff --git a/include/openmc/ifp.h b/include/openmc/ifp.h index 879ab4c4e38..4a455f49011 100644 --- a/include/openmc/ifp.h +++ b/include/openmc/ifp.h @@ -25,7 +25,8 @@ bool is_generation_time_or_both(); //! \param[in,out] lifetimes List of lifetimes //! \param[in] n Dimension to resize vectors template -void resize_ifp_data(vector& delayed_groups, vector& ancestors, vector& lifetimes, int64_t n) +void resize_ifp_data(vector& delayed_groups, vector& ancestors, + vector& lifetimes, int64_t n) { if (is_beta_effective_or_both()) { delayed_groups.resize(n); @@ -88,8 +89,8 @@ void resize_simulation_ifp_banks(); //! \param[in,out] delayed_groups Delayed group numbers //! \param[in,out] ancestors List of Ancestor nuclides //! \param[in,out] lifetimes Lifetimes lists -void copy_ifp_data_from_fission_banks( - int i_bank, vector& delayed_groups, vector& ancestors, vector& lifetimes); +void copy_ifp_data_from_fission_banks(int i_bank, vector& delayed_groups, + vector& ancestors, vector& lifetimes); #ifdef OPENMC_MPI @@ -189,18 +190,16 @@ void copy_complete_ifp_data_to_source_banks( //! \param[in,out] delayed_groups List of delayed group numbers lists //! \param[in,out] ancestors List of event nuclide lists //! \param[in,out] lifetimes List of delayed group numbers lists -void allocate_temporary_vector_ifp( - vector>& delayed_groups, vector>& ancestors, - vector>& lifetimes); +void allocate_temporary_vector_ifp(vector>& delayed_groups, + vector>& ancestors, vector>& lifetimes); //! Copy local IFP data to IFP fission banks. //! //! \param[in] delayed_groups_ptr Pointer to delayed group numbers //! \param[in] ancestors_ptr Pointer to delayed group numbers //! \param[in] lifetimes_ptr Pointer to lifetimes -void copy_ifp_data_to_fission_banks( - const vector* delayed_groups_ptr, const vector* ancestors_ptr, - const vector* lifetimes_ptr); +void copy_ifp_data_to_fission_banks(const vector* delayed_groups_ptr, + const vector* ancestors_ptr, const vector* lifetimes_ptr); } // namespace openmc diff --git a/include/openmc/output.h b/include/openmc/output.h deleted file mode 100644 index 940ea78ceb9..00000000000 --- a/include/openmc/output.h +++ /dev/null @@ -1,89 +0,0 @@ -//! \file output.h -//! Functions for ASCII output. - -#ifndef OPENMC_OUTPUT_H -#define OPENMC_OUTPUT_H - -#include - -#include "openmc/particle.h" - -namespace openmc { - -//! \brief Display the main title banner as well as information about the -//! program developers, version, and date/time which the problem was run. -void title(); - -//! Display a header block. -// -//! \param msg The main text of the header -//! \param level The lowest verbosity level at which this header is printed -void header(const char* msg, int level); - -//! Retrieve a time stamp. -// -//! \return current time stamp (format: "yyyy-mm-dd hh:mm:ss") -std::string time_stamp(); - -//! Display the attributes of a particle. -void print_particle(Particle& p); - -//! Display plot information. -void print_plot(); - -//! Display information regarding cell overlap checking. -void print_overlap_check(); - -//! Display information about command line usage of OpenMC -void print_usage(); - -//! Display current version and copright/license information -void print_version(); - -//! Display compile flags employed, etc -void print_build_info(); - -//! Display header listing what physical values will displayed -void print_columns(); - -//! Display information about a generation of neutrons -void print_generation(); - -//! Display time elapsed for various stages of a run -void print_runtime(); - -//! Display results for global tallies including k-effective estimators -void print_results(); - -void write_tallies(); - -void show_time(const char* label, double secs, int indent_level = 0); - -} // namespace openmc -#endif // OPENMC_OUTPUT_H - -////////////////////////////////////// -// Custom formatters -////////////////////////////////////// -namespace fmt { - -template -struct formatter> { - template - constexpr auto parse(ParseContext& ctx) - { - return ctx.begin(); - } - - template -#if FMT_VERSION >= 110000 // Version 11.0.0 and above - auto format(const std::array& arr, FormatContext& ctx) const { -#else // For versions below 11.0.0 - auto format(const std::array& arr, FormatContext& ctx) - { -#endif - return format_to(ctx.out(), "({}, {})", arr[0], arr[1]); -} -}; // namespace fmt - -} // namespace fmt diff --git a/include/openmc/particle_data.h b/include/openmc/particle_data.h index 3b091f8631c..9fe941ce6e5 100644 --- a/include/openmc/particle_data.h +++ b/include/openmc/particle_data.h @@ -395,25 +395,61 @@ class GeometryState { #ifdef OPENMC_DAGMC_ENABLED // DagMC state variables - moab::DagMC::RayHistory& history() { return history_; } - Direction& last_dir() { return last_dir_; } + moab::DagMC::RayHistory& history() + { + return history_; + } + Direction& last_dir() + { + return last_dir_; + } #endif // material of current and last cell - int& material() { return material_; } - const int& material() const { return material_; } - int& material_last() { return material_last_; } - const int& material_last() const { return material_last_; } + int& material() + { + return material_; + } + const int& material() const + { + return material_; + } + int& material_last() + { + return material_last_; + } + const int& material_last() const + { + return material_last_; + } // temperature of current and last cell - double& sqrtkT() { return sqrtkT_; } - const double& sqrtkT() const { return sqrtkT_; } - double& sqrtkT_last() { return sqrtkT_last_; } + double& sqrtkT() + { + return sqrtkT_; + } + const double& sqrtkT() const + { + return sqrtkT_; + } + double& sqrtkT_last() + { + return sqrtkT_last_; + } // density multiplier of the current and last cell - double& density_mult() { return density_mult_; } - const double& density_mult() const { return density_mult_; } - double& density_mult_last() { return density_mult_last_; } + double& density_mult() + { + return density_mult_; + } + const double& density_mult() const + { + return density_mult_; + } + double& density_mult_last() + { + return density_mult_last_; + } private: int64_t id_ {-1}; //!< Unique ID diff --git a/include/openmc/settings.h b/include/openmc/settings.h index 77e79c14f9b..4cbd1dfea35 100644 --- a/include/openmc/settings.h +++ b/include/openmc/settings.h @@ -71,7 +71,7 @@ extern "C" bool entropy_on; //!< calculate Shannon entropy? extern "C" bool event_based; //!< use event-based mode (instead of history-based) extern bool ifp_on; //!< Use IFP for kinetics parameters? -extern bool ifp_beta_nuclide; //!< Use IFP for beta calculation by nuclide? +extern bool ifp_beta_nuclide; //!< Use IFP for beta calculation by nuclide? extern bool legendre_to_tabular; //!< convert Legendre distributions to tabular? extern bool material_cell_offsets; //!< create material cells offsets? extern "C" bool output_summary; //!< write summary.h5? diff --git a/src/bank.cpp b/src/bank.cpp index 356e8b2acba..c495be353eb 100644 --- a/src/bank.cpp +++ b/src/bank.cpp @@ -111,10 +111,8 @@ void sort_fission_bank() } if (settings::ifp_on) { - allocate_temporary_vector_ifp( - sorted_ifp_delayed_group_bank, - sorted_ifp_ancestor_nuclide_bank, - sorted_ifp_lifetime_bank); + allocate_temporary_vector_ifp(sorted_ifp_delayed_group_bank, + sorted_ifp_ancestor_nuclide_bank, sorted_ifp_lifetime_bank); } // Use parent and progeny indices to sort fission bank @@ -128,10 +126,8 @@ void sort_fission_bank() } sorted_bank[idx] = site; if (settings::ifp_on) { - copy_ifp_data_from_fission_banks( - i, sorted_ifp_delayed_group_bank[idx], - sorted_ifp_ancestor_nuclide_bank[idx], - sorted_ifp_lifetime_bank[idx]); + copy_ifp_data_from_fission_banks(i, sorted_ifp_delayed_group_bank[idx], + sorted_ifp_ancestor_nuclide_bank[idx], sorted_ifp_lifetime_bank[idx]); } } @@ -139,10 +135,8 @@ void sort_fission_bank() std::copy(sorted_bank, sorted_bank + simulation::fission_bank.size(), simulation::fission_bank.data()); if (settings::ifp_on) { - copy_ifp_data_to_fission_banks( - sorted_ifp_delayed_group_bank.data(), - sorted_ifp_ancestor_nuclide_bank.data(), - sorted_ifp_lifetime_bank.data()); + copy_ifp_data_to_fission_banks(sorted_ifp_delayed_group_bank.data(), + sorted_ifp_ancestor_nuclide_bank.data(), sorted_ifp_lifetime_bank.data()); } } diff --git a/src/eigenvalue.cpp b/src/eigenvalue.cpp index 77a459f2e85..31b0c7afd40 100644 --- a/src/eigenvalue.cpp +++ b/src/eigenvalue.cpp @@ -140,8 +140,8 @@ void synchronize_bank() vector> temp_ancestors; vector> temp_lifetimes; if (settings::ifp_on) { - resize_ifp_data( - temp_delayed_groups, temp_ancestors, temp_lifetimes, 3 * simulation::work_per_rank); + resize_ifp_data(temp_delayed_groups, temp_ancestors, temp_lifetimes, + 3 * simulation::work_per_rank); } // ========================================================================== @@ -169,9 +169,8 @@ void synchronize_bank() int64_t idx = std::floor(tooth) - start; temp_sites[index_temp] = simulation::fission_bank[idx]; if (settings::ifp_on) { - copy_ifp_data_from_fission_banks( - idx, temp_delayed_groups[index_temp], temp_ancestors[index_temp], - temp_lifetimes[index_temp]); + copy_ifp_data_from_fission_banks(idx, temp_delayed_groups[index_temp], + temp_ancestors[index_temp], temp_lifetimes[index_temp]); } ++index_temp; @@ -252,7 +251,7 @@ void synchronize_bank() if (settings::ifp_on) { // Send IFP data send_ifp_info(index_local, n, ifp_n_generation, neighbor, requests, - temp_delayed_groups, send_delayed_groups, temp_ancestors, + temp_delayed_groups, send_delayed_groups, temp_ancestors, send_ancestors, temp_lifetimes, send_lifetimes); } } @@ -321,7 +320,8 @@ void synchronize_bank() if (settings::ifp_on) { // Receive IFP data receive_ifp_data(index_local, n, ifp_n_generation, neighbor, requests, - recv_delayed_groups, recv_ancestors, recv_lifetimes, deserialization_info); + recv_delayed_groups, recv_ancestors, recv_lifetimes, + deserialization_info); } } else { @@ -360,8 +360,8 @@ void synchronize_bank() std::copy(temp_sites.data(), temp_sites.data() + settings::n_particles, simulation::source_bank.begin()); if (settings::ifp_on) { - copy_complete_ifp_data_to_source_banks(temp_delayed_groups, - temp_ancestors, temp_lifetimes); + copy_complete_ifp_data_to_source_banks( + temp_delayed_groups, temp_ancestors, temp_lifetimes); } #endif diff --git a/src/ifp.cpp b/src/ifp.cpp index e0345d6b76b..e2981a1f47c 100644 --- a/src/ifp.cpp +++ b/src/ifp.cpp @@ -36,11 +36,11 @@ void ifp(const Particle& p, int64_t idx) simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; simulation::ifp_fission_delayed_group_bank[idx] = _ifp(p.delayed_group(), delayed_groups); - const auto& ancestor_nuclides = + const auto& ancestor_nuclides = simulation::ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; - simulation::ifp_fission_ancestor_nuclide_bank[idx] = + simulation::ifp_fission_ancestor_nuclide_bank[idx] = _ifp(p.event_nuclide(), ancestor_nuclides); - }else{ + } else { const auto& delayed_groups = simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; simulation::ifp_fission_delayed_group_bank[idx] = @@ -64,9 +64,8 @@ void resize_simulation_ifp_banks() simulation::ifp_fission_lifetime_bank, 3 * simulation::work_per_rank); } -void copy_ifp_data_from_fission_banks( - int i_bank, vector& delayed_groups, vector& ancestors, - vector& lifetimes) +void copy_ifp_data_from_fission_banks(int i_bank, vector& delayed_groups, + vector& ancestors, vector& lifetimes) { if (is_beta_effective_or_both()) { delayed_groups = simulation::ifp_fission_delayed_group_bank[i_bank]; @@ -81,8 +80,7 @@ void copy_ifp_data_from_fission_banks( void broadcast_ifp_n_generation(int& n_generation, const vector>& delayed_groups, - const vector>& ancestors, - const vector>& lifetimes) + const vector>& ancestors, const vector>& lifetimes) { if (mpi::rank == 0) { if (is_beta_effective_or_both()) { @@ -135,7 +133,8 @@ void send_ifp_info(int64_t idx, int64_t n, int n_generation, int neighbor, void receive_ifp_data(int64_t idx, int64_t n, int n_generation, int neighbor, vector& requests, vector& delayed_groups, - vector& ancestors, vector& lifetimes, vector& deserialization) + vector& ancestors, vector& lifetimes, + vector& deserialization) { // Receive delayed groups if (is_beta_effective_or_both()) { @@ -150,7 +149,7 @@ void receive_ifp_data(int64_t idx, int64_t n, int n_generation, int neighbor, MPI_Irecv(&lifetimes[n_generation * idx], n_generation * static_cast(n), MPI_DOUBLE, neighbor, neighbor, mpi::intracomm, &requests.back()); - // Is it needed also for the ancestor nuclide + // Is it needed also for the ancestor nuclide MPI_Irecv(&ancestors[n_generation * idx], n_generation * static_cast(n), MPI_INT, neighbor, neighbor, mpi::intracomm, &requests.back()); @@ -162,8 +161,7 @@ void receive_ifp_data(int64_t idx, int64_t n, int n_generation, int neighbor, void copy_partial_ifp_data_to_source_banks(int64_t idx, int n, int64_t i_bank, const vector>& delayed_groups, - const vector>& ancestors, - const vector>& lifetimes) + const vector>& ancestors, const vector>& lifetimes) { if (is_beta_effective_or_both()) { std::copy(&delayed_groups[idx], &delayed_groups[idx + n], @@ -192,8 +190,7 @@ void deserialize_ifp_info(int n_generation, delayed_groups.begin() + n_generation * i, delayed_groups.begin() + n_generation * (i + 1)); simulation::ifp_source_delayed_group_bank[i] = delayed_groups_received; - vector ancestors_received( - ancestors.begin() + n_generation * i, + vector ancestors_received(ancestors.begin() + n_generation * i, ancestors.begin() + n_generation * (i + 1)); simulation::ifp_source_ancestor_nuclide_bank[i] = ancestors_received; } @@ -210,15 +207,13 @@ void deserialize_ifp_info(int n_generation, void copy_complete_ifp_data_to_source_banks( const vector>& delayed_groups, - const vector>& ancestors, - const vector>& lifetimes) + const vector>& ancestors, const vector>& lifetimes) { if (is_beta_effective_or_both()) { std::copy(delayed_groups.data(), delayed_groups.data() + settings::n_particles, simulation::ifp_source_delayed_group_bank.begin()); - std::copy(ancestors.data(), - ancestors.data() + settings::n_particles, + std::copy(ancestors.data(), ancestors.data() + settings::n_particles, simulation::ifp_source_ancestor_nuclide_bank.begin()); } if (is_generation_time_or_both()) { @@ -227,10 +222,8 @@ void copy_complete_ifp_data_to_source_banks( } } -void allocate_temporary_vector_ifp( - vector>& delayed_groups, - vector>& ancestors, - vector>& lifetimes) +void allocate_temporary_vector_ifp(vector>& delayed_groups, + vector>& ancestors, vector>& lifetimes) { if (is_beta_effective_or_both()) { delayed_groups.resize(simulation::fission_bank.size()); @@ -248,8 +241,7 @@ void copy_ifp_data_to_fission_banks(const vector* const delayed_groups_ptr, std::copy(delayed_groups_ptr, delayed_groups_ptr + simulation::fission_bank.size(), simulation::ifp_fission_delayed_group_bank.data()); - std::copy(ancestors_ptr, - ancestors_ptr + simulation::fission_bank.size(), + std::copy(ancestors_ptr, ancestors_ptr + simulation::fission_bank.size(), simulation::ifp_fission_ancestor_nuclide_bank.data()); } if (is_generation_time_or_both()) { diff --git a/src/initialize.cpp b/src/initialize.cpp index 77c5126e0ed..1e91c3792df 100644 --- a/src/initialize.cpp +++ b/src/initialize.cpp @@ -176,37 +176,38 @@ void initialize_mpi(MPI_Comm intracomm) int blocks[] {3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; MPI_Datatype types[] {MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, - MPI_DOUBLE, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_LONG, MPI_LONG}; + MPI_DOUBLE, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_LONG, + MPI_LONG}; MPI_Type_create_struct(12, blocks, disp, types, &mpi::source_site); MPI_Type_commit(&mpi::source_site); CollisionTrackSite bc; MPI_Aint dispc[16]; - MPI_Get_address(&bc.r, &dispc[0]); // double - MPI_Get_address(&bc.u, &dispc[1]); // double - MPI_Get_address(&bc.E, &dispc[2]); // double - MPI_Get_address(&bc.dE, &dispc[3]); // double - MPI_Get_address(&bc.time, &dispc[4]); // double - MPI_Get_address(&bc.wgt, &dispc[5]); // double - MPI_Get_address(&bc.event_mt, &dispc[6]); // int - MPI_Get_address(&bc.delayed_group, &dispc[7]); // int + MPI_Get_address(&bc.r, &dispc[0]); // double + MPI_Get_address(&bc.u, &dispc[1]); // double + MPI_Get_address(&bc.E, &dispc[2]); // double + MPI_Get_address(&bc.dE, &dispc[3]); // double + MPI_Get_address(&bc.time, &dispc[4]); // double + MPI_Get_address(&bc.wgt, &dispc[5]); // double + MPI_Get_address(&bc.event_mt, &dispc[6]); // int + MPI_Get_address(&bc.delayed_group, &dispc[7]); // int MPI_Get_address(&bc.ancestor_nuclide, &dispc[8]); // int - MPI_Get_address(&bc.cell_id, &dispc[9]); // int - MPI_Get_address(&bc.nuclide_id, &dispc[10]); // int - MPI_Get_address(&bc.material_id, &dispc[11]); // int - MPI_Get_address(&bc.universe_id, &dispc[12]); // int - MPI_Get_address(&bc.n_collision, &dispc[13]); // int - MPI_Get_address(&bc.particle, &dispc[14]); // int - MPI_Get_address(&bc.parent_id, &dispc[15]); // int64_t - MPI_Get_address(&bc.progeny_id, &dispc[16]); // int64_t + MPI_Get_address(&bc.cell_id, &dispc[9]); // int + MPI_Get_address(&bc.nuclide_id, &dispc[10]); // int + MPI_Get_address(&bc.material_id, &dispc[11]); // int + MPI_Get_address(&bc.universe_id, &dispc[12]); // int + MPI_Get_address(&bc.n_collision, &dispc[13]); // int + MPI_Get_address(&bc.particle, &dispc[14]); // int + MPI_Get_address(&bc.parent_id, &dispc[15]); // int64_t + MPI_Get_address(&bc.progeny_id, &dispc[16]); // int64_t for (int i = 16; i >= 0; --i) { dispc[i] -= dispc[0]; } int blocksc[] = {3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; MPI_Datatype typesc[] = {MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, - MPI_DOUBLE, MPI_DOUBLE, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, - MPI_INT, MPI_INT, MPI_INT, MPI_INT64_T, MPI_INT64_T}; + MPI_DOUBLE, MPI_DOUBLE, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, + MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT64_T, MPI_INT64_T}; MPI_Type_create_struct( 17, blocksc, dispc, typesc, &mpi::collision_track_site); diff --git a/src/output.cpp b/src/output.cpp deleted file mode 100644 index 0a14e8843d8..00000000000 --- a/src/output.cpp +++ /dev/null @@ -1,722 +0,0 @@ -#include "openmc/output.h" - -#include // for transform, max -#include // for stdout -#include // for strlen -#include // for time, localtime -#include -#include // for setw, setprecision, put_time -#include // for fixed, scientific, left -#include -#include -#include -#include // for pair - -#include -#include -#ifdef _OPENMP -#include -#endif -#include "xtensor/xview.hpp" - -#include "openmc/capi.h" -#include "openmc/cell.h" -#include "openmc/constants.h" -#include "openmc/eigenvalue.h" -#include "openmc/error.h" -#include "openmc/geometry.h" -#include "openmc/lattice.h" -#include "openmc/math_functions.h" -#include "openmc/message_passing.h" -#include "openmc/mgxs_interface.h" -#include "openmc/nuclide.h" -#include "openmc/plot.h" -#include "openmc/random_ray/flat_source_domain.h" -#include "openmc/reaction.h" -#include "openmc/settings.h" -#include "openmc/simulation.h" -#include "openmc/surface.h" -#include "openmc/tallies/derivative.h" -#include "openmc/tallies/filter.h" -#include "openmc/tallies/tally.h" -#include "openmc/tallies/tally_scoring.h" -#include "openmc/timer.h" - -namespace openmc { - -//============================================================================== - -void title() -{ - fmt::print(" %%%%%%%%%%%%%%%\n" - " %%%%%%%%%%%%%%%%%%%%%%%%\n" - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" - " %%%%%%%%%%%%%%%%%%%%%%%%\n" - " %%%%%%%%%%%%%%%%%%%%%%%%\n" - " ############### %%%%%%%%%%%%%%%%%%%%%%%%\n" - " ################## %%%%%%%%%%%%%%%%%%%%%%%\n" - " ################### %%%%%%%%%%%%%%%%%%%%%%%\n" - " #################### %%%%%%%%%%%%%%%%%%%%%%\n" - " ##################### %%%%%%%%%%%%%%%%%%%%%\n" - " ###################### %%%%%%%%%%%%%%%%%%%%\n" - " ####################### %%%%%%%%%%%%%%%%%%\n" - " ####################### %%%%%%%%%%%%%%%%%\n" - " ###################### %%%%%%%%%%%%%%%%%\n" - " #################### %%%%%%%%%%%%%%%%%\n" - " ################# %%%%%%%%%%%%%%%%%\n" - " ############### %%%%%%%%%%%%%%%%\n" - " ############ %%%%%%%%%%%%%%%\n" - " ######## %%%%%%%%%%%%%%\n" - " %%%%%%%%%%%\n\n"); - - // Write version information - fmt::print( - " | The OpenMC Monte Carlo Code\n" - " Copyright | 2011-2025 MIT, UChicago Argonne LLC, and contributors\n" - " License | https://docs.openmc.org/en/latest/license.html\n" - " Version | {}.{}.{}{}{}\n", - VERSION_MAJOR, VERSION_MINOR, VERSION_RELEASE, VERSION_DEV ? "-dev" : "", - VERSION_COMMIT_COUNT); - fmt::print(" Commit Hash | {}\n", VERSION_COMMIT_HASH); - - // Write the date and time - fmt::print(" Date/Time | {}\n", time_stamp()); - -#ifdef OPENMC_MPI - // Write number of processors - fmt::print(" MPI Processes | {}\n", mpi::n_procs); -#endif - -#ifdef _OPENMP - // Write number of OpenMP threads - fmt::print(" OpenMP Threads | {}\n", omp_get_max_threads()); -#endif - fmt::print("\n"); - std::fflush(stdout); -} - -//============================================================================== - -std::string header(const char* msg) -{ - // Determine how many times to repeat the '=' character. - int n_prefix = (63 - strlen(msg)) / 2; - int n_suffix = n_prefix; - if ((strlen(msg) % 2) == 0) - ++n_suffix; - - // Convert to uppercase. - std::string upper(msg); - std::transform(upper.begin(), upper.end(), upper.begin(), ::toupper); - - // Add ===> <=== markers. - std::stringstream out; - out << ' '; - for (int i = 0; i < n_prefix; i++) - out << '='; - out << "> " << upper << " <"; - for (int i = 0; i < n_suffix; i++) - out << '='; - - return out.str(); -} - -std::string header(const std::string& msg) -{ - return header(msg.c_str()); -} - -void header(const char* msg, int level) -{ - auto out = header(msg); - - // Print header based on verbosity level. - if (settings::verbosity >= level) { - fmt::print("\n{}\n\n", out); - std::fflush(stdout); - } -} - -//============================================================================== - -std::string time_stamp() -{ - std::stringstream ts; - std::time_t t = std::time(nullptr); // get time now - ts << std::put_time(std::localtime(&t), "%Y-%m-%d %H:%M:%S"); - return ts.str(); -} - -//============================================================================== - -void print_particle(Particle& p) -{ - // Display particle type and ID. - switch (p.type()) { - case ParticleType::neutron: - fmt::print("Neutron "); - break; - case ParticleType::photon: - fmt::print("Photon "); - break; - case ParticleType::electron: - fmt::print("Electron "); - break; - case ParticleType::positron: - fmt::print("Positron "); - break; - default: - fmt::print("Unknown Particle "); - } - fmt::print("{}\n", p.id()); - - // Display particle geometry hierarchy. - for (auto i = 0; i < p.n_coord(); i++) { - fmt::print(" Level {}\n", i); - - if (p.coord(i).cell() != C_NONE) { - const Cell& c {*model::cells[p.coord(i).cell()]}; - fmt::print(" Cell = {}\n", c.id_); - } - - if (p.coord(i).universe() != C_NONE) { - const Universe& u {*model::universes[p.coord(i).universe()]}; - fmt::print(" Universe = {}\n", u.id_); - } - - if (p.coord(i).lattice() != C_NONE) { - const Lattice& lat {*model::lattices[p.coord(i).lattice()]}; - fmt::print(" Lattice = {}\n", lat.id_); - fmt::print(" Lattice position = ({},{},{})\n", - p.coord(i).lattice_index()[0], p.coord(i).lattice_index()[1], - p.coord(i).lattice_index()[2]); - } - - fmt::print(" r = {}\n", p.coord(i).r()); - fmt::print(" u = {}\n", p.coord(i).u()); - } - - // Display miscellaneous info. - if (p.surface() != SURFACE_NONE) { - // Surfaces identifiers are >= 1, but indices are >= 0 so we need -1 - const Surface& surf {*model::surfaces[p.surface_index()]}; - fmt::print(" Surface = {}\n", (p.surface() > 0) ? surf.id_ : -surf.id_); - } - fmt::print(" Weight = {}\n", p.wgt()); - if (settings::run_CE) { - fmt::print(" Energy = {}\n", p.E()); - } else { - fmt::print(" Energy Group = {}\n", p.g()); - } - fmt::print(" Delayed Group = {}\n\n", p.delayed_group()); -} - -//============================================================================== - -void print_plot() -{ - header("PLOTTING SUMMARY", 5); - if (settings::verbosity < 5) - return; - - for (const auto& pl : model::plots) { - fmt::print("Plot ID: {}\n", pl->id()); - fmt::print("Plot file: {}\n", pl->path_plot()); - fmt::print("Universe depth: {}\n", pl->level()); - pl->print_info(); // prints type-specific plot info - fmt::print("\n"); - } -} - -//============================================================================== - -void print_overlap_check() -{ -#ifdef OPENMC_MPI - vector temp(model::overlap_check_count); - MPI_Reduce(temp.data(), model::overlap_check_count.data(), - model::overlap_check_count.size(), MPI_INT64_T, MPI_SUM, 0, mpi::intracomm); -#endif - - if (mpi::master) { - header("cell overlap check summary", 1); - fmt::print(" Cell ID No. Overlap Checks\n"); - - vector sparse_cell_ids; - for (int i = 0; i < model::cells.size(); i++) { - fmt::print( - " {:8} {:17}\n", model::cells[i]->id_, model::overlap_check_count[i]); - if (model::overlap_check_count[i] < 10) { - sparse_cell_ids.push_back(model::cells[i]->id_); - } - } - - fmt::print("\n There were {} cells with less than 10 overlap checks\n", - sparse_cell_ids.size()); - for (auto id : sparse_cell_ids) { - fmt::print(" {}", id); - } - fmt::print("\n"); - } -} - -//============================================================================== - -void print_usage() -{ - if (mpi::master) { - fmt::print( - "Usage: openmc [options] [path]\n\n" - "Options:\n" - " -c, --volume Run in stochastic volume calculation mode\n" - " -g, --geometry-debug Run with geometry debugging on\n" - " -n, --particles Number of particles per generation\n" - " -p, --plot Run in plotting mode\n" - " -r, --restart Restart a previous run from a state point\n" - " or a particle restart file\n" - " -s, --threads Number of OpenMP threads\n" - " -t, --track Write tracks for all particles (up to " - "max_tracks)\n" - " -e, --event Run using event-based parallelism\n" - " -v, --version Show version information\n" - " -h, --help Show this message\n"); - } -} - -//============================================================================== - -void print_version() -{ - if (mpi::master) { - fmt::print("OpenMC version {}.{}.{}{}{}\n", VERSION_MAJOR, VERSION_MINOR, - VERSION_RELEASE, VERSION_DEV ? "-dev" : "", VERSION_COMMIT_COUNT); - fmt::print("Commit hash: {}\n", VERSION_COMMIT_HASH); - fmt::print("Copyright (c) 2011-2025 MIT, UChicago Argonne LLC, and " - "contributors\nMIT/X license at " - "\n"); - } -} - -//============================================================================== - -void print_build_info() -{ - const std::string n("no"); - const std::string y("yes"); - - std::string mpi(n); - std::string phdf5(n); - std::string dagmc(n); - std::string libmesh(n); - std::string png(n); - std::string profiling(n); - std::string coverage(n); - std::string mcpl(n); - std::string uwuw(n); - -#ifdef PHDF5 - phdf5 = y; -#endif -#ifdef OPENMC_MPI - mpi = y; -#endif -#ifdef OPENMC_DAGMC_ENABLED - dagmc = y; -#endif -#ifdef OPENMC_LIBMESH_ENABLED - libmesh = y; -#endif -#ifdef OPENMC_MCPL - mcpl = y; -#endif -#ifdef USE_LIBPNG - png = y; -#endif -#ifdef PROFILINGBUILD - profiling = y; -#endif -#ifdef COVERAGEBUILD - coverage = y; -#endif -#ifdef OPENMC_UWUW_ENABLED - uwuw = y; -#endif - - // Wraps macro variables in quotes -#define STRINGIFY(x) STRINGIFY2(x) -#define STRINGIFY2(x) #x - - if (mpi::master) { - fmt::print("Build type: {}\n", STRINGIFY(BUILD_TYPE)); - fmt::print("Compiler ID: {} {}\n", STRINGIFY(COMPILER_ID), - STRINGIFY(COMPILER_VERSION)); - fmt::print("MPI enabled: {}\n", mpi); - fmt::print("Parallel HDF5 enabled: {}\n", phdf5); - fmt::print("PNG support: {}\n", png); - fmt::print("DAGMC support: {}\n", dagmc); - fmt::print("libMesh support: {}\n", libmesh); - fmt::print("MCPL support: {}\n", mcpl); - fmt::print("Coverage testing: {}\n", coverage); - fmt::print("Profiling flags: {}\n", profiling); - fmt::print("UWUW support: {}\n", uwuw); - } -} - -//============================================================================== - -void print_columns() -{ - if (settings::entropy_on) { - fmt::print(" Bat./Gen. k Entropy Average k \n" - " ========= ======== ======== ====================\n"); - } else { - fmt::print(" Bat./Gen. k Average k\n" - " ========= ======== ====================\n"); - } -} - -//============================================================================== - -void print_generation() -{ - // Determine overall generation index and number of active generations - int idx = overall_generation() - 1; - int n = simulation::current_batch > settings::n_inactive - ? settings::gen_per_batch * simulation::n_realizations + - simulation::current_gen - : 0; - - // write out batch/generation and generation k-effective - auto batch_and_gen = std::to_string(simulation::current_batch) + "/" + - std::to_string(simulation::current_gen); - fmt::print(" {:>9} {:8.5f}", batch_and_gen, simulation::k_generation[idx]); - - // write out entropy info - if (settings::entropy_on) { - fmt::print(" {:8.5f}", simulation::entropy[idx]); - } - - if (n > 1) { - fmt::print(" {:8.5f} +/-{:8.5f}", simulation::keff, simulation::keff_std); - } - fmt::print("\n"); - std::fflush(stdout); -} - -//============================================================================== - -void show_time(const char* label, double secs, int indent_level) -{ - int width = 33 - indent_level * 2; - fmt::print("{0:{1}} {2:<{3}} = {4:>10.4e} seconds\n", "", 2 * indent_level, - label, width, secs); -} - -void show_rate(const char* label, double particles_per_sec) -{ - fmt::print(" {:<33} = {:.6} particles/second\n", label, particles_per_sec); -} - -void print_runtime() -{ - using namespace simulation; - - // display header block - header("Timing Statistics", 6); - if (settings::verbosity < 6) - return; - - // display time elapsed for various sections - show_time("Total time for initialization", time_initialize.elapsed()); - show_time("Reading cross sections", time_read_xs.elapsed(), 1); - show_time("Total time in simulation", - time_inactive.elapsed() + time_active.elapsed()); - show_time("Time in transport only", time_transport.elapsed(), 1); - if (settings::event_based) { - show_time("Particle initialization", time_event_init.elapsed(), 2); - show_time("XS lookups", time_event_calculate_xs.elapsed(), 2); - show_time("Advancing", time_event_advance_particle.elapsed(), 2); - show_time("Surface crossings", time_event_surface_crossing.elapsed(), 2); - show_time("Collisions", time_event_collision.elapsed(), 2); - show_time("Particle death", time_event_death.elapsed(), 2); - } - if (settings::run_mode == RunMode::EIGENVALUE) { - show_time("Time in inactive batches", time_inactive.elapsed(), 1); - } - show_time("Time in active batches", time_active.elapsed(), 1); - if (settings::run_mode == RunMode::EIGENVALUE) { - show_time("Time synchronizing fission bank", time_bank.elapsed(), 1); - show_time("Sampling source sites", time_bank_sample.elapsed(), 2); - show_time("SEND/RECV source sites", time_bank_sendrecv.elapsed(), 2); - } - show_time("Time accumulating tallies", time_tallies.elapsed(), 1); - show_time("Time writing statepoints", time_statepoint.elapsed(), 1); - show_time("Total time for finalization", time_finalize.elapsed()); - show_time("Total time elapsed", time_total.elapsed()); - - // Calculate particle rate in active/inactive batches - int n_active = simulation::current_batch - settings::n_inactive; - double speed_inactive = 0.0; - double speed_active; - if (settings::restart_run) { - if (simulation::restart_batch < settings::n_inactive) { - speed_inactive = (settings::n_particles * - (settings::n_inactive - simulation::restart_batch) * - settings::gen_per_batch) / - time_inactive.elapsed(); - speed_active = - (settings::n_particles * n_active * settings::gen_per_batch) / - time_active.elapsed(); - } else { - speed_active = (settings::n_particles * - (settings::n_batches - simulation::restart_batch) * - settings::gen_per_batch) / - time_active.elapsed(); - } - } else { - if (settings::n_inactive > 0) { - speed_inactive = (settings::n_particles * settings::n_inactive * - settings::gen_per_batch) / - time_inactive.elapsed(); - } - speed_active = - (settings::n_particles * n_active * settings::gen_per_batch) / - time_active.elapsed(); - } - - // display calculation rate - if (!(settings::restart_run && - (simulation::restart_batch >= settings::n_inactive)) && - settings::n_inactive > 0) { - show_rate("Calculation Rate (inactive)", speed_inactive); - } - show_rate("Calculation Rate (active)", speed_active); -} - -//============================================================================== - -std::pair mean_stdev(const double* x, int n) -{ - double mean = x[static_cast(TallyResult::SUM)] / n; - double stdev = - n > 1 ? std::sqrt(std::max(0.0, - (x[static_cast(TallyResult::SUM_SQ)] / n - mean * mean) / - (n - 1))) - : 0.0; - return {mean, stdev}; -} - -//============================================================================== - -void print_results() -{ - // display header block for results - header("Results", 4); - if (settings::verbosity < 4) - return; - - // Calculate t-value for confidence intervals - int n = simulation::n_realizations; - double alpha, t_n1, t_n3; - if (settings::confidence_intervals) { - alpha = 1.0 - CONFIDENCE_LEVEL; - t_n1 = t_percentile(1.0 - alpha / 2.0, n - 1); - t_n3 = t_percentile(1.0 - alpha / 2.0, n - 3); - } else { - t_n1 = 1.0; - t_n3 = 1.0; - } - - // write global tallies - const auto& gt = simulation::global_tallies; - double mean, stdev; - if (n > 1) { - if (settings::run_mode == RunMode::EIGENVALUE) { - std::tie(mean, stdev) = mean_stdev(>(GlobalTally::K_COLLISION, 0), n); - fmt::print(" k-effective (Collision) = {:.5f} +/- {:.5f}\n", mean, - t_n1 * stdev); - std::tie(mean, stdev) = mean_stdev(>(GlobalTally::K_TRACKLENGTH, 0), n); - fmt::print(" k-effective (Track-length) = {:.5f} +/- {:.5f}\n", mean, - t_n1 * stdev); - std::tie(mean, stdev) = mean_stdev(>(GlobalTally::K_ABSORPTION, 0), n); - fmt::print(" k-effective (Absorption) = {:.5f} +/- {:.5f}\n", mean, - t_n1 * stdev); - if (n > 3) { - double k_combined[2]; - openmc_get_keff(k_combined); - fmt::print(" Combined k-effective = {:.5f} +/- {:.5f}\n", - k_combined[0], k_combined[1]); - } - } - std::tie(mean, stdev) = mean_stdev(>(GlobalTally::LEAKAGE, 0), n); - fmt::print( - " Leakage Fraction = {:.5f} +/- {:.5f}\n", mean, t_n1 * stdev); - } else { - if (mpi::master) - warning("Could not compute uncertainties -- only one " - "active batch simulated!"); - - if (settings::run_mode == RunMode::EIGENVALUE) { - fmt::print(" k-effective (Collision) = {:.5f}\n", - gt(GlobalTally::K_COLLISION, TallyResult::SUM) / n); - fmt::print(" k-effective (Track-length) = {:.5f}\n", - gt(GlobalTally::K_TRACKLENGTH, TallyResult::SUM) / n); - fmt::print(" k-effective (Absorption) = {:.5f}\n", - gt(GlobalTally::K_ABSORPTION, TallyResult::SUM) / n); - } - fmt::print(" Leakage Fraction = {:.5f}\n", - gt(GlobalTally::LEAKAGE, TallyResult::SUM) / n); - } - fmt::print("\n"); - std::fflush(stdout); -} - -//============================================================================== - -const std::unordered_map score_names = { - {SCORE_FLUX, "Flux"}, - {SCORE_TOTAL, "Total Reaction Rate"}, - {SCORE_SCATTER, "Scattering Rate"}, - {SCORE_NU_SCATTER, "Scattering Production Rate"}, - {SCORE_ABSORPTION, "Absorption Rate"}, - {SCORE_FISSION, "Fission Rate"}, - {SCORE_NU_FISSION, "Nu-Fission Rate"}, - {SCORE_KAPPA_FISSION, "Kappa-Fission Rate"}, - {SCORE_EVENTS, "Events"}, - {SCORE_DECAY_RATE, "Decay Rate"}, - {SCORE_DELAYED_NU_FISSION, "Delayed-Nu-Fission Rate"}, - {SCORE_PROMPT_NU_FISSION, "Prompt-Nu-Fission Rate"}, - {SCORE_INVERSE_VELOCITY, "Flux-Weighted Inverse Velocity"}, - {SCORE_FISS_Q_PROMPT, "Prompt fission power"}, - {SCORE_FISS_Q_RECOV, "Recoverable fission power"}, - {SCORE_CURRENT, "Current"}, - {SCORE_PULSE_HEIGHT, "pulse-height"}, - {SCORE_IFP_TIME_NUM, "IFP lifetime numerator"}, - {SCORE_IFP_BETA_NUM, "IFP delayed fraction numerator"}, - {SCORE_IFP_DENOM, "IFP common denominator"}, -}; - -//! Create an ASCII output file showing all tally results. - -void write_tallies() -{ - if (model::tallies.empty()) - return; - - // Set filename for tallies_out - std::string filename = fmt::format("{}tallies.out", settings::path_output); - - // Open the tallies.out file. - std::ofstream tallies_out; - tallies_out.open(filename, std::ios::out | std::ios::trunc); - - // Loop over each tally. - for (auto i_tally = 0; i_tally < model::tallies.size(); ++i_tally) { - const auto& tally {*model::tallies[i_tally]}; - - // Write header block. - std::string tally_header("TALLY " + std::to_string(tally.id_)); - if (!tally.name_.empty()) - tally_header += ": " + tally.name_; - fmt::print(tallies_out, "{}\n\n", header(tally_header)); - - if (!tally.writable_) { - fmt::print(tallies_out, " Internal\n\n"); - continue; - } - - // Calculate t-value for confidence intervals - double t_value = 1; - if (settings::confidence_intervals) { - auto alpha = 1 - CONFIDENCE_LEVEL; - t_value = t_percentile(1 - alpha * 0.5, tally.n_realizations_ - 1); - } - - // Write derivative information. - if (tally.deriv_ != C_NONE) { - const auto& deriv {model::tally_derivs[tally.deriv_]}; - switch (deriv.variable) { - case DerivativeVariable::DENSITY: - fmt::print(tallies_out, " Density derivative Material {}\n", - deriv.diff_material); - break; - case DerivativeVariable::NUCLIDE_DENSITY: - fmt::print(tallies_out, - " Nuclide density derivative Material {} Nuclide {}\n", - deriv.diff_material, data::nuclides[deriv.diff_nuclide]->name_); - break; - case DerivativeVariable::TEMPERATURE: - fmt::print(tallies_out, " Temperature derivative Material {}\n", - deriv.diff_material); - break; - default: - fatal_error(fmt::format("Differential tally dependent variable for " - "tally {} not defined in output.cpp", - tally.id_)); - } - } - - // Initialize Filter Matches Object - vector filter_matches; - // Allocate space for tally filter matches - filter_matches.resize(model::tally_filters.size()); - - // Loop over all filter bin combinations. - auto filter_iter = FilterBinIter(tally, false, &filter_matches); - auto end = FilterBinIter(tally, true, &filter_matches); - for (; filter_iter != end; ++filter_iter) { - auto filter_index = filter_iter.index_; - - // Print info about this combination of filter bins. The stride check - // prevents redundant output. - int indent = 0; - for (auto i = 0; i < tally.filters().size(); ++i) { - if (filter_index % tally.strides(i) == 0) { - auto i_filt = tally.filters(i); - const auto& filt {*model::tally_filters[i_filt]}; - auto& match {filter_matches[i_filt]}; - fmt::print(tallies_out, "{0:{1}}{2}\n", "", indent + 1, - filt.text_label(match.i_bin_)); - } - indent += 2; - } - - // Loop over all nuclide and score combinations. - int score_index = 0; - for (auto i_nuclide : tally.nuclides_) { - // Write label for this nuclide bin. - if (i_nuclide == -1) { - fmt::print(tallies_out, "{0:{1}}Total Material\n", "", indent + 1); - } else { - if (settings::run_CE) { - fmt::print(tallies_out, "{0:{1}}{2}\n", "", indent + 1, - data::nuclides[i_nuclide]->name_); - } else { - fmt::print(tallies_out, "{0:{1}}{2}\n", "", indent + 1, - data::mg.nuclides_[i_nuclide].name); - } - } - - // Write the score, mean, and uncertainty. - indent += 2; - for (auto score : tally.scores_) { - std::string score_name = - score > 0 ? reaction_name(score) : score_names.at(score); - double mean, stdev; - std::tie(mean, stdev) = - mean_stdev(&tally.results_(filter_index, score_index, 0), - tally.n_realizations_); - fmt::print(tallies_out, "{0:{1}}{2:<36} {3:.6} +/- {4:.6}\n", "", - indent + 1, score_name, mean, t_value * stdev); - score_index += 1; - } - indent -= 2; - } - } - } -} - -} // namespace openmc diff --git a/src/tallies/tally.cpp b/src/tallies/tally.cpp index 985d29c6ed4..bdf82d1713a 100644 --- a/src/tallies/tally.cpp +++ b/src/tallies/tally.cpp @@ -238,7 +238,7 @@ Tally::Tally(pugi::xml_node node) // This bool indicates if the ancestor_nuclide vector has to be filled if (nuclides_[0] > -1) { settings::ifp_beta_nuclide = true; - }else{ + } else { continue; } case SCORE_IFP_DENOM: diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index 028c790cc2c..47d6a436b1b 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -966,7 +966,8 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, if (delayed_groups[0] > 0) { score = p.wgt_last(); if (tally.delayedgroup_filter_ != C_NONE) { - auto i_dg_filt = tally.filters()[tally.delayedgroup_filter_]; + auto i_dg_filt = + tally.filters()[tally.delayedgroup_filter_]; const DelayedGroupFilter& filt { *dynamic_cast( model::tally_filters[i_dg_filt].get())}; @@ -977,12 +978,13 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, } } else { if (delayed_groups[1] > 0) { - const auto& ancestor_event_nuclide = - simulation::ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; + const auto& ancestor_event_nuclide = simulation:: + ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; if (ancestor_event_nuclide[0] == i_nuclide) { score = p.wgt_last(); if (tally.delayedgroup_filter_ != C_NONE) { - auto i_dg_filt = tally.filters()[tally.delayedgroup_filter_]; + auto i_dg_filt = + tally.filters()[tally.delayedgroup_filter_]; const DelayedGroupFilter& filt { *dynamic_cast( model::tally_filters[i_dg_filt].get())}; From 5cc6bf09bbfa565f279bfd1b703e63c439f1ad17 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Thu, 27 Nov 2025 15:26:01 +0100 Subject: [PATCH 13/50] Test clang-15 --- include/openmc/output.h | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 include/openmc/output.h diff --git a/include/openmc/output.h b/include/openmc/output.h new file mode 100644 index 00000000000..e69de29bb2d From 72be337d88beed58c7c8d82b370a1e38e797d35b Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Thu, 27 Nov 2025 15:54:41 +0100 Subject: [PATCH 14/50] Formatting wiht clang-format-15 --- include/openmc/output.h | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 include/openmc/output.h diff --git a/include/openmc/output.h b/include/openmc/output.h deleted file mode 100644 index e69de29bb2d..00000000000 From 95ec4f30bd00162d3d9ce435217f3311f9d5ad52 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Thu, 27 Nov 2025 15:58:31 +0100 Subject: [PATCH 15/50] Formatting with clang-format-15 --- include/openmc/particle_data.h | 60 +++++++--------------------------- 1 file changed, 12 insertions(+), 48 deletions(-) diff --git a/include/openmc/particle_data.h b/include/openmc/particle_data.h index 9fe941ce6e5..3b091f8631c 100644 --- a/include/openmc/particle_data.h +++ b/include/openmc/particle_data.h @@ -395,61 +395,25 @@ class GeometryState { #ifdef OPENMC_DAGMC_ENABLED // DagMC state variables - moab::DagMC::RayHistory& history() - { - return history_; - } - Direction& last_dir() - { - return last_dir_; - } + moab::DagMC::RayHistory& history() { return history_; } + Direction& last_dir() { return last_dir_; } #endif // material of current and last cell - int& material() - { - return material_; - } - const int& material() const - { - return material_; - } - int& material_last() - { - return material_last_; - } - const int& material_last() const - { - return material_last_; - } + int& material() { return material_; } + const int& material() const { return material_; } + int& material_last() { return material_last_; } + const int& material_last() const { return material_last_; } // temperature of current and last cell - double& sqrtkT() - { - return sqrtkT_; - } - const double& sqrtkT() const - { - return sqrtkT_; - } - double& sqrtkT_last() - { - return sqrtkT_last_; - } + double& sqrtkT() { return sqrtkT_; } + const double& sqrtkT() const { return sqrtkT_; } + double& sqrtkT_last() { return sqrtkT_last_; } // density multiplier of the current and last cell - double& density_mult() - { - return density_mult_; - } - const double& density_mult() const - { - return density_mult_; - } - double& density_mult_last() - { - return density_mult_last_; - } + double& density_mult() { return density_mult_; } + const double& density_mult() const { return density_mult_; } + double& density_mult_last() { return density_mult_last_; } private: int64_t id_ {-1}; //!< Unique ID From c3bbb3eff5c58eb206a8af75c4a0d01540bc0ed7 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Thu, 27 Nov 2025 15:58:53 +0100 Subject: [PATCH 16/50] Formatting with clang-format-15 --- include/openmc/particle_data.h | 60 +++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 12 deletions(-) diff --git a/include/openmc/particle_data.h b/include/openmc/particle_data.h index 3b091f8631c..9fe941ce6e5 100644 --- a/include/openmc/particle_data.h +++ b/include/openmc/particle_data.h @@ -395,25 +395,61 @@ class GeometryState { #ifdef OPENMC_DAGMC_ENABLED // DagMC state variables - moab::DagMC::RayHistory& history() { return history_; } - Direction& last_dir() { return last_dir_; } + moab::DagMC::RayHistory& history() + { + return history_; + } + Direction& last_dir() + { + return last_dir_; + } #endif // material of current and last cell - int& material() { return material_; } - const int& material() const { return material_; } - int& material_last() { return material_last_; } - const int& material_last() const { return material_last_; } + int& material() + { + return material_; + } + const int& material() const + { + return material_; + } + int& material_last() + { + return material_last_; + } + const int& material_last() const + { + return material_last_; + } // temperature of current and last cell - double& sqrtkT() { return sqrtkT_; } - const double& sqrtkT() const { return sqrtkT_; } - double& sqrtkT_last() { return sqrtkT_last_; } + double& sqrtkT() + { + return sqrtkT_; + } + const double& sqrtkT() const + { + return sqrtkT_; + } + double& sqrtkT_last() + { + return sqrtkT_last_; + } // density multiplier of the current and last cell - double& density_mult() { return density_mult_; } - const double& density_mult() const { return density_mult_; } - double& density_mult_last() { return density_mult_last_; } + double& density_mult() + { + return density_mult_; + } + const double& density_mult() const + { + return density_mult_; + } + double& density_mult_last() + { + return density_mult_last_; + } private: int64_t id_ {-1}; //!< Unique ID From 490546e3fa42577a776543b89aa9273911620f04 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Thu, 27 Nov 2025 16:03:47 +0100 Subject: [PATCH 17/50] Remove old version clang-format --- include/openmc/particle_data.h | 60 +++++++--------------------------- 1 file changed, 12 insertions(+), 48 deletions(-) diff --git a/include/openmc/particle_data.h b/include/openmc/particle_data.h index 9fe941ce6e5..3b091f8631c 100644 --- a/include/openmc/particle_data.h +++ b/include/openmc/particle_data.h @@ -395,61 +395,25 @@ class GeometryState { #ifdef OPENMC_DAGMC_ENABLED // DagMC state variables - moab::DagMC::RayHistory& history() - { - return history_; - } - Direction& last_dir() - { - return last_dir_; - } + moab::DagMC::RayHistory& history() { return history_; } + Direction& last_dir() { return last_dir_; } #endif // material of current and last cell - int& material() - { - return material_; - } - const int& material() const - { - return material_; - } - int& material_last() - { - return material_last_; - } - const int& material_last() const - { - return material_last_; - } + int& material() { return material_; } + const int& material() const { return material_; } + int& material_last() { return material_last_; } + const int& material_last() const { return material_last_; } // temperature of current and last cell - double& sqrtkT() - { - return sqrtkT_; - } - const double& sqrtkT() const - { - return sqrtkT_; - } - double& sqrtkT_last() - { - return sqrtkT_last_; - } + double& sqrtkT() { return sqrtkT_; } + const double& sqrtkT() const { return sqrtkT_; } + double& sqrtkT_last() { return sqrtkT_last_; } // density multiplier of the current and last cell - double& density_mult() - { - return density_mult_; - } - const double& density_mult() const - { - return density_mult_; - } - double& density_mult_last() - { - return density_mult_last_; - } + double& density_mult() { return density_mult_; } + const double& density_mult() const { return density_mult_; } + double& density_mult_last() { return density_mult_last_; } private: int64_t id_ {-1}; //!< Unique ID From f70e005f19bc5fe16f2fd654ca24a11670da0bc2 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Thu, 27 Nov 2025 16:07:24 +0100 Subject: [PATCH 18/50] Remove old version clang-format --- tools/dev/install-commit-hooks.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/dev/install-commit-hooks.sh b/tools/dev/install-commit-hooks.sh index 06f610da5a1..ce15b1cb707 100755 --- a/tools/dev/install-commit-hooks.sh +++ b/tools/dev/install-commit-hooks.sh @@ -1,6 +1,6 @@ #!/bin/sh -e -if ! hash git-clang-format ; then +if ! hash git-clang-format-15 ; then printf "\e[31mgit-clang-format is not installed.\e[0m Install clang-format and update your paths. " @@ -21,8 +21,8 @@ printf "\e[2;37mSetting clang format options in git config\e[0m\n" git config clangFormat.extension "cc,hh,h,cpp,hpp" git config clangFormat.style "file" -if ! grep 'git-clang-format' ${POSTCOMMIT} >/dev/null ; then - printf "\e[33mAppending git-clang-format call to ${POSTCOMMIT}\e[0m\n" +if ! grep 'git-clang-format-15' ${POSTCOMMIT} >/dev/null ; then + printf "\e[33mAppending git-clang-format-15 call to ${POSTCOMMIT}\e[0m\n" cat >> "${POSTCOMMIT}" << 'EOF' GCF="$(git rev-parse --show-toplevel)/tools/dev/post-commit.git-clang-format" test -x "${GCF}" && "${GCF}" "$@" From a30127b678ef77bd1200c6c268c21ed1acce5104 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Thu, 27 Nov 2025 16:09:41 +0100 Subject: [PATCH 19/50] Deleting test to use clang-format-15 automatically --- tools/dev/install-commit-hooks.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/dev/install-commit-hooks.sh b/tools/dev/install-commit-hooks.sh index ce15b1cb707..06f610da5a1 100755 --- a/tools/dev/install-commit-hooks.sh +++ b/tools/dev/install-commit-hooks.sh @@ -1,6 +1,6 @@ #!/bin/sh -e -if ! hash git-clang-format-15 ; then +if ! hash git-clang-format ; then printf "\e[31mgit-clang-format is not installed.\e[0m Install clang-format and update your paths. " @@ -21,8 +21,8 @@ printf "\e[2;37mSetting clang format options in git config\e[0m\n" git config clangFormat.extension "cc,hh,h,cpp,hpp" git config clangFormat.style "file" -if ! grep 'git-clang-format-15' ${POSTCOMMIT} >/dev/null ; then - printf "\e[33mAppending git-clang-format-15 call to ${POSTCOMMIT}\e[0m\n" +if ! grep 'git-clang-format' ${POSTCOMMIT} >/dev/null ; then + printf "\e[33mAppending git-clang-format call to ${POSTCOMMIT}\e[0m\n" cat >> "${POSTCOMMIT}" << 'EOF' GCF="$(git rev-parse --show-toplevel)/tools/dev/post-commit.git-clang-format" test -x "${GCF}" && "${GCF}" "$@" From 3b72509b0efff4bd2b9ec3f9615bb716608d799d Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Fri, 28 Nov 2025 11:06:12 +0100 Subject: [PATCH 20/50] Restore output.* files --- include/openmc/output.h | 89 +++++ src/output.cpp | 722 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 811 insertions(+) create mode 100644 include/openmc/output.h create mode 100644 src/output.cpp diff --git a/include/openmc/output.h b/include/openmc/output.h new file mode 100644 index 00000000000..940ea78ceb9 --- /dev/null +++ b/include/openmc/output.h @@ -0,0 +1,89 @@ +//! \file output.h +//! Functions for ASCII output. + +#ifndef OPENMC_OUTPUT_H +#define OPENMC_OUTPUT_H + +#include + +#include "openmc/particle.h" + +namespace openmc { + +//! \brief Display the main title banner as well as information about the +//! program developers, version, and date/time which the problem was run. +void title(); + +//! Display a header block. +// +//! \param msg The main text of the header +//! \param level The lowest verbosity level at which this header is printed +void header(const char* msg, int level); + +//! Retrieve a time stamp. +// +//! \return current time stamp (format: "yyyy-mm-dd hh:mm:ss") +std::string time_stamp(); + +//! Display the attributes of a particle. +void print_particle(Particle& p); + +//! Display plot information. +void print_plot(); + +//! Display information regarding cell overlap checking. +void print_overlap_check(); + +//! Display information about command line usage of OpenMC +void print_usage(); + +//! Display current version and copright/license information +void print_version(); + +//! Display compile flags employed, etc +void print_build_info(); + +//! Display header listing what physical values will displayed +void print_columns(); + +//! Display information about a generation of neutrons +void print_generation(); + +//! Display time elapsed for various stages of a run +void print_runtime(); + +//! Display results for global tallies including k-effective estimators +void print_results(); + +void write_tallies(); + +void show_time(const char* label, double secs, int indent_level = 0); + +} // namespace openmc +#endif // OPENMC_OUTPUT_H + +////////////////////////////////////// +// Custom formatters +////////////////////////////////////// +namespace fmt { + +template +struct formatter> { + template + constexpr auto parse(ParseContext& ctx) + { + return ctx.begin(); + } + + template +#if FMT_VERSION >= 110000 // Version 11.0.0 and above + auto format(const std::array& arr, FormatContext& ctx) const { +#else // For versions below 11.0.0 + auto format(const std::array& arr, FormatContext& ctx) + { +#endif + return format_to(ctx.out(), "({}, {})", arr[0], arr[1]); +} +}; // namespace fmt + +} // namespace fmt diff --git a/src/output.cpp b/src/output.cpp new file mode 100644 index 00000000000..0a14e8843d8 --- /dev/null +++ b/src/output.cpp @@ -0,0 +1,722 @@ +#include "openmc/output.h" + +#include // for transform, max +#include // for stdout +#include // for strlen +#include // for time, localtime +#include +#include // for setw, setprecision, put_time +#include // for fixed, scientific, left +#include +#include +#include +#include // for pair + +#include +#include +#ifdef _OPENMP +#include +#endif +#include "xtensor/xview.hpp" + +#include "openmc/capi.h" +#include "openmc/cell.h" +#include "openmc/constants.h" +#include "openmc/eigenvalue.h" +#include "openmc/error.h" +#include "openmc/geometry.h" +#include "openmc/lattice.h" +#include "openmc/math_functions.h" +#include "openmc/message_passing.h" +#include "openmc/mgxs_interface.h" +#include "openmc/nuclide.h" +#include "openmc/plot.h" +#include "openmc/random_ray/flat_source_domain.h" +#include "openmc/reaction.h" +#include "openmc/settings.h" +#include "openmc/simulation.h" +#include "openmc/surface.h" +#include "openmc/tallies/derivative.h" +#include "openmc/tallies/filter.h" +#include "openmc/tallies/tally.h" +#include "openmc/tallies/tally_scoring.h" +#include "openmc/timer.h" + +namespace openmc { + +//============================================================================== + +void title() +{ + fmt::print(" %%%%%%%%%%%%%%%\n" + " %%%%%%%%%%%%%%%%%%%%%%%%\n" + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" + " %%%%%%%%%%%%%%%%%%%%%%%%\n" + " %%%%%%%%%%%%%%%%%%%%%%%%\n" + " ############### %%%%%%%%%%%%%%%%%%%%%%%%\n" + " ################## %%%%%%%%%%%%%%%%%%%%%%%\n" + " ################### %%%%%%%%%%%%%%%%%%%%%%%\n" + " #################### %%%%%%%%%%%%%%%%%%%%%%\n" + " ##################### %%%%%%%%%%%%%%%%%%%%%\n" + " ###################### %%%%%%%%%%%%%%%%%%%%\n" + " ####################### %%%%%%%%%%%%%%%%%%\n" + " ####################### %%%%%%%%%%%%%%%%%\n" + " ###################### %%%%%%%%%%%%%%%%%\n" + " #################### %%%%%%%%%%%%%%%%%\n" + " ################# %%%%%%%%%%%%%%%%%\n" + " ############### %%%%%%%%%%%%%%%%\n" + " ############ %%%%%%%%%%%%%%%\n" + " ######## %%%%%%%%%%%%%%\n" + " %%%%%%%%%%%\n\n"); + + // Write version information + fmt::print( + " | The OpenMC Monte Carlo Code\n" + " Copyright | 2011-2025 MIT, UChicago Argonne LLC, and contributors\n" + " License | https://docs.openmc.org/en/latest/license.html\n" + " Version | {}.{}.{}{}{}\n", + VERSION_MAJOR, VERSION_MINOR, VERSION_RELEASE, VERSION_DEV ? "-dev" : "", + VERSION_COMMIT_COUNT); + fmt::print(" Commit Hash | {}\n", VERSION_COMMIT_HASH); + + // Write the date and time + fmt::print(" Date/Time | {}\n", time_stamp()); + +#ifdef OPENMC_MPI + // Write number of processors + fmt::print(" MPI Processes | {}\n", mpi::n_procs); +#endif + +#ifdef _OPENMP + // Write number of OpenMP threads + fmt::print(" OpenMP Threads | {}\n", omp_get_max_threads()); +#endif + fmt::print("\n"); + std::fflush(stdout); +} + +//============================================================================== + +std::string header(const char* msg) +{ + // Determine how many times to repeat the '=' character. + int n_prefix = (63 - strlen(msg)) / 2; + int n_suffix = n_prefix; + if ((strlen(msg) % 2) == 0) + ++n_suffix; + + // Convert to uppercase. + std::string upper(msg); + std::transform(upper.begin(), upper.end(), upper.begin(), ::toupper); + + // Add ===> <=== markers. + std::stringstream out; + out << ' '; + for (int i = 0; i < n_prefix; i++) + out << '='; + out << "> " << upper << " <"; + for (int i = 0; i < n_suffix; i++) + out << '='; + + return out.str(); +} + +std::string header(const std::string& msg) +{ + return header(msg.c_str()); +} + +void header(const char* msg, int level) +{ + auto out = header(msg); + + // Print header based on verbosity level. + if (settings::verbosity >= level) { + fmt::print("\n{}\n\n", out); + std::fflush(stdout); + } +} + +//============================================================================== + +std::string time_stamp() +{ + std::stringstream ts; + std::time_t t = std::time(nullptr); // get time now + ts << std::put_time(std::localtime(&t), "%Y-%m-%d %H:%M:%S"); + return ts.str(); +} + +//============================================================================== + +void print_particle(Particle& p) +{ + // Display particle type and ID. + switch (p.type()) { + case ParticleType::neutron: + fmt::print("Neutron "); + break; + case ParticleType::photon: + fmt::print("Photon "); + break; + case ParticleType::electron: + fmt::print("Electron "); + break; + case ParticleType::positron: + fmt::print("Positron "); + break; + default: + fmt::print("Unknown Particle "); + } + fmt::print("{}\n", p.id()); + + // Display particle geometry hierarchy. + for (auto i = 0; i < p.n_coord(); i++) { + fmt::print(" Level {}\n", i); + + if (p.coord(i).cell() != C_NONE) { + const Cell& c {*model::cells[p.coord(i).cell()]}; + fmt::print(" Cell = {}\n", c.id_); + } + + if (p.coord(i).universe() != C_NONE) { + const Universe& u {*model::universes[p.coord(i).universe()]}; + fmt::print(" Universe = {}\n", u.id_); + } + + if (p.coord(i).lattice() != C_NONE) { + const Lattice& lat {*model::lattices[p.coord(i).lattice()]}; + fmt::print(" Lattice = {}\n", lat.id_); + fmt::print(" Lattice position = ({},{},{})\n", + p.coord(i).lattice_index()[0], p.coord(i).lattice_index()[1], + p.coord(i).lattice_index()[2]); + } + + fmt::print(" r = {}\n", p.coord(i).r()); + fmt::print(" u = {}\n", p.coord(i).u()); + } + + // Display miscellaneous info. + if (p.surface() != SURFACE_NONE) { + // Surfaces identifiers are >= 1, but indices are >= 0 so we need -1 + const Surface& surf {*model::surfaces[p.surface_index()]}; + fmt::print(" Surface = {}\n", (p.surface() > 0) ? surf.id_ : -surf.id_); + } + fmt::print(" Weight = {}\n", p.wgt()); + if (settings::run_CE) { + fmt::print(" Energy = {}\n", p.E()); + } else { + fmt::print(" Energy Group = {}\n", p.g()); + } + fmt::print(" Delayed Group = {}\n\n", p.delayed_group()); +} + +//============================================================================== + +void print_plot() +{ + header("PLOTTING SUMMARY", 5); + if (settings::verbosity < 5) + return; + + for (const auto& pl : model::plots) { + fmt::print("Plot ID: {}\n", pl->id()); + fmt::print("Plot file: {}\n", pl->path_plot()); + fmt::print("Universe depth: {}\n", pl->level()); + pl->print_info(); // prints type-specific plot info + fmt::print("\n"); + } +} + +//============================================================================== + +void print_overlap_check() +{ +#ifdef OPENMC_MPI + vector temp(model::overlap_check_count); + MPI_Reduce(temp.data(), model::overlap_check_count.data(), + model::overlap_check_count.size(), MPI_INT64_T, MPI_SUM, 0, mpi::intracomm); +#endif + + if (mpi::master) { + header("cell overlap check summary", 1); + fmt::print(" Cell ID No. Overlap Checks\n"); + + vector sparse_cell_ids; + for (int i = 0; i < model::cells.size(); i++) { + fmt::print( + " {:8} {:17}\n", model::cells[i]->id_, model::overlap_check_count[i]); + if (model::overlap_check_count[i] < 10) { + sparse_cell_ids.push_back(model::cells[i]->id_); + } + } + + fmt::print("\n There were {} cells with less than 10 overlap checks\n", + sparse_cell_ids.size()); + for (auto id : sparse_cell_ids) { + fmt::print(" {}", id); + } + fmt::print("\n"); + } +} + +//============================================================================== + +void print_usage() +{ + if (mpi::master) { + fmt::print( + "Usage: openmc [options] [path]\n\n" + "Options:\n" + " -c, --volume Run in stochastic volume calculation mode\n" + " -g, --geometry-debug Run with geometry debugging on\n" + " -n, --particles Number of particles per generation\n" + " -p, --plot Run in plotting mode\n" + " -r, --restart Restart a previous run from a state point\n" + " or a particle restart file\n" + " -s, --threads Number of OpenMP threads\n" + " -t, --track Write tracks for all particles (up to " + "max_tracks)\n" + " -e, --event Run using event-based parallelism\n" + " -v, --version Show version information\n" + " -h, --help Show this message\n"); + } +} + +//============================================================================== + +void print_version() +{ + if (mpi::master) { + fmt::print("OpenMC version {}.{}.{}{}{}\n", VERSION_MAJOR, VERSION_MINOR, + VERSION_RELEASE, VERSION_DEV ? "-dev" : "", VERSION_COMMIT_COUNT); + fmt::print("Commit hash: {}\n", VERSION_COMMIT_HASH); + fmt::print("Copyright (c) 2011-2025 MIT, UChicago Argonne LLC, and " + "contributors\nMIT/X license at " + "\n"); + } +} + +//============================================================================== + +void print_build_info() +{ + const std::string n("no"); + const std::string y("yes"); + + std::string mpi(n); + std::string phdf5(n); + std::string dagmc(n); + std::string libmesh(n); + std::string png(n); + std::string profiling(n); + std::string coverage(n); + std::string mcpl(n); + std::string uwuw(n); + +#ifdef PHDF5 + phdf5 = y; +#endif +#ifdef OPENMC_MPI + mpi = y; +#endif +#ifdef OPENMC_DAGMC_ENABLED + dagmc = y; +#endif +#ifdef OPENMC_LIBMESH_ENABLED + libmesh = y; +#endif +#ifdef OPENMC_MCPL + mcpl = y; +#endif +#ifdef USE_LIBPNG + png = y; +#endif +#ifdef PROFILINGBUILD + profiling = y; +#endif +#ifdef COVERAGEBUILD + coverage = y; +#endif +#ifdef OPENMC_UWUW_ENABLED + uwuw = y; +#endif + + // Wraps macro variables in quotes +#define STRINGIFY(x) STRINGIFY2(x) +#define STRINGIFY2(x) #x + + if (mpi::master) { + fmt::print("Build type: {}\n", STRINGIFY(BUILD_TYPE)); + fmt::print("Compiler ID: {} {}\n", STRINGIFY(COMPILER_ID), + STRINGIFY(COMPILER_VERSION)); + fmt::print("MPI enabled: {}\n", mpi); + fmt::print("Parallel HDF5 enabled: {}\n", phdf5); + fmt::print("PNG support: {}\n", png); + fmt::print("DAGMC support: {}\n", dagmc); + fmt::print("libMesh support: {}\n", libmesh); + fmt::print("MCPL support: {}\n", mcpl); + fmt::print("Coverage testing: {}\n", coverage); + fmt::print("Profiling flags: {}\n", profiling); + fmt::print("UWUW support: {}\n", uwuw); + } +} + +//============================================================================== + +void print_columns() +{ + if (settings::entropy_on) { + fmt::print(" Bat./Gen. k Entropy Average k \n" + " ========= ======== ======== ====================\n"); + } else { + fmt::print(" Bat./Gen. k Average k\n" + " ========= ======== ====================\n"); + } +} + +//============================================================================== + +void print_generation() +{ + // Determine overall generation index and number of active generations + int idx = overall_generation() - 1; + int n = simulation::current_batch > settings::n_inactive + ? settings::gen_per_batch * simulation::n_realizations + + simulation::current_gen + : 0; + + // write out batch/generation and generation k-effective + auto batch_and_gen = std::to_string(simulation::current_batch) + "/" + + std::to_string(simulation::current_gen); + fmt::print(" {:>9} {:8.5f}", batch_and_gen, simulation::k_generation[idx]); + + // write out entropy info + if (settings::entropy_on) { + fmt::print(" {:8.5f}", simulation::entropy[idx]); + } + + if (n > 1) { + fmt::print(" {:8.5f} +/-{:8.5f}", simulation::keff, simulation::keff_std); + } + fmt::print("\n"); + std::fflush(stdout); +} + +//============================================================================== + +void show_time(const char* label, double secs, int indent_level) +{ + int width = 33 - indent_level * 2; + fmt::print("{0:{1}} {2:<{3}} = {4:>10.4e} seconds\n", "", 2 * indent_level, + label, width, secs); +} + +void show_rate(const char* label, double particles_per_sec) +{ + fmt::print(" {:<33} = {:.6} particles/second\n", label, particles_per_sec); +} + +void print_runtime() +{ + using namespace simulation; + + // display header block + header("Timing Statistics", 6); + if (settings::verbosity < 6) + return; + + // display time elapsed for various sections + show_time("Total time for initialization", time_initialize.elapsed()); + show_time("Reading cross sections", time_read_xs.elapsed(), 1); + show_time("Total time in simulation", + time_inactive.elapsed() + time_active.elapsed()); + show_time("Time in transport only", time_transport.elapsed(), 1); + if (settings::event_based) { + show_time("Particle initialization", time_event_init.elapsed(), 2); + show_time("XS lookups", time_event_calculate_xs.elapsed(), 2); + show_time("Advancing", time_event_advance_particle.elapsed(), 2); + show_time("Surface crossings", time_event_surface_crossing.elapsed(), 2); + show_time("Collisions", time_event_collision.elapsed(), 2); + show_time("Particle death", time_event_death.elapsed(), 2); + } + if (settings::run_mode == RunMode::EIGENVALUE) { + show_time("Time in inactive batches", time_inactive.elapsed(), 1); + } + show_time("Time in active batches", time_active.elapsed(), 1); + if (settings::run_mode == RunMode::EIGENVALUE) { + show_time("Time synchronizing fission bank", time_bank.elapsed(), 1); + show_time("Sampling source sites", time_bank_sample.elapsed(), 2); + show_time("SEND/RECV source sites", time_bank_sendrecv.elapsed(), 2); + } + show_time("Time accumulating tallies", time_tallies.elapsed(), 1); + show_time("Time writing statepoints", time_statepoint.elapsed(), 1); + show_time("Total time for finalization", time_finalize.elapsed()); + show_time("Total time elapsed", time_total.elapsed()); + + // Calculate particle rate in active/inactive batches + int n_active = simulation::current_batch - settings::n_inactive; + double speed_inactive = 0.0; + double speed_active; + if (settings::restart_run) { + if (simulation::restart_batch < settings::n_inactive) { + speed_inactive = (settings::n_particles * + (settings::n_inactive - simulation::restart_batch) * + settings::gen_per_batch) / + time_inactive.elapsed(); + speed_active = + (settings::n_particles * n_active * settings::gen_per_batch) / + time_active.elapsed(); + } else { + speed_active = (settings::n_particles * + (settings::n_batches - simulation::restart_batch) * + settings::gen_per_batch) / + time_active.elapsed(); + } + } else { + if (settings::n_inactive > 0) { + speed_inactive = (settings::n_particles * settings::n_inactive * + settings::gen_per_batch) / + time_inactive.elapsed(); + } + speed_active = + (settings::n_particles * n_active * settings::gen_per_batch) / + time_active.elapsed(); + } + + // display calculation rate + if (!(settings::restart_run && + (simulation::restart_batch >= settings::n_inactive)) && + settings::n_inactive > 0) { + show_rate("Calculation Rate (inactive)", speed_inactive); + } + show_rate("Calculation Rate (active)", speed_active); +} + +//============================================================================== + +std::pair mean_stdev(const double* x, int n) +{ + double mean = x[static_cast(TallyResult::SUM)] / n; + double stdev = + n > 1 ? std::sqrt(std::max(0.0, + (x[static_cast(TallyResult::SUM_SQ)] / n - mean * mean) / + (n - 1))) + : 0.0; + return {mean, stdev}; +} + +//============================================================================== + +void print_results() +{ + // display header block for results + header("Results", 4); + if (settings::verbosity < 4) + return; + + // Calculate t-value for confidence intervals + int n = simulation::n_realizations; + double alpha, t_n1, t_n3; + if (settings::confidence_intervals) { + alpha = 1.0 - CONFIDENCE_LEVEL; + t_n1 = t_percentile(1.0 - alpha / 2.0, n - 1); + t_n3 = t_percentile(1.0 - alpha / 2.0, n - 3); + } else { + t_n1 = 1.0; + t_n3 = 1.0; + } + + // write global tallies + const auto& gt = simulation::global_tallies; + double mean, stdev; + if (n > 1) { + if (settings::run_mode == RunMode::EIGENVALUE) { + std::tie(mean, stdev) = mean_stdev(>(GlobalTally::K_COLLISION, 0), n); + fmt::print(" k-effective (Collision) = {:.5f} +/- {:.5f}\n", mean, + t_n1 * stdev); + std::tie(mean, stdev) = mean_stdev(>(GlobalTally::K_TRACKLENGTH, 0), n); + fmt::print(" k-effective (Track-length) = {:.5f} +/- {:.5f}\n", mean, + t_n1 * stdev); + std::tie(mean, stdev) = mean_stdev(>(GlobalTally::K_ABSORPTION, 0), n); + fmt::print(" k-effective (Absorption) = {:.5f} +/- {:.5f}\n", mean, + t_n1 * stdev); + if (n > 3) { + double k_combined[2]; + openmc_get_keff(k_combined); + fmt::print(" Combined k-effective = {:.5f} +/- {:.5f}\n", + k_combined[0], k_combined[1]); + } + } + std::tie(mean, stdev) = mean_stdev(>(GlobalTally::LEAKAGE, 0), n); + fmt::print( + " Leakage Fraction = {:.5f} +/- {:.5f}\n", mean, t_n1 * stdev); + } else { + if (mpi::master) + warning("Could not compute uncertainties -- only one " + "active batch simulated!"); + + if (settings::run_mode == RunMode::EIGENVALUE) { + fmt::print(" k-effective (Collision) = {:.5f}\n", + gt(GlobalTally::K_COLLISION, TallyResult::SUM) / n); + fmt::print(" k-effective (Track-length) = {:.5f}\n", + gt(GlobalTally::K_TRACKLENGTH, TallyResult::SUM) / n); + fmt::print(" k-effective (Absorption) = {:.5f}\n", + gt(GlobalTally::K_ABSORPTION, TallyResult::SUM) / n); + } + fmt::print(" Leakage Fraction = {:.5f}\n", + gt(GlobalTally::LEAKAGE, TallyResult::SUM) / n); + } + fmt::print("\n"); + std::fflush(stdout); +} + +//============================================================================== + +const std::unordered_map score_names = { + {SCORE_FLUX, "Flux"}, + {SCORE_TOTAL, "Total Reaction Rate"}, + {SCORE_SCATTER, "Scattering Rate"}, + {SCORE_NU_SCATTER, "Scattering Production Rate"}, + {SCORE_ABSORPTION, "Absorption Rate"}, + {SCORE_FISSION, "Fission Rate"}, + {SCORE_NU_FISSION, "Nu-Fission Rate"}, + {SCORE_KAPPA_FISSION, "Kappa-Fission Rate"}, + {SCORE_EVENTS, "Events"}, + {SCORE_DECAY_RATE, "Decay Rate"}, + {SCORE_DELAYED_NU_FISSION, "Delayed-Nu-Fission Rate"}, + {SCORE_PROMPT_NU_FISSION, "Prompt-Nu-Fission Rate"}, + {SCORE_INVERSE_VELOCITY, "Flux-Weighted Inverse Velocity"}, + {SCORE_FISS_Q_PROMPT, "Prompt fission power"}, + {SCORE_FISS_Q_RECOV, "Recoverable fission power"}, + {SCORE_CURRENT, "Current"}, + {SCORE_PULSE_HEIGHT, "pulse-height"}, + {SCORE_IFP_TIME_NUM, "IFP lifetime numerator"}, + {SCORE_IFP_BETA_NUM, "IFP delayed fraction numerator"}, + {SCORE_IFP_DENOM, "IFP common denominator"}, +}; + +//! Create an ASCII output file showing all tally results. + +void write_tallies() +{ + if (model::tallies.empty()) + return; + + // Set filename for tallies_out + std::string filename = fmt::format("{}tallies.out", settings::path_output); + + // Open the tallies.out file. + std::ofstream tallies_out; + tallies_out.open(filename, std::ios::out | std::ios::trunc); + + // Loop over each tally. + for (auto i_tally = 0; i_tally < model::tallies.size(); ++i_tally) { + const auto& tally {*model::tallies[i_tally]}; + + // Write header block. + std::string tally_header("TALLY " + std::to_string(tally.id_)); + if (!tally.name_.empty()) + tally_header += ": " + tally.name_; + fmt::print(tallies_out, "{}\n\n", header(tally_header)); + + if (!tally.writable_) { + fmt::print(tallies_out, " Internal\n\n"); + continue; + } + + // Calculate t-value for confidence intervals + double t_value = 1; + if (settings::confidence_intervals) { + auto alpha = 1 - CONFIDENCE_LEVEL; + t_value = t_percentile(1 - alpha * 0.5, tally.n_realizations_ - 1); + } + + // Write derivative information. + if (tally.deriv_ != C_NONE) { + const auto& deriv {model::tally_derivs[tally.deriv_]}; + switch (deriv.variable) { + case DerivativeVariable::DENSITY: + fmt::print(tallies_out, " Density derivative Material {}\n", + deriv.diff_material); + break; + case DerivativeVariable::NUCLIDE_DENSITY: + fmt::print(tallies_out, + " Nuclide density derivative Material {} Nuclide {}\n", + deriv.diff_material, data::nuclides[deriv.diff_nuclide]->name_); + break; + case DerivativeVariable::TEMPERATURE: + fmt::print(tallies_out, " Temperature derivative Material {}\n", + deriv.diff_material); + break; + default: + fatal_error(fmt::format("Differential tally dependent variable for " + "tally {} not defined in output.cpp", + tally.id_)); + } + } + + // Initialize Filter Matches Object + vector filter_matches; + // Allocate space for tally filter matches + filter_matches.resize(model::tally_filters.size()); + + // Loop over all filter bin combinations. + auto filter_iter = FilterBinIter(tally, false, &filter_matches); + auto end = FilterBinIter(tally, true, &filter_matches); + for (; filter_iter != end; ++filter_iter) { + auto filter_index = filter_iter.index_; + + // Print info about this combination of filter bins. The stride check + // prevents redundant output. + int indent = 0; + for (auto i = 0; i < tally.filters().size(); ++i) { + if (filter_index % tally.strides(i) == 0) { + auto i_filt = tally.filters(i); + const auto& filt {*model::tally_filters[i_filt]}; + auto& match {filter_matches[i_filt]}; + fmt::print(tallies_out, "{0:{1}}{2}\n", "", indent + 1, + filt.text_label(match.i_bin_)); + } + indent += 2; + } + + // Loop over all nuclide and score combinations. + int score_index = 0; + for (auto i_nuclide : tally.nuclides_) { + // Write label for this nuclide bin. + if (i_nuclide == -1) { + fmt::print(tallies_out, "{0:{1}}Total Material\n", "", indent + 1); + } else { + if (settings::run_CE) { + fmt::print(tallies_out, "{0:{1}}{2}\n", "", indent + 1, + data::nuclides[i_nuclide]->name_); + } else { + fmt::print(tallies_out, "{0:{1}}{2}\n", "", indent + 1, + data::mg.nuclides_[i_nuclide].name); + } + } + + // Write the score, mean, and uncertainty. + indent += 2; + for (auto score : tally.scores_) { + std::string score_name = + score > 0 ? reaction_name(score) : score_names.at(score); + double mean, stdev; + std::tie(mean, stdev) = + mean_stdev(&tally.results_(filter_index, score_index, 0), + tally.n_realizations_); + fmt::print(tallies_out, "{0:{1}}{2:<36} {3:.6} +/- {4:.6}\n", "", + indent + 1, score_name, mean, t_value * stdev); + score_index += 1; + } + indent -= 2; + } + } + } +} + +} // namespace openmc From 9b4b78f44f720b0cc9ff477e1028d4448803a821 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Fri, 28 Nov 2025 11:45:54 +0100 Subject: [PATCH 21/50] Fix send_* variable in ifp.h --- include/openmc/ifp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/openmc/ifp.h b/include/openmc/ifp.h index 4a455f49011..e297f38f4e4 100644 --- a/include/openmc/ifp.h +++ b/include/openmc/ifp.h @@ -128,7 +128,7 @@ void broadcast_ifp_n_generation(int& n_generation, void send_ifp_info(int64_t idx, int64_t n, int n_generation, int neighbor, vector& requests, const vector>& delayed_groups, vector& send_delayed_groups, const vector>& ancestors, - vector& ancestors, const vector>& lifetimes, + vector& send_ancestors, const vector>& lifetimes, vector& send_lifetimes); //! Receive IFP data using MPI. From 94a9e6e26fdfc7c4c464edc79f8da8f7ea5fda2d Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Fri, 28 Nov 2025 12:05:28 +0100 Subject: [PATCH 22/50] Delete files + fix eigenvalue.cpp --- src/eigenvalue.cpp | 2 +- tests/geometry.xml | 65 ------------------ tests/model.xml | 42 ----------- .../mgxs_library_hdf5/mgxs/mgxs.xlsx | Bin 8466 -> 0 bytes .../source_mcpl_file/source.10.mcpl | Bin 36120 -> 0 bytes 5 files changed, 1 insertion(+), 108 deletions(-) delete mode 100644 tests/geometry.xml delete mode 100644 tests/model.xml delete mode 100644 tests/regression_tests/mgxs_library_hdf5/mgxs/mgxs.xlsx delete mode 100644 tests/regression_tests/source_mcpl_file/source.10.mcpl diff --git a/src/eigenvalue.cpp b/src/eigenvalue.cpp index 31b0c7afd40..4b6ffd54df5 100644 --- a/src/eigenvalue.cpp +++ b/src/eigenvalue.cpp @@ -334,7 +334,7 @@ void synchronize_bank() if (settings::ifp_on) { copy_partial_ifp_data_to_source_banks( - index_temp, n, index_local, temp_delayed_groups, temp_lifetimes); + index_temp, n, index_local, temp_delayed_groups, temp_ancestors, temp_lifetimes); } } diff --git a/tests/geometry.xml b/tests/geometry.xml deleted file mode 100644 index b5e29c3bbaa..00000000000 --- a/tests/geometry.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.0 1.0 -
0.0 0.0 0.0
- - 9 - 20 10 -19 3 11 - 8 4 -18 2 12 - 7 5 -17 6 13 - 16 14 - 15 - 29 - 40 30 -39 23 31 - 28 24 -38 22 32 - 27 25 -37 26 33 - 36 34 - 35 -
-
diff --git a/tests/model.xml b/tests/model.xml deleted file mode 100644 index bcba5e66cb6..00000000000 --- a/tests/model.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - fixed source - 2000 - 10 - - - - 0.0 1.25 2.5 3.75 5.0 - 0.0 0.3141592653589793 0.6283185307179586 0.9424777960769379 1.2566370614359172 1.5707963267948966 1.8849555921538759 2.199114857512855 2.5132741228718345 2.827433388230814 3.141592653589793 3.4557519189487724 3.7699111843077517 4.084070449666731 4.39822971502571 4.71238898038469 5.026548245743669 5.340707511102648 5.654866776461628 5.969026041820607 6.283185307179586 - -5.0 -4.0 -3.0 -2.0 -1.0 0.0 1.0 2.0 3.0 4.0 5.0 - 0.0 5.001 0.0 - - - 1 - - - 1 - flux - collision - - - diff --git a/tests/regression_tests/mgxs_library_hdf5/mgxs/mgxs.xlsx b/tests/regression_tests/mgxs_library_hdf5/mgxs/mgxs.xlsx deleted file mode 100644 index 4f1fb895c826c925c8f7d3ff5ab990e2b5aab882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8466 zcmai31zc2Lw*^s@Zjn|75Tr{&7(g6`E+t1mWGG4LMvzdXhEiHuIvhY6L4_eDq&q~q zWTbg_K>xw_z4zcZGrv3MtaaDfckR9J+@r39bCD7Y3+oEjC1X#RT#Jf)EO68byhwo; z+|ESZ!Oq^1*Vx{k$IZrCrCWudiH{I>szKAGGCqVcllY!wNJ?!tk8@xJhfTo#`szg~ zTX*+Xx^$kG%xo2JAe%gMHi7~zMA8GGeQUNhT8`PIJ1=;Ilw} zLeY+y%96!?9yxR8?zp?IW#Sra%`>_};-xp4^2g}$Nf$g=!LKNk#9nh=I(c=!o$7wd z_cpsj_@#!+)zs?$T7p;2`p`Nco$~?~7TG_SU}EQBidjQvRQHo+KEhxl)7=zy)nO*( zrS>nXbcEVNL!GTptY~k38Ia#cE7jgMwI(Ua$V!#+z94*!5{)o?%*0-n;Uv6Yp@iS8 zzY_oag8YY@cA8?W)wxxx86pyrv&8-%pAVDuYdPbj4CyxGnmr=Bn*KEm5{MxDwHZ+P zVXE2OTCjszT`5Ie^|}(?-ENBJr`B{Iu*|OA|G8Kr?Q-M$QtHqc_EW`h6nC!iwKn5e z$39~6iPTiX?drf~@{mosw|}*tk!xB5*1w|@|1b$eii?GnbQ24U0*H>AHLsI}sg3E`J3l5qtNJj< z5m8E?_2RE?=4cy&FSq?FkQ9!VE~Ci!fK^qdKr-DhYj-#zz_$Tx z*Wy7J1iJ7;)O~x6=kbrA7cpCIkA`_i2Wl#LC#G}+Sjc4fXmW}-8u7D~4a@Z{v6@A_ zQ559OWB#wMD7jI#4?LWL(ei=@mXM?4+5wig4C+l{(c%eV7riQkSI0@O%PR(w*iB`1tzOtvkIHggO z(v46+VO>DMDoDh22-{`{g~koM@4R9|lwFvvM8p3xD~g@T(h9{ia%Q zbJ5E$`CpxuE!l1!6J*WP8IqZcR6kYnFDhIW{tW?bgs zhVGi!OS0oHpDzwr_R_=&$vGrPULwX4`P8GV?o}*P5i->j)%!4Vpqryyo%TvXtKSaP z|HkLB;-j6{HK}$F3HV;5BCNwYb)(UUELMT;^*#J$RS9z@?YI(y?(VsiPzO-WI9k^mtp>FP4dyn!XC91^ zV}Yc$a#zohiIyu62~bE~Ne+7RM4kRZCLVuWTF@@?O99ywg?DBBmDb6y7r*lD5+rrf zbQMMdc1h)EXObMhJN8%~T+Wi~L2K2HWxUp+^tHY~yBOk^}<jL3>5Uj(mVHG;gynlsjuTtw4?)_Ga>aDc!4|y|9>IlyoVdUNZglN^&)>y z?311mk*54z|3)!i9`Ej~^{SteX}y&qAaC=JeXn2>a<;Hf2SxlNgF-y)COQtCtt}6V zqdA7eQX5x}EWjz7tNX(&0mTV=+@PzGN`CKUSUw!SYTLN=3GW9S#){YepwCn!ggoUg zo$ccN9mUwe`Qj?}4-&As#o{z4Fjx1UgwX=BlR!|m(m`pdBBs8aO;qt`X@|WkV>{s; zbBQR13fH#`!Ut#rmpM=t-~HFJA87B^yg^jq_i0AjHSaBccB7pU8@^cO z{YJ-TVW_9)VBw=iNyfTF97D^Ct@ImfX+dwgn`MLDJ&oR&$9_>4qO`FtVBwOheDq;( zlZ$c+{)qeS<>$p37q&FD9`VDz;BZE!dnt!Pe%LR(erPn?6E!=UZCY+y%;8F7!>lRR zWch}|Jil$iwDhAEL$?-etEB#kB$7(C`&h5AHIii4`F5G>{k;d&mVYS_z4P8m`{crrfe|*L5j5$?&iLv8#qLQXh;nS(~r|G5<9+bOD9tQWfR8lgTP*IO%dQ znIdIZ8T`su5-cIvPb1AHw6xc}usZvFuXC*(z4*p!Y?VnQc=q*ynohS7dbD%A z{p)OVtZre)x7qKWUm(Pd<2i)K5wptW+{h8XkB5?DJe#!{M#m zT{uFIZV#vOs!FvL*Nofc@cPtydRB>#XRJ1(o2QYVzV8-KR#uJ%2lpwq9BiKW@_6id zbo5Q_rJm?}A8j==`Mxm{=^h;&Z$25HWB@nRIlZQK9gRpVCJAm>t zq^fFSz20C&P3lMIPH-QSVfaz+r_F(1YB>qVK0{1>`6Rv*GY0Edf3@6k`rtkW_N{+Y zR7~80=yNq(uC#E6QJ69rw_&>NYrPI$bv0_>qJP@i$7@3UON}6U6Ur9h`|7G3 zMFiOUXv5yO(%{X z?=j>)7ZHevhaT7Qk=J_;4o=oV4%fJQUF|lvfme#Hh6K;j&QpzVzDy01t;_k7-AvTZ zaVn-R1jB@S&#Z~`0=RO!Ogx4dZj&gTXe9Ag+@khuNTOm`8YFh^ODh!b|9S&12%naq z&XZDlRiriTGs!#(8OF&~nsSgQxg4PfcTicadxrzgl~L<)C6TBGQ= zdt_d=>uIF>a`%X^hV0kQq}^*ZYi)8j%Of}Dxf^$A@sd&TVOI!wj+ReT?Gvj4eTnf* z7${IM(6322u=Gm4XW}v8F(DK(^i#|_ z>1AXeUOQOOF?&EPU5o+Y#C}FFWGSH9m?=c$Y0kXi)Ku23oMQP=!Z{hv2;gx7mzgP@ zlP{)P>VheHawy`Q%?_0deV!aDXEL4A-!^x>0^&~0HpWp2c&n;A5KkjiPMk+0gm`|+ zK9n@Z@J-=bLXfZ!S+KaVo;hw$e~3jMM2PI=pK-|@1)hW;;|E-o9`E&4+6aoZXLd;z zbrc7vc*iEhZ-!E6i#wt(XzZms;>K8D3x6x_#3QE!f}D0`IS1=PB&FprOVA}&dG+Ly z6+r?;q(AwNm=b9khW)}&#nrc&^6hN=%Iq=$O97^-=IbHIfIQ4>$}UP={6PTDq5N1^ z-T&e@yms;TZ|`xwqgD6Ef=nwLlQzB;4n#Du1YxsY0k{hUaTJly@{U+q)c|M^b3y8b zE7vtM`Cb}J;ceZ&$+g_!LtdDgJ)-7+cn?6cH|=vg!(xWuM_)rnUzc(Q!n$&^bSh_m zM?&UV`stN*bhs(4@#YiX+l$zF6mi~W(l4*7r;E`c-u?-Uf;uG|KNq`L8^r}xa1$Q(!7SZR6uxwby42`fms5^c$1a_ns4Sx!dVvIVe~Vgw4oJXCWRTq z#k>w7nvfE314abOm{DOy<0jWZheQ;2gwv6iLR18cuIcY3v?x0aL8H9-0bjn4fG>j# zwhjIaM_VO?3dPTrM6m3g@-v|Zpw;La7AA#~HsxrU-g@zbP^S)-U~d-GslWsI3a~)= zBVE!#ol9`T@n^W6jRws-y$U)H(z!VBONqG7SA z%|OZjEiZX<7@D_($n(x@g@yolAjP@qECq6nnK-siR|nQCjBwg+$DIQ~!09OIXe)dm zE&59$D1WQZ#i&Ox1JlV=a3Kfl7Q=usg;#*tXW{_z+&|x!bd-9)&R%j{7$uuz0dRbp8yeMGF%~}FboU(dElC(p%P*oSGngt% zK?7r5PQ}WQsPc577vHt}*d*|AxNEWj@Ao!`^#0@lQum+(+)JQi@y zPQC}Ns6)ObHDjPmACE*rC?IkLr1JX;SMMO6bU_;tFqN7Oc0%ApfIs;bjhQTe8>qK1 z;@&EVh`#EZ^xOER(+qcI|MxijALH#smIA%-KN<~xu^qG`!BOQAg!Xd-Sbk>s&(jRt zglHCtSp`=>vcDx{?;r}i;m<&oxL1VkU;CY+cVaq9A_#xmG=2b@=Tp}e34HOQ>5&CB zql#R$EQ;`;H8MgRXf9}k-Y!Gdz8Aa|8sv4)nC~k#Et&?6xWRN<13~ZYV}nNkEHIrCSKmd&IMej+;r9fi<)=$HLk9sN;s>&*WB1b9 z2EMD*6e!vouFr(}3ol!<@#78PW3wUXX9wQ(Y9)@9xp^TJYIlEc_8@C?Iks<2)HF;m z*>zDxJI0bK3oscWM_Xh%J7Exd>5RH0o$$BE?1JgU4I^>PZnnTKdCxIz7&rfyEwy1P2059EM!~tCVI|b}Y zza3hk6;nV3Amb<@#wAFdh;SMXWfxuG@GSjSnrf8G0VsfHCyYB47l}T z#sLrZe!%6bd7yZWJElBmc}m4B&u`nuy^*6dO72}OEPj5%z$M0tVcu%tjstL75L9fW z5QCcwVwi6|&DuL{<>6a9?(K*S_9OAvce7xKdq=5w$llu<=YHmAx*=G3=0R$%~mv>OAH8l>O}TRdsOYnUN}8u zdZkq(+-3Q+Tl@oFJCsLA09ia79dVlJ zn2PT+1WozfZM~L3It@h&{};hl=jCBU1bdR?UTdE%P}PBiAUSA_{(aT$yx~?%?wG57 zlS$)4wkcqme~cRKt_+U=C%ZSj0`$|WY(C95hb4fXvtGV804+iz0Gz1j79wZd18JSf zw`UBno%PbK!ia~fAT@BhJ$eqLR&&}hwwl3Pr`0&#dyaa-JkO|j8)HZ{@D`FJ0@Dwq zRsaO%(wnE=2MjB+06Np=J`#M|P?%0?^$#2Mw|c&9FRY^Z?1&Q+ms?hk`_L{28yjAm z#=mwJ?QiX@)KDL+w)8j1UWp=$r}M)hHk7F=vz1BiqMjGh~-5q>W3$?j9H$#p;G% zDw{(&DC{r0-W2Ona?av75DNa3LWsBUE7Ia~+cf3%Svr#W{@^DgzpPwWi0a6%|_W4ca|DVM5J zo@rEZr?>jgamlMb`W#t)qAvba6my0K$i<^?M zDaU#R#~1$nnCNv#4Sgfvatgrl1i+_}gQ>M6FAwHDIjYJQ*ng4s{rokB@AB6hF9c0D zuU_24)=noGBEJ*@Np2_}$$A<|K;tecK|aQ4DZMJ1S@A0O+7YRyrT(`M*zy&u5tdzu zyG8w6jKaaa()UJ9WJ~n9z|uT4W|ejDt2vIDIxij$CTB^G@~X+$Ju4PhetOqZUP+L6 zqqEmn;MX>xFl1g46bqwu>zhAznNsLUW7fTz073PoGi3QPw4fvV7K=@oksh!gdrvJM z;D?Wyu!cT;j64?hN0F@foZC>Lt)|Q8!^Xk_0Sg5li(xiYFwest+u2!R5<5(zN3mI& z^f1<*>5*oSf7aqF2=|MtoZbyAiDrxAHbbMxkz&_qQm);ZzKJfb=8mx~WiPH5;i%WH zH@;_+SyEflw&T`@iS*x9&t^kwJI%||!f;`qaiwdO?A}|ac)a>p5EnfV*S8#aQBejT zAKl0}P4BzsqoR7PR62MoIdOWmk%bY*qgFaLv4f>FZJU7Kko|>oO%$qXtV8ZG3777% zpKBdT4fY9}4CbXP9F^#v?Jw*QGyV8$<=5*(|AJs8w&N@(knjVy)Y4$={pe!QK)qDxXm!$s`pWShsI^e#U?&&^M9Bb)X} zCHvMpe(9ZTagC?k@5UT@BV-oPYd+|=5T`E5TWCf@l=l5Ei@w@Y|8@}zV`6$C5Y$~D zz_e$}Q{#hr}H zQn-EBQL3pHl&-dKE4EqWtZ>`l?JMh8nJ{DsPuDD;+7s%68NDFf+TOY+q*3hEGDCv! zl(qQuB#C2LC+BfXFVUki(G3#5T7w_C5IBb-744jIlSRetkD4>>%5mxM1ZYBT#o6m$ zpFv%>vDEf1QBy@OxKoS#f)sVm;uTF2+PgU&pKA=Jk?v76zyiB*&bH)WvUavkrnXK- z58Uld9StxpDvVZ9ZRR5dR%Z%h<>AtOn@#tKz`!2cM2$B8INDslcT`YyMDZ;-RiH|N z+eB@5%IkuO2(pqN$vZsdP7ql*`K4xHcD?;87Q#eehU{)-ThLQeipMS3Yk-{yH z-7{wSn;_D`F4t|*ola##CBE^ooUuqHjww2sN$+2g$>;i`{ON?W`QgsKTDtBRXe~2rWhC z{2uFm@80$NLVZHlwMo{r)*w|{JD^JI`~B6ll%X#WN$d-hIRE?pHQ<@kzh^*v|8qC{ zJo^0B@fj8i>lt?QKhb|SlF!4>@2&m~p9W6v5C6uSu#0YL##Nd-i~L=;3gGoM4) zhzbHCX<#CVg&=xa_ulV5+qL}p$K!fjul1gpv*%3heYX4fsczQRBi-K0O8vior2oIa zxc~m|{|Eg4|Dx0Lx2LbqdiU{W)+202j~HpW%xA03n9;*~{@ri$;>`|zTh=*j=mG1N zE?nQ-@XkAi>{(rce%l#=snDFXiNfuqr1oRdOG--DZwf@2 znS;;lL~^M;P;_qNTxgPYf;q+!|1<>`qXd-}eIUR_%=l(#dNWB4-w7+9A|vU<#JXit!9pKv1CllGEkUOLmzie5Q?07vF8huIOA%c&3^xvOui&fhh^U3 z;?7MvbU}42y|6unGndR0@#(M%ayDiz@u2E@ld2jM2^aNrZ2vG*de~=@Rvj1P( zca%uOmPz-RQ>s2l%@*O}^nOU?lp9G6k^QI9zdwM@8nv3(g&bpiBlIvMSgDTO51qm8 zc55)VB1JrWiv`XIdp+TQW%13^J(UHTIuT^Ljw38MqsNss#WayDZ~jE;7VN{K|MK#i z{DY92(`M*Dz?d_)H{2v|Q$CY58+(!E@4wSj)BV)*>{%KsHsy@T%j?*vbtLWAOI>MQZ$^+op=t;cHLP^DJ9U4CIDbiQ)XZ^Nb=gRusb__qIyNGT4ax#G3 z6YYIw?iAYmMQ~)Hh%=@4UEqq>8M1S42hxz6h^YN<)@RC8lyoBPpT=6f1ZA#%gl49x zu>Z^KxiOGExwVqq+~q*{COtO^v{Nv?S$!OzaA~Dwua1LI`Vuz!9>3{A6)cqVoo-6*sjh5qx;L;L$ zqea@O{F}?f|MhvNiuYh^A4t>^18})a4O;ieq^PfQCY#w<#g)Z3U8}!>(NqJpI#UVw z=AimsHoE^c;y*tUlnZyDi~euXjf?_3ELD}eUQ3RJ!<@oWGXJ|NxG!$Rzn@59aZDKd zezt%s%Oxk5i360${9PsxxBConeqM%3ZcY`oe|^FkaexSG)CaJplKD{Fo=L~d>(4gWw z$TDRtgjo*Z>b!lU7K>dn5481P;CTsV*u`ua3Z8=@^k<*3|N9L22422Gqc2VcbGK8B zZ}f8KgHz^f2sAuMK&z3Ce3waz?l-V6r}Vj;jNvt`Z`g6zyeWn39cO^+zrIKPTBo9c zefn}{ebRI?(R>EjDO>@&af4|7Y73B-+5ur(`*UVwsWX{h{}n>+Nux{QgNb=jBlYcP z%%1)>|EKZ(S%c7v8de|mg7S?`z8)s0SFS&~0^hq+~Ro@XfcBw`9keB&a{?0i#Enfnt?5n{ca?9gc3|a&kw! zCB8-?SU+$)lxGyu*M0Qa`c7$fLrc=1`DU5)5%Ewt8%(~fA$$|ycbd#pRHb)*++(lK zKEm70U(un*+F`^qf9~_)n;92E2!3G2)K$AN-)PI9CErhp(2v(A+031kj$3k;K0q?$ zP(&b?bscMucwy>+`_w+i5V{_ly|`FH!Z! zsx*3r6j{(s+PzA3a0rjs^Gle`BF zh;RC9=?TZ|60qDxbNDh;k$DU5iBgV))BnqOA00-&iEM-lqi!?4$r>;SYp;5ZPc42< zG8UE4yB(oq$q+-}n+-XO@tTM&*h{m92omyymg_7jd1wBYIWxKqXAKHrM;+dg_KAMz zx7%>~&0_aoWhr|55Ld@$96Gm!#ReU0qgR0@+J{?B9_lH z(f$R^;I-$l=%Ugpx<&0EK9V76*N_(pM5rtx`qy%a_uBs0a_TaX))95Ko1Nn7d`b5# z%c!>^o<6;Zl35kiOPmRD)|#kh`k8;41JTK7(t=?`yTh6Bjic)}(n9x>{d#TW?&`_{ zuKA^qk5y(9YCbHIL!abp9X{ci-)0i=gGqWe0go!yh%=K*~1Z@cr80UK;QSC~0 zbABQ>W(IdPkb}LpgHv)AHbm`o#!CaXw4s?Lb#-tiVyh9UU$YwQ2j0QgoF~y&hn=bR zu(>49dM#Jhq39B@SZPhBo!L)%U0Y0rvntrHt4Y+|^b?oEHygh7Ljwk>;@kV=5#Jox zI4snN@Xdv%Qp_a2gp^$PMpDyK=o6P#w72vZ zRe!OC%Q@LLgzVoAB-3~`98J1I$5m#M->a9i^Qrwg)0UeGu(>xGQey-Pb|thmcO*KR z-j^Hz$A6lHP($`y+|2~5a~R*ee_4fO_a7!5)SqbE4I-O#o6(Q#O19VhAeZBf8<<{1 z3R!L2O}=#dqka8TsB7COa?WAOKh3keQ^-N!AQ$%FVgoZ0nL5fWO}g}tXALm_Y1 z(EZ*cg?nZD5_aO1blAJ!vDiIDGPdx|l;e+3V{SJ6^Jp;Po3nv+(E4E~ z0gqEyicTQ0(?-+&4gsu!N#^bor7vNnya%cJaD@$>X^8`p^994Sa&W?Y$#__I^Cl?l zGQiYQ1v2v*=$rfcc$#87o0lEI)%ohc5-9H)O1_?-Pgu(?fr@)M9%$Mrs;&y+jJ@*^ zSh4mT+dR*l7+vcoXI>tl9_k^u&hgMc&Bk-F^s34?losv4_~!PZAEelQFsZFICn3KN zgWpF3I(@bc%+|qN4&SV(x#2Q|CHBbN zz}1;=Ix37=qpOFo^t>_Q8`quhh`~98|Lo~Yvg&2f<|~7s-D)ddJX>;2`9|<5mu}8G zNq$V6_m?qc8{mqv7#_|@CB}Z?6n(hG$hM&*(Lr*?$TvF%5mX-@O%{Jl{y)v<&@Pcn zye|GU{}tlrEZVLK9=pt-t>H9?O)`j!G^KI^&7M6#2siKWjlsN;IO}_uP_^p|=9?>T zb;+F06ma@z0ehrP$QsrgH~L>B3F{AXIls>Q!qVAGVS=w6I4ml1>g-cM8=EBBq@ zOl#{=lHI!sbeAN!$u3(P7Z?0q7vOs=PY9{$FLuJ_nt z9}Vt$-6q4yZ^g+_r!9i1VU;v{mkYFtzf!qAqc{`taw3-b9SFm=zJui%6@s)$-)X7A zL>AHM#+icJ8|eJWK=4&m5?2b;@SGJoEO_Kn()~iRZb@}P*fSs$#9}q^__?3h;&xq> zx9F3gMt&ie({^zhdAYd=R!DtestcvDO~+(fRUeLJ7iV(q+WXsptb3dZ`>M~fUdLsb zbB7*@zhO!)=S$8C66arLZ-b6v;jc0lHf|VOI&3XHqyRYLq+~AWHT6H3p5FjgBjiBo z>p}31{Di)o^TA7UjJUI0zPVT#EVNP^K`W-n5WdkJTO)X0gpAX+i%k3ux^HW4J7yeMb8SzX-{KnOeF1w%wuf3ikpPEv7FCht^-g}G7 z;hR<0&A_KVTd*x81NcVILlx9l4aVU!Ho=B1Ey!T14~_NJXYNP*xjF~R7m-IlQpq~K z?|AG5p&)DF8)%PhgQW5z&ir1eMG~8OK~iJ~I@Di=wTT^QWMB~<{bw>)pSVUDk`h0H zZJU}Ry4hOBb~1|6dJkd7eLXniFv^lFoZiX4^iD+cOrps53>7>f>oarPG?O!V-M6X5 z!EdZE_9v;diK1zqx3IhOBlc~|QqCxm3aY-hn3*Lp(qtfl9}l$(Jnv3{ev=n-rc^VS zj4H8%XfcD>|75^JP>TW`WZ3gP>i;yxUJW!!sffNS^Tm9VH7uH}tGYnGHY&j!@p<&; zXFuV`6?<{i#X($-p6NTn6ZDkKoS(_zH#$cTJtv#+piqU2oE{w{&}_tPL=uLiL2 zK+m{vMiluVlU1yp#^vzM<4jxTm3>w?DZb+`v#~${3YrW^`#wz}d2P|Jx%mtufmIMo@{g#qJGW8S)r{I42bjMa#&UjxxVBB=p42penW>d3mG$N zrac;$MlI*eo7|(wQZ)h=CG8{G8NDI$`%GkSupUcs-T>#lrhyO9XPD>z%uh?%zz1NB$gcto1SlslA?jpbr?HNY6cy^PR678?^2%tz z!S_CB=j~`Nhi{Z~oyqk#=J=W43BosZx=YB2-p|RKzF+Y87!&+;`2-TxU?j~%^nTcS4U(v*yc&G}Dh?r>M~=F)Aj&XcEJ zaE|_%W&(@%N%p7aOO2t@vl7=j*~3|gr6!?$@v(e2c(F**e~cg8V_piw$n!DJ;r{V( zfmPk&f~!FZ_@1hy&#(0v4)N`CY3=#nEPK<^!pqbKuUzEI&NR&D+Qm1gy^hkg4pV7M zmLBFCH5dZ5cT1`D92syZGsN4VHD`y75Ib(-9qTrV24$P`TG z4}z~YVO&|e&Sc?GXN(dRkCCCN14&e?0haxwPo}Rq{7wt|m5Y&>?XPQ&4t@6p6!<{yb{Wm!9#|0gRktNWk=C`TENgaPGPUG%U!7D=X<~ zG?bZFfr{HO68rNB@^d*0f@~Y6Jz(HJP5vrba#bZ0X)kjmd^1JqFvyLS6Q5jyuzzk*`N0@XS<$B3}w<`@BjG3c0fQ#$P%cUe~@u9k29(Z*K0MK%OoRgafHzqO-SOuwng<3qBu=Wr>?kaP6`V zNW{nbuLreD1EA#6J^UqbJDQ`=kEI*+{ipemctWse)Lk}JH3<0T)DA^qf4#NTH_HPH zO@h(K?{`IqWipx18xt<4%=Z(Gc|zgonriyiLz~U&=&7Ig8oVQL^goTcPZGL#>I!5G zI6(MjW5p--Bk>fZ8OVvTjtL%~Z!A31`zjl8d={58V#!C=wk8=`D`dpivK3JLutK~6 zuVYoWBnHgi;wLfnAlF?4%jZOb$EA~$g|EX)dXMLFRNO1rsn3c+8@I#oG+;7a`LdEu z%|FHhKG|?4Vp=OHe)$xCo>2rzb+u?$brK0NX+*U(`#JM$^ip#Eqa)FnPGDy2B$U6b z0?Ca(Obj(8-{oM}X!4}!2&_943%l}~+1BV#k=b`+_$qkG-RpO6KSEA<27zaAJ_Lqu zqgReg^nUCQ{TtIuXQIxYh$Y7fC8HEE*zWHg#`YUW=#`c`qoaN`N^8nXxbKCmDI!=>o1 zZ|Rs{pQ+93L3(}&e2%-1_RP-~S&aKkt3%RBxlz&TIMsJyBSO`KClqmIT+{g6kSPm}R~^er;+)OHHCdGf#3BXFE9? zNEsq^x0^+{WCMLX{XH(~bOEK{iCkHoGGdrf=TAz-4#Y}TOIT1CfzW;faJ?gLTH}hWo3O)AQs=YTo}iLpN#?60fScZFXg+cb#ZPc1!HJT+ zC*QQ652cldonS)TP~e+u8S|mVz6ie`>kLQh6ovn_*|6@=%XI$?$=)G;A`P&+nP^}^n{gK&sv0cr_p#HNNj{%OuTVDx^S zEOhSlXM8hri8t(-Pzoi`(?ffJd=tx?vx_>H_!ZK+y&XtU_GnT!U2<;2H?yq2(#N+Jif%8IWqecYncL)91kdhg;{R?1!|ySVQ2zS0PE!+XN!E4A8oSlMi3};!Aua12;lr>B;!-vpJvl!G zeoIf{>bz`ZKN9w88f-9V$IGwIp{>IY(&DzytnRmDA4diqB%4d1BADqwV5hHQ8E5BNqi;R&(5kxIgEJ;2Cn6`eFQ9QH^(z;Y_RxcZm| zDGRm7`4Y7Iw5Z*;nppDGca6+ zoHN)Xa&c=f;G4Jq`N5-Oo5=TP4&+jcBGXuXvEa*cSy)jc&y^J$IT%c~>Jk(8*`)6L zYqUQ&l5}r*f@gl{&6(z1IrxClC(^qvg7|ISDhN~-vp?%|$>t#=IU|!c2W^`=1k2wL zke^Eou))>{6rdf>HkE2|=FEkDY>(Si{9fIjOn0nBhnz*!ESq6> zmw08GW6P|-eCMe*(NM2m;9}MPpJtfq2~nhKAwHfXMfhgN(Kk4Lz6JZ>uP2tfd_}N# z0=6Mb}A(L-BFZi?hX&$NzSPGW?;i_I`7n7I^yf1 zzl_x#Ut(XZ3Qg_T$cn8u#g>@ z?k!$_&dx*daW^@dD8)9+ZKuyZ#0e%%-p6M5n#Z+kd%_y5b-xVf+oVI^arMkU%!>|M zdxI5wNuKjeQ#}Yr?8dMe?uz31^Sh~`-ZLzcJB>%5w&rq*AD7UYo^$Z0JHIkZGiRs1 zEyk=*r8k_Mqx4VH^-LEAt}7MX*(UXuIk!HZg&*xjGxF5o*W^?E zLGD=ww7pGdgD)KvwXqIIr)87Cb*c#C+<{zK=J$HeK&8B3+Zr*u?DkCb*e0A-BgRUF zX8$x{?-mi8QNO6c>P47uhE2(aihWVAbhaC$+PxKa9UY6_Ke)(##9DAUd?OW~L%s?> zAdPD?G2fi8xIxCn#Ix0M*J1q2eEM#qI<2f&!=5xr_Go;w8+Oq_E|#G3`vm5j51T%- zF*nt~etUJ#9Nr)QIZ}cIai(O*BFS^Yd_xUtMKVKF@sGa!#C-F6?jV@Z*&kLHJOR&7 zPq6c;Sn8vy3HO@}xOP4F>RCG{9%Jzvtso{O6<)Z$`_&Cdw9^2YrUB$yL?mh2Z;s=N zo-hkt$sETwSMo}+8qr6Efl7pLe4VnO{LNr^ku!_bcaMNUkCbta^&=WKX*hRJ)5!iN zyt-lq*VK;^W6L-A$&y1z_<12t)0NB@V@rO6x2Zg7dwz}#xGf<4MpZb4*UON|r;;(8 zZ*FGx^!GJ`Nm$WT#y24eN8v{EjGnRfE4$^WNx!-@vyJ~nF|R<$e9AYU!qUX28kP&% z<3IdminkvI#V$|K3g`_V{AGocEjFT^hsQA649PlyZ|)y=L)W$&fW1#A;+yL}*0BAT zF3c}?g}3QN@HO%sI{nC!?RAk{Q(D8`(` zaYj1A0m;@RIA#@E@1uviw_`l3QgXKQyY&JcwnrPpSB}B`8H4b=olD8>Uk`A5v_03y z%tm#=D-SKm^FIqGkTT3^m1SOcBjJ3vWM9BHrLyJFaz>N+<=w)3Gxuo+6fe+&6J|N^ z+`$qxJKtn!m-~@~TZ_1|rlm0QRe2R&W>t^3CWpek`MHAnat9`TMlu(SodTFD9VUsR z?_+CIA=SP*n7PO+LQeg7E=OsQGOG&~Rngi7mF!s5GVFH6lFQ+nss#_(yvrxh&N-=!Z{Dmsfqy*@C;R5^1W*5m zbYe{es6I=DhW{j=^X+FxSi*{PWZe4%vNq-?Q^-3k`j#a}?5;}Y3%(h0a+$zHH=p&r znS%Ky?YcIZRj(zMpHPMe_nL$vemc`(&p)yGO_H&WZ=~~oBb63^c(!W|;hUsm^(02t zlSqf1g?pdRkzYwmQHKcFo4NX2+xg}{%}6vVMv>L_3n6?Hn(vRFj(R}mvUFmot0u^` zo>e&DQa4sFkjyE3GtFiN(iVEd)A`1PZ))u}f?mc1vN`h#3Fvul-bU-FpgF(i9RAlJ zu0ETd%L*M$1>{YvJZT^9-E&XRTHLIgf%5K1_C$QM!uK(2{F*Kpw8H@SrXgnw{jli@ z+p{N#yjjyhwHIF?uhWc>_YTSPHhgnsbu~`;`baclyOF9;5s;TDjnOKT_(%s zAEEUZ*Wxh9+S;s&|d_>2}MEd8e$G)ap5 zo*#%5Z^kmd5k{UvY0fQRS~DNF>II-dJGJT2FSi9Q>RY)SzVQYXaLjQ>rVY28_$IN~ z6HlBfC3cY0pweU2m|op}GDGx-#kz0ia`KPLlP8k<%eEDene({VJ9`tMH+Vdd|%aCTHM;*^>34-^aPkN_{uHYf^$=hDt0e z%1ijdb{$x`+~dkJ>obAvI;|#7=t#mZs{7MD;|@|d?+7l>&vE9Z#vyQilg72K?fe0fP;Z#O)D^+3;T8Y5QpS! zQhsC@RzBOCu5jAU4zHH%Q_2Qp!N~u15i%-{&@q#U?tnz9wayIQdP~lG4UgHu7wayf zJMscawr}d$J1-EtT2PC3R>yGH%T#UxPAa~EPiU@#KK&PYK`Y)1PducD{Ary1Y8ZU4lYR|}v|^j@;xf4xYx(M$Nb zC?8^4B>NP;K{3`$H*}upXTX@h%(2PVkYb|_y&U(Fy+e}8>Da8E-?lZObyPB^C|lja zL3`E3v-{}6kTd!8b@mKUrH&+Hf#iH6X>1=l&t(tnZhJt4uA2o0OXQZ%g6;xX_QT10E;<+CtK*~YMdVZblKDcb12S40% z$tYtN1ijymD^kwFQTdW}6yLZ_uB3|h41_-8!WiEu7E^ZefE7s#+5|zrba1V$0ku5Z zhg{fa%Jngwh}mpr`&Wz(>k3B>SH!y)NRct&x2TJ@Wc|!HOn)P>RKJL91$!~yyw$%= z&PO#drS0cP{Hi7_S6oGZ=FR{$o#9+re3P~KDxICSfTS-rB79SMwv=eQ{bma5&k>u? zLy3`JHTByj4bHZb_0O?Cs_?1!8UDEUtKe|xZQ3x+OqhBH;bAU*Tv_#o3rOv%flS`2 zleDJ~$LHO(gv&#-m~vSfXXb5gW_PA1vy%6x*y-WQu%%j=89s7j-BWjPMx#EAwTuF` z@RK||G^=Kd*RByfT)l#oZ+Z#80(R4qTv%0+o zJX*Wiga^Zz)mS^gR}ENAbUd~mB6)seK-7D%87K|-#RRs*@F_G@M4&e_=8?zd`?#DG zpBq@~b{9_Em&RTfJisHaCm=PGe&oMOAI=94+5Iz)MGtARBkA z`=`lR*bnbkkwQhC2>7PVD}q#C9Z$*!3*ef0T7gW=cH5BsO zqe#efG0iv<#O~hM%dOSrR2P%zw*BO~S|vQc*NjbUlvzG|gZXCi>|?mSVH6d;-w&6k z7Ygpd*#a5cF@$ft6a#U|5jhgSFdVGbT}Ad{WhXF|6Z4JE!4#-ke+2Y9uCpn!R_s}c zKlC2$LSwpZxOVZ4>ay+hPIMyaqwWiQ<2?G2Kp`v_#>pPW?QU1;o+U%@fPopJda>ZEiC9vKL7y8YR=utQMxpJWW@n~ipV3YGT>k<~~O!Z*Wfb&2RuB24Lc z3;WFnF@xDb=+#^)yzs6uSC;5)6uPu$7%S|P12*y_@S~_*q`ce;s%0c)@l9t_5N*=C zDtNZ`z+Yx!XEQB0BMny%_dItJ2%^2|_gT$0J?67qa?Zv#R}1^$4!d%sxw$v+&5IpD z=*Ln5*J`?n-q2TUmvu7T?URawlO^MrYjqrWCKsStCuAY^K`08@y}t0j4s9|%<`{QY z@O(xz@xpuI^^scQzp9l+EG+`N7dpT#h!71xEDEat0mRTZcJKwO>jByQf-Rams zhWKVKu_sTGC&GyfE-c|y5j9&_Oy+GG&*al3=Nq#c29a5H0$O10T*4Ulhsw?-kd`|l+F`ubI)hPf;;f) z5Xm`7_U^6lviC^x^oFA#W`aOa*Di&759~tmev-8W-*lf;AZI43A(fyPm~T{!W|F}T ze#C$J5u~Ws$|4_MK!eKm!!u*acRA55l5F2@OoiK3A?dC?iEFuq?i?A4H+x9Rn%Z@O zd>LlM45MB!vjAEAU0WL`y+?$OlOK z#N6Qpp~KZ>G;rA8+;4i1zbGz&G1=2CzwIAIIwhA%8xo-&wfeE3$vsp*PU;6Ntp>>884(u zj~!=xwt@lELAau{E20dn!t5Pz)##hp^6XI@{SSEfn!R(#{7 ztos*yHD=rh9v z+fI{=huda}$)@0GAk+AiMIF~>IPM2puOtkWj+h96%nFA8c-M}11F5zianE;7k=(e zfK1!4anr}^AbC0tQ+>&K)Px^5$OjW&eERwau)DezOd2oK&f-{j+%k_V>-BwQoc=|H z7;e2wcjqdz)GjS-HzEnjOU7|V?`#_`eES-rLxP}jxjWfpGXzh+eHiWDIG&qN`9@jx zD7`=Y2{QjWf$iHmmCG4BU=*Hgb&1kx2(HOhlgbI-(DsG@5tkOpT9j|%G9$*-XGEii ztH=Ch;&nHOjtGCF$97>*z3d0u(lv&>zJ@^ zS^(_&vHqW?e^&-wpEik(49@(^Y}opPwY!!Q^W)O+q8KBU*JWtC*+96MAI|02j=IWL z-uuCVe>=ja)>yQB%P}-^q6*^CI6S{FVhb**@L|pEf%|1wnTOMeA*u)bdsAn!RLSprRu$jIK{0v!;8{6>D9Q!LJM$8&XH! zJd&J`4VRGv>DZSKlMm=(ja@%j zq@}Ld{&@&zwrm{80-nXemJL$EV5b-)-SbCeCI3Jfr9A+ z4K3Vf-wk3PxE|ZQl<&9nW)=hr8i>{%!9 zFZ{-uQvYp|((?Z=~>86-( zW_=6=rv(`>YlaaF)0lwj=k6dO*`{nTo5Ho7Z@O>&K)$O>Np;Wf;rOPowU$jcZ-oa| z3S{a?WtOr#4Tbl90n3ae{h4p>AJ(OxO}|q=L#e;aCD&$TpKps6yfhLMVh&0}ztB6I z9D07&DjCP3${)d7KWF%$zk;Od%9D@t2_4vF%r4K2;_AFJ!df6Z<7sAhxuc^ zvGuqLtEZkKH5wC1i|j#i-n4>+@0YxTYh%|TW>|Nc>?k}1;1W+KCiG=zlr_k> z<&yX0_{EH81N&$T9bNp$wvu47YwS^aROJdw7PoQN^y&m{wkbhF==^3iakF{MR)=NL z_1i~dCFjl8(K5I;V%{%8sn6stHT29|p zqW&^7NBEL2mqp~(40p)7mrCn$7K-D>KgEgJl4pd@ceddb=MNFB<*Dp?fR!lX&>vj) zTpB;`7sl1cC-4j2HD5t^Bl;TB_4tPL|1*Mup0Vykmt^dH=P(v6|9+QDT-$;AKOIWO zC~QXvtZ?KD$+~V7Yb3Vj$;3Ofi#}}B#Bud6*bOT^;w;+9l~t`2Mr=16W^yy*nYPk0 z^r)u~y;78d&`Xln6``jA7*Gz`&unF+|Q6h3w3u52yx^QOST4`~5aTu}C zIl+D|vmwDMp84H=FPT(>q|SVE_-=nZ^ZG^FuDO};O=iCqXdaVBUSFu9Y8MTu%Zi6! ze8__c%J*<(@lA-yYgF&jn++K7gYnI3r}<=X&so8KTP=v1R169+IcVKLBQl1}=5qLE z{slSg(ZA>S9+!juGEVyrkZ5H&@t>mpkTW_GeUP68i7(C2;v16n>MOZzV6T@8`L~Xf zRXf7zY}I8*uxmG11mE2QVBBj%gm2TlmIa2z@E@)EqTvm*80F4Q74 z7hCpC=W_1tC;`LG`8eF=08yL1Oti=_fu^-@CGHBg{;hoXZz%T0NbsPwcCnd-h@sb-s!GFr*7 z#X}{+H?uSK$ih1%% zvqy3D;Tug`U0jmTi8lzP{xZG2&a$co9pv3N9<&T}*owd*aOU)2GX1P0m!tT!kGLjI z2j5h%W4*`?QOi+dqN|0l^Y|hEGy~3;GF4RtI;H42@XgayBhnTd46TND$P~k7Hv7VH zY9DV1C8yVMIaiG$V63|rT-UUu>mu^en?+;M;~FL6_r~>~#wXqnC3q{r{aL4gZ+cyK zfuy6eVcWs0_`)IukPX(SQ){J&dxbydSI%btrW75Cw5&m{Yu zjP*Z}T)mh%E=fff`}d(m7Y~S&e|4j5`D@(XlY9sw$1ckeb16#BrYF(a*IhvzaD(+Z zF4?0EJk?8hBFmdR9z2-nP0mJYMG<61izeO9KKQWm`#g@erEe`^#i_n5`URIl)sF~tkW?1`!eD1c3n~MDSsTJlf~uS z&$`5hF4;lv_?8jJ*rx@;Su)~%7hjQ&eI)ZK-*}<^Xu$1oTH5>_@y&XVV=V1k3R_{P zF8sB5vM4Jf7jKvog!|b_#vi`XxOI>Y&TK)dW_t+VoN!!$G-9(^+^PK}^UYgYdvO;@ z>v><5m*x(x&U~|D?FlmLmz`*ETLR^qtrr)N&l3lbAIkSYDS0#MoMeDk;skstcN&+& zH`0fS=<+HxmRq@=@QwCDb!5EmJI-4g16@mh($P|=aB#w45_8&{%lY`nhMg89QF!nM ze%1B{>rt_y*&Zuc!nT9lIPb4D2|Jf2Labsv+)t5Zf2t?KAXjx^!lR{JPMe1!D<3%r zcHWg2ubt{jJ9EUyV_Y36#*%XhzEOCf&gP6)#}N%P|1wRNoXMHp`ea)FX0rcMH0|u# z3Gy4uS(yDzZau~~r<8rrgkzO#lTZNvml^G8io(Xp;Hf9{{!cSG`7E6nt1QL^T7;i- zF-VQ5qkM&LY*wRTNGf!B5ZGRu6NSpVu=yzN&E z*|I-aU^IOU3UH4k4%2G6oU3Y6NwB{=v~029*cS0{* z@nsLpCunZ{BG>!A-Xk(c8QcLcTe?Qa~P= z*T9tJN8lMTXQNW|#il85vHE364&N*d-$5&qMqr&e1OGBfPwm*^`{N;H(`s1ub`ne+ z@>_6V?sGEDQSzL_{?UhtXW>=IS$Br$-Wf**G|S?Z(?{V?-LhOC3s@aT?#{djCwtyM zyVppQ8h%J8zh-KZ(Is-68PjV7v}w&?TbEqJO-j*XrT<=_PbQh{iozqV?R+EEPSMyq z6JUbO_d*99;J(0AFZ?-B06~?F43eq+v{AJ#KKLE2gJ|=Cyt--f> zpU59sz%<3dq6x{8Ghx0tqT9;cN1LF1ebpJ?tcm*s9s^p@z`jB-HTs5e{2)4D?Fbk! z(vEX?TV>m8rq1+ZH|VFRT_^ z-1rU^_ATUoH#)do1jS!ou%OUwV7^^MhcrE4^EQmc6|W@sw$=t0!R0}fY~ajs@cfoG zjmSL&Tb%lWZG_~S2AQQmK#Q0Z1S^pIhjMJuwcn_hdocb~B{^5Oe`C(>ACM6i9!&td z^s%(4F`4%7f0RAYldL!RMs;B%+WAvJQr)xuGOI4tAeZB}hzP_`W2eq`J7BQl9Zmo%A0_Y);0j z=Q|UtUD?R?#3!~$Gz6XpO4cNNb6k29Sfxt$yyayZT*Y-&>Mw8Q<`;sXw>tSZy0r7!5{pi-~G9=3J`#;U7stmNFaSB=ze}eJN z$T?rgJmce7K6WO&NeLm&n;z45L0#y8ttxljr??J-t)pGY`mM*ntUHs0j88zxyZ_KD zHIg&WuEjwls=2A>eV$QZJ1hykdZa?8jcLR#A6|0x8M)FQS_MbpzTH!p_*t4X`$)5< zgzId<63MfLeDgUaQ8eQ{#lN@2BfeQM@Cw*;=P>_}MIha4hrndbAa>Bf4z^cGo~3d8 za2rqUqfSn*{0LQh%$VI4eX^=o4IZ2>c}DSrR{*u1(sSRUWEt7u^IWtr&z$sqY=zZs zp5^MS>((DW)~aD^-5=2A`J2k-T_Q7{%aC8kC1-H;J zZL}$(vJ^?`&dik-Lb7jBh*Ze#mx!X!B4vwq6=^}VsXH@QC887|NsB0jl1OEH?_cK} z&*T07^L)?Dxu<64J6p(x;`d>BkZT5|^U+T6X!ONDUUVLTJe0J}$9>Z!$bB95>@2Ry z9PUh~-8%^a>-PYzX=#W=Dk(YW!T5>P*&rO{Xxrepn(JhUat%{vuBnYQLGwDNf*xrx z#5Ed-PkAvX$t$fq6t?Rv+56HK?9tmtC(r-Q#7P=mN7q%WB5zH9y2ob;m{hHcOzUrw ztKZnX4cC0#Rtk*HjU?u^{J+e}w-n*t4A^REO?REWg-g#27ijNmhVxq3zIuCJ33^(g z2ebD$(D3J%QJwY$-i%{8F#jz(*S2c-CFEZhjBj>55X_FVLBZ}?(7RU}%@DU`zSYDy zb-t2}1$lIz2UjRegkGz(ZDoGdlONOB@fX*)>?eHK>e#OfMQoTEy)29B|VEjw1z(r0~ihk`iHRkEHrB#0hvEI;+glnE(cA%l%9yI!-3JUQ(2j<-?=gUaXLVedKGIi$~o!{C} zxkm?m*6V{@Ba>D}f8_6^HHiW=f6E0h?d)k(X0RMeU9@20a82)OMdE2GEgDBWKwR^9 zn=W1A8;RZuMHO&7UB_U4Sl*rvwQPNi35 z$3`C}PSENBI(NMZ6!d42xgEpl&GBPMvgZSM{=!Md)NT>2!EbEFjwV7{Ty_z^DGWou z+dh-MHIo>Fqcv%8b0qc1bVqK|s^o^E`7A-+GO}`o-an17qyUU+tcLG{zEiHbKX(`Y z^Id|Dym%Ms+I_&G1ywNUSz_^-a`sy-oRk3vrni$(vro}&`wR&6T?-z})g#fRYz~cU z3cl5log=icIX|3oO-|q!8ehSO-=7_!MP1!s4M@V;L(8FTExX?4kB*p7dG&XYX}OoK zD7{o*KBpZnjTYmN+o8$St3phcdIVmhJLPuJ%zNSvaFiCduaAg^U_5D-`q3> z2E=^8Tmu$LQAvdidQEjRt=F9>^q;3g472somkx6#j`XliWNgGBnzyip7=7=+TG^nu zVM754-p=-WxyDr&%4l6-yNi{Mv66sAl1iPJN0xG|dT8!w6) zP7TN z-(^bSJG086+qPe{cgbx$XWmZ``u+hN7031uxh84+7BCY>f(_|U2-ip%91&z2UBs6H z!sxcrgZMug0SPnxgJ1QnXUfyoyO=gA-a!@f1E7cI2Wpog4!5jSMss&8`KP(%-zIR# z5v|K{5df}H!gs0ef&wHbaSb^Hw_}6&wLIccMVv;n`ChKceUpKDyTxHne)?ZVJGKXF zWv)m3Pp9Cv-Ys~jzByj@UjqCvBaUe+xkh5?V?3=ybXN3RN5nPTOLeK*(tc#2T22mE zQlWO_1F+unGTf#%oT=A>sYmIl@ongxtRqdc)~8CXRRW`DBhiI^_HSpq{!{e6HG__e zlNOyp8YLKA?@l{3Pr+snRVGeG`6HOvpFkg&jzUUH&2ie)WNY`lpJas++wLfB7mee_ zE=G9^K9E}zUV{5k;nZ*QLU628j)^n(;UGPy@|1j869%!e64`DrfgaDRBfgpJH@4Ab zh%jKsU9wC5Cp_C8&HKK-7`iVRAb*ByF>$yCoP3Ex!dgL{jWOk#)Yn6VrPE%K)N2x` zETs>$?fC_DCOv}oz?E7g_IYP~4L~DnU zJ$Zn1iPP~Z{K5k&L~s98raW9@CO%+eFuRFl&e#gM#<(tsEU^i|lB2#;&Bg$rzbGHc zr@w(UoGnCmMIdahx{p(WGG{&L#<6Q%<0FG{zy#se$11U^!m?XBJa0 zu2G70#Y=XNfm`;*60RxGI!|_Vl%dV%s;J3mX^^t@fJ>yfO==O;Mm{nJLDSk+aWjxr<61+A!mz6ar1G6S^PVlDv%xzjPjtUgl`qo@Y@%9%!9jj7TBw@I{7>K-uM{QZ zo|P*2)f_~*CdjP>_8yLc<+6>`vGqFGcKD!hpkO!tcexMG+q+lirlUzFmW>GJRx!FGx4^~+t9Hg)ntcXAL#Bs4lOF! zyU!G5j0Gj`-GEouLkHK2mn0v24t$cPKrJcu>{+gHS*$(+y;>&(4Xc zZ-XxQelG!Z-CfRG=XL_yMzQa3+g35!KjI@vt+fY9#@g_HIsm~=8_AVC9p*jHn{ylv z`TmebTkfOH5#0hU<6<~r+HQ0vkj=LoYKtK$KhkK6h7UdPW-8H;)!=1TY6use~%c9G&mN<0M zR>njf3q;9bAyj4lPw3};1`KBI#0T@A1A{bne!1tm5h4*cX^GoQxa7o8(y@on&v9wP zC6A6WaguQ^J)Nt9Y{Q=;-)xtnBG(GCjD|s*#60Hr;+j+i1=#18gy!eh60W(TDdaU; zwF+LYZ9#UsOa*Gs^`Q}=F!n2ZZw}WC$V=io;`wmS$q33d8~g!D5A;V$v&8sM$10NJ z1u>Mr(G=1eHs8xNSNH#f-i5=6ucQ^?nvCG}^l-I3@*gF|A10g%H9w8!KmBl#6rExJ7UuN38&!RKk>?oQOPO5lXbmk8O^1CGi*DO8H z#NnF2mS}2~tp)cS8-QG6>^zYkNOz+C@fF0SP7LoaG$sCB&BW|zA`@p&bhf~w7pipQ znqB06;AZ@*zh~z3Q#X+RrWD5bt@^?HytELVckY4*E!%kOa+QgX=tMeL+=d`oVSpgScD?ehOxZB zg%poylB9}?Y}=$&WC2svkJ4$EtI_#^-Dv1>FG22?#n8Tu9XoK1(c-6|()NJRO_Yb` znl;&yB*i}xxy$g-Y?TO}c+?AEHra>N?fb?24F=g~p@Jm|=)aQ<#9H2&4OoF zsq=;?(EI2tR++kj`64}bPO3?e~qa-*F2Dp0Tr)oh3a>L0oMq{qsUhYHZTI3wY}<}#%k1JZ1JQ9X3LiUWt`8H!2O3V!-u^==!&8& zv_2z451}w3wvx>;t`P10|MFxjdS%@}&<-Bn7-fk&%Lu7SG-1B^PrfIShxTq{k$xO` z1rC75WkX5xvICUt9m|+mt)J012TAnvt1b1Ejz{9_rJ*2s0?p>!Ul~y2fSd;hQM}bv z*sf9uZnZzae$(~P=og(#y|^a&QV&?VrU{&%(hIppylyk9T=@+RXjH-29tpBuv?tbh zQ6|}1%$|W`^5hks<@^gyR*)Cgb{pCFZ~RE^V>$Y}j?D=d%LL-IayZQYjf{eubS1d-^kJ$F& zQ}sHOE`67d%(((*&kMvjtp<;g1^DrTuT0&!##E*jSZ)~(S14K_u7PE?sLks$&EKYv zrZqmn&qtf%Uqf9{OTtek4%ci8T7w=NSOMqQSi&`DlgH7!Ul!4t_kL*Z3>|FQHjWe~ zCeW>K*>Q?&{Vb{=?nu?L<6%L35l+w(1B*P9Na`I!=6C0skM|Vl7M>)mN-UsU6R>>n(>G?~EYRC1D9PGRHwNuMV_VJejd*R6v?Y#i7{lgv zxTZ~c2TFaDfX8(AL9Tf`eizjZFQ=t9Tw#L0DxKrx4S2h4=2^=|Y(kft+Np;^ zJkq-u1f;?rz>~%`Fl9G8-*m)&Ka%M&qF>sA(cwd?XzT<<_%d*kU}__qOW~TLAIebd zzc^aAHJx%z%&2fQCHx~P`>li0#(RklAI(Ki9`n(lLCiJ4{p42ew?_lV11?m^ z-DT3#~r-!l#q&(Hq2 z$z2AxbnDYUU2Oi)@xG8A{yI}oy*&h`8EV3s+%7;91IT3_+rFPEGlE*Duc8mnE|5CM zSKx-nQLsf*0(~-P`(u?yvv6HqGBWRx#g?{(yjU+~oGvXShN;0!d3vfRQb*A}V-8Xe z(Y5uq=-A?K_~7V9IRB&?V;n?h*ZYgsv=>&iAT(M)Ff0M?_%Ea+VVzWB>(tm-h&YBF|k0fL7`s=u2Iy;}sHIKV|1gcr}c&nZ0?h}qFiyVNS ziWV?MTpzu6)Q9C49O%zwJ|r+Lj(HZ>s2v{yS1-AM_zl&RYwqtZ2d-gmpz_FT=w*8x z%nk3v-I0)h8L>=U=9>P6_SOuZ3QbvFP66Z=hk%TfCo6gUe?o zF>&sCeM3ijw2{)nvnX-ZTi&_6XLNj4F&sWN{hvnWr@eKWt11d~zW0|gpZJ`7a*w5c zszQ3mr~z2Lv!lx1$-v%x1`~&CR4j&*sj_S7sH;kpYc!n4AU82gJzqVdTj~=*A8iF1 zo7d8ZK`WU!S536x(B0BPqW+g_kU(`2 zQ!lP5JM#k9cdkXnFR&KaCj zT?_j9m(oLJe!!tLm}Gdee_x5o{xsbFCVF<}0oraB3V5f6QmYSg{Npifo~<%o7w34Z z^7~v01qmMyW1G)a$bM=pRW4%lQCu_r>wdI(&J7&0KKd_H77)ri_G1J;@sbwNdaOy0 z*k8oXCP#^r2Afxxx>t`TthGjJRc26kdAd+=SeDpl43fvqvzhn9HD-avHg^7ZK%T%7 zan0`U=g@oycldRF2YT4YKKWoleh-Ya#dgET+s{)BH(^ z9{<^DV>0v_{L4JqfO@a&q$V{9sNGG4ACbQpZy&XfNIooQ;_MLRtvC5RrYUW*w5aAj zN)qj5FkBD=&i$(Vr^y+-j4!rqwE3}W2I88cl|S+Btj9>k{5l!5=)%7FKd_ExI9{>2 ziHS37S)27t%P_R7;5O~ww2-Ftj)!G;^U!3a9>!>X52JUy?x41|*93`mfsZOu2=&$g z`Li$nX}oe3!4%Owyhl?!G1qikhu}NDYWzg&Rx+Y#EdKZ*A2+)81D)j`nK;$4;|Sb4 zjDL1PDA}4;g|l=X+BnOvgi|uR8Do)Bh)Tp4&@_bvSZ7s6K83{KInQIr_QMYtV=R9G zy}!{(M_Y`eIu2DhIim$QsGK2Z4I3G=qi7GZ*NvbnjQ1hk&B>z0+N#2!P;ctz`jRoV z`)ASj?KLQVL@vnnl_RO{@y{CGdS!16-29em`9Et*1O4&;Mx}4AL+eFOIDD-6UL7+^0lSDx~-^r#hfI$iUILCB$~8 z2UT0d&f^cg-3_0=Q{WSYVmRHR63&=C7QdQ5mfZWqj=#9(h}cPxXf|Zl_m!4^8S`UW z$X@7&zOGWDe@?q#<$X<1JTnSR@?ppCTvIZn8s48#!fTE*qFi%HHWUqdi|!$QcYtOO z6QiYvny_|>EBd~U?Td0vtxG>v`dL>Do@{_z)B4{lxXx0C>dkvcySvsStIe4pGB*~E z8DYfyrd-o-EEBX=v;d2ZS%SYzqA5D9a+=(?QWmP?A=G`;Jl?fzUs&bGj#DP4MIx8C z5op=mX(a7|E*7_5jN}cq>DVDE%(J+r+EEPVzseTo@{bU%*|OIjnHJ1N3s&X9A3xnG zme~fXo8+iPBRfaWHE-`AY#un5w^_7DgKNax>QKK+1iE6*N6r4(IJ>b2OkMU8d&o>= z%0tpyk?2HqQ6Cc_^W4$GF>gHt$xnmHRzG$u%r#U09Ks(LNFj+gYZ2F&p14lSAJ3o* zW&Ky-Sqj47mTT${DUqQdrs;Ui;H~Yr%As#or=90 zO00J`P_9{|+(Mm1cfaR!oFapg-ux{_Lt$l3DwJ!oWZDZ`#~9?4`WPA1tVedUOyFAm zY~F=2!F1Kk3Cy!B({}V!v!6vY0QA zE}i#b>UA}7D;;)Ig`7SsDbx=5hQ(@^g6$!)h#ok>n1o~n)bA=9$0}?^<~wC*u0}hS z96uQjEN0IU;u`A@J%U^teX=Dh@h_889*S{O8ZAlaLABmjG1#vLFRm}eKZ6!9&*GZ% zXO9*S?@{GlUHKVu%@Sb%>Ri7b?WKy;PvRh$HQb2qt2PF8+cq+BxF+xSW3cjq5dyE9 zAlF=;@De#km{R`ZaGIjgC0P357B0@{fqhE$Oq}%0TohuwmxNA?q3TzpQTp18Hm^pz zqc?5rJR{efDmBIVZ)fv^-pEs~IegU;hNXm3Rrx%+FtrdCCVaBKoMb@uu4D5*dz_Aw zn_jEvmQ_d4LX`} Date: Fri, 28 Nov 2025 12:15:16 +0100 Subject: [PATCH 23/50] Update include/openmc/ifp.h Co-authored-by: GuySten <62616591+GuySten@users.noreply.github.com> --- include/openmc/ifp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/openmc/ifp.h b/include/openmc/ifp.h index e297f38f4e4..694a16b475e 100644 --- a/include/openmc/ifp.h +++ b/include/openmc/ifp.h @@ -105,7 +105,7 @@ struct DeserializationInfo { //! //! \param[in] n_generation Number of generations //! \param[in] delayed_groups List of delayed group numbers lists -//! \param[in,out] ancestors List of Ancestor nuclide +//! \param[in] ancestors List of Ancestor nuclide //! \param[in] lifetimes List of lifetimes lists void broadcast_ifp_n_generation(int& n_generation, const vector>& delayed_groups, From c1f4321081fcaa520c82a91429762f8ba3e8e4b6 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Fri, 28 Nov 2025 14:04:57 +0100 Subject: [PATCH 24/50] Update iniatialize.cpp --- src/initialize.cpp | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/initialize.cpp b/src/initialize.cpp index 1e91c3792df..62624a558d1 100644 --- a/src/initialize.cpp +++ b/src/initialize.cpp @@ -183,34 +183,33 @@ void initialize_mpi(MPI_Comm intracomm) CollisionTrackSite bc; MPI_Aint dispc[16]; - MPI_Get_address(&bc.r, &dispc[0]); // double - MPI_Get_address(&bc.u, &dispc[1]); // double - MPI_Get_address(&bc.E, &dispc[2]); // double - MPI_Get_address(&bc.dE, &dispc[3]); // double - MPI_Get_address(&bc.time, &dispc[4]); // double - MPI_Get_address(&bc.wgt, &dispc[5]); // double - MPI_Get_address(&bc.event_mt, &dispc[6]); // int - MPI_Get_address(&bc.delayed_group, &dispc[7]); // int - MPI_Get_address(&bc.ancestor_nuclide, &dispc[8]); // int - MPI_Get_address(&bc.cell_id, &dispc[9]); // int - MPI_Get_address(&bc.nuclide_id, &dispc[10]); // int - MPI_Get_address(&bc.material_id, &dispc[11]); // int - MPI_Get_address(&bc.universe_id, &dispc[12]); // int - MPI_Get_address(&bc.n_collision, &dispc[13]); // int - MPI_Get_address(&bc.particle, &dispc[14]); // int - MPI_Get_address(&bc.parent_id, &dispc[15]); // int64_t - MPI_Get_address(&bc.progeny_id, &dispc[16]); // int64_t - for (int i = 16; i >= 0; --i) { + MPI_Get_address(&bc.r, &dispc[0]); // double + MPI_Get_address(&bc.u, &dispc[1]); // double + MPI_Get_address(&bc.E, &dispc[2]); // double + MPI_Get_address(&bc.dE, &dispc[3]); // double + MPI_Get_address(&bc.time, &dispc[4]); // double + MPI_Get_address(&bc.wgt, &dispc[5]); // double + MPI_Get_address(&bc.event_mt, &dispc[6]); // int + MPI_Get_address(&bc.delayed_group, &dispc[7]); // int + MPI_Get_address(&bc.cell_id, &dispc[8]); // int + MPI_Get_address(&bc.nuclide_id, &dispc[9]); // int + MPI_Get_address(&bc.material_id, &dispc[10]); // int + MPI_Get_address(&bc.universe_id, &dispc[11]); // int + MPI_Get_address(&bc.n_collision, &dispc[12]); // int + MPI_Get_address(&bc.particle, &dispc[13]); // int + MPI_Get_address(&bc.parent_id, &dispc[14]); // int64_t + MPI_Get_address(&bc.progeny_id, &dispc[15]); // int64_t + for (int i = 15; i >= 0; --i) { dispc[i] -= dispc[0]; } - int blocksc[] = {3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + int blocksc[] = {3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; MPI_Datatype typesc[] = {MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, - MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT64_T, MPI_INT64_T}; + MPI_INT, MPI_INT, MPI_INT, MPI_INT64_T, MPI_INT64_T}; MPI_Type_create_struct( - 17, blocksc, dispc, typesc, &mpi::collision_track_site); + 16, blocksc, dispc, typesc, &mpi::collision_track_site); MPI_Type_commit(&mpi::collision_track_site); } #endif // OPENMC_MPI From ad0e42043d618c9af82248bc03137b28ca9d692f Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Fri, 28 Nov 2025 19:08:24 +0100 Subject: [PATCH 25/50] Update particle_data, initialize and eigenvalue --- include/openmc/particle_data.h | 1 + src/eigenvalue.cpp | 4 +-- src/initialize.cpp | 45 +++++++++++++++++----------------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/include/openmc/particle_data.h b/include/openmc/particle_data.h index 3b091f8631c..acfb79ca58e 100644 --- a/include/openmc/particle_data.h +++ b/include/openmc/particle_data.h @@ -66,6 +66,7 @@ struct CollisionTrackSite { double wgt {1.0}; int event_mt {0}; int delayed_group {0}; + int ancestor_nuclide {0}; int cell_id {0}; int nuclide_id; int material_id {0}; diff --git a/src/eigenvalue.cpp b/src/eigenvalue.cpp index 4b6ffd54df5..e90b2212af5 100644 --- a/src/eigenvalue.cpp +++ b/src/eigenvalue.cpp @@ -333,8 +333,8 @@ void synchronize_bank() &simulation::source_bank[index_local]); if (settings::ifp_on) { - copy_partial_ifp_data_to_source_banks( - index_temp, n, index_local, temp_delayed_groups, temp_ancestors, temp_lifetimes); + copy_partial_ifp_data_to_source_banks(index_temp, n, index_local, + temp_delayed_groups, temp_ancestors, temp_lifetimes); } } diff --git a/src/initialize.cpp b/src/initialize.cpp index 62624a558d1..22115dae954 100644 --- a/src/initialize.cpp +++ b/src/initialize.cpp @@ -157,7 +157,7 @@ void initialize_mpi(MPI_Comm intracomm) // Create bank datatype SourceSite b; - MPI_Aint disp[11]; + MPI_Aint disp[12]; MPI_Get_address(&b.r, &disp[0]); MPI_Get_address(&b.u, &disp[1]); MPI_Get_address(&b.E, &disp[2]); @@ -182,34 +182,35 @@ void initialize_mpi(MPI_Comm intracomm) MPI_Type_commit(&mpi::source_site); CollisionTrackSite bc; - MPI_Aint dispc[16]; - MPI_Get_address(&bc.r, &dispc[0]); // double - MPI_Get_address(&bc.u, &dispc[1]); // double - MPI_Get_address(&bc.E, &dispc[2]); // double - MPI_Get_address(&bc.dE, &dispc[3]); // double - MPI_Get_address(&bc.time, &dispc[4]); // double - MPI_Get_address(&bc.wgt, &dispc[5]); // double - MPI_Get_address(&bc.event_mt, &dispc[6]); // int - MPI_Get_address(&bc.delayed_group, &dispc[7]); // int - MPI_Get_address(&bc.cell_id, &dispc[8]); // int - MPI_Get_address(&bc.nuclide_id, &dispc[9]); // int - MPI_Get_address(&bc.material_id, &dispc[10]); // int - MPI_Get_address(&bc.universe_id, &dispc[11]); // int - MPI_Get_address(&bc.n_collision, &dispc[12]); // int - MPI_Get_address(&bc.particle, &dispc[13]); // int - MPI_Get_address(&bc.parent_id, &dispc[14]); // int64_t - MPI_Get_address(&bc.progeny_id, &dispc[15]); // int64_t - for (int i = 15; i >= 0; --i) { + MPI_Aint dispc[17]; + MPI_Get_address(&bc.r, &dispc[0]); // double + MPI_Get_address(&bc.u, &dispc[1]); // double + MPI_Get_address(&bc.E, &dispc[2]); // double + MPI_Get_address(&bc.dE, &dispc[3]); // double + MPI_Get_address(&bc.time, &dispc[4]); // double + MPI_Get_address(&bc.wgt, &dispc[5]); // double + MPI_Get_address(&bc.event_mt, &dispc[6]); // int + MPI_Get_address(&bc.delayed_group, &dispc[7]); // int + MPI_Get_address(&bc.ancestor_nuclide, &dispc[8]); // int + MPI_Get_address(&bc.cell_id, &dispc[9]); // int + MPI_Get_address(&bc.nuclide_id, &dispc[10]); // int + MPI_Get_address(&bc.material_id, &dispc[11]); // int + MPI_Get_address(&bc.universe_id, &dispc[12]); // int + MPI_Get_address(&bc.n_collision, &dispc[13]); // int + MPI_Get_address(&bc.particle, &dispc[14]); // int + MPI_Get_address(&bc.parent_id, &dispc[15]); // int64_t + MPI_Get_address(&bc.progeny_id, &dispc[16]); // int64_t + for (int i = 16; i >= 0; --i) { dispc[i] -= dispc[0]; } - int blocksc[] = {3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + int blocksc[] = {3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; MPI_Datatype typesc[] = {MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, - MPI_INT, MPI_INT, MPI_INT, MPI_INT64_T, MPI_INT64_T}; + MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT64_T, MPI_INT64_T}; MPI_Type_create_struct( - 16, blocksc, dispc, typesc, &mpi::collision_track_site); + 17, blocksc, dispc, typesc, &mpi::collision_track_site); MPI_Type_commit(&mpi::collision_track_site); } #endif // OPENMC_MPI From aed5d73705459071f92cf3ec7d1b6a5850498859 Mon Sep 17 00:00:00 2001 From: GuySten Date: Sun, 30 Nov 2025 11:41:42 +0200 Subject: [PATCH 26/50] ran clang-format on src/eigenvalue.cpp --- src/eigenvalue.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/eigenvalue.cpp b/src/eigenvalue.cpp index 4b6ffd54df5..e90b2212af5 100644 --- a/src/eigenvalue.cpp +++ b/src/eigenvalue.cpp @@ -333,8 +333,8 @@ void synchronize_bank() &simulation::source_bank[index_local]); if (settings::ifp_on) { - copy_partial_ifp_data_to_source_banks( - index_temp, n, index_local, temp_delayed_groups, temp_ancestors, temp_lifetimes); + copy_partial_ifp_data_to_source_banks(index_temp, n, index_local, + temp_delayed_groups, temp_ancestors, temp_lifetimes); } } From b2eaa8a1688c27119005aae875df53677e192d0c Mon Sep 17 00:00:00 2001 From: GuySten Date: Sun, 30 Nov 2025 13:05:45 +0200 Subject: [PATCH 27/50] fix SourceSite displacement size --- src/initialize.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/initialize.cpp b/src/initialize.cpp index 62624a558d1..7b8f28f4631 100644 --- a/src/initialize.cpp +++ b/src/initialize.cpp @@ -157,7 +157,7 @@ void initialize_mpi(MPI_Comm intracomm) // Create bank datatype SourceSite b; - MPI_Aint disp[11]; + MPI_Aint disp[12]; MPI_Get_address(&b.r, &disp[0]); MPI_Get_address(&b.u, &disp[1]); MPI_Get_address(&b.E, &disp[2]); From e1136eda42031b4afa529cbff2837c040b7d59de Mon Sep 17 00:00:00 2001 From: GuySten Date: Sun, 30 Nov 2025 16:07:14 +0200 Subject: [PATCH 28/50] fix wrong receive location in MPI communication --- src/ifp.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ifp.cpp b/src/ifp.cpp index e2981a1f47c..f93264ae2cf 100644 --- a/src/ifp.cpp +++ b/src/ifp.cpp @@ -142,6 +142,10 @@ void receive_ifp_data(int64_t idx, int64_t n, int n_generation, int neighbor, MPI_Irecv(&delayed_groups[n_generation * idx], n_generation * static_cast(n), MPI_INT, neighbor, neighbor, mpi::intracomm, &requests.back()); + // Is it needed also for the ancestor nuclide + MPI_Irecv(&ancestors[n_generation * idx], + n_generation * static_cast(n), MPI_INT, neighbor, neighbor, + mpi::intracomm, &requests.back()); } // Receive lifetimes if (is_generation_time_or_both()) { @@ -149,10 +153,6 @@ void receive_ifp_data(int64_t idx, int64_t n, int n_generation, int neighbor, MPI_Irecv(&lifetimes[n_generation * idx], n_generation * static_cast(n), MPI_DOUBLE, neighbor, neighbor, mpi::intracomm, &requests.back()); - // Is it needed also for the ancestor nuclide - MPI_Irecv(&ancestors[n_generation * idx], - n_generation * static_cast(n), MPI_INT, neighbor, neighbor, - mpi::intracomm, &requests.back()); } // Deserialization info to reconstruct data later DeserializationInfo info = {idx, n}; From ef3ed7b7604f4b3a4fb7997ec57180ff0d48b835 Mon Sep 17 00:00:00 2001 From: GuySten Date: Sun, 30 Nov 2025 18:37:26 +0200 Subject: [PATCH 29/50] do not store ancestor_nuclide in surface source --- openmc/lib/core.py | 3 +-- openmc/source.py | 12 ++++-------- src/state_point.cpp | 2 -- .../case-01/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-02/surface_source_true.h5 | Bin 14872 -> 13896 bytes .../case-03/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-04/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-05/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-06/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-07/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-08/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-09/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-10/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-11/surface_source_true.h5 | Bin 5464 -> 5160 bytes .../case-12/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-13/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-14/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-15/surface_source_true.h5 | Bin 2216 -> 2144 bytes .../case-16/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-17/surface_source_true.h5 | Bin 2216 -> 2144 bytes .../case-18/surface_source_true.h5 | Bin 2216 -> 2144 bytes .../case-19/surface_source_true.h5 | Bin 2216 -> 2144 bytes .../case-20/surface_source_true.h5 | Bin 35816 -> 33344 bytes .../case-21/surface_source_true.h5 | Bin 2216 -> 2144 bytes .../case-a01/surface_source_true.h5 | Bin 7144 -> 6720 bytes .../surface_source_write/test.py | 7 +++---- 26 files changed, 8 insertions(+), 16 deletions(-) diff --git a/openmc/lib/core.py b/openmc/lib/core.py index bc7ed6dcf3b..14d33a060bf 100644 --- a/openmc/lib/core.py +++ b/openmc/lib/core.py @@ -512,8 +512,7 @@ def sample_external_source( # Convert to list of SourceParticle and return return openmc.ParticleList([openmc.SourceParticle( r=site.r, u=site.u, E=site.E, time=site.time, wgt=site.wgt, - delayed_group=site.delayed_group, ancestor_nuclide=site.ancestor_nuclide, - surf_id=site.surf_id, + delayed_group=site.delayed_group, surf_id=site.surf_id, particle=openmc.ParticleType(site.particle) ) for site in sites_array diff --git a/openmc/source.py b/openmc/source.py index f04157e75ae..7a0ff945cb5 100644 --- a/openmc/source.py +++ b/openmc/source.py @@ -1005,7 +1005,6 @@ def __init__( time: float = 0.0, wgt: float = 1.0, delayed_group: int = 0, - ancestor_nuclide: int = 0, surf_id: int = 0, particle: ParticleType = ParticleType.NEUTRON ): @@ -1016,7 +1015,6 @@ def __init__( self.time = float(time) self.wgt = float(wgt) self.delayed_group = delayed_group - self.ancestor_nuclide = ancestor_nuclide self.surf_id = surf_id self.particle = particle @@ -1034,8 +1032,7 @@ def to_tuple(self) -> tuple: """ return (self.r, self.u, self.E, self.time, self.wgt, - self.delayed_group, self.ancestor_nuclide, - self.surf_id, self.particle.value) + self.delayed_group, self.surf_id, self.particle.value) def write_source_file( @@ -1181,12 +1178,12 @@ def to_dataframe(self) -> pd.DataFrame: """ # Extract the attributes of the source particles into a list of tuples data = [(sp.r[0], sp.r[1], sp.r[2], sp.u[0], sp.u[1], sp.u[2], - sp.E, sp.time, sp.wgt, sp.delayed_group, sp.ancestor_nuclide, - sp.surf_id, sp.particle.name.lower()) for sp in self] + sp.E, sp.time, sp.wgt, sp.delayed_group, sp.surf_id, + sp.particle.name.lower()) for sp in self] # Define the column names for the DataFrame columns = ['x', 'y', 'z', 'u_x', 'u_y', 'u_z', 'E', 'time', 'wgt', - 'delayed_group', 'ancestor_nuclide', 'surf_id', 'particle'] + 'delayed_group', 'surf_id', 'particle'] # Create the pandas DataFrame from the data return pd.DataFrame(data, columns=columns) @@ -1218,7 +1215,6 @@ def export_to_hdf5(self, filename: PathLike, **kwargs): ('time', 'L{a9L`o+Oq#tN- zQiy0Nl|!Y7>LFn^S$hFURX0XRRhNcE1PdgyL0x*)wb>NzJO}CBd#7GB$I<_Olc8tttg_PSTYt2HH)D53yA6sidSO`hFYAU_!)?54)S=b z9VFgNCyBQVK-CJf%Qkc+-WG0cbP=o5O{_Hl$eN3j7L_mNw=|RG!~7XWvif_68emFMuaBH`Zv)oZ1lMbzO&gsy}Rc}X43>S}(XcodH*Tg9fb zx|*6y!3bMFoJGjIfT`@jXhqox8sWg+D!qs@cV2@A8@(3F+K)u}X9^Tep`@ zLTc+~wm7rJy=)RvTb$W?n61aP?YxLrp@b(+;#JtgY`x6Z>lK@XPfn4Ake?>=Rh_mC zb-sGpcztZVKCkg4q_yZ{wtm-!55n5ZHd+|{uKsM6L|(~~y>GpOZ{B`3)&Prqz$TWpbwWfP06LQMXNaSE#*VA={LJpj84@EibNF^G z=ZW2%x6u=SznjPQJjtU0t<)&@vxIS3+9fQD#drThhxWA+;r$ZH(E*ylfKA zzKd7V7_(W-W_j6~@I7p^m@UO@DKDFZG}Dx8!}D8upUkhei060QwQntw`K>RKRhU0d zuInlQbX{jYuyytL7i9qIn@5-zNSERTd}BR&H2`Rs+!D#K0sy^rt&6s9 zC=Uryx`W(aKuw?#IaQzv4k6|B;wjC87=oINudG&t!%467E}oU zNsG*;*sBQHNIQY{*tC>mVGkb z1_0E>`J8mA0YF`H8+Kgn^1|*;Y88L1&!MNnaj!@vgheD)HqJNacqB$m!pKSJ05W3PIgdTPN#Rp H|Nr<8B7H*; delta 7869 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 Xy(DAjB^g^knH}zqEvbJW`~S~>VZiG$FvJ( zx`{cRDa$O`bS51)%yg6PvdofQ<1Wj%W6>G=-aXegbI(1^0)(Ic^FLqr#up1e`6|Eq zGN!Nc^XtA>KC21#)%X5h*z&@LujDPm^SVPV={m2+<7p3gJgGOo)&1cMO)t*OEk9d& zI<>em^LSx)&Y|uLmKu)+mRFuWm|B?iB;ZNo8Sl9B^|0x}29Mw4hVl7)?lMsi?`MNwPc?6&ddE7HvN-&5DrYXxqqYH{o=enD7?_W zb3#ZO5&TP_DkZ9k&y|Q^s-zCy1u&SZ0kZ`YQzej*fGD;(g|&mJu_yuYi0s7TRnW-h zo86^XG`Y10-A>iUf^dCnws}Xd_7+AU* zYByiH)uETPIT8cjb_|H^QvYswqHpuYS&* zY;JpamsFR&4PB1JfOlQ`Htd5ZUHUe3vn0%t9>*&LnQndSpxn(Yd_0Vx_O=mwl9zzA z&gfwjb`Q2ey>0fpsbxPI)Q)^VThRfQ^s?k2OH7w&*9wyRncfs6AT2NtphDe5$Z%kr z16D6Kt@e^|`+pq%Ot!;cy+it(BM0@p?iXv2Kd4`Wtf@EqRH$rIuY!`vlp8(7tU^u# z(m8)06DrlGPc14^tM)Oe#SZIbr=TYgg2G{x)n1!oxr0Ygrh+r@_K0(ejxe$^BRlv1 zZuz5Fw0bbWIEFwSKG+hF1*;sx#8q&?NgUT(EeSS{Gw$Jtz6pb(np}iwLN$W%h*7ei zsix4cHyZxXHgPkk@kU_!g#LbvyF`C3tP^OZF5YD}*cFzH;#oSWU%l*SdZ%lAawSHR zU{e@l$qn8n^|?N?ab6OO>Ls^e>@0Sg>~8QBO4QxG?MlQzRY?*)I)%Yh4a83~JDQh( zD2y}Ave_J{a3FCOD^c^EaPt+FsO}SNjgx$h)pJb7$@A#1z6IZ7U8dN~rdW-|XJ*Bi z%!(4Ioq@;&MzMZDzZElVUbEs7urD&VP3a;!krbi>ObR&()OLb@5ETTZBp@DJ5~#N= z#D=g;6*Pz|qcEhuG9WmN8K}1tq$MD!l_gM(AU=Yj2*{7%<47$KkBMe{RNR@QN;{6l zs980;#bhrrwInVv-Q1Lb_=GPr)vrlF6je@;KqHqPPuYEHS4@&1p@jA_3`I;ufZ+Dtbg}rCUsD;oF!2Y0jDiB(W#_AOTUBcNj(H4i=+Uc|h!1@Gi4!)?KEZMG4e+5Sd`gUuQse5(T7|c?pO`NdmG= z(JwI+QRE~b9{zhweJKuXNkBYeQy7X2YeNDu_n?I{Q8(qJSg?%6ELhoMjN;P>)Oe7e z)*D5IQRF^jWZ%blq|^!r5;LeEecqISq!ymlAF|V8FLSfZURD{|Sy+7$g47%%E6kyr zI*RkcE%tzsWgcKzWZ||YAZ1x!p+Yr+q6B11BJ-G<+U$!Wwfww3wd{hvpaG$>7xXG9 zEieT|A2NC89-@)jf)RLav_tnJ{P2U!J@p9Vsa3(21f&nK$7rOs)Oq-G-V_UunTmp6 zGZm#JAQ_Y;AR~$|GCAitU@S3RvzPSa8518FyCrk!w5)eg| z1IectN*w?cIAAU_ip;WpmUqRy6MTlVBvo3^^s)))Utu0`BP&b_>kP<#g92hcF99jP z#DVCyjCW1~vU>hBqe!K(a#b-SmcN>2mOu7f->_LcGtU`W@H-}rv;=AzP?mt6neQ
vYl4A5phXJ=?Dv1v{26k8uhZPe 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ǽKLnk)T*M zfGJ867#qV-Y(et|u)c&o7RpZ>z|6NKMdBugq78#}353T5#fktj6SyX{jB$89A>4}# z6M{$N69HrmpeEqGB`A^-*pNVU(mq_%xLqct?UKL@*!nIRz*ei6KqET$Rr;h!ObI7V zZptpJf!D(U2;Ua+OWj5p-Ar}hu4#t9Z{rt%mD%gdXkvOu?^-H@wP~!E0cXZ;)S%1C z&Io0dW-uOW)7TxsC~p88hS03#X05)}{B>5ih;Gda9*Iu{ur7h{oS;}SfbPM}ydap9 zKtTeL&xBA}16XstpQC~%1xW+waKeTJqIWSAQ>+@mJpA|UlZ@BE^gUrxiucfnt$Xag zP)yDMHmku0Le41zSk9XUuujI4SWM*(QdiAG`q(HWg>C69*mn!cvI~N&B*>0vx8$NA z%P$HY3Oy7++5pzNElH7hgcZ@&9oM&jKOPCUfbe6?fc6ho450BcUkGbAX8;vI!2q^) zkuNb6D>5qq?~-7iG=O<*7{IcMJ`v1U4PXlYSEyiMNdiR!Sb?#x1@oK%td8JQL6I_m zE#RgBEZz7w7>b=3YX&fL=NZlx1sC<$XP*gUUotX!Vhreyq~vpyQ40Cz=tjYyzM)4` jf?GO;WllRmURy_X#^qeRK diff --git a/tests/regression_tests/surface_source_write/case-05/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-05/surface_source_true.h5 index 24bc7cd31e3cd12e04ef1038b90cbbd1d1c8026b..c276af40f4302f4e0feff883bc3c472bc4df7ca1 100644 GIT binary patch delta 5685 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ǽKLnk)T*M zfGJ867#qV-Y(et|u)c&o7RpZ>z|6NKMdBugq78#}353T5#fktj6SyX{jB$89A>4}# z6M{$N69HrmpeEqGB`A^-*pNVU(mq_%xLqct?UKL@*!nIRz*ei6KqET$Rr;h!ObI7V zZptpJf!D(U2;Ua+OWj5p-Ar}hu4#t9Z{rt%mD%gdXkvOu?^-H@wP~!E0cXZ;)S%1C z&Io0dW-uOW)7TxsC~p88hS03#X05)}{B>5ih;Gda9*Iu{ur7h{oS;}SfbPM}ydap9 zKtTeL&xBA}16XstpQC~%1xW+waKeTJqIWSAQ>+@mJpA|UlZ@BE^gUrxiucfnt$Xag zP)yDMHmku0Le41zSk9XUuujI4SWM*(QdiAG`q(HWg>C69*mn!cvI~N&B*>0vx8$NA z%P$HY3Oy7++5pzNElH7hgcZ@&9oM&jKOPCUfbe6?fc6ho450BcUkGbAX8;vI!2q^) zkuNb6D>5qq?~-7iG=O<*7{IcMJ`v1U4PXlYSEyiMNdiR!Sb?#x1@oK%td8JQL6I_m zE#RgBEZz7w7>b=3YX&fL=NZlx1sC<$XP*gUUotX!Vhreyq~vpyQ40Cz=tjYyzM)4` jf?GO;WllRmURy_X#^qeRK diff --git a/tests/regression_tests/surface_source_write/case-06/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-06/surface_source_true.h5 index 8d472169e1a63704083210a5361f5e573d71a48e..6946938adb27e24a74078b6546c045551d24713b 100644 GIT binary patch delta 5641 zcmZ{o-*1yu7{}LkbnmtnC(zOTDg)VQL4|09GPkk~EM*J^46)FcF@#`MoPr3QLfK$I z(ZooOiREUAcdvrh4rj0RejA>^~J7WTj2`Gln zLn;JQUP2+-X$M-gnG!`5tc|cJa#GNzQdCh$hv6$_6yjYF!|Aev`r-`o!4$gffWD|i zt=kUzwA^1&t25t|46e~d@lSUqpkpG{3u7*!5bd)Aty&OK?6ZTq(4nj%5xNmNloiS7 zRfVlak^wyta~9!dAA?)VdkgV~Wo;Nj4BKqNHZyFC!dBjdSqbliZCluBhxE1m zT4P=M#ow`M+Do##=nmh?JO@mv4KQrbgbgxmn+e;-u&4=(GAw4oVhW?9bl!mzH@q9R zazP6ERu(lRvU}*-e?xTb#v?2aK}u2}hjMf;9CF3IHtE2-)QBQOFvGbaNVkeY`dx4; zOF=)nMSPe#y``L1hQTR3LaDbEwLAh;Z3ObkCSc?hDUgw;_CcR0?W0b6lv839oQk6m z#~K5t+!&3sSH)Q!gE;ANN)0LM`FJv*-wKe#zkAVl~85QPJFNGFCHdu@$4KR!*S zcBElRu4yCU^fJzwO)%`R2|LWN$p!{(aT+Ukl6H$Djmou(#VNXikD7ds zGT$kqZ|)SW+%cCrMJsoV1v_r?JkGEaChP>mrcKy1!%iwJe}?9El40*RqR|4EGIXG) z6qT^yKq}g>p{=vD6MrBc+w^9V7OiJ9=U~1aDd;;zgl9o0%+j0F z8J0?hrIKNc%@~`f8@&MDMJdo@>>_;x&M>2M%;+3rW)%Ys@e<5{bBP`y=NlWrFMhV+ z+En<6PS%HfWZA48)XRK<<#dtfRQec3AN>UDBL!NYPoc5qq(F!&66wp(2+Eh~-KJTb zz6^I8=QHRg;W@g@{c4#n&%rXU&4E?+bBI%s0_jSrFMudXLH~b;h+cs;Uc5qcX;ZmG zuG0N0U-Vb#sod`F->Z;v`b(%^SqkKd8^1>Ff-26+HHZ`b3eqk}LGO;DhD7!{5S8oH z$$jC@+<<0Sx&awSb8u}bN`b5iYaWE06iAV)QXtu;zlN`rr9kWQ4G4}Dh;8^L9gq9q zUA_sGs{vJi@7@Bcatnf|^0;vF)Xja=CT>HV;%$gyEx?}3EzmgbBX@NH;-nWT<-T#B zF9H?618$BK^m9Ul@4|*CNP)gh?oucBWt(4uRZ&@jIH`LOr*x0Tao@Cw`w*viA2PNc zK*qTTG>-e4U41}rSgtr%fZ*i# CvQ*dr delta 8035 zcmaKwOHfl+7{~K~5QvWH$RnV@MN~qq4%MolVpAUxDWjoP8Y?XqL4|4|ijVlBaoPnl z-Nc;ElqJh-Izz_|oo=#ZNp~#M9m}|5(V6z1^PSi`=bZn&3nTgS``-8C+*|r7u=Q&o z9}jH({N}^OfL+HrY7YKh+VrzxV8dT#&w{;?Y|!uX`I_r}zRcU-f`0~DCg-MZFFcxm zI5GEl>i+EXZAax7n-3kXUwHiR&cy7rFU1~&PW!Jp{~n5SvDO#%aWjEHfPXkY#rTIW z=r4xFe|(7_**~FJP2Z9D?Aut~FaAdUwfJ4<^IzxUKeM&)xDX`tzhKn^VMz)B&O6t8 zQJs%d2Xkr5%d^B0009x;}z9tKtq zlWBlV17sqQi9lutWOi`IJTZlmoL_(qi5Jf4tli?AtXs5Z*yFClNn>mFR_p=&XqbJu0xh7Ap33APx zE9^7RLo>%jZPhTD)g9wwWG=kbO=Z+NveZr0Qp?x^<7@TIs}*u>f=e7QC)NhJJ)Zvd zKyGi9GgqXqhZ0w}LA$_Kd(2_BvyXddOjNEzaJjgd>wsLRr@v0fS)QB)xh_wx3v&Ae zS2_d+Ecy`*n6^W+QqU%^ECscYZ0Im`M%}vmVQdFHb2mYoAQdNo1*kr<-%sJ0wSmGk+Pw^so zQnNYFJ&D3->6DW(mQR8~C?`R`Ib~l0)aoS=UTlcMQ+L)yScoJqMBy@>Ak?NN;V@kC zuAen*p1mQun}*E?7DpX6x9hSe=cs@i_T(HDaG!f}jtaPuDhJMgS3uvErJx>I3Rlf_ zyi)Ze?qQX3R1n|QDrb&wC1rM(5|}k=ZkwY5ccWEz#xNZfa9?`3 z*Ub4jD&VeH{h7;|yKXM$7{>}@;7>|wjD|$pq-$ejPTf6UvC%Q}^Ff;ZAr+NLb4En1 zxk;zVzlyMu6toQ&zd?k$byyw=+czi`)%n*jm76e?n~)iY%s5VeW*j85Aq6e{{%
Zkarbf`8#AwO+6%* zO!O{T7xrDUr^U7|1Cyz#B&ouh|Z3fcg4&sIoC#VW7eEZgGeUz zoq5wXu)k)_2Y`s+tb3pcnR}q6n^MqPnz(NcaHnuox(^&hzb8lP;$m4TXq6}|$u)7%pf-3Fri zpOQIk39dXf=R@yJtt@bq$(k{GZCXKC;u*-QCLMw~FQDu=FX_=;f oAVItBN>b2nyLb-7oJYbo671JxO6%wP>+$`(v1*z3@h@H1f96*>0RR91 diff --git a/tests/regression_tests/surface_source_write/case-07/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-07/surface_source_true.h5 index 63b599bcb101e38dba41e676e1d06ed4fcd6690b..c276af40f4302f4e0feff883bc3c472bc4df7ca1 100644 GIT binary patch delta 5685 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 bQFw|K+~xJlGfJcN%v|dCG+h4${QuW~+?`<0 delta 7878 zcmZ{oOHh+n6vvbBO0Z+2fcc~qgD8gDYJ9a3d;~#6MGb;Vg+dUp&{_>XTIj>ZX&20N zrjzD$rYzGPo6f{>lbLSP9m{mbGE0_m$D-3V_nxEk%{}*g3n2OVKmT*iJ@@9u;*Y+~ z-+Y;fZ}X>L-h1XtHb7f#=ZoTo7uI|wZyA{?U)5KR z`sJzduKD#Jp7;;&PrXxn^l)V1rPJ`Mw^_YS%=2IMQLmxkpU}XkUR9qrARL%zQE$|$ zAJykI@WQLWxR%r-ctfBPz*r27H432Eh$g0@PBzJGvr8J3B&bqy2ZL~JbGC6vSK@wO z{kwotSV^Nuwuy;lw_}a0!}A0hlxOvM-AE`AV6Bh6jiL0yx)nJBOyLg-=Bc2)TifAz zGp=HtPRf;5e8+@tqdQ-S*EK_7$B+iq!PSo{qzYQ0bLW5t?orX;=bZz3QkX}1C+1t@ z3Z?#p!6pQ54-N87Scn;_NiHPaY?riDB@TF7`t;hH0e8s(3oRJXOfIA()?mAfVu)D2D7+?Wsx}=ymK>wZUH@dy0ES5*A6jE~~t|-@dxhR$N50wXoWXxtn`r zzvy&8B%LBTD3XXG_MH8Dq#Z=STy)rwK)g+u;WYy8ou!96xL0V{5&^bP%6sjdJgQeF z85UM19~O+9b|L3LD zMjhy8Qm6>B(=gqMLvKpXKzj!cf=M8906SsMC}aqjHNlnylARced8`v)9?^sL2K4I& z76YmW`dl)}Mfkl-*e1Cyv@*B$B_**Qa+gJNMYf3_ zn%JWj-n6-@-mE?W=Zr9kXMR4|Yuz)lkXN2p*RMZnw-upuepF}%gO zL#fL!6k09Q% zJ$TD>19eD1;xvY0_viuv)`RdFRG7uU3IP_XLcr`Aq^q~F)LEhW;#usqdv#RG>hc+a z_&GtAIcFbR2adKnup=&ftR~}F70Yp*fVmAI+H246UHlyC#r({MXV2SJZCaH+Z&yKy zWM&p&ElczXvRt1qDE@w7*;5kOAYd*B#4lhdvr8afC{r1SR%kY%93L6B8D%cx);D+E~O6$y-8!B8x#A_3O+$Pg-+ zM}`2~xLX8R6O&hkI@Sp=^XN5Huu!W4$X*vL<_WM!rR%u0%;t9M10#_T4vbvFE;|jc zWQm-2(Sq#k6>!%`1Rq(&8SdOeiUV9 zYW?t{DFo4*f-HSg$ZwMXt0-~HZgdfPmqSpxg+}HwLijcsv3gesu%WBmMk8}nuISH# z#WCTtpg1NNMLrfv%@AOzZApsc9Sp^qvrd35cXZs|wHx?(Gj8u%b^?7^Z{`UwpOU1A zeS)FPZbD81{z*ZRnzS#>9bHRh(q0S1r|hx`=$#TS_rauHGO3+1Nx`X{6fz&27C>GC z&Rs!~zH495S+z~GGnkpV86h!);n=zr2(TFp&!U2Ds1*WCQ6a$0$L25;o2KF%UOe3j zeU*;g!>cq?WbO%}wj_}JRH$Q}0BcEf9y@HBZ^tb&Z(scEg5_(0`aj%f3&JJ3v>?@N`oD_49bm&RRE!rmqDvN^A*dqk2#YF-vgUDkcRE7Xs_$>mg#mOfa z%Dox&m%ViYEL8L#I_6SvZ7)Ukf=e5n#((mK1~EU?|r5JOQ@6&bLDOX#&iAlK}Hbe21Z!M}YwAWcZn2 xzCwU0Dg@Y9w6X6o6jKx>5J?N>83L@1ElH7lj-mJ-c|NgUZ5A`De)Xp7`5*F&B>eyY diff --git a/tests/regression_tests/surface_source_write/case-09/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-09/surface_source_true.h5 index 214d234c69d29d8625d39227c1cbf3042fa6804d..ebce87b36aff8050b2b6b9df2bf4292296045da5 100644 GIT binary patch delta 5383 zcmZ|T&2!Xr7zgluX?L@*JM@LpENEYZmbBKFsg9Ce4Z`*-`_zFeEr7VAg;vhQq^f6Q0Y|D`|w(2r0mR<%>x z2B%`x3hlss$ctM_vzDzXNK%xfOOkF$N|KZ%Q6#BIvO|)cl2lXSE7x|x$~}T|X5~WZ zv3Q9?klh;*_gHLeYVt5)uT?8%y6zIc_cp6p5q=*GtoB>AN~Wequ1WeW-o)N*4P?9a zb?S@a&)x=`L4Vqf$!=t#NjZ1 zlpYbQ!?0`q2t2atD1b|leNIGz3Hu=^i4cta&?6wo?x4^P0C)(>7$h8o7{MIp=X9uZ zPTgXAtij&HInf$}*WEt|@2;xB1YC{3LG#)6e0lZ+pUJUol+9!zeM#0P7pq;J$o*S4 znB?`x|F?coUWqcrFC9ZvruYqgLXwk`ETzI%r9aANb*eL~is+r<`+Hh0b|2%jT9!sU zBgt7w8j`G}!sn??!^wHm{H{1JZcX#M!c2v~Uhxyq#eCALW$*tBQkSMAmfTl;if_c4 zRJ1M^*-u*o*-w^>ovkm4pQrg1v?;Z_B)8LMU~L|PG7AZ3mR~MiqBRSbi}?)Hgaqs^ z(GLOm1le^7b&l`O4pEejyzN@DP-F=;08s9x*{F`x=|i zLLx-ak3qsmP!}NKA|wd*aVUuh*f|)BkO&A^LVFGp9)e=2 z0yeaM5)wXwx&#RqAwjU8hmweZKO?8$`(8l6&R07P;2|h4z*-yv)+5G*xeO&C0V~nZ z0QdxK$JDcsa0%Gr5=__)D2WJIiLn9@tndS$Ne}$+IXH0d986Am5k_(lVg&O%l!OSn z2?-xTU4?nL1Z-auOxPD75fQMBHkyzK2v|b1AmJe>FG0dVh!M;+zVl0Bbqy{>eI2^` z2XbvPi0@g!m0XPI~>M?@(DU^f+tVI6|z$akCs#hT460oC8uJDU$GX03y zy1H1+{s}-tSD}xw1rQ);pF_e!P_9A3Az;&wF=1{)Nl3s-^y`rD5!5fB#3f++nqb1d z0f~r!ZKLreBmx5V%~Jac5*~u`HB8JQU=xcmVY*NfBIw^h!becQg_*hpY}f?B{?2+J NyXy;`uh9Sf`WLLW=Oq9D delta 7761 zcmZ{oOK@6M9L9NtkX9>c9$=lcH>OQ*TH8_|k(gGANm|;Z%}o;xHrSA-pfw>cr9LX1 zx?si)a-1iX{9 z*3Q!A{_4Zn+Io}HgKRl3b?ol%Y%ImrEC$(jj#}rNuNQR++bk{%wXxZ3^sV{HOW!PZ zYtCiKL$NWIc-14W7hNl`~2GzF}R2C0MZCFIFNc0xzDVmkuPx|DSV3{_yGW!Fc3r$C?nwi6l9x4!1Vwq z;s{g_2rRJ`6k8Q0V@qJ??T&!x2@d2F1Sx{cz$(A2PHTlcTLx(*SD2R+y@r6X$`sNx z6gZHqv^5YTg+LvF&^oXxt}8Z+bl2Im%st0DsWE=V`cfwWK!4y5xxvZubST`(V!|Ft)1K9Ue0 zkrUrO$oT+(%vV4VMWBp;|7&2CWz~5*$d2RYi*6 zw;*_)18I4^-vLFE1L>!74JnN8fmMM6sX*;9P^37J6mG=YP(8WO1?jWwi65{$-d zwVJ(oIt2m3o|GJ8K3TZ)F}hY&nzlr9z1J<-?Zmg;?>z za+*0~h1Kkx0LNvZMad#701R?j0Pn0gsg;=D78%Ril~|gs5+*ySH2DrXO<#qVVuy5l zv5MR(!pfUQOj_ku$E#I{I9I#y0ZRI5oRIMSMhteq&+?=nJmm)mC7kI-&C`CCXC!>F ziAQl04*yx_pG_mU3QC))q2?B=#e1cOr4Kw2Beg2-R_d>|4X;YNMrE{CCAFPYiUPpm zitWJQ#%o3NPf5fU0Je37L1rgih|*5H!u7Jc=@?bF5FK2Tzoy%>VpySX?R~ zVgc38o!v`T#y;$(E`xo!4-Zf~H`+(8**@xWxerfNyLNIv<=V5CGn1;}BW60>Hh{Obg%XtcfYCm!*AgVre(1 znL11X77x?$u_FZX0(hSYM?XqA*#bZcm7_S9+vU-@V{~-s80nbDDbd1l)KSYdo+KSN ziB@XcMo-`^P}_D|K<}f!Th-|V>7@qfzl!1jwmL4|k|$|M^C!toKSgD+Php$(OP$t1 zjOl=?)gXzN21(pJjWMZ}I(wSjj59PTt^m+XZHStX9l~m=75aXNgi~iprzil-KrBTT zc>%yeKS#hmXF+?^mTVoS_GE@B;*tO$Y>tpcK>)ZxhDE?-pqj@GZ!f!{SxJ2UqUzaA={cEw@e1_ zj@poOY-N5yK^7PoUy_B(K>Lcim=ys2Jt;FteN7fc2C;7_>%0Ik-ufgp%4Seukhx46 zrOWtOsr{C|g0Jct*_PQWRA1vNX}JPG*4i}+Fe?D0P`-ve>XIi-UZ+7SUdMi`#h1K6 zR{0xfwNYwy-y|#hCWTO8kolIjo3{uQZsC{DHhFYBOGmp|a?_@`J_5i=WdY#P zOMOSd6$OAh9s8bK@&bUU{sU>)0)Rz@LFPxYCinhm@o7h;-aXnDmgGu;^n<`mBW0kEz7v$0VMzNxW#|j!|1M`Gj=x iPcRir-LI!)Wk03Cs0aZ4%RIA|dnb0Z`c3}-pZ@^et#!lz delta 7925 zcmZ{oOHh+n6vvYQLZsD5k$gUYfQYHJ8dPi$TB9H!pnUiu6@*aKLbVc~jn9T@r^8G) zF{d+SnI)Uf#Bsw+H(7O9#vRLa$Ep){EIQNXyXUr(Ip>}%RPytG{^xbST$20Iv+=7Z z74&TU{O0g$Pplf6D%;=Y*4?n;$-4{itm5O^M1|Ysay58euK2s(Dt`CunYllE`_bct zhtv0;%-);7b-P5>Yvj$_W=L)O!29UQ!#mUSw_G;9vEO}Flc4kes$4ZLC!)vWasDd( zWI2DiD%>kI>L0Gi5AgRktMd5K;QTwQ`WN?Z=WWeg|CC&b@csXR2U@%nNYuo|5>afLCG*)Kkq$A-sXuL2yxNE^opw~Fl zE*NXYX_r3@9J|x%!ywcmd>ABKFiR@yfz1OrR!YEb#a1w|ssUX^2pkZ`w?5D!6Sx3!FbHj(^eP|wl-UO|r_hL=5vci0s5GttQ><%1Gk{1KTR_21 z^{CH<`^?wE_Aa~@(uWx&x-c~w4+GDvu-uDPMroiVyyd@3FcfomLLQw5hVS-j9$%zzDbSp(YV^f{r(ISr@)@*1#|!@U@aC6(#LT4<=lYBd6V z!fM3(gm~*3u)##m3&pHxKr;YeKPp(i5*jd%LO&Km%Ri|G6B`f)lN}I@tU&}c9wZ0N zMy0!=&!4^^_}CZBsxFmYUXlfdP)1K%w~}Rs1h?W4CQoG$9Y(;~mm4-4ol(D~Mn;5P zNR0^bwlrXqja@Vw^{S;STojB#mxPLzHJ}xxN6kJ1u(;rd%-oR9%mik@ro5~HomqMkedzL6s7jNQLZx{@Rt1|wrEj=y3h8BTq8mL?)!?q$ z4NX({MO%6D>W-M48Zmz@x;};F(s&S=HXGHdvU1ZxS-u#?qg{f82F$3S0o^(noH1N@ zov#!Bm=Ugr)>lF?NeOI7z@8OCt!luIRp6GOSdu_d0@2$-sGJ6@yTLoCU|FR!pxX&s z5{P|`p_pP#1LhH$GoJvw-eu>^tCF5aA2##fk<@;rmulBs5^@79=ouA44&ZtOhKUwSWo+k_$LRI*$|1^D-S5 zo=0|E2)C*MTcf}OL9wI(n@LdvR%G-chGHH$4Opn)Bf&hS0rS|B6tTxbs5J?Mo}hwx zENej1O+Ph1gU_j3(&AI$mXv=gWETDo0qa*r1DXKTBv8RXJb|gvtshh$55I9Hr_FwaMzpcl z)$Jtz3XN!YA@CZF7+BJP#)F~;EQ9FxLJx8pFpppo6>NV~8ZgC{q=+pF4O?5BY;&Hs MbVa9~H_KlC0_7hp+W-In diff --git a/tests/regression_tests/surface_source_write/case-11/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-11/surface_source_true.h5 index ba52e9db16b185d91ce81e774b611e121ee5a0d6..b5b6036201bede37dac2749563dcd68620584009 100644 GIT binary patch delta 657 zcmcbiwL)Wp29t)!M6Eg|3HHfyENUAM++du%g6RU|jLDVEn%oA=j0_A6VjK(%8JpKK z?`E33hK*x#1Dnp|2W$e20h1fqv?nXDOQ|IQ6@b7AZU_w_g%}{hAR}&Tp32yqz&?eM z2db3eKM+jj;EX{Pr~nGELk$6|c!4eu!4<>HiKIec;zrTQ_qg16S&;PZ&+>58)VIU=3R295rbBr0K`!yh0z58Yi!jVf;KAX^6Ho~Z9R|D*9T;w&0hK^^ z!6ZJ226XYs8Bhu2U;(*)@&%{_ayWt|EckKwegQwk_vl8kfPJqZfW!9%0ub}iwN1VO zmB4VbgCIl)MzE}aN?_;^5P~=jJ-m#;PMaWv!)Xto+R&3_$Yeua@yQ9o5N+s&PTn9K PqXG&lbRWfo1d#v$mvG4e diff --git a/tests/regression_tests/surface_source_write/case-12/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-12/surface_source_true.h5 index 6f354b1015cea86ae135692e3a960ec6b6c55446..6c6925daba145c5db52a281023dd017f066e0732 100644 GIT binary patch delta 5802 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 BOaTA@ diff --git a/tests/regression_tests/surface_source_write/case-13/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-13/surface_source_true.h5 index 6f354b1015cea86ae135692e3a960ec6b6c55446..6c6925daba145c5db52a281023dd017f066e0732 100644 GIT binary patch delta 5802 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 BOaTA@ diff --git a/tests/regression_tests/surface_source_write/case-14/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-14/surface_source_true.h5 index 0ecaa85d61b0168a6b0871edb019b20c3f81e919..6c6925daba145c5db52a281023dd017f066e0732 100644 GIT binary patch delta 5802 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 CJWK)r diff --git a/tests/regression_tests/surface_source_write/case-15/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-15/surface_source_true.h5 index 1a0d7abe2054c04fe14ffd74163a0b4f06396bad..5bdb39b2a703fa7cdb17a153a688cb0ea7664f1c 100644 GIT binary patch delta 81 zcmV-X0IvV25#SJzC;?!RDSrYO2a_HICb7WS0h6c#&;gi}c>^g6FarSq000&U003yS ntpmFPldJ{^lYj;+li&sr0Z@~H1}l>w2RsDcDavTGUI-4zv Nv7SceW(jr=MgSDIAn^bI diff --git a/tests/regression_tests/surface_source_write/case-16/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-16/surface_source_true.h5 index 8d1aeed061642f738694a175330fe5a3e93f8098..79ac8e1a65e38b5b4c38de45c29da9f3579a35aa 100644 GIT binary patch delta 5649 zcmZvgPfQeN7{-?cVUgVxq0r%vQ$(Nx;)>Sl`frO>aV@%1s&(3~h!*Wwbrq~Qv~>l= zI&BkDGEKTC&U0u*@ z7JR)J{6z~6KV2Tk29-Knt?7ID+N-ji;6GJ4d#<{_VW_$)5D2t}0s-UIAJu;a?cZxd z_I&N2{ie3DYRq1!-EDW(wf9Xj0sne4xAAl1dsAQo^Ag4Wzl~Rub-z}HYc?hSvM)PS zpAOggfyqF7_3zkeN=G(NFu;!`DE8Al65irh zS;qN&T{sno0sqjpqS5*4c*qrv&L?2BUjnoJ z(9!FMj>!Q4`2k7C#BNFPRT)$VCCa5i*nMeG(j>D7RPG+SL@{S71}Y~;ceeZ|d;Ipo z+}2*Wm1P9R5N%e^H@!Xtb&~sNaG@&fqcaPb*bg~#`y~z3_axRO8LY@)=77XrJOG{J z@5As80_7kmECl6)^bge!2FM#hJ4{#8ARfiTw77uk5h!jR zkytCJ(vLy}_b9c6dB@Z-x=jJsj=?sSdjqrNW1cWsbFu2D6eZ7AGAkP5Z z)i8kEFdZezTdOA^wRr-b^AZE(Ril3htz8DlXGZ)aoqQYbw04qCE@12ww6{)4tkKh; zGET#69s_hgBakUSLJK$YOo=m4ICqBLUZGNxpfZ!tt;7J`(OGEko~4Di^Y*Ea=t=}! z1K7lsu~E1o)+j_MkJ9;sEqe}Z-Z_bC;yitTgtc%UtXhg*AE8=JNv!Gxu$mX>CulPt zse&qfOrk1|L9O`5aP$rXWcSLrq|VAXoMCw!>KLEEk$DWzJ9Uv3ZsB7TF48j;FmVY| z=Pp6W(5KMNWPprOVt};QFVnMYZ6s(xJVhLviIZ02Tw}87?zG-Y3TAVDS(n zzW_xZftH3YIR?nop)2&3DSXJKD|AQ!D>9gwkSL2Xn7WEPx(eBpNyug)C?hbgfyKK< zuZ&1OaUELcuY*nd5%j`C1aXXPQyB#K98B``Y+ zLA_aerG$0j5vcNyV1b$`v8|dgPG}C&n+%XQTM2>wEht$t=C&LRH9uN_!$vtv;c5Tv*k4u$uFbt28gkm05t}aTmZAe+nCL z7$93zp2422XEb#W-#~N`0vd}@*juClg>B+F9ag}?bEu{L0JU-qkdUDlpfDLA=T>?_ r+xPO+84EhO7TDrHLScsiQds#3fQ6up!1y`c>HpoNck{n{|Nr<82H|YW delta 7932 zcmaKwO;A&36oy0i3&m0pBwJKDrsiLByhSt`!qC`Ojf8hEbtJOH|f|+h& zzRonuEVJoMI&PThCQFuCW|{7?%#uZC+T8D)Y43dJzGT7QGw(U?dCzyh0HvRUwcmo7 zNU-+H`(1B>$#%85W$=$urAZZn<)*57*}Ste)!Y;a1lD&10?vouoBs^<-kh7d{p9KV zQuA$lJDxmyd}nfYIuKWn+Kx6|X?)xrabas96mZJ~gF*LG<2%d! z6liWLg!C7I*iY*3Hml{}zR2tctNqueZuiG6!~*{`UhbD_F*Kn;y9w+L0u7t`^`Bya zfl$;DNPGl(ln{t?g60_pVvc2`NUow%LXqjTRCU#ee=O0Df#niVQ?^tD6)8 zq#1~{*N`IK1DY=)V6O*?1qNb+bp#TwYAN0=m(~xFw8q(ebhIBT8dKCm> zn}MRhz;vL(TadM`wY@5{g{+Bisw^|ZX;rQ)X#-i&rfz0*B#UkZvh-H4qZ$J-R(u;N z#Ccm}U>aBUcK?IerVnC%JJ?ZuMVT`IWTgS}X9l4nI|vAWnH~Powd=&ggCM%(Aj!-P zw(GH~EE6$BKLP%70AwR8*-J-&y)w(BJ@*{NcLG^{C)qP)Dzppub{GgnWtacnDc8jA zk+6F`d1cCO=~j!o$29QnsR8=b;GQ!Ycq7${g*~M3-b@SFR2j+a=nBnLJ_@?kSClyifUI}lqwzf&v}iu z7CQl~Wlm5%bE|5Zf$*G+O~~6c*4nKqF}fSQaVi(YzVx{?T~J`)?V%OnlcX>}pL%nW zE@rP?t*ElX8(0JMsY|DTqIe3pvPQs-?TmozD-68N_3afqO-u3GbwQV2O6fFMO85*l zGVcSGVjvn-&-ibDt-e8$XQ`2>S3J9tEIJBg=~3XX#z36s_&I81Iv{`LbD)uZo@Cx5 z<>t3ekCi_UWc3wg&IKSVU7)edZYnZHK#Y|cL;l>~e8Ly0k-2@9ya*aCG4P&ycU~2} zL<+I^+$DbpJ^F-Mm;LYT9-UwMG6$SD|IItG` zit3pMNfj6f2jQ>5FewJ6165@p&cWyvP^yT4^$k#@5vVZ`uHxTY(5tvkklb}(GfoN1kiqV^( zRFQ#bZrvi!=6%T@(+BYu31JhdzxhCxcxf5{4|KKJ`MJs zxJ|&Ur%DXWsZ`_+D3!V6KT*H>YuHj3v+k3g1%1jaGwqQqeh-#-VN-h%E^Be9Oy1FC0^r3ws8<0||R zHagL`h#u0OM6OkqnZVZhCFej8#X0I`u7hOJc_2&A(^#fV)#gz>_rJR{4v1;d0kPYU zKz<7d)DcKL20cm$M4kXehJhG=8G+Q#$SLdA^!r*5=s#evp5XQ!>K9^gtgd9P^!Q{J~uy*LOf|H2BJrmfjPb! zeFd5qU-_Tz0euNXUxU+~eogg6qZ$JdSo}v)h$$Bt2!;KI6k^H+20~G1AY3Khf>I?0 gqEsXe6d44T5lFrRrIy}J47h*Zn9X;%KlHr*1$xvjH2?qr diff --git a/tests/regression_tests/surface_source_write/case-17/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-17/surface_source_true.h5 index cd1b24a7bd70089876b700d3fa980dbcc9c7ad6e..aadcc3fa407a973be80196cab5f3cc4051c1a724 100644 GIT binary patch delta 81 zcmV-X0IvV25#SJzC;?!RDSrYO2a_HICb7WS0h6c#&;gi}c>^g6FarSq000&U003yS ntpmFPldJ{^lYj;+li&sr0Z@~H1}l>w2RsDdDavTGUI-4zv NiJnI0W(jr=MgSDRAo2hJ diff --git a/tests/regression_tests/surface_source_write/case-18/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-18/surface_source_true.h5 index cd1b24a7bd70089876b700d3fa980dbcc9c7ad6e..e5a7619c552c4321cdcaa3710363e430fa57516b 100644 GIT binary patch delta 81 zcmV-X0IvV25#SJzC;?!RDSrYO2a_HICb7WS0h6c#&;gi}c>^g6FarSq000&U003yS ntpmFPldJ{^lYj;+li&sr0Z@~H1}l>w2RsDeDavTGUI-4zv NiJnI0W(jr=MgSDRAo2hJ diff --git a/tests/regression_tests/surface_source_write/case-19/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-19/surface_source_true.h5 index cd1b24a7bd70089876b700d3fa980dbcc9c7ad6e..db8a49dceeb20ebdc3e0c1b8db765cafed5a4052 100644 GIT binary patch delta 81 zcmV-X0IvV25#SJzC;?!RDSrYO2a_HICb7WS0h6c#&;gi}c>^g6FarSq000&U003yS ntpmFPldJ{^lYj;+li&sr0Z@~H1}l>w2RsDfDavTGUI-4zv NiJnI0W(jr=MgSDRAo2hJ diff --git a/tests/regression_tests/surface_source_write/case-20/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-20/surface_source_true.h5 index 430bf90269899b49d2aa8514c3534b168fbcca40..01d2abf61cf8a41876d664d1aa505a967e7559cb 100644 GIT binary patch delta 5230 zcmZA5$&yty0Eh8=Z&TetP!SO$BI4Ah0Tt&sqk_f>0TH9N+RkyFHSK_ah*39M$13v( zS?I!IlPWhXQ?6WQiMu>PcG6V4z%Pq)PW|fpp9e_$b#mh9-RapdPM2Pbl7*tBBy zj}vt~q{-joI4n-ht=c{{9*sup#c1S?|33BSWcY1b42Pz-4JW79jQ0$Or?(E9XEw|( zECr{}$;IXO@^kHInNR=XpSi!>@r9XR#;aHSm;AeQ2C;Jf|KJIYV9&y&5cDb(i6B>_ z2!u{>XJb+c<{T86pw2}R31STjPiO>t9wvpL*P=)Sc|M9j=mfV8lS(ibpvVNZ9z`UG z3sHDNBUp(^A?S-xB!b+4A`m*kU5rU3n2jhhL0y6(62vAHp3n&PQcMa#Z$^;_@-h^G z&t4JL)4uSJmv@;VfO&f_n^oGwF5;Yh_eCof_@l9BFINj1VSgc zM=_}c^B9UuP`gn?f_NN-Cp3cHgGnLiy(khv?n4m>o#39pq!P@26q%r&L=g$%018iN z1p5>wg`h2pM37IT2!u{>&tOss=2;Y(pyp9Tf_M&vCp3b69+N`QFQ7;Sxqu=NI>Eh& zNhO$jfa1N77FmIs91obA0NDyzK@PtON zZ(~vj`W+OBAm2q12%X^G!=w_-`zSI&eSjho#D^$6p%Lsym=uEk7)2t;Pf!FxC%8{B zsRZ*GicC-*MI?wt6rRus_H#@ML4ScF5#*OB0-+P!SC~|SIfxu6LLwo#*o*)Q&rv<^g_S?iC{e5TGmR2?|u5T=^Z7rQ& zU0&JN?nu_Bj!tiGZJb+NT^6k5!qkc0>FwJiYKOZ7QRrs+{eE}1{Y>uego$1%{_{XE zen|eDk|&QJQ&+FayMO7;b}vu>)z6%1E zpd`@mhN&Tecn=gFK}BHfhpCi6x)%zcU`${tFf}5O?}H*Bs0pn5VJag~9)KbwXb9{B zFqIRi4?+z*I({Xi$U%4T1eAOyvaXV^Bl{ErIhmOcey$6Hp8Q;^Ppw1SNs~ zBuotn#HXO}2r2?YhpCi6dKwC!U`${>15+ac`2-XJK}}#i3sV_^@*ET)K|^3a4^ugT z`T`UYK}+BmFjWv}FG4W@h+l%hB`68>mtks1Aie^HM^F(MufkMHAiV~KPcSAhUx%p? zfowt%5Yz210`VOvJc5eAco(Kp0%;x!e}0E=-PkpoH1l)+znJg9J`Io)sAu2@49>u(stK(3 zpvVZ6_n`<08UovfshmLl0E&p9C2&53se(ZJ2#Ntfya0hqP!i}L!_<&K`~(V*pdv69 zVJan%94LH(F@bp&rbYzvr%(h0HG#DRQyGD>3`I!L5ZEg)l@qAvpoj=s0_QWBDhMr%1h6JJyg-1{k7?)rwC6K;> z!Y3FLnBT(Gh(P`hih!Udu)c?>j6k^zMM%&P*jHdGCr|?@B7&B{xe8Oo)rAB9{Y$HR KeyY2^g6FarSq000&U003yS ntpmFPldJ{^lYj;+li&sr0Z@~H1}l>w2RsDgDavTGUI-4zv Nsh&pWW(jr=MgSDaAoBnK diff --git a/tests/regression_tests/surface_source_write/case-a01/surface_source_true.h5 b/tests/regression_tests/surface_source_write/case-a01/surface_source_true.h5 index ddb29c5cf5f536f7ef9cf905fa5fc89ccf477135..da36fc505eb67f3da0ce48511464b699a4fb16e3 100644 GIT binary patch delta 889 zcmZ9LzfQtX6o+qH(iUlzw)|@~#)$wrIFLx&2hjtsEH1S zg~WvsHwOpY82bn~>8)kxIcI2-FW>#0b5GjnVA{N|$w%Hp<3_G%u$`&CP3IDX@~1R{ zYo(ssS0u(*NoOn=zbfxCyr??ds(Y|d^U^uosk^YFdDX5E;#yeAJ9*kH!EwY@`zsiC zwMWU2SIVy_(6bzaz5uZw*S`@_qqD{hB@q&1CIAX;<%kjHxS0-Z!qD&$vB4$e7Ux0L9hy+Mq2s#$N;UPTRzL`#K!-qv? zZQ1xx33>$|H<}kXO1S{nAt?ig%(8TFYy-}UQSkyKixWPDi1=9t_2a_wAHMuL885tND#5frk3O280 z-pwSQn3tSdT#{cDpI4fklbMnVlm&sw`E0tJ#id1Q@tG+M0h0^atQkXqq_ze~l9hpj z0b~pl6BCF6@+3eM12f|a4lskkL3r{XHVGC}J&nxG66{kLML@z#5IKhbKmcM+-oX)r zT|$8qA^|oXs1mND11f=G)CZ^pGrAoSTsZ7F0F}Vdp}`#^3Ni)Va+AqFxudblI8L63 zLq=%wNgjwEbZeX^CqiY=?Gc`A$Qum~7j&7)GkCFw%OpPR;*&FQNnC(RU<9NEKaTKP z0F^-Z$Yc%y9F`XdU=K*^$&P|JJh(y-yB4v@Hw7T!i0)wf$q$8a80I02!(khQvD>0G zSrBR#h9@h8AX?C^kD4qgg2Va-5r`IavsfkviegVk_LEALIF)G;dV;nTALyH^+06r!e=l}o! diff --git a/tests/regression_tests/surface_source_write/test.py b/tests/regression_tests/surface_source_write/test.py index 0a49606e4c8..f144eb82a73 100644 --- a/tests/regression_tests/surface_source_write/test.py +++ b/tests/regression_tests/surface_source_write/test.py @@ -633,16 +633,15 @@ def return_surface_source_data(filepath): time = point.time wgt = point.wgt delayed_group = point.delayed_group - ancestor_nuclide = point.ancestor_nuclide surf_id = point.surf_id particle = point.particle key = ( f"{r[0]:.10e} {r[1]:.10e} {r[2]:.10e} {u[0]:.10e} {u[1]:.10e} {u[2]:.10e}" - f"{e:.10e} {time:.10e} {wgt:.10e} {delayed_group} {ancestor_nuclide} {surf_id} {particle}" + f"{e:.10e} {time:.10e} {wgt:.10e} {delayed_group} {surf_id} {particle}" ) keys.append(key) - values = [*r, *u, e, time, wgt, delayed_group, ancestor_nuclide, surf_id, particle] - assert len(values) == 13 + values = [*r, *u, e, time, wgt, delayed_group, surf_id, particle] + assert len(values) == 12 data.append(values) data = np.array(data) From d855c5c73f636d10fd1c6f906e88958b041f41e2 Mon Sep 17 00:00:00 2001 From: GuySten Date: Sun, 30 Nov 2025 19:10:35 +0200 Subject: [PATCH 30/50] fix source file --- .../surface_source/surface_source_true.h5 | Bin 114216 -> 116096 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/regression_tests/surface_source/surface_source_true.h5 b/tests/regression_tests/surface_source/surface_source_true.h5 index dab07047713bf700f28327da0a0e11b0c7b4a858..7bb522c9d5f4c7ee981918bb3f80a2c7cb89d890 100644 GIT binary patch delta 4524 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 NQ$5TWzTw>`#h+c@$`$|s delta 4494 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 XujCP2tufw$vDkT&4(4GGEy(`?xn#B% From dc46eeadff7e29e239936801dcdcd0b5b1c40090 Mon Sep 17 00:00:00 2001 From: GuySten Date: Thu, 4 Dec 2025 14:18:39 +0200 Subject: [PATCH 31/50] changed python api to support fetching kinetic parameters per nuclide --- docs/source/usersguide/kinetics.rst | 2 +- openmc/model/model.py | 10 +++-- openmc/statepoint.py | 14 +++--- .../ifp/nuclidewise/inputs_true.dat | 45 +++++++++++++++++++ .../ifp/nuclidewise/results_true.dat | 33 ++++++++++++++ .../regression_tests/ifp/nuclidewise/test.py | 41 +++++++++++++++++ tests/unit_tests/test_ifp.py | 31 ++++++++----- 7 files changed, 153 insertions(+), 23 deletions(-) create mode 100644 tests/regression_tests/ifp/nuclidewise/inputs_true.dat create mode 100644 tests/regression_tests/ifp/nuclidewise/results_true.dat create mode 100644 tests/regression_tests/ifp/nuclidewise/test.py diff --git a/docs/source/usersguide/kinetics.rst b/docs/source/usersguide/kinetics.rst index 53768ceb082..85d5035a264 100644 --- a/docs/source/usersguide/kinetics.rst +++ b/docs/source/usersguide/kinetics.rst @@ -118,7 +118,7 @@ for ``ifp-denominator``: \beta_{\text{eff}} = \frac{S_{\text{ifp-beta-numerator}}}{S_{\text{ifp-denominator}}} The kinetics parameters can be retrieved directly from a statepoint file using -the :meth:`openmc.StatePoint.ifp_results` method:: +the :meth:`openmc.StatePoint.get_kinetics_parameters` method:: with openmc.StatePoint(output_path) as sp: generation_time, beta_eff = sp.get_kinetics_parameters() diff --git a/openmc/model/model.py b/openmc/model/model.py index 64294c23cbb..bbbc64c5d79 100644 --- a/openmc/model/model.py +++ b/openmc/model/model.py @@ -235,13 +235,13 @@ def _get_all_materials(self) -> dict[int, openmc.Material]: return materials - def add_kinetics_parameters_tallies(self, num_groups: int | None = None): + def add_kinetics_parameters_tallies(self, num_groups: int | None = None, nuclides: Sequence[str] | None = None): """Add tallies for calculating kinetics parameters using the IFP method. This method adds tallies to the model for calculating two kinetics parameters, the generation time and the effective delayed neutron fraction (beta effective). After a model is run, these parameters can be - determined through the :meth:`openmc.StatePoint.ifp_results` method. + determined through the :meth:`openmc.StatePoint.get_kinetics_parameters` method. Parameters ---------- @@ -249,7 +249,9 @@ def add_kinetics_parameters_tallies(self, num_groups: int | None = None): Number of precursor groups to filter the delayed neutron fraction. If None, only the total effective delayed neutron fraction is tallied. - + nuclides : int, optional + Nuclides to calculate separate kinetic parameters for. + If None, do not separate kinetic parameters per nuclide. """ if not any('ifp-time-numerator' in t.scores for t in self.tallies): gen_time_tally = openmc.Tally(name='IFP time numerator') @@ -260,6 +262,8 @@ def add_kinetics_parameters_tallies(self, num_groups: int | None = None): beta_tally.scores = ['ifp-beta-numerator'] if num_groups is not None: beta_tally.filters = [openmc.DelayedGroupFilter(list(range(1, num_groups + 1)))] + if nuclides is not None: + beta_tally.nuclides = list(nuclides) self.tallies.append(beta_tally) if not any('ifp-denominator' in t.scores for t in self.tallies): denom_tally = openmc.Tally(name='IFP denominator') diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 11986841f0e..2d656cdabc0 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -761,21 +761,17 @@ def get_ufloat(tally, score): return uarray(tally.get_values(scores=[score]), tally.get_values(scores=[score], value='std_dev')) - denom_values = get_ufloat(denom_tally, 'ifp-denominator') + denom_value = get_ufloat(denom_tally, 'ifp-denominator').squeeze() if gen_time_tally is None: generation_time = None else: - gen_time_values = get_ufloat(gen_time_tally, 'ifp-time-numerator') - gen_time_values /= denom_values*self.keff - generation_time = gen_time_values.flatten()[0] + generation_time = get_ufloat(gen_time_tally, 'ifp-time-numerator').squeeze() + generation_time /= denom_value*self.keff if beta_tally is None: beta_effective = None else: - beta_values = get_ufloat(beta_tally, 'ifp-beta-numerator') - beta_values /= denom_values - beta_effective = beta_values.flatten() - if beta_effective.size == 1: - beta_effective = beta_effective[0] + beta_effective = get_ufloat(beta_tally, 'ifp-beta-numerator').squeeze() + beta_effective /= denom_value return KineticsParameters(generation_time, beta_effective) diff --git a/tests/regression_tests/ifp/nuclidewise/inputs_true.dat b/tests/regression_tests/ifp/nuclidewise/inputs_true.dat new file mode 100644 index 00000000000..c0993614f18 --- /dev/null +++ b/tests/regression_tests/ifp/nuclidewise/inputs_true.dat @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + eigenvalue + 1000 + 20 + 5 + + + -10.0 -10.0 -10.0 10.0 10.0 10.0 + + + true + + + 5 + + + + 1 2 3 4 5 6 + + + ifp-time-numerator + + + 1 + U235 Pu239 + ifp-beta-numerator + + + ifp-denominator + + + diff --git a/tests/regression_tests/ifp/nuclidewise/results_true.dat b/tests/regression_tests/ifp/nuclidewise/results_true.dat new file mode 100644 index 00000000000..c3a0946f9e5 --- /dev/null +++ b/tests/regression_tests/ifp/nuclidewise/results_true.dat @@ -0,0 +1,33 @@ +k-combined: +1.244762E+00 5.675228E-03 +tally 1: +7.903583E-08 +4.224633E-16 +tally 2: +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +1.400000E-02 +1.960000E-04 +7.000000E-03 +4.900000E-05 +7.000000E-03 +4.900000E-05 +0.000000E+00 +0.000000E+00 +8.000000E-03 +6.400000E-05 +tally 3: +1.515000E+01 +1.531553E+01 diff --git a/tests/regression_tests/ifp/nuclidewise/test.py b/tests/regression_tests/ifp/nuclidewise/test.py new file mode 100644 index 00000000000..f4904812c58 --- /dev/null +++ b/tests/regression_tests/ifp/nuclidewise/test.py @@ -0,0 +1,41 @@ +"""Test the Iterated Fission Probability (IFP) method to compute adjoint-weighted +kinetics parameters using dedicated tallies.""" + +import openmc +import pytest + +from tests.testing_harness import PyAPITestHarness + +@pytest.fixture() +def ifp_model(): + # Material + material = openmc.Material(name="core") + material.add_nuclide("U235", 1.0) + material.add_nuclide("Pu239", 1.0) + material.set_density('g/cm3', 16.0) + + # Geometry + radius = 10.0 + sphere = openmc.Sphere(r=radius, boundary_type="vacuum") + cell = openmc.Cell(region=-sphere, fill=material) + geometry = openmc.Geometry([cell]) + + # Settings + settings = openmc.Settings() + settings.particles = 1000 + settings.batches = 20 + settings.inactive = 5 + settings.ifp_n_generation = 5 + + model = openmc.Model(settings=settings, geometry=geometry) + + space = openmc.stats.Box(*cell.bounding_box) + model.settings.source = openmc.IndependentSource( + space=space, constraints={'fissionable': True}) + model.add_kinetics_parameters_tallies(num_groups=6, nuclides = ["U235", "Pu239"]) + return model + + +def test_iterated_fission_probability(ifp_model): + harness = PyAPITestHarness("statepoint.20.h5", model=ifp_model) + harness.main() diff --git a/tests/unit_tests/test_ifp.py b/tests/unit_tests/test_ifp.py index e527f162460..a49ecede169 100644 --- a/tests/unit_tests/test_ifp.py +++ b/tests/unit_tests/test_ifp.py @@ -21,6 +21,7 @@ def geometry(): openmc.reset_auto_ids() material = openmc.Material() material.add_nuclide("U235", 1.0) + material.add_nuclide("Pu239", 1.0) sphere = openmc.Sphere(r=1.0, boundary_type="vacuum") cell = openmc.Cell(region=-sphere, fill=material) return openmc.Geometry([cell]) @@ -50,15 +51,20 @@ def test_exceptions(options, error, run_in_tmpdir, geometry): @pytest.mark.parametrize( - "num_groups, use_auto_tallies", + "num_groups, use_auto_tallies, nuclides", [ - (None, True), - (None, False), - (6, True), - (6, False), + (None, True, None), + (None, False, None), + (6, True, None), + (6, False, None), + (None, True, ["U235", "Pu239"]), + (None, False, ["U235", "Pu239"]), + (6, True, ["U235", "Pu239"]), + (6, False, ["U235", "Pu239"]), + ], ) -def test_get_kinetics_parameters(run_in_tmpdir, geometry, num_groups, use_auto_tallies): +def test_get_kinetics_parameters(run_in_tmpdir, geometry, num_groups, use_auto_tallies, nuclides): # Create basic model model = openmc.Model(geometry=geometry) model.settings.particles = 1000 @@ -68,13 +74,16 @@ def test_get_kinetics_parameters(run_in_tmpdir, geometry, num_groups, use_auto_t # Add IFP tallies either via the convenience method or manually if use_auto_tallies: - model.add_kinetics_parameters_tallies(num_groups=num_groups) + model.add_kinetics_parameters_tallies(num_groups=num_groups, nuclides=nuclides) else: for score in ["ifp-time-numerator", "ifp-beta-numerator", "ifp-denominator"]: tally = openmc.Tally() tally.scores = [score] - if score == "ifp-beta-numerator" and num_groups is not None: - tally.filters = [openmc.DelayedGroupFilter(list(range(1, num_groups + 1)))] + if score == "ifp-beta-numerator": + if num_groups is not None: + tally.filters = [openmc.DelayedGroupFilter(list(range(1, num_groups + 1)))] + if nuclides: + tally.nuclides = nuclides model.tallies.append(tally) # Run and get kinetics parameters @@ -84,5 +93,7 @@ def test_get_kinetics_parameters(run_in_tmpdir, geometry, num_groups, use_auto_t assert isinstance(params, openmc.KineticsParameters) assert params.generation_time is not None assert params.beta_effective is not None - if num_groups is not None: + if num_groups is not None and not nuclides: assert len(params.beta_effective) == num_groups + if num_groups is not None and nuclides: + assert params.beta_effective.shape == (num_groups, len(nuclides)) From 965a92f5ab5ee686edd0c0ec452dc5651a8b9dcd Mon Sep 17 00:00:00 2001 From: GuySten Date: Thu, 4 Dec 2025 14:26:59 +0200 Subject: [PATCH 32/50] some minor improvements --- openmc/model/model.py | 3 ++- tests/unit_tests/test_ifp.py | 32 +++++++++++++++++--------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/openmc/model/model.py b/openmc/model/model.py index bbbc64c5d79..5973064f619 100644 --- a/openmc/model/model.py +++ b/openmc/model/model.py @@ -252,6 +252,7 @@ def add_kinetics_parameters_tallies(self, num_groups: int | None = None, nuclide nuclides : int, optional Nuclides to calculate separate kinetic parameters for. If None, do not separate kinetic parameters per nuclide. + """ if not any('ifp-time-numerator' in t.scores for t in self.tallies): gen_time_tally = openmc.Tally(name='IFP time numerator') @@ -262,7 +263,7 @@ def add_kinetics_parameters_tallies(self, num_groups: int | None = None, nuclide beta_tally.scores = ['ifp-beta-numerator'] if num_groups is not None: beta_tally.filters = [openmc.DelayedGroupFilter(list(range(1, num_groups + 1)))] - if nuclides is not None: + if nuclides: beta_tally.nuclides = list(nuclides) self.tallies.append(beta_tally) if not any('ifp-denominator' in t.scores for t in self.tallies): diff --git a/tests/unit_tests/test_ifp.py b/tests/unit_tests/test_ifp.py index a49ecede169..5952eaf1efd 100644 --- a/tests/unit_tests/test_ifp.py +++ b/tests/unit_tests/test_ifp.py @@ -51,20 +51,19 @@ def test_exceptions(options, error, run_in_tmpdir, geometry): @pytest.mark.parametrize( - "num_groups, use_auto_tallies, nuclides", + "num_groups, nuclides, use_auto_tallies", [ - (None, True, None), - (None, False, None), - (6, True, None), - (6, False, None), - (None, True, ["U235", "Pu239"]), - (None, False, ["U235", "Pu239"]), - (6, True, ["U235", "Pu239"]), - (6, False, ["U235", "Pu239"]), - + (None, None, True), + (None, None, False), + (6, None, True), + (6, None, False), + (None, ["U235", "Pu239"], True), + (None, ["U235", "Pu239"], False), + (6, ["U235", "Pu239"], True), + (6, ["U235", "Pu239"], False), ], ) -def test_get_kinetics_parameters(run_in_tmpdir, geometry, num_groups, use_auto_tallies, nuclides): +def test_get_kinetics_parameters(run_in_tmpdir, geometry, num_groups, nuclides, use_auto_tallies): # Create basic model model = openmc.Model(geometry=geometry) model.settings.particles = 1000 @@ -93,7 +92,10 @@ def test_get_kinetics_parameters(run_in_tmpdir, geometry, num_groups, use_auto_t assert isinstance(params, openmc.KineticsParameters) assert params.generation_time is not None assert params.beta_effective is not None - if num_groups is not None and not nuclides: - assert len(params.beta_effective) == num_groups - if num_groups is not None and nuclides: - assert params.beta_effective.shape == (num_groups, len(nuclides)) + if num_groups is not None: + if nuclides: + assert params.beta_effective.shape == (num_groups, len(nuclides)) + else: + assert len(params.beta_effective) == num_groups + elif nuclides: + assert len(params.beta_effective) == len(nuclides) From 5d6b8bf877c48ba5204684dd2920e2d0415f13f4 Mon Sep 17 00:00:00 2001 From: GuySten Date: Thu, 4 Dec 2025 14:47:45 +0200 Subject: [PATCH 33/50] fix test structure --- tests/regression_tests/ifp/nuclidewise/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/regression_tests/ifp/nuclidewise/__init__.py diff --git a/tests/regression_tests/ifp/nuclidewise/__init__.py b/tests/regression_tests/ifp/nuclidewise/__init__.py new file mode 100644 index 00000000000..e69de29bb2d From 272163b4586bdb6e4348d614adee857f92127757 Mon Sep 17 00:00:00 2001 From: OlivaresDarian <163006793+OlivaresDarian@users.noreply.github.com> Date: Tue, 9 Dec 2025 09:17:06 +0100 Subject: [PATCH 34/50] Apply suggestion from @GuySten You're right. It is affecting the switch-case loop. Co-authored-by: GuySten <62616591+GuySten@users.noreply.github.com> --- src/tallies/tally.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tallies/tally.cpp b/src/tallies/tally.cpp index bdf82d1713a..cef3079aafd 100644 --- a/src/tallies/tally.cpp +++ b/src/tallies/tally.cpp @@ -238,8 +238,6 @@ Tally::Tally(pugi::xml_node node) // This bool indicates if the ancestor_nuclide vector has to be filled if (nuclides_[0] > -1) { settings::ifp_beta_nuclide = true; - } else { - continue; } case SCORE_IFP_DENOM: if (settings::ifp_parameter == IFPParameter::None) { From fbfa5f3aa23f6dd0015c089efeedb17651ec3f9c Mon Sep 17 00:00:00 2001 From: OlivaresDarian <163006793+OlivaresDarian@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:46:55 +0100 Subject: [PATCH 35/50] Update src/ifp.cpp Co-authored-by: GuySten <62616591+GuySten@users.noreply.github.com> --- src/ifp.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ifp.cpp b/src/ifp.cpp index f93264ae2cf..833e460b0bb 100644 --- a/src/ifp.cpp +++ b/src/ifp.cpp @@ -117,7 +117,6 @@ void send_ifp_info(int64_t idx, int64_t n, int n_generation, int neighbor, MPI_Isend(&send_delayed_groups[n_generation * idx], n_generation * static_cast(n), MPI_INT, neighbor, mpi::rank, mpi::intracomm, &requests.back()); - // Is it needed also for the ancestor nuclide MPI_Isend(&send_ancestors[n_generation * idx], n_generation * static_cast(n), MPI_INT, neighbor, mpi::rank, mpi::intracomm, &requests.back()); From 4abfdbe7ef4585b0a4ad8e4a9ebcebf448efb561 Mon Sep 17 00:00:00 2001 From: OlivaresDarian <163006793+OlivaresDarian@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:47:06 +0100 Subject: [PATCH 36/50] Update src/ifp.cpp Co-authored-by: GuySten <62616591+GuySten@users.noreply.github.com> --- src/ifp.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ifp.cpp b/src/ifp.cpp index 833e460b0bb..f196eb91cf2 100644 --- a/src/ifp.cpp +++ b/src/ifp.cpp @@ -141,7 +141,6 @@ void receive_ifp_data(int64_t idx, int64_t n, int n_generation, int neighbor, MPI_Irecv(&delayed_groups[n_generation * idx], n_generation * static_cast(n), MPI_INT, neighbor, neighbor, mpi::intracomm, &requests.back()); - // Is it needed also for the ancestor nuclide MPI_Irecv(&ancestors[n_generation * idx], n_generation * static_cast(n), MPI_INT, neighbor, neighbor, mpi::intracomm, &requests.back()); From e61ecb9d1fadcae66105ad362521003ca998227d Mon Sep 17 00:00:00 2001 From: GuySten Date: Tue, 9 Dec 2025 18:40:08 +0200 Subject: [PATCH 37/50] various fixes --- include/openmc/particle_data.h | 13 +++++-------- openmc/lib/core.py | 2 +- openmc/source.py | 8 +++----- src/ifp.cpp | 15 +++++---------- src/initialize.cpp | 8 ++++---- src/particle.cpp | 3 +-- .../surface_source/surface_source_true.h5 | Bin 116096 -> 106144 bytes .../surface_source/surface_source_true.mcpl | Bin 36120 -> 36120 bytes 8 files changed, 19 insertions(+), 30 deletions(-) diff --git a/include/openmc/particle_data.h b/include/openmc/particle_data.h index 3b091f8631c..1bf7a5e4378 100644 --- a/include/openmc/particle_data.h +++ b/include/openmc/particle_data.h @@ -47,12 +47,12 @@ struct SourceSite { double time {0.0}; double wgt {1.0}; int delayed_group {0}; - int ancestor_nuclide {0}; int surf_id {SURFACE_NONE}; ParticleType particle; // Extra attributes that don't show up in source written to file int parent_nuclide {-1}; + int ancestor_nuclide {-1}; int64_t parent_id; int64_t progeny_id; }; @@ -518,6 +518,7 @@ class ParticleData : public GeometryState { int event_mt_; int delayed_group_ {0}; int parent_nuclide_ {-1}; + int ancestor_nuclide_ {-1}; int n_bank_ {0}; double bank_second_E_ {0.0}; @@ -529,8 +530,6 @@ class ParticleData : public GeometryState { // Iterated Fission Probability double lifetime_ {0.0}; //!< neutron lifetime [s] - int ancestor_nuclide_ {0}; - int n_collision_ {0}; bool write_track_ {false}; @@ -645,10 +644,6 @@ class ParticleData : public GeometryState { double& lifetime() { return lifetime_; } const double& lifetime() const { return lifetime_; } - // Particle event nuclide - int& ancestor_nuclide() { return ancestor_nuclide_; } - const int& ancestor_nuclide() const { return ancestor_nuclide_; } - // What event took place, described in greater detail below TallyEvent& event() { return event_; } const TallyEvent& event() const { return event_; } @@ -659,8 +654,10 @@ class ParticleData : public GeometryState { const int& event_mt() const { return event_mt_; } int& delayed_group() { return delayed_group_; } // delayed group const int& delayed_group() const { return delayed_group_; } - const int& parent_nuclide() const { return parent_nuclide_; } int& parent_nuclide() { return parent_nuclide_; } // Parent nuclide + const int& parent_nuclide() const { return parent_nuclide_; } + int& ancestor_nuclide() { return ancestor_nuclide_; } // Ancestor nuclide + const int& ancestor_nuclide() const { return ancestor_nuclide_; } // Post-collision data double& bank_second_E() diff --git a/openmc/lib/core.py b/openmc/lib/core.py index 14d33a060bf..000c106a897 100644 --- a/openmc/lib/core.py +++ b/openmc/lib/core.py @@ -25,10 +25,10 @@ class _SourceSite(Structure): ('time', c_double), ('wgt', c_double), ('delayed_group', c_int), - ('ancestor_nuclide', c_int), ('surf_id', c_int), ('particle', c_int), ('parent_nuclide', c_int), + ('ancestor_nuclide', c_int), ('parent_id', c_int64), ('progeny_id', c_int64)] diff --git a/openmc/source.py b/openmc/source.py index 7a0ff945cb5..84d8a9619dc 100644 --- a/openmc/source.py +++ b/openmc/source.py @@ -1308,7 +1308,7 @@ def read_collision_track_mcpl(file_path): 'r': [], # for position (x, y, z) 'u': [], # for direction (ux, uy, uz) 'E': [], 'dE': [], 'time': [], - 'wgt': [], 'event_mt': [], 'delayed_group': [], 'ancestor_nuclide' : [], + 'wgt': [], 'event_mt': [], 'delayed_group': [], 'cell_id': [], 'nuclide_id': [], 'material_id': [], 'universe_id': [], 'n_collision': [], 'particle': [], 'parent_id': [], 'progeny_id': [] @@ -1332,8 +1332,6 @@ def read_collision_track_mcpl(file_path): data['event_mt'].append(int(values_dict.get('event_mt', 0))) data['delayed_group'].append( int(values_dict.get('delayed_group', 0))) - data['ancestor_nuclide'].append( - int(values_dict.get('ancestor_nuclide', 0))) data['cell_id'].append(int(values_dict.get('cell_id', 0))) data['nuclide_id'].append(int(values_dict.get('nuclide_id', 0))) data['material_id'].append(int(values_dict.get('material_id', 0))) @@ -1347,8 +1345,8 @@ def read_collision_track_mcpl(file_path): ('r', [('x', 'f8'), ('y', 'f8'), ('z', 'f8')]), ('u', [('x', 'f8'), ('y', 'f8'), ('z', 'f8')]), ('E', 'f8'), ('dE', 'f8'), ('time', 'f8'), ('wgt', 'f8'), - ('event_mt', 'f8'), ('delayed_group', 'i4'), ('ancestor_nuclide', 'i4'), - ('cell_id', 'i4'), ('nuclide_id', 'i4'), ('material_id', 'i4'), ('universe_id', 'i4'), + ('event_mt', 'f8'), ('delayed_group', 'i4'), ('cell_id', 'i4'), + ('nuclide_id', 'i4'), ('material_id', 'i4'), ('universe_id', 'i4'), ('n_collision', 'i4'), ('particle', 'i4'), ('parent_id', 'i8'), ('progeny_id', 'i8') ] diff --git a/src/ifp.cpp b/src/ifp.cpp index f196eb91cf2..af3a92f116e 100644 --- a/src/ifp.cpp +++ b/src/ifp.cpp @@ -31,20 +31,15 @@ bool is_generation_time_or_both() void ifp(const Particle& p, int64_t idx) { if (is_beta_effective_or_both()) { - if (settings::ifp_beta_nuclide == true) { - const auto& delayed_groups = - simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; - simulation::ifp_fission_delayed_group_bank[idx] = - _ifp(p.delayed_group(), delayed_groups); + const auto& delayed_groups = + simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; + simulation::ifp_fission_delayed_group_bank[idx] = + _ifp(p.delayed_group(), delayed_groups); + if (settings::ifp_beta_nuclide) { const auto& ancestor_nuclides = simulation::ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; simulation::ifp_fission_ancestor_nuclide_bank[idx] = _ifp(p.event_nuclide(), ancestor_nuclides); - } else { - const auto& delayed_groups = - simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; - simulation::ifp_fission_delayed_group_bank[idx] = - _ifp(p.delayed_group(), delayed_groups); } } if (is_generation_time_or_both()) { diff --git a/src/initialize.cpp b/src/initialize.cpp index 7b8f28f4631..17cabad0adf 100644 --- a/src/initialize.cpp +++ b/src/initialize.cpp @@ -164,10 +164,10 @@ void initialize_mpi(MPI_Comm intracomm) MPI_Get_address(&b.time, &disp[3]); MPI_Get_address(&b.wgt, &disp[4]); MPI_Get_address(&b.delayed_group, &disp[5]); - MPI_Get_address(&b.ancestor_nuclide, &disp[6]); - MPI_Get_address(&b.surf_id, &disp[7]); - MPI_Get_address(&b.particle, &disp[8]); - MPI_Get_address(&b.parent_nuclide, &disp[9]); + MPI_Get_address(&b.surf_id, &disp[6]); + MPI_Get_address(&b.particle, &disp[7]); + MPI_Get_address(&b.parent_nuclide, &disp[8]); + MPI_Get_address(&b.ancestor_nuclide, &disp[9]); MPI_Get_address(&b.parent_id, &disp[10]); MPI_Get_address(&b.progeny_id, &disp[11]); for (int i = 11; i >= 0; --i) { diff --git a/src/particle.cpp b/src/particle.cpp index b80275b2787..7b004d061fb 100644 --- a/src/particle.cpp +++ b/src/particle.cpp @@ -148,8 +148,8 @@ void Particle::from_source(const SourceSite* src) time() = src->time; time_last() = src->time; parent_nuclide() = src->parent_nuclide; - delayed_group() = src->delayed_group; ancestor_nuclide() = src->ancestor_nuclide; + delayed_group() = src->delayed_group; // Convert signed surface ID to signed index if (src->surf_id != SURFACE_NONE) { @@ -991,7 +991,6 @@ void add_surf_source_to_bank(Particle& p, const Surface& surf) site.time = p.time(); site.wgt = p.wgt(); site.delayed_group = p.delayed_group(); - site.ancestor_nuclide = p.ancestor_nuclide(); site.surf_id = surf.id_; site.particle = p.type(); site.parent_id = p.id(); diff --git a/tests/regression_tests/surface_source/surface_source_true.h5 b/tests/regression_tests/surface_source/surface_source_true.h5 index 7bb522c9d5f4c7ee981918bb3f80a2c7cb89d890..2c2a19038fc1b6d9c7785e8a7f591e9e5c7fd959 100644 GIT binary patch delta 19334 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 delta 27291 zcmZ{t2XvNIwuZk#4LuY|=%I%qgqk1%0TBXHf|P_Fq$GflpeR8Uf}(_)Y~Vl;1gxN_ z1W}111S?pH4PpaqfMq0Bu+8h-b=SIg&HK96jEmWG&a>b1f8RNKpS}N|9fv9`T~%>? zn_%h7`(krKfBycx;fsMk!ZIuL@~_8#w`)<}tK|8f=LLT7&%f}e`v3WJ=zBH)`LpLO zJz#%Ss9!EVyM6lp`V|NH`;MIZfB&&5m4?>)=l}Sh@%Z=O_~(EAY%!HnsVVTRta54{ zHp<3DOyGti5fkWSe#)psRo z!i#}r)#M&lx2aY6gunSNAwjH0Szw8^_=GiVOEo^>CEx8*6aE<3o?7H1?pwZ&ovzM5 z;>)%ul9OtAE~1xk{inbpYVr^Aci+xNa#N(|veb+}2UaRp_Yd1wo4Z)sbERs+UjmD+ z!&kSC)e@Tj^j+drLi4YIT@Vx2wZX!}zkIhxP54`2$#uDh^=w%kF8OcYMfMgRUJ9(J zuGkiu)|)_IF3&CM?elm1vaPJgE%hzs3U2Y;8B9kvhTj7#tH4C-L~~V5Jj>q6z4+VCG~ujDfh$t1Ahe7Ie8Q%7W+$J}^DVj=cd&BcV)_YPVQ3`{ z_^@W474G6D-?!u#?qP)OY{)%~@m#KQqg-gw_j6X@TTF9qs)7Td5jQpWT$zHE5AA}0 zg}$Y>;KHifsYYB_3(ut{iuJ7!TJi(j#d5yox8$a3IHVhMQ%lbsRj`Vo#XQJ|mG|v< zD=w_M)e;YBE6>ID7s4uqmMd5ld<)ueH);fy-GrN3doEwWDu)rKRR?*^V6li-gmyNb4{H=yi8wyG zBh(VGx`=;z@d+CTZjbV#erUVe@?kwZOL~Hv>LDLW63U{mdtAkbH9@=*%S}BIYzf#E zzROmyXl#DH`A62&PKgsK-m~Z@xf}I;cUG|);9$I(4{L^ar5!gVcy>X+qI{P$M66=N z&?4J&VZH29AO0-HAh+Ge-H7&Gp<*=(EnBdzvd;Z@8qwUE6>={c_%3>=kkvS}qz+tG zZ%a?)6SfE}w~)(f=(`-nY7$zZU|nrH`*T?>EoDFVqLJ?|C{)wXayoKZeeBc#K4GiC zj_&8O8v8E!IlYlo*p%y^Aw!83eRbKj*77pvGRwEUrb728{09ACwOh_nQ&h3}3kR_oA? zU&meSfX71wVb|h1`dL1zrSD=#2w`nP3x;!H9qm{bE^H7YEx~H#yL`oJi}P{>ckxO* z9wG=E>{-@9KB~3vE-P4UXr&{$uukT8$$Kvi|@{b4Mn8&9B0M)E-qOJ>wvv^G#}Ol)r#)ibR8ls0c+>G z0tM?BTG1FTtgB`A;KGI>(0ZP`(H?2qC?V`hWKLuGux_~57h&^o1X=>t0co0ob;9P6 z!i9CW-95Rm5uW87;vRNHnxO^O(S4J#kqh zV9A~py}(CxLY}5zT|!Hk$X7Am1}E@U9OYTeVb1D|G;OpH))gmo0%xHlJBh~$33l-? z_aY8innHEME7psnM%(Vme8OIVr5@q3x*$nYtnP>f1Z#|)nZjjVWo?VO7hMtlh-_u7 z=Mu+=#qELn+BEKb@4#YubJI9fkc+vg8%kCR))Sk`G`_r7+r{2oSc+$9M>(rIvbV89 zSUfhB8~Ct3_`pQ|lZrC8fb~H3reF!UkD0-R^|iJl$r+D(rWd(~J(0aBRxez~%;dxR z1(x53n8`udh7SU1?pOwJk{xLm~=fJ-vL>gQYHHC)$p zE6(Dqq`;La)-^aTk8xdzcn}3^hFw~~SwjMsIzg=AK*ZVuIcp~FrjBz{f8XM6=BA;6 zJE~yUVi5&w7D6Tg8{k{ULJqqwaIq7GvOx&!#kD}XXUVVg8L#ne*Dc&MEO7Y>HW-KS zAU-SuG1D8|G|;!wTe)dC%3=zZgcwJ_W_y+^VAuKalLXQqNBI?j7f;n zmT=Q3RHVd&^E_9e{1}F6pnwhWt?YKbwOnt-L-^}H9}Rd@gy!MMXWr)C5A`i}DL0Kq zMQSKFWqK|{!A77bOB2Gb zM+o#TA2t%F+zKu%)zXJ^VGGglr&yyA0SQ*JZ`pTqH^!qPHJqDnK{KF&jX?<|af!^o3 zMk53gtZZAkinAsKF7gJUD+Q;wV2#1Uk<1^C#a6tUvnB^FTd`6R0)4=BjYS9~Shv}w zHJmjiaAy^3JkIV9Icppq#8F(=66?Hq5~Su?EJSk7AR+0jzY zn&i78#Y)4|wuuj$i9+UBZo1R6*pIkrvhQMM31QRl2yEuUW?9NOF6=JPE(_Ka-{mUS z4JcM^;V!15ST&BDR^T4$V{V%2yD|lvj{D{UJ}d))Q3^NRjfSUBxG4>lv2?MDGZ3I{ z<*PW`E~W5Qya)GCf;A15F~ypRm}wh#aSj3_aqqnnWw=lIs2flj%Mik5As8Ibh2>iO zb}no#PJ6+cj>?!~rK4DNA9wLa1V-bzX%)(FpK;R+RK^r60~xgFIi6?f6S%O|=yy8J zSu;@?n=KY`HgeiseAs*}l_(ypK^acKW}z~sU~^DkoXBBoQB4tTyP4=eIm1V#qck>0 zD4UDOa}po64h4<}_>+@mwa)Sd&Ol{Mv2MiUAz172EiKVXy8tDav)sekD2>e(!sa3J zoXm&iAghi`^*JHw*cZXj8leU)cGA&o~bOkbrGOGNxb)kh46-h23fg zzvRN^<9Z^EyRiwm*gPTZCZrL2`LIQ(>wLvcnTUV{%pn<5u$vLvi*CMbL<$0yg%D^O z_hU1XF$G(Q`>QAUDlWE^ulXu2K);Tt25mugY`$2&)P$?FhFnaMP`*j%A5eybU)w&v0SO z?AS~$>^^L7-*DCJZY@$xM<-G=@~1zU>!K7$XtAFWN_abZg=>JS%p zSKyLw5{tMD5s+X#fS5|KZnu#yaMlVG&J-&L0nlu&>p^rjea}sIAR)V1c)uKZ@?pLl zciXAi+{K5`+4L{YT8e~BvF^m}{1HCv9t4DQxanbZHVN1=BxDM97s8yme8xwxzZG-M zD{b%(TyqZcv4vt0S0Ks}tlijhMD;%xA=MAu!{tcG6zpz<_c!ukdysX##D%T0Wf!@y zJCTpwB81(8dkDdL6p4^1$gf67b&-2`7ZNfBTZt2Y9v}7?UZhvJur+qDj0;~yC}-tPojMH6KAbNrnX4vT7!t{bv`T)Z8=%ov=5g`KXVUr?cy7JHS+OY zGv&rw#6Jr-s}K>DV6C#YZ*i6dF31*=*Wm_8u=e9l=@+hRwM~7Svo-`SL$TH))Vhi5 zdI|xRV6Cw&?{L<}z?CRg9xj^%>j18le&xE>TKWmj+7!5i#bOQf5!Q*8fu|8q{l;1A zY-b5)xxnpGEJN_Kkgwr0*hd9xy`6fOvo;4V;x?gc10qPldKQgMm$i}$XB7mlRIxT89ud6>MToO5b6sZ3KIE*esF*DgYv_LDIU`c=SmEVjM?GCYs z_aabP%!eJp3-%db#GMxP7Z3Suc4TbA7IB zn?;Fx!3U9`EfZ_F6Df{hz3go)6RhnvQe4$Ngal2ocA@5U2iNrqZjHa_PN2E#-@K z3=z|L?#FI7H57}r3pv_yq52_&G0QmYIKmilEwl$e&=86l??;lRXb^f154ZsJdO~vf{^wwDra{I+oQP35wy3_=X#M#d%{(&D5O1t z%9(;ahImFaX1#;0y^O1V5|Lj;;r?!Pii#OecrI>*7`7MtP~ zC1^wtIb$J`HRZ?Sq1#hQ`1mOLQbn`ZyXa)RTMT;wJB_Pa%ug|x@eWFuhjp_5U; zp2R!L|MGd>-w~AdoF3USjgu?w@V$pNAL}Tnqu6u=)Ydaac8h+DcqsZ z#nlokdC;9w=W;Q=kF}oD&SKMABbV24AO5h%^Hqejm#ngA&ioQP{v^H{S-{6-R746l~omI3KU1l92?RAUV#HD?U1Uyejdo6T@ zR|wln=mXls{r?V!B|dC=GQWYZohjV0&_&l5<6cH{j^k5)k6m7Q`6j-2rf|nYcR}G^ zL6uD4{)Mej4SNd*N4`+-dgzj)gzZ&y=xpZde!zyIhP{oXU*X;eT}-sVy@oGh3EV}z zR%+Ng`1+ZNDc?lIrN$le?dTS+t_)9KLowwEq+km7R_Ib2h;hg9)i2TE{39xyjl{4L zTr+GCwzrX)1=VLod(-V~DroQHR%4@B$r2RK1npNO56y(O58Savg7y{?G(~$CS3uji zw%-tBHy2KRhzGr~u)U41#EB^{q5pA{81`Q1l3ECHC!Mc8xOeac-tAn#Wi&u4+WVo) zX(>E8g(t6xu${o~gQz(_K>pTBC@6LD>R~9sZ#6oB`w*E^Ycb_VuCmJ0-o;OPs3}h( zV`(dJALB|24;Vd{-a~WZW??%Oy0lo~<|nRSjCe5LM+>5wvJ?S&JAwNY^}ZNk`v9$m zYR-=k8Mha1e&!Z67jAxtYSk8j`xp^vM`1gSlA3yfPNFKM=KKVq;FZG7Gj3lC;pQo{ z2NnodK1B%DN!ZS!Xr*3-QnUf8IX^?}(^hAtm-Qa8`Lytcy4Gbrb56S%K% ztD)Syfap|hR%cPPQFDHc4XKB4^BZ?8R=D{&N;BJqo99Az98=N{_FEi>YP0$Ry;VJh zE8jW4y>R7Ae4z!yDDHb4P}s+)?JHdUcJTRM3gUKj@cCaBbPgAt*v9DJO5{#<6r(QS zn88NHN7d{kMtzGN8ha5RHK?-~^*wesYz=(W(l{~d2W$*o)Tn2>h*4#Dsjy{m)(>6% W2`&EX+vE5je)`|PX6YXz{`oh0Q!y_9 diff --git a/tests/regression_tests/surface_source/surface_source_true.mcpl b/tests/regression_tests/surface_source/surface_source_true.mcpl index f71134bd46cbf030a7b3de5c5da5736e1b97e7a9..ca4b7c2c4257c88baff2f9bd1c2a756fdfde92bf 100644 GIT binary patch delta 3986 zcmWmEKUiz^9S7j2w^5^_Mw=>X)U@|!n<`q`#@?t=(TmrpQKLqUSF}{4a+S8UjT$v7 zDr#&qh`IFo(wa$z_czad1!7eiEfBSh1Q5EaKll(;c;-VD*gjUk#l7oze_A&TWfw8tWA zzX;JRW698Y&}lM61%_XSsLeLFnZDWaP>5DI!I4`+w8bN)9uCpWV2G+r-WsAl7n#p{ z`fVXvVui^^LbSm#4&NT4P0lm%Xo%t|pJ9y~+~x3NO1vXP>+CYz8KR*PpK(k&-{mTc zkE@Ygrtk8xWFcd3%8U;EzkA-&wTbHwR~yE6FhnoJ+5;s`mu#)FE&o!=dmqTig{pf$p zaE(P~^f1L)&i)uWTIjkA++q9c(D{!pT?VFgRA7sfJZ76IovpITZ65K2gSt!qS7#jM zAt#vBWsB2X;Q_ap(CslBOtnI^&k+vjxXLn{oaZw4*k@daN38wKvjiw}#=Qln%dGH( zpPLZdtP9U*%tVA|g}Y2$p?l$JG6>HRw>fjAdS6jDQ?ClnRW|mTO>nGYOL4VxgN@fs z|7taJp5=?4agFD3j(dzoV(oN)RsM)wK-Our>=MXmTO1T`N&_) z)vImEvFtqQ)iyXTC0t^~yDj%ub#Rk)@3!pQX5`)0;2igv@p3D_t-oo>K31U*Rwdw@xjn}&qxN9%2mhot-i(sPQ33iw<(wVJZAZJWltCZt1PA5j%z$( z<_;}fa(j+n3Y|N3;-5ve!{Mo2E zsux+9a|}M|ZjN2&xeMlf#$C9>##5dm69WZzVmfAC&Rg8$F-uP?`U=Ie&&)H5yi&33 zafi99+~-+4V4I1!U2?SO7wUY416P}+mtCDr?(vAFYury}*LcX{wYojcE)%EOm5GJZ z?6NGoCydMNgnX>=m_^yGULQIl+ZT~l=EY-FbbH+5n0Snc@Bx?E5RXAo9uSWi&NC^> zCGnW%E-RuubsCS0p(7PT61&PZj!H*NVvjk?rgQ{p9TbZ;mzaLbV^1T&O>QwO5>=^P z;1LIIzdQPF{A^SgjYH{O=a|$EiN*ovQsMHvN8J%FuPa7C;`X@15@+sF4G$T!&)mIc z!9~uV?)l!(vDUltP3R1}h0DNGqk?6%7SSGmeNWU5>LL7Bk%D5+}r>$1NVRDjvzKdojnnc#N^fY39UZktd?F$zxGDU{gdA5BR)j zWZC1wS>F+j4JO_;VJ>hWINnh^>nwARb(X5O%U!Os_^$u4%lO?!|DGP%W{K(dZH6t* zF*Tug_PNWMOSb(Ry)nb-58RUnoMPoeE93^d9GJ9imM25!w@PstxW@vA{$|^(vCTEE zGWK^PWsxVGWjft>Tx_St0qU)IeT z_SxeRlmE8vd#s0fPIH`#T;c(HOw@e#UTt%X4Nh}`2i#|N$QVBI8J4-gf_nFP!r}Y$ zq|Q1gxXu;E?-vIyzMyvX?w8cg^%t$?C3QQWdRe_Jl+~;D^egJ*3YS=Y)vDO%*l7=5 zc$++AR&9$Ft75_nZ}_w});Vy|t~k$i#=ZICAA2rq%y{#yvCGUSb|}76+~y8jVjSw` zF2)7++2*(yZ!;;zqn~;{TdaujF*i8!nOekmne!a{+_S}ZiE~Ug2RxHqN8^FevHAsnn&bvoxzFaq#{Xw+=RJ-+ zmO1^1$8zCOW8uJK9?yC1F+Sor=g}Nu>~ZCAinVj0^Ms9^D@1K(a*}f1zqrCKM@CJN zeTD~Z>Pe+Bc|mDh|?vs8XC0%cFjTJwXjIIa#P-Z#L zozrQ&WXal(`O$2%%Teu5`tfY>gjMagUQsfSIb#gXSJlcRP8&o1H8rxwiZSFWYU3ue JuN%$l;s4;+%nJYj delta 3986 zcmWmFKUAyr9mnzGEoxM1>1}Fbi*4HbyBZZWYVI{w)Tr@_ii%2GR8&+{yrzm8ZLHX0 z#Y!s!HxEOOCj&zUh71`P7#J8bWME)m$dDleLk4;d0|Ns?Ul~5<^ZtCFJikBR-}5}F z{CKAF3WtA)0u=bzV}d z@``-GcjPV}c{)U~^C3!QLsY~Qcph)#foDRrhAV30xP!ZR4TlHabE_II;CURL4bdjv z!i7H5>4Tws8-w{jhG-1u$3wJ&SMdto$8EfihaaNnLX=E}XqGR_bGVN8a04IX#At|4 z@aXd)n!!svcYBC7@Gf4)M>zh1`|vc+KJ30bLR7@Soi$Z_3Fh9E9AFPvttEQwwQh4mb?CAs6J)zZhHX zL|($1YWs37?@;7ZdH8CFGUb5O=I%ANyoVdOjuTHBlb^^lc=Q_g-{)|iJRf~`&ADh9 zAF1!EXD_)|j$i9QapHalgj;w9*YMC&?!||A3LoK2%z@%;Mh!3WCa>|q>$IPSE@(TS z;s<=>dTpgHrEbuE+PWc>2ep+}sZGhB+7>nFgmO3979G>*&$NYhDL!PW)S{uEn}*h@ zN9nVkBU*n&ru3^a?NIDB4-QqROQ~r~p{?mqe%(@NmD-ei!&0b0CzN|r*J+OuGde^Y zbVS*=bb(ql^tR>DI`t_1j_GNKVzZ{F3Uw*^l zNw3lzHRyzLUXNwkql8yrhBoMkvR;ElYSEB$o}!trJRcNa@O)5>4k`1sj|eqs@E;yg zs?q_C{L`aJ+f=#AtGzfDb@}|FrJk`&K7S^Zzp+%>Qd<2clz(Ey{Sr_9ONr0%HgE9c zfF1DMx9WJAH~1bu;Vr95EV+KQRr4V$TgDssi1zT5TJ}4?yT(rW3}07k;SD_WZ@=YJ zJbSHcyyyBN?%}lEweaNkV^IkY#T>}@gcopZ**$%?^9kI;6a6mW^mQC}aS5mXgXQ%L zx`B7p#&xDCZ^^Oiee@PX`M(-`(J*4ibak(H5Yxfr3#IxUq@`Hwib>%Uf z_l-Hmt9S*E>UY&`XQdh8J%C2>v#e0;bYvy z3E!^KQ7v)`Gk6K7@dn<-lRN*-ZB}dcYmZus`nXz0ZSbtDwkB8A zgJYXitEzR>3i5&afgEnrZh7Rdl+$lqP%Gl1TK)&~<88cx2OiV!zJFvsyy>^YD_CBW zXYr|82d}Bs<$OxUdpJC9965Zf&+pP+4RgEOY15^GpVjdx-h4b<+3{;JKdTES~lSnw48}o!8Y4@iDHsb}VN`%<-hU zyx!+e%^~-2<`pdO%IUkDiX6WrtCi$w-0asr^WModdGJ;1yxTRk2|g*;a0OTKA@1S> zoGE&L?{ONh85_^zBHrT7VkoB_hB)}SmjVw=8xF7Haa_f1yoQta8dC1yJRbQ%n|OHL zka!;#@bG=clxO*-T<6C$@Hbn(U(3~&_%4mB#WTix!*=+Zyn97?uw!Psxw z1~167xQ91!9iQ@Jp8wK3GsfXde4p>~;lG>fE%)(hUgtG_%n$kKSLS%zJ$!+0@FqXv zgYOvQ125!){@_Jk2yh#J^I^u#o^Ag{oH5~IY zboc}h?>RMuI&I0veDs4*_K+`G>KI?8Htn2seDkLI zg=uIGS9pVWc`ELkhUa}OWTbHCCd zyv$pCk0%oTgo;+kt7m=A@De`2yL?@a->id{)5Fuah|{0zEIy=dxg<~hS~ugih1YS9 zVqfU2TKYG(h}Uol?@$L<)MCRrZ0%hH&+{E!}U-F6E#%(-ox5?k>3?;vGMsfq!`J8-$b4fLPthS7266*3EPW)bX<(%ho z1|Q*NywPXc!`YkZ54y|~p3gPsFvM>;aaGkl%*XaP5AP)8=IN(VGz=SAA40lOWi uHR@2Xrvh!#Ddnwwh4yLKT4$+F$24kfOSDUIYni4R9a5%0KQ(DEg#QD5WXv!C From fcd88d97d2cd54f51b4b03ad3e9449bc2bdb37ee Mon Sep 17 00:00:00 2001 From: GuySten Date: Tue, 9 Dec 2025 19:03:40 +0200 Subject: [PATCH 38/50] another fix --- src/tallies/tally_scoring.cpp | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index 47d6a436b1b..cc695aa583a 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -962,8 +962,11 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, const auto& delayed_groups = simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; if (delayed_groups.size() == settings::ifp_n_generation) { - if (tally.nuclides_[0] == -1) { - if (delayed_groups[0] > 0) { + if (delayed_groups[0] > 0) { + const auto& ancestor_event_nuclide = simulation:: + ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; + if (tally.nuclides_[0] == -1 || + ancestor_event_nuclide[0] == i_nuclide) { score = p.wgt_last(); if (tally.delayedgroup_filter_ != C_NONE) { auto i_dg_filt = @@ -976,24 +979,6 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, continue; } } - } else { - if (delayed_groups[1] > 0) { - const auto& ancestor_event_nuclide = simulation:: - ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; - if (ancestor_event_nuclide[0] == i_nuclide) { - score = p.wgt_last(); - if (tally.delayedgroup_filter_ != C_NONE) { - auto i_dg_filt = - tally.filters()[tally.delayedgroup_filter_]; - const DelayedGroupFilter& filt { - *dynamic_cast( - model::tally_filters[i_dg_filt].get())}; - score_fission_delayed_dg(i_tally, delayed_groups[1] - 1, - score, score_index, p.filter_matches()); - continue; - } - } - } } } } From 164975d8620bade9043db3cc2b22bbb647431c39 Mon Sep 17 00:00:00 2001 From: GuySten Date: Tue, 9 Dec 2025 22:37:51 +0200 Subject: [PATCH 39/50] add statistics to test --- .../ifp/nuclidewise/inputs_true.dat | 2 +- .../ifp/nuclidewise/results_true.dat | 58 +++++++++---------- .../regression_tests/ifp/nuclidewise/test.py | 2 +- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/tests/regression_tests/ifp/nuclidewise/inputs_true.dat b/tests/regression_tests/ifp/nuclidewise/inputs_true.dat index c0993614f18..68fc5888589 100644 --- a/tests/regression_tests/ifp/nuclidewise/inputs_true.dat +++ b/tests/regression_tests/ifp/nuclidewise/inputs_true.dat @@ -13,7 +13,7 @@ eigenvalue - 1000 + 100000 20 5 diff --git a/tests/regression_tests/ifp/nuclidewise/results_true.dat b/tests/regression_tests/ifp/nuclidewise/results_true.dat index c3a0946f9e5..b011c1059b1 100644 --- a/tests/regression_tests/ifp/nuclidewise/results_true.dat +++ b/tests/regression_tests/ifp/nuclidewise/results_true.dat @@ -1,33 +1,33 @@ k-combined: -1.244762E+00 5.675228E-03 +1.256195E+00 5.261787E-04 tally 1: -7.903583E-08 -4.224633E-16 +7.942195E-08 +4.207211E-16 tally 2: -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 -1.400000E-02 -1.960000E-04 -7.000000E-03 -4.900000E-05 -7.000000E-03 -4.900000E-05 -0.000000E+00 -0.000000E+00 -8.000000E-03 -6.400000E-05 +1.330000E-03 +2.933000E-07 +1.450000E-03 +2.415000E-07 +3.630000E-03 +1.181900E-06 +5.830000E-03 +2.858900E-06 +2.740000E-03 +7.918000E-07 +4.680000E-03 +1.904800E-06 +6.500000E-03 +3.465400E-06 +8.560000E-03 +5.700800E-06 +2.590000E-03 +5.795000E-07 +4.640000E-03 +1.866200E-06 +1.450000E-03 +2.701000E-07 +1.590000E-03 +2.641000E-07 tally 3: -1.515000E+01 -1.531553E+01 +1.495260E+01 +1.490559E+01 diff --git a/tests/regression_tests/ifp/nuclidewise/test.py b/tests/regression_tests/ifp/nuclidewise/test.py index f4904812c58..05251b3c31c 100644 --- a/tests/regression_tests/ifp/nuclidewise/test.py +++ b/tests/regression_tests/ifp/nuclidewise/test.py @@ -22,7 +22,7 @@ def ifp_model(): # Settings settings = openmc.Settings() - settings.particles = 1000 + settings.particles = 100000 settings.batches = 20 settings.inactive = 5 settings.ifp_n_generation = 5 From d379243fdb9d28f024b87a158bd66146a4813c93 Mon Sep 17 00:00:00 2001 From: GuySten Date: Wed, 10 Dec 2025 18:19:43 +0200 Subject: [PATCH 40/50] fix bug and update regression test --- src/tallies/tally_scoring.cpp | 3 +- .../ifp/nuclidewise/results_true.dat | 48 +++++++++---------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index cc695aa583a..11fd453910a 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -962,7 +962,8 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, const auto& delayed_groups = simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; if (delayed_groups.size() == settings::ifp_n_generation) { - if (delayed_groups[0] > 0) { + if ((delayed_groups[0] > 0 && tally.nuclides_[0] == -1) || + (delayed_groups[1] > 0 && tally.nuclides_[0] > 0)) { const auto& ancestor_event_nuclide = simulation:: ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; if (tally.nuclides_[0] == -1 || diff --git a/tests/regression_tests/ifp/nuclidewise/results_true.dat b/tests/regression_tests/ifp/nuclidewise/results_true.dat index b011c1059b1..fd7f5b69d92 100644 --- a/tests/regression_tests/ifp/nuclidewise/results_true.dat +++ b/tests/regression_tests/ifp/nuclidewise/results_true.dat @@ -4,30 +4,30 @@ tally 1: 7.942195E-08 4.207211E-16 tally 2: -1.330000E-03 -2.933000E-07 -1.450000E-03 -2.415000E-07 -3.630000E-03 -1.181900E-06 -5.830000E-03 -2.858900E-06 -2.740000E-03 -7.918000E-07 -4.680000E-03 -1.904800E-06 -6.500000E-03 -3.465400E-06 -8.560000E-03 -5.700800E-06 -2.590000E-03 -5.795000E-07 -4.640000E-03 -1.866200E-06 -1.450000E-03 -2.701000E-07 -1.590000E-03 -2.641000E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 tally 3: 1.495260E+01 1.490559E+01 From eabad048ceb1a4292c51bc578cadaa464935f7a0 Mon Sep 17 00:00:00 2001 From: GuySten Date: Wed, 10 Dec 2025 18:22:37 +0200 Subject: [PATCH 41/50] fix typo --- src/tallies/tally_scoring.cpp | 2 +- .../ifp/nuclidewise/results_true.dat | 26 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index 11fd453910a..23d3562e26d 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -963,7 +963,7 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; if (delayed_groups.size() == settings::ifp_n_generation) { if ((delayed_groups[0] > 0 && tally.nuclides_[0] == -1) || - (delayed_groups[1] > 0 && tally.nuclides_[0] > 0)) { + (delayed_groups[1] > 0 && tally.nuclides_[0] > -1)) { const auto& ancestor_event_nuclide = simulation:: ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; if (tally.nuclides_[0] == -1 || diff --git a/tests/regression_tests/ifp/nuclidewise/results_true.dat b/tests/regression_tests/ifp/nuclidewise/results_true.dat index fd7f5b69d92..770d73096e5 100644 --- a/tests/regression_tests/ifp/nuclidewise/results_true.dat +++ b/tests/regression_tests/ifp/nuclidewise/results_true.dat @@ -1,27 +1,27 @@ k-combined: -1.256195E+00 5.261787E-04 +1.256564E+00 9.028219E-04 tally 1: -7.942195E-08 -4.207211E-16 +7.934819E-08 +4.200276E-16 tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +7.000000E-05 +4.900000E-09 +3.000000E-05 +9.000000E-10 +1.100000E-04 +7.300000E-09 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +2.000000E-05 +4.000000E-10 0.000000E+00 0.000000E+00 0.000000E+00 @@ -29,5 +29,5 @@ tally 2: 0.000000E+00 0.000000E+00 tally 3: -1.495260E+01 -1.490559E+01 +1.494502E+01 +1.489049E+01 From f3e00ee354702bc44ad4482e2c5ad5a656f6396b Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Thu, 11 Dec 2025 10:36:43 +0100 Subject: [PATCH 42/50] Tally_scoring correction for simultaneous Family and Nuclide filters --- src/tallies/tally_scoring.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index 23d3562e26d..41c8a54c64e 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -962,12 +962,21 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, const auto& delayed_groups = simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; if (delayed_groups.size() == settings::ifp_n_generation) { - if ((delayed_groups[0] > 0 && tally.nuclides_[0] == -1) || - (delayed_groups[1] > 0 && tally.nuclides_[0] > -1)) { + if (delayed_groups[0] > 0 && tally.nuclides_[0] == -1) { + score = p.wgt_last(); + if (tally.delayedgroup_filter_ != C_NONE) { + auto i_dg_filt = tally.filters()[tally.delayedgroup_filter_]; + const DelayedGroupFilter& filt { + *dynamic_cast( + model::tally_filters[i_dg_filt].get())}; + score_fission_delayed_dg(i_tally, delayed_groups[0] - 1, + score, score_index, p.filter_matches()); + continue; + } + } else if (delayed_groups[1] > 0 && tally.nuclides_[0] > -1) { const auto& ancestor_event_nuclide = simulation:: ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; - if (tally.nuclides_[0] == -1 || - ancestor_event_nuclide[0] == i_nuclide) { + if (ancestor_event_nuclide[0] == i_nuclide) { score = p.wgt_last(); if (tally.delayedgroup_filter_ != C_NONE) { auto i_dg_filt = @@ -975,11 +984,14 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, const DelayedGroupFilter& filt { *dynamic_cast( model::tally_filters[i_dg_filt].get())}; - score_fission_delayed_dg(i_tally, delayed_groups[0] - 1, + score_fission_delayed_dg(i_tally, delayed_groups[1] - 1, score, score_index, p.filter_matches()); continue; } } + } else { + // An error can be printed in this line + continue; } } } From 553de638ed6588dfe30f7e2a0e525948212ee55a Mon Sep 17 00:00:00 2001 From: OlivaresDarian <163006793+OlivaresDarian@users.noreply.github.com> Date: Thu, 11 Dec 2025 12:01:40 +0100 Subject: [PATCH 43/50] Update src/tallies/tally_scoring.cpp Co-authored-by: GuySten <62616591+GuySten@users.noreply.github.com> --- src/tallies/tally_scoring.cpp | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index 41c8a54c64e..6fc9285a864 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -973,25 +973,6 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, score, score_index, p.filter_matches()); continue; } - } else if (delayed_groups[1] > 0 && tally.nuclides_[0] > -1) { - const auto& ancestor_event_nuclide = simulation:: - ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; - if (ancestor_event_nuclide[0] == i_nuclide) { - score = p.wgt_last(); - if (tally.delayedgroup_filter_ != C_NONE) { - auto i_dg_filt = - tally.filters()[tally.delayedgroup_filter_]; - const DelayedGroupFilter& filt { - *dynamic_cast( - model::tally_filters[i_dg_filt].get())}; - score_fission_delayed_dg(i_tally, delayed_groups[1] - 1, - score, score_index, p.filter_matches()); - continue; - } - } - } else { - // An error can be printed in this line - continue; } } } From 8ffacae37a64cfb8e4acb15d254aec783212660c Mon Sep 17 00:00:00 2001 From: OlivaresDarian <163006793+OlivaresDarian@users.noreply.github.com> Date: Thu, 11 Dec 2025 12:01:54 +0100 Subject: [PATCH 44/50] Update src/tallies/tally_scoring.cpp Co-authored-by: GuySten <62616591+GuySten@users.noreply.github.com> --- src/tallies/tally_scoring.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index 6fc9285a864..f8e2cbca523 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -962,7 +962,12 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, const auto& delayed_groups = simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; if (delayed_groups.size() == settings::ifp_n_generation) { - if (delayed_groups[0] > 0 && tally.nuclides_[0] == -1) { + int j = -1; + if (delayed_groups[0] > 0 && tally.nuclides_[0] == -1) + j = 0; + if (delayed_groups[1] > 0 && tally.nuclides_[0] > -1) + j = 1; + if (j>-1) { score = p.wgt_last(); if (tally.delayedgroup_filter_ != C_NONE) { auto i_dg_filt = tally.filters()[tally.delayedgroup_filter_]; From 6106bf6e04efc580c7c3c54ac7d3151a2d137f7c Mon Sep 17 00:00:00 2001 From: GuySten <62616591+GuySten@users.noreply.github.com> Date: Thu, 11 Dec 2025 13:06:02 +0200 Subject: [PATCH 45/50] Fix delayed group filter indexing in scoring --- src/tallies/tally_scoring.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index f8e2cbca523..075879d1fbe 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -974,7 +974,7 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, const DelayedGroupFilter& filt { *dynamic_cast( model::tally_filters[i_dg_filt].get())}; - score_fission_delayed_dg(i_tally, delayed_groups[0] - 1, + score_fission_delayed_dg(i_tally, delayed_groups[j] - 1, score, score_index, p.filter_matches()); continue; } From 18a77267986356d0ed6e9cd2b0b4b8bbf9eab580 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Thu, 11 Dec 2025 12:28:52 +0100 Subject: [PATCH 46/50] Adding ancestor_event_nuclide to tally --- src/tallies/tally_scoring.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index 075879d1fbe..749e7ae5aaf 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -967,16 +967,22 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, j = 0; if (delayed_groups[1] > 0 && tally.nuclides_[0] > -1) j = 1; - if (j>-1) { - score = p.wgt_last(); - if (tally.delayedgroup_filter_ != C_NONE) { - auto i_dg_filt = tally.filters()[tally.delayedgroup_filter_]; - const DelayedGroupFilter& filt { - *dynamic_cast( - model::tally_filters[i_dg_filt].get())}; - score_fission_delayed_dg(i_tally, delayed_groups[j] - 1, - score, score_index, p.filter_matches()); - continue; + if (j > -1) { + const auto& ancestor_event_nuclide = simulation:: + ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; + if ((ancestor_event_nuclide[0] == i_nuclide && j == 1) || + (j == 0)) { + score = p.wgt_last(); + if (tally.delayedgroup_filter_ != C_NONE) { + auto i_dg_filt = + tally.filters()[tally.delayedgroup_filter_]; + const DelayedGroupFilter& filt { + *dynamic_cast( + model::tally_filters[i_dg_filt].get())}; + score_fission_delayed_dg(i_tally, delayed_groups[j] - 1, + score, score_index, p.filter_matches()); + continue; + } } } } From e129455407f54e1905c03fab02f8d80a9df90a6b Mon Sep 17 00:00:00 2001 From: GuySten Date: Thu, 11 Dec 2025 15:25:56 +0200 Subject: [PATCH 47/50] another simplification --- src/tallies/tally_scoring.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index 749e7ae5aaf..a46c0998383 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -962,27 +962,25 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, const auto& delayed_groups = simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; if (delayed_groups.size() == settings::ifp_n_generation) { + const auto& ancestor_event_nuclide = + simulation::ifp_source_ancestor_nuclide_bank[p.current_work() - + 1]; int j = -1; if (delayed_groups[0] > 0 && tally.nuclides_[0] == -1) j = 0; - if (delayed_groups[1] > 0 && tally.nuclides_[0] > -1) + if (delayed_groups[1] > 0 && tally.nuclides_[0] > -1 && + ancestor_event_nuclide[0] == i_nuclide) j = 1; if (j > -1) { - const auto& ancestor_event_nuclide = simulation:: - ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; - if ((ancestor_event_nuclide[0] == i_nuclide && j == 1) || - (j == 0)) { - score = p.wgt_last(); - if (tally.delayedgroup_filter_ != C_NONE) { - auto i_dg_filt = - tally.filters()[tally.delayedgroup_filter_]; - const DelayedGroupFilter& filt { - *dynamic_cast( - model::tally_filters[i_dg_filt].get())}; - score_fission_delayed_dg(i_tally, delayed_groups[j] - 1, - score, score_index, p.filter_matches()); - continue; - } + score = p.wgt_last(); + if (tally.delayedgroup_filter_ != C_NONE) { + auto i_dg_filt = tally.filters()[tally.delayedgroup_filter_]; + const DelayedGroupFilter& filt { + *dynamic_cast( + model::tally_filters[i_dg_filt].get())}; + score_fission_delayed_dg(i_tally, delayed_groups[j] - 1, + score, score_index, p.filter_matches()); + continue; } } } From c7f5923198847d59d16980aa6e4279ec8aa3538b Mon Sep 17 00:00:00 2001 From: GuySten Date: Thu, 11 Dec 2025 15:30:13 +0200 Subject: [PATCH 48/50] further step --- src/tallies/tally_scoring.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index a46c0998383..7dc237d0c52 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -962,15 +962,15 @@ void score_general_ce_nonanalog(Particle& p, int i_tally, int start_index, const auto& delayed_groups = simulation::ifp_source_delayed_group_bank[p.current_work() - 1]; if (delayed_groups.size() == settings::ifp_n_generation) { - const auto& ancestor_event_nuclide = - simulation::ifp_source_ancestor_nuclide_bank[p.current_work() - - 1]; int j = -1; if (delayed_groups[0] > 0 && tally.nuclides_[0] == -1) j = 0; - if (delayed_groups[1] > 0 && tally.nuclides_[0] > -1 && - ancestor_event_nuclide[0] == i_nuclide) - j = 1; + if (delayed_groups[1] > 0 && tally.nuclides_[0] > -1) { + const auto& ancestor_event_nuclide = simulation:: + ifp_source_ancestor_nuclide_bank[p.current_work() - 1]; + if (ancestor_event_nuclide[0] == i_nuclide) + j = 1; + } if (j > -1) { score = p.wgt_last(); if (tally.delayedgroup_filter_ != C_NONE) { From c3bb521a7ccac74df0b14366ab2344e22b62ace1 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Fri, 12 Dec 2025 10:01:51 +0100 Subject: [PATCH 49/50] Fix CollisionTrackSite --- src/initialize.cpp | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/initialize.cpp b/src/initialize.cpp index d2ab8cdb1bb..17cabad0adf 100644 --- a/src/initialize.cpp +++ b/src/initialize.cpp @@ -182,35 +182,34 @@ void initialize_mpi(MPI_Comm intracomm) MPI_Type_commit(&mpi::source_site); CollisionTrackSite bc; - MPI_Aint dispc[17]; - MPI_Get_address(&bc.r, &dispc[0]); // double - MPI_Get_address(&bc.u, &dispc[1]); // double - MPI_Get_address(&bc.E, &dispc[2]); // double - MPI_Get_address(&bc.dE, &dispc[3]); // double - MPI_Get_address(&bc.time, &dispc[4]); // double - MPI_Get_address(&bc.wgt, &dispc[5]); // double - MPI_Get_address(&bc.event_mt, &dispc[6]); // int - MPI_Get_address(&bc.delayed_group, &dispc[7]); // int - MPI_Get_address(&bc.ancestor_nuclide, &dispc[8]); // int - MPI_Get_address(&bc.cell_id, &dispc[9]); // int - MPI_Get_address(&bc.nuclide_id, &dispc[10]); // int - MPI_Get_address(&bc.material_id, &dispc[11]); // int - MPI_Get_address(&bc.universe_id, &dispc[12]); // int - MPI_Get_address(&bc.n_collision, &dispc[13]); // int - MPI_Get_address(&bc.particle, &dispc[14]); // int - MPI_Get_address(&bc.parent_id, &dispc[15]); // int64_t - MPI_Get_address(&bc.progeny_id, &dispc[16]); // int64_t - for (int i = 16; i >= 0; --i) { + MPI_Aint dispc[16]; + MPI_Get_address(&bc.r, &dispc[0]); // double + MPI_Get_address(&bc.u, &dispc[1]); // double + MPI_Get_address(&bc.E, &dispc[2]); // double + MPI_Get_address(&bc.dE, &dispc[3]); // double + MPI_Get_address(&bc.time, &dispc[4]); // double + MPI_Get_address(&bc.wgt, &dispc[5]); // double + MPI_Get_address(&bc.event_mt, &dispc[6]); // int + MPI_Get_address(&bc.delayed_group, &dispc[7]); // int + MPI_Get_address(&bc.cell_id, &dispc[8]); // int + MPI_Get_address(&bc.nuclide_id, &dispc[9]); // int + MPI_Get_address(&bc.material_id, &dispc[10]); // int + MPI_Get_address(&bc.universe_id, &dispc[11]); // int + MPI_Get_address(&bc.n_collision, &dispc[12]); // int + MPI_Get_address(&bc.particle, &dispc[13]); // int + MPI_Get_address(&bc.parent_id, &dispc[14]); // int64_t + MPI_Get_address(&bc.progeny_id, &dispc[15]); // int64_t + for (int i = 15; i >= 0; --i) { dispc[i] -= dispc[0]; } - int blocksc[] = {3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + int blocksc[] = {3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; MPI_Datatype typesc[] = {MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT, - MPI_INT, MPI_INT, MPI_INT, MPI_INT, MPI_INT64_T, MPI_INT64_T}; + MPI_INT, MPI_INT, MPI_INT, MPI_INT64_T, MPI_INT64_T}; MPI_Type_create_struct( - 17, blocksc, dispc, typesc, &mpi::collision_track_site); + 16, blocksc, dispc, typesc, &mpi::collision_track_site); MPI_Type_commit(&mpi::collision_track_site); } #endif // OPENMC_MPI From a2d1360347580cd2e22a3603445ec16f9f7dcb48 Mon Sep 17 00:00:00 2001 From: OlivaresDarian Date: Fri, 12 Dec 2025 16:34:53 +0100 Subject: [PATCH 50/50] Update regression test in ifp/nuclidewise --- .../ifp/nuclidewise/results_true.dat | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/tests/regression_tests/ifp/nuclidewise/results_true.dat b/tests/regression_tests/ifp/nuclidewise/results_true.dat index 770d73096e5..d3fa8333047 100644 --- a/tests/regression_tests/ifp/nuclidewise/results_true.dat +++ b/tests/regression_tests/ifp/nuclidewise/results_true.dat @@ -1,33 +1,33 @@ k-combined: -1.256564E+00 9.028219E-04 +1.256195E+00 5.261787E-04 tally 1: -7.934819E-08 -4.200276E-16 +7.942195E-08 +4.207211E-16 tally 2: -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-05 -4.900000E-09 -3.000000E-05 -9.000000E-10 -1.100000E-04 -7.300000E-09 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-05 -4.000000E-10 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +1.710000E-03 +4.295000E-07 +9.400000E-04 +1.794000E-07 +5.970000E-03 +2.607900E-06 +4.550000E-03 +1.625100E-06 +5.070000E-03 +2.047900E-06 +2.600000E-03 +5.692000E-07 +1.236000E-02 +1.062980E-05 +4.020000E-03 +1.379200E-06 +5.690000E-03 +3.302300E-06 +3.180000E-03 +8.316000E-07 +2.100000E-03 +4.486000E-07 +1.300000E-03 +2.008000E-07 tally 3: -1.494502E+01 -1.489049E+01 +1.495260E+01 +1.490559E+01