diff --git a/include/openmc/xsdata.h b/include/openmc/xsdata.h index 780855ecf..0bdeaf818 100644 --- a/include/openmc/xsdata.h +++ b/include/openmc/xsdata.h @@ -37,7 +37,7 @@ class XsData { // the HDF5 file when beta is provided. void fission_vector_beta_from_hdf5(hid_t xsdata_grp, size_t n_ang, - size_t energy_groups, size_t delayed_groups); + size_t energy_groups, size_t delayed_groups, bool is_isotropic); //! \brief Reads fission data formatted as chi and nu-fission vectors from // the HDF5 file when beta is not provided. @@ -55,7 +55,7 @@ class XsData { // the HDF5 file when beta is provided. void fission_matrix_beta_from_hdf5(hid_t xsdata_grp, size_t n_ang, - size_t energy_groups, size_t delayed_groups); + size_t energy_groups, size_t delayed_groups, bool is_isotropic); //! \brief Reads fission data formatted as a nu-fission matrix from // the HDF5 file when beta is not provided. diff --git a/src/xsdata.cpp b/src/xsdata.cpp index cd53b826e..d89fb1172 100644 --- a/src/xsdata.cpp +++ b/src/xsdata.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include "xtensor/xview.hpp" #include "xtensor/xindex_view.hpp" @@ -124,7 +123,7 @@ XsData::from_hdf5(hid_t xsdata_grp, bool fissionable, int scatter_format, void XsData::fission_vector_beta_from_hdf5(hid_t xsdata_grp, size_t n_ang, - size_t energy_groups, size_t delayed_groups) + size_t energy_groups, size_t delayed_groups, bool is_isotropic) { // Data is provided as nu-fission and chi with a beta for delayed info @@ -145,17 +144,35 @@ XsData::fission_vector_beta_from_hdf5(hid_t xsdata_grp, size_t n_ang, xt::xtensor temp_nufiss({n_ang, energy_groups}, 0.); read_nd_vector(xsdata_grp, "nu-fission", temp_nufiss, true); - // Get beta - xt::xtensor temp_beta({n_ang, delayed_groups}, 0.); - read_nd_vector(xsdata_grp, "beta", temp_beta, true); + // Get beta (strategy will depend upon the number of dimensions in beta) + hid_t beta_dset = open_dataset(xsdata_grp, "beta"); + int beta_ndims = dataset_ndims(beta_dset); + close_dataset(beta_dset); + int ndim_target = 1; + if (!is_isotropic) ndim_target += 2; + if (beta_ndims == ndim_target) { + xt::xtensor temp_beta({n_ang, delayed_groups}, 0.); + read_nd_vector(xsdata_grp, "beta", temp_beta, true); - // Set prompt_nu_fission = (1. - beta_total)*nu_fission - prompt_nu_fission = temp_nufiss * (1. - xt::sum(temp_beta, {1})); + // Set prompt_nu_fission = (1. - beta_total)*nu_fission + prompt_nu_fission = temp_nufiss * (1. - xt::sum(temp_beta, {1})); - // Set delayed_nu_fission as beta * nu_fission - delayed_nu_fission = - xt::view(temp_beta, xt::all(), xt::all(), xt::newaxis()) * - xt::view(temp_nufiss, xt::all(), xt::newaxis(), xt::all()); + // Set delayed_nu_fission as beta * nu_fission + delayed_nu_fission = + xt::view(temp_beta, xt::all(), xt::all(), xt::newaxis()) * + xt::view(temp_nufiss, xt::all(), xt::newaxis(), xt::all()); + } else if (beta_ndims == ndim_target + 1) { + xt::xtensor temp_beta({n_ang, delayed_groups, energy_groups}, + 0.); + read_nd_vector(xsdata_grp, "beta", temp_beta, true); + + // Set prompt_nu_fission = (1. - beta_total)*nu_fission + prompt_nu_fission = temp_nufiss * (1. - xt::sum(temp_beta, {1})); + + // Set delayed_nu_fission as beta * nu_fission + delayed_nu_fission = temp_beta * + xt::view(temp_nufiss, xt::all(), xt::newaxis(), xt::all()); + } } void @@ -219,7 +236,7 @@ XsData::fission_vector_no_delayed_from_hdf5(hid_t xsdata_grp, size_t n_ang, void XsData::fission_matrix_beta_from_hdf5(hid_t xsdata_grp, size_t n_ang, - size_t energy_groups, size_t delayed_groups) + size_t energy_groups, size_t delayed_groups, bool is_isotropic) { // Data is provided as nu-fission and chi with a beta for delayed info @@ -227,32 +244,65 @@ XsData::fission_matrix_beta_from_hdf5(hid_t xsdata_grp, size_t n_ang, 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, delayed_groups}, 0.); - read_nd_vector(xsdata_grp, "beta", temp_beta, true); + // Get beta (strategy will depend upon the number of dimensions in beta) + hid_t beta_dset = open_dataset(xsdata_grp, "beta"); + int beta_ndims = dataset_ndims(beta_dset); + close_dataset(beta_dset); + int ndim_target = 1; + if (!is_isotropic) ndim_target += 2; + if (beta_ndims == ndim_target) { + 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}); + 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_sum) - prompt_nu_fission = xt::sum(temp_matrix, {2}) * (1. - temp_beta_sum); + // prompt_nu_fission is the sum of this matrix over outgoing groups and + // 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 - 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 + chi_prompt = xt::view(1.0 - temp_beta_sum, xt::all(), xt::newaxis(), + xt::newaxis()) * temp_matrix; - // Store chi-prompt - chi_prompt = xt::view(1.0 - temp_beta_sum, xt::all(), xt::newaxis(), xt::newaxis()) * temp_matrix; + // delayed_nu_fission is the sum of this matrix over outgoing groups and + // multiplied by beta + 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-delayed - 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()); + // Store chi-delayed + 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 + } else if (beta_ndims == ndim_target + 1) { + xt::xtensor temp_beta({n_ang, delayed_groups, energy_groups}, 0.); + read_nd_vector(xsdata_grp, "beta", temp_beta, true); + + xt::xtensor temp_beta_sum({n_ang, energy_groups}, 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_sum) + prompt_nu_fission = xt::sum(temp_matrix, {2}) * (1. - temp_beta_sum); + + // Store chi-prompt + chi_prompt = xt::view(1.0 - temp_beta_sum, xt::all(), xt::all(), + xt::newaxis()) * temp_matrix; + + // delayed_nu_fission is the sum of this matrix over outgoing groups and + // multiplied by beta + delayed_nu_fission = temp_beta * + xt::view(xt::sum(temp_matrix, {2}), xt::all(), xt::newaxis(), xt::all()); + + // Store chi-delayed + chi_delayed = + xt::view(temp_beta, xt::all(), xt::all(), xt::all(), xt::newaxis()) * + xt::view(temp_matrix, xt::all(), xt::newaxis(), xt::all(), xt::all()); + } + + //Normalize both chis chi_prompt = chi_prompt / xt::view(xt::sum(chi_prompt, {2}), xt::all(), xt::all(), xt::newaxis()); @@ -335,7 +385,7 @@ XsData::fission_from_hdf5(hid_t xsdata_grp, size_t n_ang, size_t energy_groups, } else { if (object_exists(xsdata_grp, "beta")) { fission_vector_beta_from_hdf5(xsdata_grp, n_ang, energy_groups, - delayed_groups); + delayed_groups, is_isotropic); } else { fission_vector_no_beta_from_hdf5(xsdata_grp, n_ang, energy_groups, delayed_groups); @@ -347,7 +397,7 @@ XsData::fission_from_hdf5(hid_t xsdata_grp, size_t n_ang, size_t energy_groups, } else { if (object_exists(xsdata_grp, "beta")) { fission_matrix_beta_from_hdf5(xsdata_grp, n_ang, energy_groups, - delayed_groups); + delayed_groups, is_isotropic); } else { fission_matrix_no_beta_from_hdf5(xsdata_grp, n_ang, energy_groups, delayed_groups); diff --git a/tests/regression_tests/mg_basic_delayed/inputs_true.dat b/tests/regression_tests/mg_basic_delayed/inputs_true.dat index e62e65ab1..9fb7afe7e 100644 --- a/tests/regression_tests/mg_basic_delayed/inputs_true.dat +++ b/tests/regression_tests/mg_basic_delayed/inputs_true.dat @@ -4,11 +4,15 @@ + + - - - - + + + + + + @@ -29,6 +33,14 @@ + + + + + + + + @@ -38,7 +50,7 @@ 5 - 0.0 -1000.0 -1000.0 232.3625 1000.0 1000.0 + 0.0 -1000.0 -1000.0 154.90833333333333 1000.0 1000.0 diff --git a/tests/regression_tests/mg_basic_delayed/results_true.dat b/tests/regression_tests/mg_basic_delayed/results_true.dat index 4b425173d..85312b8e1 100644 --- a/tests/regression_tests/mg_basic_delayed/results_true.dat +++ b/tests/regression_tests/mg_basic_delayed/results_true.dat @@ -1,2 +1,2 @@ k-combined: -9.928704E-01 2.679667E-02 +1.003463E+00 2.173155E-02 diff --git a/tests/regression_tests/mg_basic_delayed/test.py b/tests/regression_tests/mg_basic_delayed/test.py index 8fbcaca49..f0474a567 100644 --- a/tests/regression_tests/mg_basic_delayed/test.py +++ b/tests/regression_tests/mg_basic_delayed/test.py @@ -85,6 +85,29 @@ def create_library(): mat_4.set_total(total) mg_cross_sections_file.add_xsdata(mat_4) + # Make the base data that uses chi & nu-fiss vectors with a group-wise beta + mat_5 = openmc.XSdata('mat_5', groups) + mat_5.order = 1 + mat_5.num_delayed_groups = 2 + mat_5.set_beta(np.stack([beta] * groups.num_groups)) + mat_5.set_nu_fission(np.multiply(nu, fiss)) + mat_5.set_absorption(absorption) + mat_5.set_scatter_matrix(scatter) + mat_5.set_total(total) + mat_5.set_chi(chi) + mg_cross_sections_file.add_xsdata(mat_5) + + # Make a version that uses a nu-fission matrix with a group-wise beta + mat_6 = openmc.XSdata('mat_6', groups) + mat_6.order = 1 + mat_6.num_delayed_groups = 2 + mat_6.set_beta(np.stack([beta] * groups.num_groups)) + mat_6.set_nu_fission(np.outer(np.multiply(nu, fiss), chi)) + mat_6.set_absorption(absorption) + mat_6.set_scatter_matrix(scatter) + mat_6.set_total(total) + mg_cross_sections_file.add_xsdata(mat_6) + # Write the file mg_cross_sections_file.export_to_hdf5('2g.h5') @@ -99,8 +122,10 @@ class MGXSTestHarness(PyAPITestHarness): def test_mg_basic_delayed(): create_library() - model = slab_mg(num_regions=4, mat_names=['vec beta', 'vec no beta', - 'matrix beta', 'matrix no beta']) + model = slab_mg(num_regions=6, mat_names=['vec beta', 'vec no beta', + 'matrix beta', 'matrix no beta', + 'vec group beta', + 'matrix group beta']) harness = PyAPITestHarness('statepoint.10.h5', model) harness.main()