From fcaf9e25f67489902ae42f3c4bbbaadc2f200ea4 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 23 Feb 2021 22:40:49 -0600 Subject: [PATCH] Check that source_bank datatype matches when reading from file --- src/state_point.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/state_point.cpp b/src/state_point.cpp index 48d87d403..956518c1c 100644 --- a/src/state_point.cpp +++ b/src/state_point.cpp @@ -698,6 +698,17 @@ write_source_bank(hid_t group_id, bool surf_source_bank) H5Tclose(banktype); } +// Determine member names of a compound HDF5 datatype +std::string dtype_member_names(hid_t dtype_id) +{ + int nmembers = H5Tget_nmembers(dtype_id); + std::string names; + for (int i = 0; i < nmembers; i++) { + names = names.append(H5Tget_member_name(dtype_id, i)); + if (i < nmembers - 1) names += ", "; + } + return names; +} void read_source_bank(hid_t group_id, std::vector& sites, bool distribute) { @@ -705,6 +716,17 @@ void read_source_bank(hid_t group_id, std::vector& sites, bool d // Open the dataset hid_t dset = H5Dopen(group_id, "source_bank", H5P_DEFAULT); + + // Make sure number of members matches + hid_t dtype = H5Dget_type(dset); + auto file_member_names = dtype_member_names(dtype); + auto bank_member_names = dtype_member_names(banktype); + if (file_member_names != bank_member_names) { + fatal_error(fmt::format("Source site attributes in file do not match what is " + "expected for this version of OpenMC. File attributes = ({}). Expected " + "attributes = ({})", file_member_names, bank_member_names)); + } + hid_t dspace = H5Dget_space(dset); hsize_t n_sites; H5Sget_simple_extent_dims(dspace, &n_sites, nullptr);