From fe8cbcc487849d4e3cbd6e445cdf534f04faaf29 Mon Sep 17 00:00:00 2001 From: Adam G Nelson Date: Tue, 12 Nov 2019 05:07:43 -0600 Subject: [PATCH] Updated Mgxs::calculate_xs interface to use the particle, matching interface for continuous energy equivalent --- include/openmc/mgxs.h | 11 +++-------- src/mgxs.cpp | 15 +++++++-------- src/particle.cpp | 10 +++++----- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/include/openmc/mgxs.h b/include/openmc/mgxs.h index 71e8c7ec9..3dfd6ba4c 100644 --- a/include/openmc/mgxs.h +++ b/include/openmc/mgxs.h @@ -11,6 +11,7 @@ #include "openmc/constants.h" #include "openmc/hdf5_interface.h" +#include "openmc/particle.h" #include "openmc/xsdata.h" @@ -167,15 +168,9 @@ class Mgxs { //! \brief Calculates cross section quantities needed for tracking. //! - //! @param gin Incoming energy group. - //! @param sqrtkT Temperature of the material. - //! @param u Incoming particle direction. - //! @param total_xs Resultant total cross section. - //! @param abs_xs Resultant absorption cross section. - //! @param nu_fiss_xs Resultant nu-fission cross section. + //! @param p The particle whose attributes set which MGXS to get. void - calculate_xs(int gin, double sqrtkT, Direction u, - double& total_xs, double& abs_xs, double& nu_fiss_xs); + calculate_xs(Particle& p); //! \brief Sets the temperature index in cache given a temperature //! diff --git a/src/mgxs.cpp b/src/mgxs.cpp index 53e24c67c..0dd8c73cc 100644 --- a/src/mgxs.cpp +++ b/src/mgxs.cpp @@ -600,8 +600,7 @@ Mgxs::sample_scatter(int gin, int& gout, double& mu, double& wgt) //============================================================================== void -Mgxs::calculate_xs(int gin, double sqrtkT, Direction u, - double& total_xs, double& abs_xs, double& nu_fiss_xs) +Mgxs::calculate_xs(Particle& p) { // Set our indices #ifdef _OPENMP @@ -609,13 +608,13 @@ Mgxs::calculate_xs(int gin, double sqrtkT, Direction u, #else int tid = 0; #endif - set_temperature_index(sqrtkT); - set_angle_index(u); + set_temperature_index(p.sqrtkT_); + set_angle_index(p.u_local()); XsData* xs_t = &xs[cache[tid].t]; - total_xs = xs_t->total(cache[tid].a, gin); - abs_xs = xs_t->absorption(cache[tid].a, gin); - - nu_fiss_xs = fissionable ? xs_t->nu_fission(cache[tid].a, gin) : 0.; + p.macro_xs_.total = xs_t->total(cache[tid].a, p.g_); + p.macro_xs_.absorption = xs_t->absorption(cache[tid].a, p.g_); + p.macro_xs_.nu_fission = + fissionable ? xs_t->nu_fission(cache[tid].a, p.g_) : 0.; } //============================================================================== diff --git a/src/particle.cpp b/src/particle.cpp index da93c6723..b430d3a06 100644 --- a/src/particle.cpp +++ b/src/particle.cpp @@ -202,12 +202,12 @@ Particle::transport() model::materials[material_]->calculate_xs(*this); } } else { - // Get the MG data - data::mg.macro_xs_[material_].calculate_xs(g_, sqrtkT_, - this->u_local(), macro_xs_.total, macro_xs_.absorption, - macro_xs_.nu_fission); + // Get the MG data; unlike the CE case above, we have to re-calculate + // cross sections for every collision since the cross sections may + // be angle-dependent + data::mg.macro_xs_[material_].calculate_xs(*this); - // Finally, update the particle group since we know we are multi-group + // Update the particle's group while we know we are multi-group g_last_ = g_; } } else {