Consistent MultiGroup Scattering Matrices
Created by: wbinventor
This PR introduces a new formulation for computing multigroup scattering matrices with the openmc.mgxs
module. These changes attempt to eliminate reaction rate imbalance between total MGXS and scattering matrices. This work addresses instabilities observed by @geogunow with CMFD and linear/quadratic source approximations in OpenMOC when solving 3D problems.
Presently, scattering matrices are computed out of necessity with analog tally estimators, while the total cross section is computed with a tracklength estimator (by default). As a result of this mixture of tally estimators, neutron balance will not be conserved since it is not necessarily true that the total MGXS is equal to the sum of the absorption XS and the scattering matrix in each energy group. This is particularly relevant for void (e.g., helium gap) regions with miniscule cross sections, where the statistical inefficiency of the analog tally estimator used for the scattering matrix is particularly problematic for some applications (i.e., CMFD + linear source MOC).
This PR addresses this with a new formulation of the scattering matrix which is computed from the product of the (a) scattering cross section and the (b) grouptogroup scattering probability matrix. Reaction rates are exactly preserved (with the total cross section) since (a) is computed using a tracklength estimator, and simply convolved with (b). While (b) is necessarily computed with an analog estimator, it is normalized to unity across outgoing energy groups which ensures that the product (a) x (b) preserves neutron balance with the total and absorption cross sections.
From a design perspective, this PR introduces the following new classes to the openmc.mgxs
module:

ConvolvedMGXS
(abstract) ScatteringProbabilityMatrix
NuScatteringProbabilityMatrix
ConsistentScatteringMatrixXS
ConsisistentNuScatteringMatrixXS
I introduced the new ConvolvedMGXS
class in openmc.mgxs
, which is simply a MGXS
computed as a convolution of two or more "sub"MGXS
objects. While this may have been overkill, I thought it would provide a platform to build upon in the future, though I am certainly open to alternative ideas. The new (Nu
)ScatteringProbabilityMatrix
class encapsulates the grouptogroup scattering probabilities. The ConsistentScatteringMatrixXS
class defines the new scattering formulation as a product of a ScatterXS
(tracklength) and ScatterProbabilityMatrix
(analog) objects.
The current scattering matrix formulation and class were left intact. Note that the new classes do not (yet) support Legendre moments greater than zero. The new classes do support the use of a transport correction just as do the current scattering matrices.
Although @geogunow has yet to thoroughly evaluate this new scattering matrix in OpenMOC, I have done some simple sanity checks to confirm that it is roughly consistent with the current (original) scattering matrix formulation. For example, the following plot shows the discrepancy/imbalance between the total, absorption and scattering matrix cross sections as a function of realization for the current and new approaches (for a helium gap in a PWR fuel pin in the fast group). As expected, the imbalance for the new approach is very nearly zero (to within machine precision), while the current approach exhibits an imbalance that slowly converges to zero in the limit of infinite realizations.
It is worth noting that the new formulation does not accelerate the convergence of the scattering matrix statistical uncertainties. Indeed, the uncertainties are roughly the same as those for the current scattering matrix as shown below:
@nelsonag would you be interested in reciprocating and reviewing this PR as you find the time?