diff --git a/openmc/settings.py b/openmc/settings.py
index 3efdf1ab7a..054b8b382f 100644
--- a/openmc/settings.py
+++ b/openmc/settings.py
@@ -958,20 +958,15 @@ class Settings(object):
subelement = ET.SubElement(element, "energy")
subelement.text = str(self._cutoff['energy'])
- def _create_entropy_subelement(self, root):
- if self._entropy_mesh is not None:
- element = ET.SubElement(root, "entropy")
+ def _create_entropy_mesh_subelement(self, root):
+ if self.entropy_mesh is not None:
+ # See if a element already exists -- if not, add it
+ path = "./mesh[@id='{}']".format(self.entropy_mesh.id)
+ if root.find(path) is None:
+ root.append(self.entropy_mesh.to_xml_element)
- if self._entropy_mesh.dimension is not None:
- subelement = ET.SubElement(element, "dimension")
- subelement.text = ' '.join(
- str(x) for x in self._entropy_mesh.dimension)
- subelement = ET.SubElement(element, "lower_left")
- subelement.text = ' '.join(
- str(x) for x in self._entropy_mesh.lower_left)
- subelement = ET.SubElement(element, "upper_right")
- subelement.text = ' '.join(
- str(x) for x in self._entropy_mesh.upper_right)
+ subelement = ET.SubElement(element, "entropy_mesh")
+ subelement.text = str(self.entropy_mesh.id)
def _create_trigger_subelement(self, root):
if self._trigger_active is not None:
@@ -1028,18 +1023,15 @@ class Settings(object):
element = ET.SubElement(root, "track")
element.text = ' '.join(map(str, self._track))
- def _create_ufs_subelement(self, root):
- if self._ufs_mesh is not None:
- element = ET.SubElement(root, "uniform_fs")
- subelement = ET.SubElement(element, "dimension")
- subelement.text = ' '.join(str(x) for x in
- self._ufs_mesh.dimension)
- subelement = ET.SubElement(element, "lower_left")
- subelement.text = ' '.join(str(x) for x in
- self._ufs_mesh.lower_left)
- subelement = ET.SubElement(element, "upper_right")
- subelement.text = ' '.join(str(x) for x in
- self._ufs_mesh.upper_right)
+ def _create_ufs_mesh_subelement(self, root):
+ if self.ufs_mesh is not None:
+ # See if a element already exists -- if not, add it
+ path = "./mesh[@id='{}']".format(self.ufs_mesh.id)
+ if root.find(path) is None:
+ root.append(self.ufs_mesh.to_xml_element)
+
+ subelement = ET.SubElement(element, "ufs_mesh")
+ subelement.text = str(self.ufs_mesh.id)
def _create_dd_subelement(self, root):
if self._dd_mesh_lower_left is not None and \
@@ -1126,7 +1118,7 @@ class Settings(object):
self._create_seed_subelement(root_element)
self._create_survival_biasing_subelement(root_element)
self._create_cutoff_subelement(root_element)
- self._create_entropy_subelement(root_element)
+ self._create_entropy_mesh_subelement(root_element)
self._create_trigger_subelement(root_element)
self._create_no_reduce_subelement(root_element)
self._create_threads_subelement(root_element)
@@ -1135,7 +1127,7 @@ class Settings(object):
self._create_temperature_subelements(root_element)
self._create_trace_subelement(root_element)
self._create_track_subelement(root_element)
- self._create_ufs_subelement(root_element)
+ self._create_ufs_mesh_subelement(root_element)
self._create_dd_subelement(root_element)
self._create_resonance_scattering_subelement(root_element)
self._create_volume_calcs_subelement(root_element)
diff --git a/src/input_xml.F90 b/src/input_xml.F90
index ee6dd98d4c..37d230c31d 100644
--- a/src/input_xml.F90
+++ b/src/input_xml.F90
@@ -144,6 +144,7 @@ contains
integer :: n
integer :: temp_int
integer :: temp_int_array3(3)
+ integer(C_INT32_T) :: i_start, i_end
integer(C_INT) :: err
integer, allocatable :: temp_int_array(:)
real(8), allocatable :: temp_real(:)
@@ -167,6 +168,7 @@ contains
type(XMLNode) :: node_trigger
type(XMLNode) :: node_vol
type(XMLNode) :: node_tab_leg
+ type(XMLNode), allocatable :: node_mesh_list(:)
type(XMLNode), allocatable :: node_source_list(:)
type(XMLNode), allocatable :: node_vol_list(:)
@@ -686,8 +688,39 @@ contains
track_identifiers = reshape(temp_int_array, [3, n_tracks/3])
end if
+ ! Read meshes
+ call get_node_list(root, "mesh", node_mesh_list)
+
+ ! Check for user meshes and allocate
+ n = size(node_mesh_list)
+ if (n > 0) then
+ err = openmc_extend_meshes(n, i_start, i_end)
+ end if
+
+ do i = 1, n
+ associate (m => meshes(i_start + i - 1))
+ ! Instantiate mesh from XML node
+ call m % from_xml(node_mesh_list(i))
+
+ ! Add mesh to dictionary
+ call mesh_dict % add_key(m % id, i)
+ end associate
+ end do
+
! Shannon Entropy mesh
- if (check_for_node(root, "entropy")) then
+ if (check_for_node(root, "entropy_mesh")) then
+ call get_node_value(root, "entropy_mesh", temp_int)
+ if (mesh_dict % has_key(temp_int)) then
+ index_entropy_mesh = mesh_dict % get_key(temp_int)
+ else
+ call fatal_error("Mesh " // to_str(temp_int) // " specified for &
+ &Shannon entropy does not exist.")
+ end if
+ elseif (check_for_node(root, "entropy")) then
+ call warning("Specifying a Shannon entropy mesh via the element &
+ &is deprecated. Please create a mesh using and then reference &
+ &it by specifying its ID in an element.")
+
! Get pointer to entropy node
node_entropy = root % child("entropy")
@@ -698,12 +731,16 @@ contains
m % id = 10000
call m % from_xml(node_entropy)
+ end associate
+ end if
+ if (index_entropy_mesh > 0) then
+ associate(m => meshes(index_entropy_mesh))
! Check if dimensions were specified -- if not, they will be calculated
! automatically upon first entry into shannon_entropy
- if (check_for_node(node_entropy, "dimension")) then
+ if (allocated(m % dimension)) then
! If so, make sure proper number of values were given
- if (node_word_count(node_entropy, "dimension") /= 3) then
+ if (m % n_dimension /= 3) then
call fatal_error("Dimension of entropy mesh must be given as three &
&integers.")
end if
@@ -729,7 +766,19 @@ contains
end if
! Uniform fission source weighting mesh
- if (check_for_node(root, "uniform_fs")) then
+ if (check_for_node(root, "ufs_mesh")) then
+ call get_node_value(root, "ufs_mesh", temp_int)
+ if (mesh_dict % has_key(temp_int)) then
+ index_ufs_mesh = mesh_dict % get_key(temp_int)
+ else
+ call fatal_error("Mesh " // to_str(temp_int) // " specified for &
+ &uniform fission site method does not exist.")
+ end if
+ elseif (check_for_node(root, "uniform_fs")) then
+ call warning("Specifying a UFS mesh via the element &
+ &is deprecated. Please create a mesh using and then reference &
+ &it by specifying its ID in a element.")
+
! Get pointer to ufs node
node_ufs = root % child("uniform_fs")
@@ -741,9 +790,13 @@ contains
m % id = 10001
call m % from_xml(node_ufs)
+ end associate
+ end if
- if (check_for_node(node_ufs, "dimension")) then
- if (node_word_count(node_ufs, "dimension") /= 3) then
+ if (index_ufs_mesh > 0) then
+ associate (m => meshes(index_ufs_mesh))
+ if (allocated(m % dimension)) then
+ if (m % n_dimension /= 3) then
call fatal_error("Dimension of UFS mesh must be given as three &
&integers.")
end if
diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc
index 23a0cfd4b7..19a2948c58 100644
--- a/src/relaxng/settings.rnc
+++ b/src/relaxng/settings.rnc
@@ -12,14 +12,7 @@ element settings {
element energy_mode { ( "continuous-energy" | "ce" | "CE" | "multi-group" | "mg" | "MG" ) }? &
- element entropy {
- (element dimension { list { xsd:int+ } } |
- attribute dimension { list { xsd:int+ } })? &
- (element lower_left { list { xsd:double+ } } |
- attribute lower_left { list { xsd:double+ } }) &
- (element upper_right { list { xsd:double+ } } |
- attribute upper_right { list { xsd:double+ } })
- }? &
+ element entropy_mesh { xsd:positiveInteger }? &
element generations_per_batch { xsd:positiveInteger }? &
@@ -34,6 +27,22 @@ element settings {
element max_order { xsd:nonNegativeInteger }? &
+ element mesh {
+ (element id { xsd:int } | attribute id { xsd:int }) &
+ (element type { ( "regular" ) } |
+ attribute type { ( "regular" ) })? &
+ (element dimension { list { xsd:positiveInteger+ } } |
+ attribute dimension { list { xsd:positiveInteger+ } }) &
+ (element lower_left { list { xsd:double+ } } |
+ attribute lower_left { list { xsd:double+ } }) &
+ (
+ (element upper_right { list { xsd:double+ } } |
+ attribute upper_right { list { xsd:double+ } }) |
+ (element width { list { xsd:double+ } } |
+ attribute width { list { xsd:double+ } })
+ )
+ }* &
+
element no_reduce { xsd:boolean }? &
element output {
@@ -132,6 +141,8 @@ element settings {
(element batch_interval { xsd:positiveInteger } | attribute batch_interval { xsd:positiveInteger })?
}? &
+ element ufs_mesh { xsd:positiveInteger }? &
+
element verbosity { xsd:positiveInteger }? &
element volume_calc {
@@ -147,15 +158,6 @@ element settings {
attribute upper_right { list { xsd:double+ } })
}* &
- element uniform_fs{
- (element dimension { list { xsd:positiveInteger+ } } |
- attribute dimension { list { xsd:positiveInteger+ } }) &
- (element lower_left { list { xsd:double+ } } |
- attribute lower_left { list { xsd:double+ } }) &
- (element upper_right { list { xsd:double+ } } |
- attribute upper_right { list { xsd:double+ } })
- }? &
-
element resonance_scattering {
(element enable { xsd:boolean } | attribute enable { xsd:boolean })? &
(element method { xsd:string } | attribute method { xsd:string })? &
diff --git a/src/relaxng/settings.rng b/src/relaxng/settings.rng
index e75dc7c15e..606b978290 100644
--- a/src/relaxng/settings.rng
+++ b/src/relaxng/settings.rng
@@ -62,59 +62,8 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -159,6 +108,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ regular
+
+
+ regular
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -585,6 +624,11 @@
+
+
+
+
+
@@ -660,60 +704,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/test_cmfd_feed/settings.xml b/tests/test_cmfd_feed/settings.xml
index 3e8b77b393..742aa22330 100644
--- a/tests/test_cmfd_feed/settings.xml
+++ b/tests/test_cmfd_feed/settings.xml
@@ -16,13 +16,14 @@
-
+
10 1 1
-10.0 -1.0 -1.0
10.0 1.0 1.0
-
+
+ 10
-
- true
+
+ true
diff --git a/tests/test_cmfd_nofeed/settings.xml b/tests/test_cmfd_nofeed/settings.xml
index 3e8b77b393..b56acb4b76 100644
--- a/tests/test_cmfd_nofeed/settings.xml
+++ b/tests/test_cmfd_nofeed/settings.xml
@@ -16,11 +16,12 @@
-
+
10 1 1
-10.0 -1.0 -1.0
10.0 1.0 1.0
-
+
+ 10
true
diff --git a/tests/test_entropy/settings.xml b/tests/test_entropy/settings.xml
index df6a851ef6..493da72237 100644
--- a/tests/test_entropy/settings.xml
+++ b/tests/test_entropy/settings.xml
@@ -12,10 +12,12 @@
-
+
10 10 10
-10. -10. -10.
10. 10. 10.
-
+
+
+ 1
diff --git a/tests/test_plot/settings.xml b/tests/test_plot/settings.xml
index 197b9c7093..adf256d2d4 100644
--- a/tests/test_plot/settings.xml
+++ b/tests/test_plot/settings.xml
@@ -3,10 +3,11 @@
plot
-
+
5 4 3
-10 -10 -10
10 10 10
-
+
+ 1