From ec5f0e54f4e764dd5a5cb52e8cd5d8e725856abd Mon Sep 17 00:00:00 2001 From: Patrick A Myers Date: Fri, 27 Jan 2023 10:22:27 -0500 Subject: [PATCH] Restored init_alias and changed constructor definitions --- include/openmc/distribution.h | 2 +- src/distribution.cpp | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/include/openmc/distribution.h b/include/openmc/distribution.h index 8563ee031..4fc0db2e0 100644 --- a/include/openmc/distribution.h +++ b/include/openmc/distribution.h @@ -60,7 +60,7 @@ private: void normalize(); //! Initialize alias tables for distribution - void init_alias(); + void init_alias(vector& x, vector& p); }; //============================================================================== diff --git a/src/distribution.cpp b/src/distribution.cpp index 50913dfe4..4b4ebd69d 100644 --- a/src/distribution.cpp +++ b/src/distribution.cpp @@ -27,20 +27,27 @@ Discrete::Discrete(pugi::xml_node node) auto params = get_node_array(node, "parameters"); std::size_t n = params.size(); - double x[n / 2], p[n / 2]; + std::vector x_vec(params.begin(), params.begin() + n / 2); + std::vector p_vec(params.begin() + n / 2, params.end()); - std::copy(params.begin(), params.begin() + n / 2, x); - std::copy(params.begin() + n / 2, params.end(), p); - - new (this) Discrete(x, p, n / 2); + this->init_alias(x_vec, p_vec); } Discrete::Discrete(const double* x, const double* p, int n) - : x_ {x, x + n}, prob_ {p, p + n} { + std::vector x_vec(x, x + n); + std::vector p_vec(p, p + n); + + this->init_alias(x_vec, p_vec); +} + +void Discrete::init_alias(vector& x, vector& p) +{ + x_ = x; + prob_ = p; normalize(); - // The initialization and sampling method is base on Vose + // The initialization and sampling method is based on Vose // (DOI: 10.1109/32.92917) // Vectors for large and small probabilities based on 1/n vector large;