From 75fd0a7f78116681ccc9126f71fea9b27d95360f Mon Sep 17 00:00:00 2001 From: agnelson Date: Tue, 5 Oct 2021 14:12:31 -0500 Subject: [PATCH] Added test of volume calc from MG mode, then corrected 2 issues: the first led to #1698, the second led to the test failing as volume calcs need atom densities but they existed in a different location in MG mode. To fix the former, if blocks were placed to point to the MG nuclide data as necessary, and the latter by calling Material.finalize() at the appropriate spot in the MG code --- src/material.cpp | 32 ++++++++++++---------- src/mgxs_interface.cpp | 6 +++- src/volume_calc.cpp | 7 +++-- tests/regression_tests/volume_calc/test.py | 2 ++ 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/material.cpp b/src/material.cpp index ca29ce7404..30dfa5ed50 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -349,24 +349,26 @@ Material::~Material() void Material::finalize() { // Set fissionable if any nuclide is fissionable - for (const auto& i_nuc : nuclide_) { - if (data::nuclides[i_nuc]->fissionable_) { - fissionable_ = true; - break; + if (settings::run_CE) { + for (const auto& i_nuc : nuclide_) { + if (data::nuclides[i_nuc]->fissionable_) { + fissionable_ = true; + break; + } } + + // Generate material bremsstrahlung data for electrons and positrons + if (settings::photon_transport && + settings::electron_treatment == ElectronTreatment::TTB) { + this->init_bremsstrahlung(); + } + + // Assign thermal scattering tables + this->init_thermal(); } - // Generate material bremsstrahlung data for electrons and positrons - if (settings::photon_transport && - settings::electron_treatment == ElectronTreatment::TTB) { - this->init_bremsstrahlung(); - } - - // Assign thermal scattering tables - this->init_thermal(); - - // Normalize density - this->normalize_density(); +// Normalize density +this->normalize_density(); } void Material::normalize_density() diff --git a/src/mgxs_interface.cpp b/src/mgxs_interface.cpp index 1a6dab5c6a..77085d57c8 100644 --- a/src/mgxs_interface.cpp +++ b/src/mgxs_interface.cpp @@ -123,10 +123,14 @@ void MgxsInterface::create_macro_xs() // Therefore type(nuclides[mat->nuclide_[0]]) dictates type(macroxs). // At the same time, we will find the scattering type, as that will dictate // how we allocate the scatter object within macroxs. + for (int i = 0; i < model::materials.size(); ++i) { + // First we have to normalize the densities as it has not been called yet + // for MG mode + auto& mat {model::materials[i]}; + mat->finalize(); if (kTs[i].size() > 0) { // Convert atom_densities to a vector - auto& mat {model::materials[i]}; vector atom_densities( mat->atom_density_.begin(), mat->atom_density_.end()); diff --git a/src/volume_calc.cpp b/src/volume_calc.cpp index ae738d6bb1..3ae98fdc38 100644 --- a/src/volume_calc.cpp +++ b/src/volume_calc.cpp @@ -8,6 +8,7 @@ #include "openmc/hdf5_interface.h" #include "openmc/material.h" #include "openmc/message_passing.h" +#include "openmc/mgxs_interface.h" #include "openmc/nuclide.h" #include "openmc/output.h" #include "openmc/random_lcg.h" @@ -237,7 +238,8 @@ vector VolumeCalculation::execute() const // Create 2D array to store atoms/uncertainty for each nuclide. Later this // is compressed into vectors storing only those nuclides that are // non-zero - auto n_nuc = data::nuclides.size(); + auto n_nuc = settings::run_CE ? data::nuclides.size() + : data::mg.nuclides_.size(); xt::xtensor atoms({n_nuc, 2}, 0.0); #ifdef OPENMC_MPI @@ -442,7 +444,8 @@ void VolumeCalculation::to_hdf5( vector nucnames; for (int i_nuc : result.nuclides) { - nucnames.push_back(data::nuclides[i_nuc]->name_); + nucnames.push_back(settings::run_CE ? data::nuclides[i_nuc]->name_ + : data::mg.nuclides_[i_nuc].name); } // Create array of total # of atoms with uncertainty for each nuclide diff --git a/tests/regression_tests/volume_calc/test.py b/tests/regression_tests/volume_calc/test.py index fc96e4a551..ddca3ceaa7 100644 --- a/tests/regression_tests/volume_calc/test.py +++ b/tests/regression_tests/volume_calc/test.py @@ -100,6 +100,8 @@ class VolumeTest(PyAPITestHarness): for iso in ['H1', 'O16', 'B10', 'Mo99', 'U235']: mat = openmc.XSdata(iso, groups) mat.order = 0 + mat.atomic_weight_ratio = \ + openmc.data.atomic_mass(iso) / openmc.data.NEUTRON_MASS mat.set_scatter_matrix(scatter) if iso == 'U235': mat.set_nu_fission(np.multiply(nu, fiss))