Extend openmc.data to be able to import ENDF data and perform resonance

reconstruction.
This commit is contained in:
Paul Romano 2016-02-24 11:01:12 -06:00
parent 4f95b4a7f6
commit cbcd3a7f57
21 changed files with 3308 additions and 171 deletions

View file

@ -4,6 +4,7 @@ from numbers import Real, Integral
import numpy as np
import openmc.data
import openmc.checkvalue as cv
from openmc.mixin import EqualityMixin
@ -423,3 +424,80 @@ class Sum(EqualityMixin):
def functions(self, functions):
cv.check_type('functions', functions, Iterable, Callable)
self._functions = functions
class ResonancesWithBackground(EqualityMixin):
"""Cross section in resolved resonance region.
Parameters
----------
resonances : openmc.data.Resonances
Resolved resonance parameter data
background : Callable
Background cross section as a function of energy
mt : int
MT value of the reaction
Attributes
----------
resonances : openmc.data.Resonances
Resolved resonance parameter data
background : Callable
Background cross section as a function of energy
mt : int
MT value of the reaction
"""
def __init__(self, resonances, background, mt):
self.resonances = resonances
self.background = background
self.mt = mt
def __call__(self, x):
# Get background cross section
xs = self.background(x)
rrr = self.resonances.resolved
if isinstance(x, Iterable):
# Determine which energies are within resolved resonance range
within_rrr = (rrr.energy_min <= x) & (x <= rrr.energy_max)
# Get resonance cross sections and add to background
resonant_xs = rrr.reconstruct(x[within_rrr])
xs[within_rrr] += resonant_xs[self.mt]
else:
if rrr.energy_min <= x <= rrr.energy_max:
resonant_xs = rrr.reconstruct(x)
xs += resonant_xs[self.mt]
return xs
@property
def background(self):
return self._background
@property
def mt(self):
return self._mt
@property
def resonances(self):
return self._resonances
@background.setter
def background(self, background):
cv.check_type('background cross section', background, Callable)
self._background = background
@mt.setter
def mt(self, mt):
cv.check_type('MT value', mt, Integral)
self._mt = mt
@resonances.setter
def resonances(self, resonances):
cv.check_type('resolved resonance parameters', resonances,
openmc.data.Resonances)
self._resonances = resonances