diff --git a/include/openmc/tallies/filter.h b/include/openmc/tallies/filter.h index 7203a81615..ba6ca08830 100644 --- a/include/openmc/tallies/filter.h +++ b/include/openmc/tallies/filter.h @@ -97,20 +97,28 @@ public: //---------------------------------------------------------------------------- // Accessors + //! Get unique ID of filter + //! \return Unique ID + int32_t id() const { return id_; } + //! Assign a unique ID to the filter //! \param[in] Unique ID to assign. A value of -1 indicates that an ID should //! be automatically assigned void set_id(int32_t id); + //! Get number of bins + //! \return Number of bins + int n_bins() const { return n_bins_; } + gsl::index index() const { return index_; } //---------------------------------------------------------------------------- // Data members - int32_t id_ {-1}; - +protected: int n_bins_; private: + int32_t id_ {-1}; gsl::index index_; }; diff --git a/src/state_point.cpp b/src/state_point.cpp index 7516b0d485..6ea666fde2 100644 --- a/src/state_point.cpp +++ b/src/state_point.cpp @@ -141,13 +141,13 @@ openmc_statepoint_write(const char* filename, bool* write_source) std::vector filter_ids; filter_ids.reserve(model::tally_filters.size()); for (const auto& filt : model::tally_filters) - filter_ids.push_back(filt->id_); + filter_ids.push_back(filt->id()); write_attribute(filters_group, "ids", filter_ids); // Write info for each filter for (const auto& filt : model::tally_filters) { hid_t filter_group = create_group(filters_group, - "filter " + std::to_string(filt->id_)); + "filter " + std::to_string(filt->id())); filt->to_statepoint(filter_group); close_group(filter_group); } @@ -188,7 +188,7 @@ openmc_statepoint_write(const char* filename, bool* write_source) std::vector filter_ids; filter_ids.reserve(tally.filters().size()); for (auto i_filt : tally.filters()) - filter_ids.push_back(model::tally_filters[i_filt]->id_); + filter_ids.push_back(model::tally_filters[i_filt]->id()); write_dataset(tally_group, "filters", filter_ids); } diff --git a/src/tallies/filter.cpp b/src/tallies/filter.cpp index 913a4debca..c67eec830d 100644 --- a/src/tallies/filter.cpp +++ b/src/tallies/filter.cpp @@ -193,7 +193,7 @@ openmc_filter_get_id(int32_t index, int32_t* id) { if (int err = verify_filter(index)) return err; - *id = model::tally_filters[index]->id_; + *id = model::tally_filters[index]->id(); return 0; } @@ -233,7 +233,7 @@ openmc_get_filter_next_id(int32_t* id) { int32_t largest_filter_id = 0; for (const auto& t : model::tally_filters) { - largest_filter_id = std::max(largest_filter_id, t->id_); + largest_filter_id = std::max(largest_filter_id, t->id()); } *id = largest_filter_id + 1; } diff --git a/src/tallies/tally.cpp b/src/tallies/tally.cpp index 496c18ee4f..a142c16f15 100644 --- a/src/tallies/tally.cpp +++ b/src/tallies/tally.cpp @@ -523,7 +523,7 @@ Tally::set_filters(gsl::span filters) for (int i = 0; i < n; ++i) { // Add index to vector of filters auto& f {filters[i]}; - filters_.push_back(model::filter_map.at(f->id_)); + filters_.push_back(model::filter_map.at(f->id())); // Keep track of indices for special filters. if (dynamic_cast(f)) { @@ -540,7 +540,7 @@ Tally::set_filters(gsl::span filters) int stride = 1; for (int i = n-1; i >= 0; --i) { strides_[i] = stride; - stride *= model::tally_filters[filters_[i]]->n_bins_; + stride *= model::tally_filters[filters_[i]]->n_bins(); } n_filter_bins_ = stride; } diff --git a/src/tallies/tally_scoring.cpp b/src/tallies/tally_scoring.cpp index a69ab8ca5c..4fb3718ecb 100644 --- a/src/tallies/tally_scoring.cpp +++ b/src/tallies/tally_scoring.cpp @@ -69,7 +69,7 @@ FilterBinIter::FilterBinIter(const Tally& tally, bool end) if (!match.bins_present_) { match.bins_.clear(); match.weights_.clear(); - for (auto i = 0; i < model::tally_filters[i_filt]->n_bins_; ++i) { + for (auto i = 0; i < model::tally_filters[i_filt]->n_bins(); ++i) { match.bins_.push_back(i); match.weights_.push_back(1.0); } @@ -216,7 +216,7 @@ score_fission_eout(const Particle* p, int i_tally, int i_score, int score_bin) // modify the value so that g_out = 1 corresponds to the highest energy // bin - g_out = eo_filt.n_bins_ - g_out; + g_out = eo_filt.n_bins() - g_out; // change outgoing energy bin simulation::filter_matches[i_eout_filt].bins_[i_bin] = g_out; @@ -272,7 +272,7 @@ score_fission_eout(const Particle* p, int i_tally, int i_score, int score_bin) model::tally_filters[i_dg_filt].get())}; // Loop over delayed group bins until the corresponding bin is found - for (auto d_bin = 0; d_bin < dg_filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < dg_filt.n_bins(); ++d_bin) { if (dg_filt.groups_[d_bin] == g) { // Find the filter index and weight for this filter combination double filter_weight = 1.; @@ -632,7 +632,7 @@ score_general_ce(Particle* p, int i_tally, int start_index, {*dynamic_cast( model::tally_filters[i_dg_filt].get())}; // Tally each delayed group bin individually - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; auto yield = data::nuclides[p->event_nuclide_] ->nu(E, ReactionProduct::EmissionMode::delayed, d); @@ -670,7 +670,7 @@ score_general_ce(Particle* p, int i_tally, int start_index, {*dynamic_cast( model::tally_filters[i_dg_filt].get())}; // Tally each delayed group bin individually - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; score = simulation::keff * p->wgt_bank_ / p->n_bank_ * p->n_delayed_bank_[d-1] * flux; @@ -693,7 +693,7 @@ score_general_ce(Particle* p, int i_tally, int start_index, {*dynamic_cast( model::tally_filters[i_dg_filt].get())}; // Tally each delayed group bin individually - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; auto yield = data::nuclides[i_nuclide] ->nu(E, ReactionProduct::EmissionMode::delayed, d); @@ -722,7 +722,7 @@ score_general_ce(Particle* p, int i_tally, int start_index, auto j_nuclide = material.nuclide_[i]; auto atom_density = material.atom_density_(i); // Tally each delayed group bin individually - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; auto yield = data::nuclides[j_nuclide] ->nu(E, ReactionProduct::EmissionMode::delayed, d); @@ -770,7 +770,7 @@ score_general_ce(Particle* p, int i_tally, int start_index, {*dynamic_cast( model::tally_filters[i_dg_filt].get())}; // Tally each delayed group bin individually - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; auto yield = nuc.nu(E, ReactionProduct::EmissionMode::delayed, d); @@ -830,7 +830,7 @@ score_general_ce(Particle* p, int i_tally, int start_index, {*dynamic_cast( model::tally_filters[i_dg_filt].get())}; // Find the corresponding filter bin and then score - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; if (d == g) score_fission_delayed_dg(i_tally, d_bin, score, @@ -852,7 +852,7 @@ score_general_ce(Particle* p, int i_tally, int start_index, {*dynamic_cast( model::tally_filters[i_dg_filt].get())}; // Tally each delayed group bin individually - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; auto yield = nuc.nu(E, ReactionProduct::EmissionMode::delayed, d); @@ -892,7 +892,7 @@ score_general_ce(Particle* p, int i_tally, int start_index, if (nuc.fissionable_) { const auto& rxn {*nuc.fission_rx_[0]}; // Tally each delayed group bin individually - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; auto yield = nuc.nu(E, ReactionProduct::EmissionMode::delayed, d); @@ -1757,7 +1757,7 @@ score_general_mg(const Particle* p, int i_tally, int start_index, {*dynamic_cast( model::tally_filters[i_dg_filt].get())}; // Tally each delayed group bin individually - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; score = p->wgt_absorb_ * flux; if (i_nuclide >= 0) { @@ -1807,7 +1807,7 @@ score_general_mg(const Particle* p, int i_tally, int start_index, {*dynamic_cast( model::tally_filters[i_dg_filt].get())}; // Tally each delayed group bin individually - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; score = simulation::keff * p->wgt_bank_ / p->n_bank_ * p->n_delayed_bank_[d-1] * flux; @@ -1839,7 +1839,7 @@ score_general_mg(const Particle* p, int i_tally, int start_index, {*dynamic_cast( model::tally_filters[i_dg_filt].get())}; // Tally each delayed group bin individually - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; if (i_nuclide >= 0) { score = flux * atom_density @@ -1879,7 +1879,7 @@ score_general_mg(const Particle* p, int i_tally, int start_index, {*dynamic_cast( model::tally_filters[i_dg_filt].get())}; // Tally each delayed group bin individually - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; score = p->wgt_absorb_ * flux; if (i_nuclide >= 0) { @@ -1959,7 +1959,7 @@ score_general_mg(const Particle* p, int i_tally, int start_index, {*dynamic_cast( model::tally_filters[i_dg_filt].get())}; // Find the corresponding filter bin and then score - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; if (d == g) score_fission_delayed_dg(i_tally, d_bin, score, @@ -1978,7 +1978,7 @@ score_general_mg(const Particle* p, int i_tally, int start_index, {*dynamic_cast( model::tally_filters[i_dg_filt].get())}; // Tally each delayed group bin individually - for (auto d_bin = 0; d_bin < filt.n_bins_; ++d_bin) { + for (auto d_bin = 0; d_bin < filt.n_bins(); ++d_bin) { auto d = filt.groups_[d_bin]; if (i_nuclide >= 0) { score += atom_density * flux