mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-27 05:35:49 -04:00
Added domain decomposition settings to api
This commit is contained in:
parent
f99a6a4f33
commit
21f6871a91
1 changed files with 111 additions and 0 deletions
|
|
@ -69,6 +69,12 @@ class SettingsFile(object):
|
|||
self._ufs_lower_left = None
|
||||
self._ufs_upper_right = None
|
||||
|
||||
# Domain decomposition subelement
|
||||
self._dd_mesh_dimension = None
|
||||
self._dd_mesh_lower_left = None
|
||||
self._dd_mesh_upper_right = None
|
||||
self._dd_nodemap = None
|
||||
|
||||
self._settings_file = ET.Element("settings")
|
||||
self._eigenvalue_element = None
|
||||
self._source_element = None
|
||||
|
|
@ -703,6 +709,78 @@ class SettingsFile(object):
|
|||
self._ufs_upper_right = upper_right
|
||||
|
||||
|
||||
def set_dd_mesh_dimension(self, dimension):
|
||||
|
||||
if not isinstance(dimension, tuple) and \
|
||||
not isinstance(dimension, list):
|
||||
msg = 'Unable to set DD mesh upper right corner to {0} which is ' \
|
||||
'not a Python tuple or list'.format(dimension)
|
||||
raise ValueError(msg)
|
||||
|
||||
if len(dimension) < 3 or len(dimension) > 3:
|
||||
msg = 'Unable to set DD mesh upper right corner to {0} which ' \
|
||||
'is not a 3D point'.format(dimension)
|
||||
raise ValueError(msg)
|
||||
|
||||
self._dd_mesh_dimension = dimension
|
||||
|
||||
|
||||
def set_dd_mesh_lower_left(self, lower_left):
|
||||
|
||||
if not isinstance(lower_left, (tuple, list, np.ndarray)):
|
||||
msg = 'Unable to set DD mesh lower left corner to {0} which is ' \
|
||||
'not a Python tuple or list'.format(lower_left)
|
||||
raise ValueError(msg)
|
||||
|
||||
elif len(lower_left) < 3 or len(lower_left) > 3:
|
||||
msg = 'Unable to set DD mesh lower left corner to {0} which ' \
|
||||
'is not a 3D point'.format(lower_left)
|
||||
raise ValueError(msg)
|
||||
|
||||
self._dd_mesh_lower_left = lower_left
|
||||
|
||||
|
||||
def set_dd_mesh_upper_right(self, upper_right):
|
||||
|
||||
if not isinstance(upper_right, tuple) and \
|
||||
not isinstance(upper_right, list):
|
||||
msg = 'Unable to set DD mesh upper right corner to {0} which is ' \
|
||||
'not a Python tuple or list'.format(upper_right)
|
||||
raise ValueError(msg)
|
||||
|
||||
if len(upper_right) < 3 or len(upper_right) > 3:
|
||||
msg = 'Unable to set DD mesh upper right corner to {0} which ' \
|
||||
'is not a 3D point'.format(upper_right)
|
||||
raise ValueError(msg)
|
||||
|
||||
self._dd_mesh_upper_right = upper_right
|
||||
|
||||
|
||||
def set_dd_nodemap(self, nodemap):
|
||||
|
||||
if not isinstance(nodemap, tuple) and \
|
||||
not isinstance(nodemap, list):
|
||||
msg = 'Unable to set DD nodemap {0} which is ' \
|
||||
'not a Python tuple or list'.format(dimension)
|
||||
raise ValueError(msg)
|
||||
|
||||
nodemap = np.array(nodemap).flatten()
|
||||
|
||||
if self._dd_mesh_dimension is None:
|
||||
msg = 'Must set DD mesh dimension before setting the nodemap'
|
||||
raise ValueError(msg)
|
||||
else:
|
||||
len_nodemap = np.prod(self._dd_mesh_dimension)
|
||||
|
||||
if len(nodemap) < len_nodemap or len(nodemap) > len_nodemap:
|
||||
msg = 'Unable to set DD nodemap with length {0} which ' \
|
||||
'does not have the same dimensionality as the domain ' \
|
||||
'mesh'.format(len(nodemap))
|
||||
raise ValueError(msg)
|
||||
|
||||
self._dd_mesh_dimension = dimension
|
||||
|
||||
|
||||
def create_eigenvalue_subelement(self):
|
||||
|
||||
self.create_particles_subelement()
|
||||
|
|
@ -1043,6 +1121,38 @@ class SettingsFile(object):
|
|||
self._ufs_upper_right[2])
|
||||
|
||||
|
||||
def create_dd_subelement(self):
|
||||
|
||||
if not self._dd_mesh_lower_left is None and \
|
||||
not self._dd_mesh_upper_right is None and \
|
||||
not self._dd_mesh_dimension is None:
|
||||
|
||||
element = ET.SubElement(self._settings_file, "domain_decomposition")
|
||||
|
||||
subelement = ET.SubElement(element, "mesh")
|
||||
subsubelement = ET.SubElement(subelement, "dimension")
|
||||
subsubelement.text = '{0} {1} {2}'.format(
|
||||
self._dd_mesh_dimension[0],
|
||||
self._dd_mesh_dimension[1],
|
||||
self._dd_mesh_dimension[2])
|
||||
|
||||
subsubelement = ET.SubElement(subelement, "lower_left")
|
||||
subsubelement.text = '{0} {1} {2}'.format(
|
||||
self._dd_mesh_lower_left[0],
|
||||
self._dd_mesh_lower_left[1],
|
||||
self._dd_mesh_lower_left[2])
|
||||
|
||||
subsubelement = ET.SubElement(subelement, "upper_right")
|
||||
subsubelement.text = '{0} {1} {2}'.format(
|
||||
self._dd_mesh_upper_right[0],
|
||||
self._dd_mesh_upper_right[1],
|
||||
self._dd_mesh_upper_right[2])
|
||||
|
||||
if not self._dd_nodemap is None:
|
||||
subelement = ET.SubElement(element, "nodemap")
|
||||
subsubelement.text = ' '.join([str(n) for n in self._dd_nodemap])
|
||||
|
||||
|
||||
def export_to_xml(self):
|
||||
|
||||
self.create_eigenvalue_subelement()
|
||||
|
|
@ -1065,6 +1175,7 @@ class SettingsFile(object):
|
|||
self.create_trace_subelement()
|
||||
self.create_track_subelement()
|
||||
self.create_ufs_subelement()
|
||||
self.create_dd_subelement()
|
||||
|
||||
# Clean the indentation in the file to be user-readable
|
||||
clean_xml_indentation(self._settings_file)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue