2015-12-21 11:24:22 -06:00
|
|
|
from numbers import Real
|
2015-12-18 09:13:41 -06:00
|
|
|
from xml.etree import ElementTree as ET
|
|
|
|
|
|
|
|
|
|
import openmc.checkvalue as cv
|
2020-04-06 15:16:09 -05:00
|
|
|
from openmc.stats.multivariate import UnitSphere, Spatial
|
|
|
|
|
from openmc.stats.univariate import Univariate
|
|
|
|
|
from ._xml import get_text
|
2015-12-18 09:13:41 -06:00
|
|
|
|
|
|
|
|
|
2020-02-24 19:53:46 -06:00
|
|
|
class Source:
|
2015-12-18 09:13:41 -06:00
|
|
|
"""Distribution of phase space coordinates for source sites.
|
|
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
|
----------
|
2020-02-24 19:53:46 -06:00
|
|
|
space : openmc.stats.Spatial
|
2015-12-18 09:13:41 -06:00
|
|
|
Spatial distribution of source sites
|
2020-02-24 19:53:46 -06:00
|
|
|
angle : openmc.stats.UnitSphere
|
2015-12-18 09:13:41 -06:00
|
|
|
Angular distribution of source sites
|
2020-02-24 19:53:46 -06:00
|
|
|
energy : openmc.stats.Univariate
|
2015-12-18 09:13:41 -06:00
|
|
|
Energy distribution of source sites
|
2020-02-24 19:53:46 -06:00
|
|
|
filename : str
|
2015-12-18 09:13:41 -06:00
|
|
|
Source file from which sites should be sampled
|
2020-02-24 19:53:46 -06:00
|
|
|
library : str
|
|
|
|
|
Path to a custom source library
|
2020-04-10 21:52:43 -05:00
|
|
|
|
|
|
|
|
.. versionadded:: 0.12
|
2020-02-24 19:53:46 -06:00
|
|
|
strength : float
|
2015-12-21 11:24:22 -06:00
|
|
|
Strength of the source
|
2017-06-28 12:50:01 -05:00
|
|
|
particle : {'neutron', 'photon'}
|
|
|
|
|
Source particle type
|
2015-12-18 09:13:41 -06:00
|
|
|
|
|
|
|
|
Attributes
|
|
|
|
|
----------
|
|
|
|
|
space : openmc.stats.Spatial or None
|
|
|
|
|
Spatial distribution of source sites
|
|
|
|
|
angle : openmc.stats.UnitSphere or None
|
|
|
|
|
Angular distribution of source sites
|
|
|
|
|
energy : openmc.stats.Univariate or None
|
|
|
|
|
Energy distribution of source sites
|
|
|
|
|
file : str or None
|
|
|
|
|
Source file from which sites should be sampled
|
2020-02-24 19:53:46 -06:00
|
|
|
library : str or None
|
|
|
|
|
Path to a custom source library
|
|
|
|
|
strength : float
|
2015-12-21 11:24:22 -06:00
|
|
|
Strength of the source
|
2017-06-28 12:50:01 -05:00
|
|
|
particle : {'neutron', 'photon'}
|
|
|
|
|
Source particle type
|
2015-12-18 09:13:41 -06:00
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
2017-06-28 12:50:01 -05:00
|
|
|
def __init__(self, space=None, angle=None, energy=None, filename=None,
|
2019-06-14 08:33:44 +01:00
|
|
|
library=None, strength=1.0, particle='neutron'):
|
2015-12-18 09:13:41 -06:00
|
|
|
self._space = None
|
|
|
|
|
self._angle = None
|
|
|
|
|
self._energy = None
|
|
|
|
|
self._file = None
|
2019-10-15 22:10:33 +01:00
|
|
|
self._library = None
|
2015-12-18 09:13:41 -06:00
|
|
|
|
|
|
|
|
if space is not None:
|
|
|
|
|
self.space = space
|
|
|
|
|
if angle is not None:
|
|
|
|
|
self.angle = angle
|
|
|
|
|
if energy is not None:
|
|
|
|
|
self.energy = energy
|
|
|
|
|
if filename is not None:
|
|
|
|
|
self.file = filename
|
2019-06-14 08:33:44 +01:00
|
|
|
if library is not None:
|
2019-06-14 10:52:55 +01:00
|
|
|
self.library = library
|
2015-12-21 11:24:22 -06:00
|
|
|
self.strength = strength
|
2017-06-28 12:50:01 -05:00
|
|
|
self.particle = particle
|
2015-12-18 09:13:41 -06:00
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def file(self):
|
|
|
|
|
return self._file
|
|
|
|
|
|
2019-06-14 08:33:44 +01:00
|
|
|
@property
|
|
|
|
|
def library(self):
|
2019-10-15 22:10:33 +01:00
|
|
|
return self._library
|
2019-06-14 08:33:44 +01:00
|
|
|
|
2015-12-18 09:13:41 -06:00
|
|
|
@property
|
|
|
|
|
def space(self):
|
|
|
|
|
return self._space
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def angle(self):
|
|
|
|
|
return self._angle
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def energy(self):
|
|
|
|
|
return self._energy
|
|
|
|
|
|
2015-12-21 11:24:22 -06:00
|
|
|
@property
|
|
|
|
|
def strength(self):
|
|
|
|
|
return self._strength
|
|
|
|
|
|
2017-06-28 12:50:01 -05:00
|
|
|
@property
|
|
|
|
|
def particle(self):
|
|
|
|
|
return self._particle
|
|
|
|
|
|
2015-12-18 09:13:41 -06:00
|
|
|
@file.setter
|
|
|
|
|
def file(self, filename):
|
2017-12-24 16:06:05 +07:00
|
|
|
cv.check_type('source file', filename, str)
|
2015-12-18 09:13:41 -06:00
|
|
|
self._file = filename
|
|
|
|
|
|
2019-06-14 08:33:44 +01:00
|
|
|
@library.setter
|
|
|
|
|
def library(self, library_name):
|
|
|
|
|
cv.check_type('library', library_name, str)
|
2019-10-15 22:10:33 +01:00
|
|
|
self._library = library_name
|
2019-06-14 08:33:44 +01:00
|
|
|
|
2015-12-18 09:13:41 -06:00
|
|
|
@space.setter
|
|
|
|
|
def space(self, space):
|
|
|
|
|
cv.check_type('spatial distribution', space, Spatial)
|
|
|
|
|
self._space = space
|
|
|
|
|
|
|
|
|
|
@angle.setter
|
|
|
|
|
def angle(self, angle):
|
|
|
|
|
cv.check_type('angular distribution', angle, UnitSphere)
|
|
|
|
|
self._angle = angle
|
|
|
|
|
|
|
|
|
|
@energy.setter
|
|
|
|
|
def energy(self, energy):
|
|
|
|
|
cv.check_type('energy distribution', energy, Univariate)
|
|
|
|
|
self._energy = energy
|
|
|
|
|
|
2015-12-21 11:24:22 -06:00
|
|
|
@strength.setter
|
|
|
|
|
def strength(self, strength):
|
|
|
|
|
cv.check_type('source strength', strength, Real)
|
|
|
|
|
cv.check_greater_than('source strength', strength, 0.0, True)
|
|
|
|
|
self._strength = strength
|
|
|
|
|
|
2017-06-28 12:50:01 -05:00
|
|
|
@particle.setter
|
|
|
|
|
def particle(self, particle):
|
|
|
|
|
cv.check_value('source particle', particle, ['neutron', 'photon'])
|
|
|
|
|
self._particle = particle
|
|
|
|
|
|
2016-07-28 13:52:42 -05:00
|
|
|
def to_xml_element(self):
|
2016-07-01 22:57:14 +07:00
|
|
|
"""Return XML representation of the source
|
|
|
|
|
|
|
|
|
|
Returns
|
|
|
|
|
-------
|
|
|
|
|
element : xml.etree.ElementTree.Element
|
|
|
|
|
XML element containing source data
|
|
|
|
|
|
|
|
|
|
"""
|
2015-12-18 09:13:41 -06:00
|
|
|
element = ET.Element("source")
|
2015-12-21 11:24:22 -06:00
|
|
|
element.set("strength", str(self.strength))
|
2017-06-28 14:32:03 -05:00
|
|
|
if self.particle != 'neutron':
|
|
|
|
|
element.set("particle", self.particle)
|
2015-12-18 09:13:41 -06:00
|
|
|
if self.file is not None:
|
|
|
|
|
element.set("file", self.file)
|
2019-06-14 10:52:55 +01:00
|
|
|
if self.library is not None:
|
|
|
|
|
element.set("library", self.library)
|
2015-12-18 09:13:41 -06:00
|
|
|
if self.space is not None:
|
2016-07-28 13:52:42 -05:00
|
|
|
element.append(self.space.to_xml_element())
|
2015-12-18 09:13:41 -06:00
|
|
|
if self.angle is not None:
|
2016-07-28 13:52:42 -05:00
|
|
|
element.append(self.angle.to_xml_element())
|
2015-12-18 09:13:41 -06:00
|
|
|
if self.energy is not None:
|
2016-07-28 13:52:42 -05:00
|
|
|
element.append(self.energy.to_xml_element('energy'))
|
2015-12-18 09:13:41 -06:00
|
|
|
return element
|
2019-04-18 08:22:40 -05:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def from_xml_element(cls, elem):
|
|
|
|
|
"""Generate source from an XML element
|
|
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
|
----------
|
|
|
|
|
elem : xml.etree.ElementTree.Element
|
|
|
|
|
XML element
|
|
|
|
|
|
|
|
|
|
Returns
|
|
|
|
|
-------
|
|
|
|
|
openmc.Source
|
|
|
|
|
Source generated from XML element
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
source = cls()
|
|
|
|
|
|
2019-04-25 20:07:53 -05:00
|
|
|
strength = get_text(elem, 'strength')
|
2019-04-18 08:22:40 -05:00
|
|
|
if strength is not None:
|
2019-04-25 20:07:53 -05:00
|
|
|
source.strength = float(strength)
|
2019-04-18 08:22:40 -05:00
|
|
|
|
2019-04-25 20:07:53 -05:00
|
|
|
particle = get_text(elem, 'particle')
|
2019-04-18 08:22:40 -05:00
|
|
|
if particle is not None:
|
2019-04-25 20:07:53 -05:00
|
|
|
source.particle = particle
|
2019-04-18 08:22:40 -05:00
|
|
|
|
2019-04-25 20:07:53 -05:00
|
|
|
filename = get_text(elem, 'file')
|
2019-04-18 08:22:40 -05:00
|
|
|
if filename is not None:
|
2019-04-25 20:07:53 -05:00
|
|
|
source.file = filename
|
2019-04-18 08:22:40 -05:00
|
|
|
|
2019-06-14 08:33:44 +01:00
|
|
|
library = get_text(elem, 'library')
|
|
|
|
|
if library is not None:
|
2019-06-14 10:52:55 +01:00
|
|
|
source.library = library
|
2019-06-14 08:33:44 +01:00
|
|
|
|
2019-04-18 08:22:40 -05:00
|
|
|
space = elem.find('space')
|
|
|
|
|
if space is not None:
|
2019-05-22 19:26:15 -06:00
|
|
|
source.space = Spatial.from_xml_element(space)
|
2019-04-18 08:22:40 -05:00
|
|
|
|
|
|
|
|
angle = elem.find('angle')
|
|
|
|
|
if angle is not None:
|
2019-05-22 19:26:15 -06:00
|
|
|
source.angle = UnitSphere.from_xml_element(angle)
|
2019-04-18 08:22:40 -05:00
|
|
|
|
|
|
|
|
energy = elem.find('energy')
|
|
|
|
|
if energy is not None:
|
2019-05-22 19:26:15 -06:00
|
|
|
source.energy = Univariate.from_xml_element(energy)
|
2019-04-18 08:22:40 -05:00
|
|
|
|
|
|
|
|
return source
|