mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-27 13:45:36 -04:00
Allow entropy mesh and UFS mesh to be specified using <mesh> elements
This commit is contained in:
parent
23159d0c3b
commit
523fb33bab
8 changed files with 209 additions and 167 deletions
|
|
@ -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 <mesh> 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 <mesh> 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)
|
||||
|
|
|
|||
|
|
@ -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 <entropy> element &
|
||||
&is deprecated. Please create a mesh using <mesh> and then reference &
|
||||
&it by specifying its ID in an <entropy_mesh> 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 <uniform_fs> element &
|
||||
&is deprecated. Please create a mesh using <mesh> and then reference &
|
||||
&it by specifying its ID in a <ufs_mesh> 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
|
||||
|
|
|
|||
|
|
@ -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 })? &
|
||||
|
|
|
|||
|
|
@ -62,59 +62,8 @@
|
|||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="entropy">
|
||||
<interleave>
|
||||
<optional>
|
||||
<choice>
|
||||
<element name="dimension">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="int"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</element>
|
||||
<attribute name="dimension">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="int"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</attribute>
|
||||
</choice>
|
||||
</optional>
|
||||
<choice>
|
||||
<element name="lower_left">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</element>
|
||||
<attribute name="lower_left">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</attribute>
|
||||
</choice>
|
||||
<choice>
|
||||
<element name="upper_right">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</element>
|
||||
<attribute name="upper_right">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</attribute>
|
||||
</choice>
|
||||
</interleave>
|
||||
<element name="entropy_mesh">
|
||||
<data type="positiveInteger"/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
|
|
@ -159,6 +108,96 @@
|
|||
<data type="nonNegativeInteger"/>
|
||||
</element>
|
||||
</optional>
|
||||
<zeroOrMore>
|
||||
<element name="mesh">
|
||||
<interleave>
|
||||
<choice>
|
||||
<element name="id">
|
||||
<data type="int"/>
|
||||
</element>
|
||||
<attribute name="id">
|
||||
<data type="int"/>
|
||||
</attribute>
|
||||
</choice>
|
||||
<optional>
|
||||
<choice>
|
||||
<element name="type">
|
||||
<value>regular</value>
|
||||
</element>
|
||||
<attribute name="type">
|
||||
<value>regular</value>
|
||||
</attribute>
|
||||
</choice>
|
||||
</optional>
|
||||
<choice>
|
||||
<element name="dimension">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="positiveInteger"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</element>
|
||||
<attribute name="dimension">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="positiveInteger"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</attribute>
|
||||
</choice>
|
||||
<choice>
|
||||
<element name="lower_left">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</element>
|
||||
<attribute name="lower_left">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</attribute>
|
||||
</choice>
|
||||
<choice>
|
||||
<choice>
|
||||
<element name="upper_right">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</element>
|
||||
<attribute name="upper_right">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</attribute>
|
||||
</choice>
|
||||
<choice>
|
||||
<element name="width">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</element>
|
||||
<attribute name="width">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</attribute>
|
||||
</choice>
|
||||
</choice>
|
||||
</interleave>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
<optional>
|
||||
<element name="no_reduce">
|
||||
<data type="boolean"/>
|
||||
|
|
@ -585,6 +624,11 @@
|
|||
</interleave>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="ufs_mesh">
|
||||
<data type="positiveInteger"/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="verbosity">
|
||||
<data type="positiveInteger"/>
|
||||
|
|
@ -660,60 +704,6 @@
|
|||
</interleave>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
<optional>
|
||||
<element name="uniform_fs">
|
||||
<interleave>
|
||||
<choice>
|
||||
<element name="dimension">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="positiveInteger"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</element>
|
||||
<attribute name="dimension">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="positiveInteger"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</attribute>
|
||||
</choice>
|
||||
<choice>
|
||||
<element name="lower_left">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</element>
|
||||
<attribute name="lower_left">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</attribute>
|
||||
</choice>
|
||||
<choice>
|
||||
<element name="upper_right">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</element>
|
||||
<attribute name="upper_right">
|
||||
<list>
|
||||
<oneOrMore>
|
||||
<data type="double"/>
|
||||
</oneOrMore>
|
||||
</list>
|
||||
</attribute>
|
||||
</choice>
|
||||
</interleave>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="resonance_scattering">
|
||||
<interleave>
|
||||
|
|
|
|||
|
|
@ -16,13 +16,14 @@
|
|||
</source>
|
||||
|
||||
<!-- Shannon Entropy -->
|
||||
<entropy>
|
||||
<mesh id="10">
|
||||
<dimension> 10 1 1 </dimension>
|
||||
<lower_left> -10.0 -1.0 -1.0 </lower_left>
|
||||
<upper_right> 10.0 1.0 1.0 </upper_right>
|
||||
</entropy>
|
||||
</mesh>
|
||||
<entropy_mesh>10</entropy_mesh>
|
||||
|
||||
<!-- Run CMFD -->
|
||||
<run_cmfd>true</run_cmfd>
|
||||
<!-- Run CMFD -->
|
||||
<run_cmfd>true</run_cmfd>
|
||||
|
||||
</settings>
|
||||
|
|
|
|||
|
|
@ -16,11 +16,12 @@
|
|||
</source>
|
||||
|
||||
<!-- Shannon Entropy -->
|
||||
<entropy>
|
||||
<mesh id="10">
|
||||
<dimension> 10 1 1 </dimension>
|
||||
<lower_left> -10.0 -1.0 -1.0 </lower_left>
|
||||
<upper_right> 10.0 1.0 1.0 </upper_right>
|
||||
</entropy>
|
||||
</mesh>
|
||||
<entropy_mesh>10</entropy_mesh>
|
||||
|
||||
<!-- Run CMFD -->
|
||||
<run_cmfd>true</run_cmfd>
|
||||
|
|
|
|||
|
|
@ -12,10 +12,12 @@
|
|||
</space>
|
||||
</source>
|
||||
|
||||
<entropy>
|
||||
<mesh id="1">
|
||||
<dimension>10 10 10</dimension>
|
||||
<lower_left>-10. -10. -10.</lower_left>
|
||||
<upper_right>10. 10. 10.</upper_right>
|
||||
</entropy>
|
||||
</mesh>
|
||||
|
||||
<entropy_mesh>1</entropy_mesh>
|
||||
|
||||
</settings>
|
||||
|
|
|
|||
|
|
@ -3,10 +3,11 @@
|
|||
|
||||
<run_mode>plot</run_mode>
|
||||
|
||||
<entropy>
|
||||
<mesh id="1">
|
||||
<dimension>5 4 3</dimension>
|
||||
<lower_left>-10 -10 -10</lower_left>
|
||||
<upper_right>10 10 10</upper_right>
|
||||
</entropy>
|
||||
</mesh>
|
||||
<entropy_mesh>1</entropy_mesh>
|
||||
|
||||
</settings>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue