MGXS and Library classes now accept tally triggers

This commit is contained in:
Will Boyd 2015-10-13 00:59:41 -04:00
parent ebe8ac3902
commit 23f64bf330
5 changed files with 246 additions and 43 deletions

File diff suppressed because one or more lines are too long

View file

@ -50,6 +50,9 @@ class Library(object):
Domain type for spatial homogenization
energy_groups : EnergyGroups
Energy group structure for energy condensation
tally_trigger : Trigger
An (optional) tally precision trigger given to each tally used to
compute the cross section
all_mgxs : dict
MGXS objects keyed by domain ID and cross section type
statepoint : openmc.StatePoint
@ -69,6 +72,7 @@ class Library(object):
self._mgxs_types = []
self._domain_type = None
self._energy_groups = None
self._tally_trigger = None
self._all_mgxs = OrderedDict()
self._statepoint = None
@ -91,6 +95,7 @@ class Library(object):
clone._mgxs_types = self.mgxs_types
clone._domain_type = self.domain_type
clone._energy_groups = copy.deepcopy(self.energy_groups, memo)
clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo)
clone._all_mgxs = self.all_mgxs
clone._statepoint = self._statepoint
@ -145,6 +150,10 @@ class Library(object):
def energy_groups(self):
return self._energy_groups
@property
def tally_trigger(self):
return self._tally_trigger
@property
def num_groups(self):
return self.energy_groups.num_groups
@ -192,6 +201,11 @@ class Library(object):
cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups)
self._energy_groups = energy_groups
@tally_trigger.setter
def tally_trigger(self, tally_trigger):
cv.check_type('tally trigger', tally_trigger, openmc.Trigger)
self._tally_trigger = tally_trigger
def build_library(self):
"""Initialize MGXS objects in each domain and for each reaction type
in the library.
@ -211,6 +225,11 @@ class Library(object):
mgxs.domain_type = self.domain_type
mgxs.energy_groups = self.energy_groups
mgxs.by_nuclide = self.by_nuclide
# If a tally trigger was specified, add it to the MGXS
if self.tally_trigger:
mgxs.tally_trigger = self.tally_trigger
mgxs.create_tallies()
self.all_mgxs[domain.id][mgxs_type] = mgxs

View file

@ -80,6 +80,9 @@ class MGXS(object):
Domain type for spatial homogenization
energy_groups : EnergyGroups
Energy group structure for energy condensation
tally_trigger : Trigger
An (optional) tally precision trigger given to each tally used to
compute the cross section
tallies : dict
OpenMC tallies needed to compute the multi-group cross section
xs_tally : Tally
@ -100,6 +103,7 @@ class MGXS(object):
self._domain = None
self._domain_type = None
self._energy_groups = None
self._tally_trigger = None
self._tallies = OrderedDict()
self._xs_tally = None
@ -125,6 +129,7 @@ class MGXS(object):
clone._domain = self.domain
clone._domain_type = self.domain_type
clone._energy_groups = copy.deepcopy(self.energy_groups, memo)
clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo)
clone._xs_tally = copy.deepcopy(self.xs_tally, memo)
clone._tallies = OrderedDict()
@ -163,6 +168,10 @@ class MGXS(object):
def energy_groups(self):
return self._energy_groups
@property
def tally_trigger(self):
return self._tally_trigger
@property
def num_groups(self):
return self.energy_groups.num_groups
@ -220,6 +229,11 @@ class MGXS(object):
cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups)
self._energy_groups = energy_groups
@tally_trigger.setter
def tally_trigger(self, tally_trigger):
cv.check_type('tally trigger', tally_trigger, openmc.Trigger)
self._tally_trigger = tally_trigger
@staticmethod
def get_mgxs(mgxs_type, domain=None, domain_type=None,
energy_groups=None, by_nuclide=False, name=''):
@ -431,6 +445,12 @@ class MGXS(object):
self.tallies[key].estimator = estimator
self.tallies[key].add_filter(domain_filter)
# If a tally trigger was specified, add it to each tally
if self.tally_trigger:
trigger_clone = copy.deepcopy(self.tally_trigger)
trigger_clone.add_score(score)
self.tallies[key].add_trigger(trigger_clone)
# Add all non-domain specific Filters (e.g., 'energy') to the Tally
for filter in filters:
self.tallies[key].add_filter(filter)

View file

@ -390,7 +390,8 @@ class Tally(object):
'since "{1}" is not a Trigger'.format(self.id, trigger)
raise ValueError(msg)
self._triggers.append(trigger)
if trigger not in self.triggers:
self.triggers.append(trigger)
@id.setter
def id(self, tally_id):

View file

@ -58,6 +58,15 @@ class Trigger(object):
else:
return existing
def __eq__(self, other):
if str(self) == str(other):
return True
else:
return False
def __ne__(self, other):
return not self == other
def __repr__(self):
string = 'Trigger\n'
string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._trigger_type)