From c7fa8c05ce017b2c0fec75d7e9dee2f668a5f79b Mon Sep 17 00:00:00 2001 From: Adam G Nelson Date: Sun, 2 Sep 2018 21:10:01 -0400 Subject: [PATCH] Added delayed test and made code changes so that we pass the tests --- src/mgxs.cpp | 18 +-- src/xsdata.cpp | 146 +++++++----------- .../mg_benchmark/inputs_true.dat | 37 ++++- .../mg_benchmark/results_true.dat | 2 +- tests/regression_tests/mg_benchmark/test.py | 2 +- .../mg_benchmark_delayed/inputs_true.dat | 51 ++++++ .../mg_benchmark_delayed/results_true.dat | 2 + .../mg_benchmark_delayed/test.py | 2 +- 8 files changed, 154 insertions(+), 106 deletions(-) create mode 100644 tests/regression_tests/mg_benchmark_delayed/inputs_true.dat create mode 100644 tests/regression_tests/mg_benchmark_delayed/results_true.dat diff --git a/src/mgxs.cpp b/src/mgxs.cpp index 93b7d43b77..b9e22780ab 100644 --- a/src/mgxs.cpp +++ b/src/mgxs.cpp @@ -463,11 +463,11 @@ Mgxs::get_xs(const int xstype, const int gin, int* gout, double* mu, int* dg) case MG_GET_XS_DELAYED_NU_FISSION: if (fissionable) { if (dg != nullptr) { - val = xs_t->delayed_nu_fission(a, gin, *dg); + val = xs_t->delayed_nu_fission(a, *dg, gin); } else { val = 0.; for (int d = 0; d < xs_t->delayed_nu_fission.shape()[2]; d++) { - val += xs_t->delayed_nu_fission(a, gin, d); + val += xs_t->delayed_nu_fission(a, d, gin); } } } else { @@ -493,21 +493,21 @@ Mgxs::get_xs(const int xstype, const int gin, int* gout, double* mu, int* dg) if (fissionable) { if (gout != nullptr) { if (dg != nullptr) { - val = xs_t->chi_delayed(a, gin, *gout, *dg); + val = xs_t->chi_delayed(a, *dg, gin, *gout); } else { - val = xs_t->chi_delayed(a, gin, *gout, 0); + val = xs_t->chi_delayed(a, 0, gin, *gout); } } else { if (dg != nullptr) { val = 0.; for (int g = 0; g < xs_t->delayed_nu_fission.shape()[2]; g++) { - val += xs_t->delayed_nu_fission(a, gin, g, *dg); + val += xs_t->delayed_nu_fission(a, *dg, gin, g); } } else { val = 0.; for (int g = 0; g < xs_t->delayed_nu_fission.shape()[2]; g++) { for (int d = 0; d < xs_t->delayed_nu_fission.shape()[3]; d++) { - val += xs_t->delayed_nu_fission(a, gin, g, d); + val += xs_t->delayed_nu_fission(a, d, gin, g); } } } @@ -578,7 +578,7 @@ Mgxs::sample_fission_energy(const int gin, int& dg, int& gout) while (xi_pd >= prob_prompt) { dg++; prob_prompt += - xs_t->delayed_nu_fission(cache[tid].a, gin, dg); + xs_t->delayed_nu_fission(cache[tid].a, dg, gin); } // adjust dg in case of round-off error @@ -587,11 +587,11 @@ Mgxs::sample_fission_energy(const int gin, int& dg, int& gout) // sample the outgoing energy group gout = 0; double prob_gout = - xs_t->chi_delayed(cache[tid].a, gin, gout, dg); + xs_t->chi_delayed(cache[tid].a, dg, gin, gout); while (prob_gout < xi_gout) { gout++; prob_gout += - xs_t->chi_delayed(cache[tid].a, gin, gout, dg); + xs_t->chi_delayed(cache[tid].a, dg, gin, gout); } } } diff --git a/src/xsdata.cpp b/src/xsdata.cpp index 18e474987c..fd849b1c7c 100644 --- a/src/xsdata.cpp +++ b/src/xsdata.cpp @@ -32,7 +32,7 @@ XsData::XsData(size_t energy_groups, size_t num_delayed_groups, bool fissionable scatter_format != ANGLE_LEGENDRE) { fatal_error("Invalid scatter_format!"); } - // allocate all [temperature][phi][theta][in group] quantities + // allocate all [temperature][angle][in group] quantities std::vector shape = {n_ang, energy_groups}; total = xt::zeros(shape); absorption = xt::zeros(shape); @@ -44,21 +44,21 @@ XsData::XsData(size_t energy_groups, size_t num_delayed_groups, bool fissionable kappa_fission = xt::zeros(shape); } - // allocate decay_rate; [temperature][phi][theta][delayed group] + // allocate decay_rate; [temperature][angle][delayed group] shape[1] = num_delayed_groups; decay_rate = xt::zeros(shape); if (fissionable) { - shape = {n_ang, energy_groups, num_delayed_groups}; - // allocate delayed_nu_fission; [temperature][phi][theta][in group][delay group] + shape = {n_ang, num_delayed_groups, energy_groups}; + // allocate delayed_nu_fission; [temperature][angle][delay group][in group] delayed_nu_fission = xt::zeros(shape); - // chi_prompt; [temperature][phi][theta][in group][out group] + // chi_prompt; [temperature][angle][in group][out group] shape = {n_ang, energy_groups, energy_groups}; chi_prompt = xt::zeros(shape); - // chi_delayed; [temperature][phi][theta][in group][out group][delay group] - shape = {n_ang, energy_groups, energy_groups, num_delayed_groups}; + // chi_delayed; [temperature][angle][delay group][in group][out group] + shape = {n_ang, num_delayed_groups, energy_groups, energy_groups}; chi_delayed = xt::zeros(shape); } @@ -136,16 +136,9 @@ XsData::fission_vector_beta_from_hdf5(hid_t xsdata_grp, size_t n_ang, // Now every incoming group in prompt_chi and delayed_chi is the normalized // chi we just made - for (size_t a = 0; a < n_ang; a++) { - for (size_t gin = 0; gin < energy_groups; gin++) { - for (size_t gout = 0; gout < energy_groups; gout++) { - chi_prompt(a, gin, gout) = temp_chi(a, gout); - for (size_t dg = 0; dg < delayed_groups; dg++) { - chi_delayed(a, gin, gout, dg) = temp_chi(a, gout); - } - } - } - } + chi_prompt = xt::view(temp_chi, xt::all(), xt::newaxis(), xt::all()); + chi_delayed = xt::view(temp_chi, xt::all(), xt::newaxis(), xt::newaxis(), + xt::all()); // Get nu-fission xt::xtensor temp_nufiss({n_ang, energy_groups}, 0.); @@ -159,13 +152,9 @@ XsData::fission_vector_beta_from_hdf5(hid_t xsdata_grp, size_t n_ang, prompt_nu_fission = temp_nufiss * (1. - xt::sum(temp_beta, {1})); // Set delayed_nu_fission as beta * nu_fission - for (size_t a = 0; a < n_ang; a++) { - for (size_t gin = 0; gin < energy_groups; gin++) { - for (size_t dg = 0; dg < delayed_groups; dg++) { - delayed_nu_fission(a, gin, dg) = temp_beta(a, dg) * temp_nufiss(a, gin); - } - } - } + delayed_nu_fission = + xt::view(temp_beta, xt::all(), xt::all(), xt::newaxis()) * + xt::view(temp_nufiss, xt::all(), xt::newaxis(), xt::all()); } void @@ -179,27 +168,21 @@ XsData::fission_vector_no_beta_from_hdf5(hid_t xsdata_grp, size_t n_ang, read_nd_vector(xsdata_grp, "chi-prompt", temp_chi_p, true); // Normalize chi by summing over the outgoing groups for each incoming angle - temp_chi_p = temp_chi_p / xt::view(xt::sum(temp_chi_p, {1}), xt::all(), xt::newaxis()); + temp_chi_p = temp_chi_p / xt::view(xt::sum(temp_chi_p, {1}), xt::all(), + xt::newaxis()); // Get chi-delayed - xt::xtensor temp_chi_d({n_ang, energy_groups, delayed_groups}, 0.); + xt::xtensor temp_chi_d({n_ang, delayed_groups, energy_groups}, 0.); read_nd_vector(xsdata_grp, "chi-delayed", temp_chi_d, true); // Normalize chi by summing over the outgoing groups for each incoming angle - temp_chi_d = temp_chi_d / xt::view(xt::sum(temp_chi_d, {1}), xt::all(), - xt::newaxis(), xt::all()); + temp_chi_d = temp_chi_d / xt::view(xt::sum(temp_chi_d, {2}), xt::all(), + xt::all(), xt::newaxis()); // Now assign the prompt and delayed chis by replicating for each incoming group - for (size_t a = 0; a < n_ang; a++) { - for (size_t gin = 0; gin < energy_groups; gin++) { - for (size_t gout = 0; gout < energy_groups; gout++) { - chi_prompt(a, gin, gout) = temp_chi_p(a, gout); - for (size_t dg = 0; dg < delayed_groups; dg++) { - chi_delayed(a, gin, gout, dg) = temp_chi_d(a, gout, dg); - } - } - } - } + chi_prompt = xt::view(temp_chi_p, xt::all(), xt::newaxis(), xt::all()); + chi_delayed = xt::view(temp_chi_d, xt::all(), xt::all(), xt::newaxis(), + xt::all()); // Get prompt and delayed nu-fission directly read_nd_vector(xsdata_grp, "prompt-nu-fission", prompt_nu_fission, true); @@ -246,59 +229,40 @@ XsData::fission_matrix_beta_from_hdf5(hid_t xsdata_grp, size_t n_ang, // Data is provided as nu-fission and chi with a beta for delayed info // Get nu-fission matrix - xt::xtensor temp_matrix({n_ang, energy_groups, energy_groups}); + xt::xtensor temp_matrix({n_ang, energy_groups, energy_groups}, 0.); read_nd_vector(xsdata_grp, "nu-fission", temp_matrix, true); // Get beta - xt::xtensor temp_beta({n_ang, energy_groups, delayed_groups}, 0.); + xt::xtensor temp_beta({n_ang, delayed_groups}, 0.); read_nd_vector(xsdata_grp, "beta", temp_beta, true); + xt::xtensor temp_beta_sum({n_ang}, 0.); + temp_beta_sum = xt::sum(temp_beta, {1}); + // prompt_nu_fission is the sum of this matrix over outgoing groups and - // multiplied by (1 - beta_tot) - prompt_nu_fission = xt::sum(temp_matrix, {2}) * (1. - xt::sum(temp_beta, {2})); + // multiplied by (1 - beta_sum) + prompt_nu_fission = xt::sum(temp_matrix, {2}) * (1. - temp_beta_sum); // delayed_nu_fission is the sum of this matrix over outgoing groups and // multiplied by beta - for (size_t a = 0; a < n_ang; a++) { - for (size_t gin = 0; gin < energy_groups; gin++) { - double out_sum = 0.; - for (size_t gout = 0; gout < energy_groups; gout++) { - out_sum += temp_matrix(a, gin, gout); - } - for (size_t dg = 0; dg < delayed_groups; dg++) { - delayed_nu_fission(a, gin, dg) = temp_beta(a, dg) * out_sum; - } - } - } + delayed_nu_fission = + xt::view(temp_beta, xt::all(), xt::all(), xt::newaxis()) * + xt::view(xt::sum(temp_matrix, {2}), xt::all(), xt::newaxis(), xt::all()); // Store chi-prompt - for (size_t a = 0; a < n_ang; a++) { - for (size_t gin = 0; gin < energy_groups; gin++) { - for (size_t gout = 0; gout < energy_groups; gout++) { - double beta = 0.; - for (size_t dg = 0; dg < delayed_groups; dg++) { - beta += temp_beta(a, gin, dg); - } - chi_prompt(a, gin, gout) = (1.0 - beta) * temp_matrix(a, gin, gout); - } - } - } + chi_prompt = xt::view(1.0 - temp_beta_sum, xt::all(), xt::newaxis(), xt::newaxis()) * temp_matrix; // Store chi-delayed - for (size_t a = 0; a < n_ang; a++) { - for (size_t gin = 0; gin < energy_groups; gin++) { - for (size_t gout = 0; gout < energy_groups; gout++) { - for (size_t dg = 0; dg < delayed_groups; dg++) { - chi_delayed(a, gin, gout, dg) = temp_beta(a, gin, dg) * temp_matrix(a, gin, gout); - } - } - } - } + chi_delayed = + xt::view(temp_beta, xt::all(), xt::all(), xt::newaxis(), xt::newaxis()) * + xt::view(temp_matrix, xt::all(), xt::newaxis(), xt::all(), xt::all()); //Normalize both - chi_prompt = chi_prompt / xt::view(xt::sum(chi_prompt, {2}), xt::all(), xt::newaxis()); - chi_delayed = chi_delayed / xt::view(xt::sum(chi_delayed, {2}), xt::all(), - xt::newaxis(), xt::all()); + chi_prompt = chi_prompt / xt::view(xt::sum(chi_prompt, {2}), xt::all(), + xt::all(), xt::newaxis()); + + chi_delayed = chi_delayed / xt::view(xt::sum(chi_delayed, {3}), xt::all(), + xt::all(), xt::all(), xt::newaxis()); } void @@ -308,7 +272,7 @@ XsData::fission_matrix_no_beta_from_hdf5(hid_t xsdata_grp, size_t n_ang, // Data is provided separately as prompt + delayed nu-fission and chi // Get the prompt nu-fission matrix - xt::xtensor temp_matrix_p({n_ang, energy_groups, energy_groups}); + xt::xtensor temp_matrix_p({n_ang, energy_groups, energy_groups}, 0.); read_nd_vector(xsdata_grp, "prompt-nu-fission", temp_matrix_p, true); // prompt_nu_fission is the sum over outgoing groups @@ -316,19 +280,21 @@ XsData::fission_matrix_no_beta_from_hdf5(hid_t xsdata_grp, size_t n_ang, // chi_prompt is this matrix but normalized over outgoing groups, which we // have already stored in prompt_nu_fission - chi_prompt = temp_matrix_p / prompt_nu_fission; + chi_prompt = temp_matrix_p / + xt::view(prompt_nu_fission, xt::all(), xt::all(), xt::newaxis()); // Get the delayed nu-fission matrix - xt::xtensor temp_matrix_d({n_ang, energy_groups, energy_groups, - delayed_groups}); + xt::xtensor temp_matrix_d({n_ang, delayed_groups, energy_groups, + energy_groups}, 0.); read_nd_vector(xsdata_grp, "delayed-nu-fission", temp_matrix_d, true); // delayed_nu_fission is the sum over outgoing groups - delayed_nu_fission = xt::sum(temp_matrix_d, {2}); + delayed_nu_fission = xt::sum(temp_matrix_d, {3}); // chi_prompt is this matrix but normalized over outgoing groups, which we // have already stored in prompt_nu_fission - chi_delayed = temp_matrix_d / delayed_nu_fission; + chi_delayed = temp_matrix_d / + xt::view(delayed_nu_fission, xt::all(), xt::all(), xt::all(), xt::newaxis()); } void @@ -339,7 +305,7 @@ XsData::fission_matrix_no_delayed_from_hdf5(hid_t xsdata_grp, size_t n_ang, // Therefore, the code only considers the data as prompt. // Get nu-fission matrix - xt::xtensor temp_matrix({n_ang, energy_groups, energy_groups}); + xt::xtensor temp_matrix({n_ang, energy_groups, energy_groups}, 0.); if (object_exists(xsdata_grp, "prompt-nu-fission")) { read_nd_vector(xsdata_grp, "prompt-nu-fission", temp_matrix, true); } else { @@ -366,7 +332,8 @@ XsData::fission_from_hdf5(hid_t xsdata_grp, size_t n_ang, size_t energy_groups, // Get the data; the strategy for doing so depends on if the data is provided // as a nu-fission matrix or a set of chi and nu-fission vectors - if (object_exists(xsdata_grp, "chi")) { + if (object_exists(xsdata_grp, "chi") || + object_exists(xsdata_grp, "chi-prompt")) { if (delayed_groups == 0) { fission_vector_no_delayed_from_hdf5(xsdata_grp, n_ang, energy_groups); } else { @@ -393,13 +360,10 @@ XsData::fission_from_hdf5(hid_t xsdata_grp, size_t n_ang, size_t energy_groups, } // Combine prompt_nu_fission and delayed_nu_fission into nu_fission - for (size_t a = 0; a < n_ang; a++) { - for (size_t gin = 0; gin < energy_groups; gin++) { - nu_fission(a, gin) = prompt_nu_fission(a, gin); - for (size_t dg = 0; dg < delayed_groups; dg++) { - nu_fission(a, gin) += delayed_nu_fission(a, gin, dg); - } - } + if (delayed_groups == 0) { + nu_fission = prompt_nu_fission; + } else { + nu_fission = prompt_nu_fission + xt::sum(delayed_nu_fission, {1}); } } diff --git a/tests/regression_tests/mg_benchmark/inputs_true.dat b/tests/regression_tests/mg_benchmark/inputs_true.dat index 8856770ddb..4f2fd3f0b0 100644 --- a/tests/regression_tests/mg_benchmark/inputs_true.dat +++ b/tests/regression_tests/mg_benchmark/inputs_true.dat @@ -1,16 +1,47 @@ + + + + + - + + + + + + 2g.h5 - + + + + + + + + + + + + + + + + + + + + + + @@ -20,7 +51,7 @@ 5 - -929.45 -1e+50 -1e+50 929.45 1e+50 1e+50 + 0.0 -1000.0 -1000.0 154.90833333333333 1000.0 1000.0 diff --git a/tests/regression_tests/mg_benchmark/results_true.dat b/tests/regression_tests/mg_benchmark/results_true.dat index 33e4d68f79..dede97007b 100644 --- a/tests/regression_tests/mg_benchmark/results_true.dat +++ b/tests/regression_tests/mg_benchmark/results_true.dat @@ -1,2 +1,2 @@ k-combined: -9.949396E-01 2.047218E-02 +1.005345E+00 1.109180E-02 diff --git a/tests/regression_tests/mg_benchmark/test.py b/tests/regression_tests/mg_benchmark/test.py index cc8f5ba34a..97cef92adc 100644 --- a/tests/regression_tests/mg_benchmark/test.py +++ b/tests/regression_tests/mg_benchmark/test.py @@ -156,7 +156,7 @@ def create_model(): class MGXSTestHarness(PyAPITestHarness): def _cleanup(self): super()._cleanup() - f = '2g .h5' + f = '2g.h5' if os.path.exists(f): os.remove(f) diff --git a/tests/regression_tests/mg_benchmark_delayed/inputs_true.dat b/tests/regression_tests/mg_benchmark_delayed/inputs_true.dat new file mode 100644 index 0000000000..e62e65ab1d --- /dev/null +++ b/tests/regression_tests/mg_benchmark_delayed/inputs_true.dat @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + 2g.h5 + + + + + + + + + + + + + + + + + + + + eigenvalue + 1000 + 10 + 5 + + + 0.0 -1000.0 -1000.0 232.3625 1000.0 1000.0 + + + + false + + multi-group + + false + + diff --git a/tests/regression_tests/mg_benchmark_delayed/results_true.dat b/tests/regression_tests/mg_benchmark_delayed/results_true.dat new file mode 100644 index 0000000000..4b425173d6 --- /dev/null +++ b/tests/regression_tests/mg_benchmark_delayed/results_true.dat @@ -0,0 +1,2 @@ +k-combined: +9.928704E-01 2.679667E-02 diff --git a/tests/regression_tests/mg_benchmark_delayed/test.py b/tests/regression_tests/mg_benchmark_delayed/test.py index f9f04110ef..72bd34e1b2 100644 --- a/tests/regression_tests/mg_benchmark_delayed/test.py +++ b/tests/regression_tests/mg_benchmark_delayed/test.py @@ -164,7 +164,7 @@ def create_model(): class MGXSTestHarness(PyAPITestHarness): def _cleanup(self): super()._cleanup() - f = '2g .h5' + f = '2g.h5' if os.path.exists(f): os.remove(f)