mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-28 06:05:58 -04:00
fixed mgxs library.py to accept MDGXS
This commit is contained in:
parent
1f1dab1733
commit
7be7c6f29b
4 changed files with 231 additions and 127 deletions
File diff suppressed because one or more lines are too long
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue