fixed mgxs library.py to accept MDGXS

This commit is contained in:
Sam Shaner 2016-08-02 18:53:44 -04:00
parent 1f1dab1733
commit 7be7c6f29b
4 changed files with 231 additions and 127 deletions

File diff suppressed because one or more lines are too long

View file

@ -18,17 +18,18 @@ if sys.version_info[0] >= 3:
class Library(object):
"""A multi-group cross section library for some energy group structure.
"""A multi-energy-group and multi-delayed-group cross section library for
some energy group structure.
This class can be used for both OpenMC input generation and tally data
post-processing to compute spatially-homogenized and energy-integrated
multi-group cross sections for deterministic neutronics calculations.
This class helps automate the generation of MGXS objects for some energy
group structure and domain type. The Library serves as a collection for
MGXS objects with routines to automate the initialization of tallies for
input files, the loading of tally data from statepoint files, data storage,
energy group condensation and more.
This class helps automate the generation of MGXS and MDGXS objects for some
energy group structure and domain type. The Library serves as a collection
for MGXS and MDGXS objects with routines to automate the initialization of
tallies for input files, the loading of tally data from statepoint files,
data storage, energy group condensation and more.
Parameters
----------
@ -64,6 +65,8 @@ class Library(object):
The highest legendre moment in the scattering matrices (default is 0)
energy_groups : openmc.mgxs.EnergyGroups
Energy group structure for energy condensation
delayed_groups : openmc.mgxs.DelayedGroups
Delayed groups to filter out the xs
tally_trigger : openmc.Trigger
An (optional) tally precision trigger given to each tally used to
compute the cross section
@ -95,6 +98,7 @@ class Library(object):
self._domain_type = None
self._domains = 'all'
self._energy_groups = None
self._delayed_groups = None
self._correction = 'P0'
self._legendre_order = 0
self._tally_trigger = None
@ -126,6 +130,7 @@ class Library(object):
clone._correction = self.correction
clone._legendre_order = self.legendre_order
clone._energy_groups = copy.deepcopy(self.energy_groups, memo)
clone._delayed_groups = copy.deepcopy(self.delayed_groups, memo)
clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo)
clone._all_mgxs = copy.deepcopy(self.all_mgxs)
clone._sp_filename = self._sp_filename
@ -194,6 +199,10 @@ class Library(object):
def energy_groups(self):
return self._energy_groups
@property
def delayed_groups(self):
return self._delayed_groups
@property
def correction(self):
return self._correction
@ -210,6 +219,13 @@ class Library(object):
def num_groups(self):
return self.energy_groups.num_groups
@property
def num_delayed_groups(self):
if self.delayed_groups == None:
return 0
else:
return self.delayed_groups.num_groups
@property
def all_mgxs(self):
return self._all_mgxs
@ -261,7 +277,7 @@ class Library(object):
def domain_type(self, domain_type):
cv.check_value('domain type', domain_type, openmc.mgxs.DOMAIN_TYPES)
if by_nuclide == True and domain_type == 'mesh':
if self.by_nuclide == True and domain_type == 'mesh':
raise ValueError('Unable to create MGXS library by nuclide with ' +
'mesh domain')
@ -308,6 +324,12 @@ class Library(object):
cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups)
self._energy_groups = energy_groups
@delayed_groups.setter
def delayed_groups(self, delayed_groups):
cv.check_type('delayed groups', delayed_groups,
openmc.mgxs.DelayedGroups)
self._delayed_groups = delayed_groups
@correction.setter
def correction(self, correction):
cv.check_value('correction', correction, ('P0', None))
@ -373,12 +395,19 @@ class Library(object):
for domain in self.domains:
self.all_mgxs[domain.id] = OrderedDict()
for mgxs_type in self.mgxs_types:
mgxs = openmc.mgxs.MGXS.get_mgxs(mgxs_type, name=self.name)
if mgxs_type in openmc.mgxs.MDGXS_TYPES:
mgxs = openmc.mgxs.MDGXS.get_mgxs(mgxs_type, name=self.name)
else:
mgxs = openmc.mgxs.MGXS.get_mgxs(mgxs_type, name=self.name)
mgxs.domain = domain
mgxs.domain_type = self.domain_type
mgxs.energy_groups = self.energy_groups
mgxs.by_nuclide = self.by_nuclide
if mgxs_type in openmc.mgxs.MDGXS_TYPES:
mgxs.delayed_groups = self.delayed_groups
# If a tally trigger was specified, add it to the MGXS
if self.tally_trigger:
mgxs.tally_trigger = self.tally_trigger

View file

