diff --git a/include/openmc/distribution.h b/include/openmc/distribution.h index 2e210b7abb..b7d0e47210 100644 --- a/include/openmc/distribution.h +++ b/include/openmc/distribution.h @@ -37,13 +37,15 @@ UPtrDist distribution_from_xml(pugi::xml_node node); class DiscreteIndex { public: - explicit Discrete(pugi::xml_node node); - Discrete(const double* p, int n); + explicit DiscreteIndex(pugi::xml_node node); + DiscreteIndex(const double* p, int n); + + void assign(const double* p, int n); //! Sample a value from the distribution //! \param seed Pseudorandom number seed pointer //! \return Sampled value - size_t sample(uint64_t* seed) const override; + size_t sample(uint64_t* seed) const; // Properties const vector& prob() const { return prob_; } @@ -81,9 +83,9 @@ public: const vector& alias() const { return di_->alias(); } private: - vector x_; //!< Possible outcomes - unique_ptr di_; //!< discrete probability distribution of - //!< outcome indices + vector x_; //!< Possible outcomes + DiscreteIndex di_; //!< discrete probability distribution of + //!< outcome indices }; //============================================================================== diff --git a/include/openmc/distribution_spatial.h b/include/openmc/distribution_spatial.h index 9ca9c0684b..9fba950602 100644 --- a/include/openmc/distribution_spatial.h +++ b/include/openmc/distribution_spatial.h @@ -114,8 +114,8 @@ public: private: int32_t mesh_idx_ {C_NONE}; - unique_ptr elem_idx_dist_; //!< Distribution of - //!< mesh element indices + DiscreteIndex elem_idx_dist_; //!< Distribution of + //!< mesh element indices }; //============================================================================== diff --git a/src/distribution.cpp b/src/distribution.cpp index 2066e5a8c1..18fa414490 100644 --- a/src/distribution.cpp +++ b/src/distribution.cpp @@ -25,8 +25,9 @@ namespace openmc { DiscreteIndex::DiscreteIndex(pugi::xml_node node) { auto params = get_node_array(node, "parameters"); + std::size_t n = params.size() / 2; - prob_.assign(params.begin(), params.end()); + prob_.assign(params.begin() + n, params.end()); this->init_alias(); } @@ -38,6 +39,13 @@ DiscreteIndex::DiscreteIndex(const double* p, int n) this->init_alias(); } +void DiscreteIndex::assign(const double* p, int n) +{ + prob_.assign(p, p + n); + + this->init_alias(); +} + void DiscreteIndex::init_alias() { normalize(); @@ -111,21 +119,19 @@ void DiscreteIndex::normalize() // Discrete implementation //============================================================================== -Discrete::Discrete(pugi::xml_node node) +Discrete::Discrete(pugi::xml_node node) : di_(node) { auto params = get_node_array(node, "parameters"); std::size_t n = params.size() / 2; x_.assign(params.begin(), params.begin() + n); - di_ = new DiscreteIndex(params.begin() + n, n) } -Discrete::Discrete(const double* x, const double* p, int n) +Discrete::Discrete(const double* x, const double* p, int n) : di_(p, n) { x_.assign(x, x + n); - di_ = new DiscreteIndex(params.begin() + n, n) } double Discrete::sample(uint64_t* seed) const diff --git a/src/distribution_spatial.cpp b/src/distribution_spatial.cpp index c2d370b17a..694617ac5b 100644 --- a/src/distribution_spatial.cpp +++ b/src/distribution_spatial.cpp @@ -231,7 +231,7 @@ MeshSpatial::MeshSpatial(pugi::xml_node node) } } - elem_idx_dist_ = make_unique(strengths.data(), n_bins); + elem_idx_dist_.assign(strengths.data(), n_bins); } Position MeshSpatial::sample(uint64_t* seed) const