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