@ -115,7 +115,7 @@ class MDGXS(MGXS):
__metaclass__ = abc.ABCMeta
def __init__(self, domain=None, domain_type=None, energy_groups=None,
by_nuclide=False, name='', delayed_groups=None):
delayed_groups=None, by_nuclide=False, name=''):
super(MDGXS, self).__init__(domain, domain_type, energy_groups,
by_nuclide, name)
self._delayed_groups = None
@ -124,12 +124,30 @@ class MDGXS(MGXS):
self.delayed_groups = delayed_groups
def __deepcopy__(self, memo):
super(MDGXS, self).__deepcopy__(memo)
existing = memo.get(id(self))
# If this is the first time we have tried to copy this object, copy it
if existing is None:
clone = type(self).__new__(type(self))
clone._name = self.name
clone._rxn_type = self.rxn_type
clone._by_nuclide = self.by_nuclide
clone._nuclides = copy.deepcopy(self._nuclides)
clone._domain = self.domain
clone._domain_type = self.domain_type
clone._energy_groups = copy.deepcopy(self.energy_groups, memo)
clone._delayed_groups = copy.deepcopy(self.delayed_groups, memo)
clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo)
clone._rxn_rate_tally = copy.deepcopy(self._rxn_rate_tally, memo)
clone._xs_tally = copy.deepcopy(self._xs_tally, memo)
clone._sparse = self.sparse
clone._derived = self.derived
clone._tallies = OrderedDict()
for tally_type, tally in self.tallies.items():
clone.tallies[tally_type] = copy.deepcopy(tally, memo)
memo[id(self)] = clone
return clone
@ -143,7 +161,10 @@ class MDGXS(MGXS):
@property
def num_delayed_groups(self):
return self.delayed_groups.num_groups
if self.delayed_groups == None:
return 0
else:
return self.delayed_groups.num_groups
@delayed_groups.setter
def delayed_groups(self, delayed_groups):
@ -167,8 +188,8 @@ class MDGXS(MGXS):
@staticmethod
def get_mgxs(mdgxs_type, domain=None, domain_type=None,
energy_groups=None, by_nuclide=False, name='',
delayed_groups=None):
energy_groups=None, delayed_groups=None,
by_nuclide=False, name=''):
"""Return a MDGXS subclass object for some energy group structure within
some spatial domain for some reaction type.
@ -206,15 +227,16 @@ class MDGXS(MGXS):
cv.check_value('mdgxs_type', mdgxs_type, MDGXS_TYPES)
if mdgxs_type == 'delayed-nu-fission':
mdgxs = DelayedNuFissionXS(domain, domain_type, energy_groups)
mdgxs = DelayedNuFissionXS(domain, domain_type, energy_groups,
delayed_groups)
elif mdgxs_type == 'chi-delayed':
mdgxs = ChiDelayed(domain, domain_type, energy_groups)
mdgxs = ChiDelayed(domain, domain_type, energy_groups,
delayed_groups)
elif mdgxs_type == 'beta':
mdgxs = Beta(domain, domain_type, energy_groups)
mdgxs = Beta(domain, domain_type, energy_groups, delayed_groups)
mdgxs.by_nuclide = by_nuclide
mdgxs.name = name
mdgxs.delayed_groups = delayed_groups
return mdgxs
def get_xs(self, groups='all', subdomains='all', nuclides='all',
@ -936,9 +958,9 @@ class ChiDelayed(MDGXS):
"""
def __init__(self, domain=None, domain_type=None, energy_groups=None,
by_nuclide=False, name='', delayed_groups=None):
delayed_groups=None, by_nuclide=False, name=''):
super(ChiDelayed, self).__init__(domain, domain_type, energy_groups,
by_nuclide, name, delayed_groups)
delayed_groups, by_nuclide, name)
self._rxn_type = 'chi-delayed'
@property
@ -1390,10 +1412,10 @@ class DelayedNuFissionXS(MDGXS):
"""
def __init__(self, domain=None, domain_type=None, energy_groups=None,
by_nuclide=False, name='', delayed_groups=None):
delayed_groups=None, by_nuclide=False, name=''):
super(DelayedNuFissionXS, self).__init__(domain, domain_type,
energy_groups, by_nuclide,
name, delayed_groups)
energy_groups, delayed_groups,
by_nuclide, name)
self._rxn_type = 'delayed-nu-fission'
@ -1509,9 +1531,9 @@ class Beta(MDGXS):
"""
def __init__(self, domain=None, domain_type=None, energy_groups=None,
by_nuclide=False, name='', delayed_groups=None):
delayed_groups=None, by_nuclide=False, name=''):
super(Beta, self).__init__(domain, domain_type, energy_groups,
by_nuclide, name, delayed_groups)
delayed_groups, by_nuclide, name)
self._rxn_type = 'beta'
@property

View file

@ -795,6 +795,9 @@ class Tally(object):
else:
no_scores_match = False
if score == 'current' and score not in self.scores:
return False
# Nuclides cannot be specified on 'flux' scores
if 'flux' in self.scores or 'flux' in other.scores:
if self.nuclides != other.nuclides: