From 49fb1ade00eb0c6c5c0b842f66c7622f37b715bc Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sun, 2 Oct 2016 15:59:57 -0400 Subject: [PATCH 1/6] Allow wmp to work with s(a, b) and URR interp --- docs/source/usersguide/input.rst | 16 ++++++++-------- openmc/settings.py | 24 ++++++++++++++++++++++-- src/constants.F90 | 3 +-- src/cross_section.F90 | 2 -- src/global.F90 | 3 +++ src/input_xml.F90 | 21 ++++++++++++++++----- src/nuclide_header.F90 | 4 ---- src/physics.F90 | 2 +- src/sab_header.F90 | 4 ---- tests/test_multipole/inputs_true.dat | 2 +- tests/test_multipole/results_true.dat | 2 +- tests/test_multipole/test_multipole.py | 4 +++- 12 files changed, 56 insertions(+), 31 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 9b2d78607..2e4d3f087 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -292,8 +292,8 @@ OpenMC can use it for on-the-fly Doppler-broadening of resolved resonance range cross sections. If this element is absent from the settings.xml file, the :envvar:`OPENMC_MULTIPOLE_LIBRARY` environment variable will be used. - .. note:: The :ref:`temperature_method` must also be set to "multipole" for - windowed multipole functionality. + .. note:: The element must also be set to "true" + for windowed multipole functionality. ```` Element --------------------------- @@ -725,16 +725,16 @@ a material default temperature. ```` Element -------------------------------- -The ```` element has an accepted value of "nearest", -"interpolation", or "multipole". A value of "nearest" indicates that for each +The ```` element has an accepted value of "nearest" or +"interpolation". A value of "nearest" indicates that for each cell, the nearest temperature at which cross sections are given is to be applied, within a given tolerance (see :ref:`temperature_tolerance`). A value of "interpolation" indicates that cross sections are to be linear-linear interpolated between temperatures at which nuclear data are present (see -:ref:`temperature_treatment`). A value of "multipole" indicates that the -windowed multipole method should be used to evaluate temperature-dependent cross -sections in the resolved resonance range (a :ref:`windowed multipole library -` must also be available). +:ref:`temperature_treatment`). Note that if ```` is set +true, then for which multipole data is available will use the windowed multipole +method for cross sections in the resolved resonance range. (a +:ref:`windowed multipole library ` must also be available). *Default*: "nearest" diff --git a/openmc/settings.py b/openmc/settings.py index f255a8bb1..0d3eb61db 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -105,7 +105,7 @@ class Settings(object): temperatures at which nuclear data doesn't exist. Accepted keys are 'default', 'method', and 'tolerance'. The value for 'default' should be a float representing the default temperature in Kelvin. The value for - 'method' should be 'nearest' or 'multipole'. If the method is + 'method' should be 'nearest' or 'interpolation'. If the method is 'nearest', 'tolerance' indicates a range of temperature within which cross sections may be used. trigger_active : bool @@ -135,6 +135,9 @@ class Settings(object): Coordinates of the lower-left point of the UFS mesh ufs_upper_right : tuple or list Coordinates of the upper-right point of the UFS mesh + use_windowed_multipole : bool + Whether or not windowed multipole can be used to evaluate resolved + resonance cross sections. resonance_scattering : ResonanceScattering or iterable of ResonanceScattering The elastic scattering model to use for resonant isotopes volume_calculations : VolumeCalculation or iterable of VolumeCalculation @@ -219,6 +222,7 @@ class Settings(object): self._settings_file = ET.Element("settings") self._run_mode_subelement = None + self._multipole_active = None self._resonance_scattering = cv.CheckedList( ResonanceScattering, 'resonance scattering models') @@ -417,6 +421,10 @@ class Settings(object): def dd_count_interactions(self): return self._dd_count_interactions + @property + def use_windowed_multipole(self): + return self._multipole_active + @property def resonance_scattering(self): return self._resonance_scattering @@ -676,7 +684,7 @@ class Settings(object): cv.check_type('default temperature', value, Real) elif key == 'method': cv.check_value('temperature method', value, - ['nearest', 'interpolation', 'multipole']) + ['nearest', 'interpolation']) elif key == 'tolerance': cv.check_type('temperature tolerance', value, Real) self._temperature = temperature @@ -808,6 +816,11 @@ class Settings(object): self._dd_count_interactions = interactions + @use_windowed_multipole.setter + def use_windowed_multipole(self, active): + cv.check_type('use_windowed_multipole', active, bool) + self._multipole_active = active + @resonance_scattering.setter def resonance_scattering(self, res): if not isinstance(res, MutableSequence): @@ -1111,6 +1124,12 @@ class Settings(object): subelement = ET.SubElement(element, "count_interactions") subelement.text = str(self._dd_count_interactions).lower() + def _create_use_multipole_subelement(self): + if self._multipole_active is not None: + element = ET.SubElement(self._settings_file, + "use_windowed_multipole") + element.text = str(self._multipole_active) + def _create_resonance_scattering_subelement(self): if len(self.resonance_scattering) > 0: elem = ET.SubElement(self._settings_file, 'resonance_scattering') @@ -1158,6 +1177,7 @@ class Settings(object): self._create_track_subelement() self._create_ufs_subelement() self._create_dd_subelement() + self._create_use_multipole_subelement() self._create_resonance_scattering_subelement() self._create_volume_calcs_subelement() diff --git a/src/constants.F90 b/src/constants.F90 index cc0d663ea..8c321156c 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -271,8 +271,7 @@ module constants ! Temperature treatment method integer, parameter :: & TEMPERATURE_NEAREST = 1, & - TEMPERATURE_INTERPOLATION = 2, & - TEMPERATURE_MULTIPOLE = 3 + TEMPERATURE_INTERPOLATION = 2 ! ============================================================================ ! TALLY-RELATED CONSTANTS diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 4bb323c51..69363e40a 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -185,8 +185,6 @@ contains f = (kT - nuc % kTs(i_temp)) / & (nuc % kTs(i_temp + 1) - nuc % kTs(i_temp)) if (f > prn()) i_temp = i_temp + 1 - case (TEMPERATURE_MULTIPOLE) - i_temp = minloc(abs(nuclides(i_nuclide) % kTs - kT), dim=1) end select end if diff --git a/src/global.F90 b/src/global.F90 index bea5f61a8..d424e1cec 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -99,6 +99,9 @@ module global ! What to assume for expanding natural elements integer :: default_expand = ENDF_BVII1 + ! Whether or not windowed multipole cross sections should be used. + logical :: multipole_active = .false. + ! Default temperature and method for choosing temperatures integer :: temperature_method = TEMPERATURE_NEAREST real(8) :: temperature_tolerance = 10.0_8 diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 16892397a..74b5f47ae 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1063,6 +1063,20 @@ contains end select end if + ! Check to see if windowed multipole functionality is requested + if (check_for_node(doc, "use_windowed_multipole")) then + call get_node_value(doc, "use_windowed_multipole", temp_str) + select case (to_lower(temp_str)) + case ('true', '1') + multipole_active = .true. + case ('false', '0') + multipole_active = .false. + case default + call fatal_error("Unrecognized value for in & + &settings.xml") + end select + end if + call get_node_list(doc, "volume_calc", node_vol_list) n = get_list_size(node_vol_list) allocate(volume_calcs(n)) @@ -1082,8 +1096,6 @@ contains temperature_method = TEMPERATURE_NEAREST case ('interpolation') temperature_method = TEMPERATURE_INTERPOLATION - case ('multipole') - temperature_method = TEMPERATURE_MULTIPOLE case default call fatal_error("Unknown temperature method: " // trim(temp_str)) end select @@ -5786,8 +5798,7 @@ contains call already_read % add(name) ! Read multipole file into the appropriate entry on the nuclides array - if (temperature_method == TEMPERATURE_MULTIPOLE) & - call read_multipole_data(i_nuclide) + if (multipole_active) call read_multipole_data(i_nuclide) end if ! Check if material is fissionable @@ -5841,7 +5852,7 @@ contains end do ! If the user wants multipole, make sure we found a multipole library. - if (temperature_method == TEMPERATURE_MULTIPOLE) then + if (multipole_active) then mp_found = .false. do i = 1, size(nuclides) if (nuclides(i) % mp_present) then diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 4235f4234..d07ccbe5a 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -302,10 +302,6 @@ module nuclide_header trim(to_str(nint(temp_desired))) // " K.") end do TEMP_LOOP - case (TEMPERATURE_MULTIPOLE) - ! Add first available temperature - call temps_to_read % push_back(nint(temps_available(1))) - end select ! Sort temperatures to read diff --git a/src/physics.F90 b/src/physics.F90 index 23fb6f1df..6a6a9787d 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -334,7 +334,7 @@ contains else ! Determine temperature - if (temperature_method == TEMPERATURE_MULTIPOLE) then + if (nuc % mp_present) then kT = p % sqrtkT**2 else kT = nuc % kTs(micro_xs(i_nuclide) % index_temp) diff --git a/src/sab_header.F90 b/src/sab_header.F90 index 21a2ab032..dcf5df979 100644 --- a/src/sab_header.F90 +++ b/src/sab_header.F90 @@ -187,10 +187,6 @@ contains trim(to_str(nint(temp_desired))) // " K.") end do TEMP_LOOP - case (TEMPERATURE_MULTIPOLE) - ! Add first available temperature - call temps_to_read % push_back(nint(temps_available(1))) - end select ! Sort temperatures to read diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index 930be9536..9ff8c6e39 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -1 +1 @@ -8462e17d102259b3a48a7e908bc75038a28a19d4a5e8bd38f26579e5baf3998bc2d05d1d3055ac1ed478d0c01bd64868d654919c2e6ca3fea86d79f03eda25ef \ No newline at end of file +cab3356c163ceace74251d20cafc1b46f9fc3af428685cf5cea9964f5356d59a967468a14b3a2cd2ad3eea04b1d164b5daee8259f38be8ec5fb04fa7b4982830 \ No newline at end of file diff --git a/tests/test_multipole/results_true.dat b/tests/test_multipole/results_true.dat index 4d379b3f4..b17f6b0aa 100644 --- a/tests/test_multipole/results_true.dat +++ b/tests/test_multipole/results_true.dat @@ -1,5 +1,5 @@ k-combined: -1.425673E+00 1.779969E-02 +1.363786E+00 1.103929E-02 Cell ID = 11 Name = diff --git a/tests/test_multipole/test_multipole.py b/tests/test_multipole/test_multipole.py index a44489aa5..e908eba2d 100644 --- a/tests/test_multipole/test_multipole.py +++ b/tests/test_multipole/test_multipole.py @@ -17,6 +17,7 @@ class MultipoleTestHarness(PyAPITestHarness): moderator.set_density('g/cc', 1.0) moderator.add_nuclide('H1', 2.0) moderator.add_nuclide('O16', 1.0) + moderator.add_s_alpha_beta('c_H_in_H2O') dense_fuel = openmc.Material(material_id=2) dense_fuel.set_density('g/cc', 4.5) @@ -67,7 +68,8 @@ class MultipoleTestHarness(PyAPITestHarness): sets_file.particles = 1000 sets_file.source = Source(space=Box([-1, -1, -1], [1, 1, 1])) sets_file.output = {'summary': True} - sets_file.temperature = {'method': 'multipole'} + sets_file.use_windowed_multipole = True + sets_file.temperature = {'tolerance': 1000} sets_file.export_to_xml() #################### From b68e3c12aca9af941b624116e22d2522342af05c Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 7 Oct 2016 13:52:07 -0400 Subject: [PATCH 2/6] Stick multipole flag back in settings.temperature --- openmc/settings.py | 44 ++++++++++---------------- tests/test_multipole/test_multipole.py | 3 +- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/openmc/settings.py b/openmc/settings.py index 0d3eb61db..5019980eb 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -103,11 +103,13 @@ class Settings(object): temperature : dict Defines a default temperature and method for treating intermediate temperatures at which nuclear data doesn't exist. Accepted keys are - 'default', 'method', and 'tolerance'. The value for 'default' should be - a float representing the default temperature in Kelvin. The value for - 'method' should be 'nearest' or 'interpolation'. If the method is - 'nearest', 'tolerance' indicates a range of temperature within which - cross sections may be used. + 'default', 'method', 'tolerance', and 'multipole'. The value for + 'default' should be a float representing the default temperature in + Kelvin. The value for 'method' should be 'nearest' or 'interpolation'. + If the method is 'nearest', 'tolerance' indicates a range of temperature + within which cross sections may be used. 'multipole' is a boolean + indicating whether or not the windowed multipole method should be used + to evaluate resolved resonance cross sections. trigger_active : bool Indicate whether tally triggers are used trigger_max_batches : int @@ -135,9 +137,6 @@ class Settings(object): Coordinates of the lower-left point of the UFS mesh ufs_upper_right : tuple or list Coordinates of the upper-right point of the UFS mesh - use_windowed_multipole : bool - Whether or not windowed multipole can be used to evaluate resolved - resonance cross sections. resonance_scattering : ResonanceScattering or iterable of ResonanceScattering The elastic scattering model to use for resonant isotopes volume_calculations : VolumeCalculation or iterable of VolumeCalculation @@ -222,7 +221,6 @@ class Settings(object): self._settings_file = ET.Element("settings") self._run_mode_subelement = None - self._multipole_active = None self._resonance_scattering = cv.CheckedList( ResonanceScattering, 'resonance scattering models') @@ -421,10 +419,6 @@ class Settings(object): def dd_count_interactions(self): return self._dd_count_interactions - @property - def use_windowed_multipole(self): - return self._multipole_active - @property def resonance_scattering(self): return self._resonance_scattering @@ -679,7 +673,7 @@ class Settings(object): cv.check_type('temperature settings', temperature, Mapping) for key, value in temperature.items(): cv.check_value('temperature key', key, - ['default', 'method', 'tolerance']) + ['default', 'method', 'tolerance', 'multipole']) if key == 'default': cv.check_type('default temperature', value, Real) elif key == 'method': @@ -687,6 +681,8 @@ class Settings(object): ['nearest', 'interpolation']) elif key == 'tolerance': cv.check_type('temperature tolerance', value, Real) + elif key == 'multipole': + cv.check_type('temperature multipole', value, bool) self._temperature = temperature @threads.setter @@ -816,11 +812,6 @@ class Settings(object): self._dd_count_interactions = interactions - @use_windowed_multipole.setter - def use_windowed_multipole(self, active): - cv.check_type('use_windowed_multipole', active, bool) - self._multipole_active = active - @resonance_scattering.setter def resonance_scattering(self, res): if not isinstance(res, MutableSequence): @@ -1063,8 +1054,12 @@ class Settings(object): def _create_temperature_subelements(self): if self.temperature: for key, value in self.temperature.items(): - element = ET.SubElement(self._settings_file, - "temperature_{}".format(key)) + if (key == 'multipole'): + element = ET.SubElement(self._settings_file, + "use_windowed_multipole") + else: + element = ET.SubElement(self._settings_file, + "temperature_{}".format(key)) element.text = str(value) def _create_threads_subelement(self): @@ -1124,12 +1119,6 @@ class Settings(object): subelement = ET.SubElement(element, "count_interactions") subelement.text = str(self._dd_count_interactions).lower() - def _create_use_multipole_subelement(self): - if self._multipole_active is not None: - element = ET.SubElement(self._settings_file, - "use_windowed_multipole") - element.text = str(self._multipole_active) - def _create_resonance_scattering_subelement(self): if len(self.resonance_scattering) > 0: elem = ET.SubElement(self._settings_file, 'resonance_scattering') @@ -1177,7 +1166,6 @@ class Settings(object): self._create_track_subelement() self._create_ufs_subelement() self._create_dd_subelement() - self._create_use_multipole_subelement() self._create_resonance_scattering_subelement() self._create_volume_calcs_subelement() diff --git a/tests/test_multipole/test_multipole.py b/tests/test_multipole/test_multipole.py index e908eba2d..32b38dd76 100644 --- a/tests/test_multipole/test_multipole.py +++ b/tests/test_multipole/test_multipole.py @@ -68,8 +68,7 @@ class MultipoleTestHarness(PyAPITestHarness): sets_file.particles = 1000 sets_file.source = Source(space=Box([-1, -1, -1], [1, 1, 1])) sets_file.output = {'summary': True} - sets_file.use_windowed_multipole = True - sets_file.temperature = {'tolerance': 1000} + sets_file.temperature = {'tolerance': 1000, 'multipole': True} sets_file.export_to_xml() #################### From 63b9543fc9aa93d2c0302c2b8c9827f3c6ce0706 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 7 Oct 2016 14:19:17 -0400 Subject: [PATCH 3/6] use_windowed_multipole --> temperature_multipole --- docs/source/usersguide/input.rst | 33 ++++++++++++++-------------- openmc/settings.py | 8 ++----- src/global.F90 | 4 +--- src/input_xml.F90 | 30 ++++++++++++------------- src/relaxng/settings.rnc | 4 ++-- src/relaxng/settings.rng | 10 ++++----- tests/test_multipole/inputs_true.dat | 2 +- 7 files changed, 41 insertions(+), 50 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 2e4d3f087..847dc66ff 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -292,8 +292,8 @@ OpenMC can use it for on-the-fly Doppler-broadening of resolved resonance range cross sections. If this element is absent from the settings.xml file, the :envvar:`OPENMC_MULTIPOLE_LIBRARY` environment variable will be used. - .. note:: The element must also be set to "true" - for windowed multipole functionality. + .. note:: The element must also be set to "true" for + windowed multipole functionality. ```` Element --------------------------- @@ -731,13 +731,23 @@ cell, the nearest temperature at which cross sections are given is to be applied, within a given tolerance (see :ref:`temperature_tolerance`). A value of "interpolation" indicates that cross sections are to be linear-linear interpolated between temperatures at which nuclear data are present (see -:ref:`temperature_treatment`). Note that if ```` is set -true, then for which multipole data is available will use the windowed multipole -method for cross sections in the resolved resonance range. (a -:ref:`windowed multipole library ` must also be available). +:ref:`temperature_treatment`). *Default*: "nearest" +.. _temperature_multipole: + +```` Element +----------------------------------- + +The ```` element toggles the windowed multipole +capability on or off. If this element is set to "True" and the relevant data is +available, OpenMC will use the windowed multipole method to evaluate and Doppler +broaden cross sections in the resolved resonance range. This override other +methods like "nearest" and "interpolation" in the resolved resonance range. + + *Default*: False + .. _temperature_tolerance: ```` Element @@ -850,17 +860,6 @@ problem. It has the following attributes/sub-elements: *Default*: None - -```` Element ------------------------------------- - -The ```` element toggles the windowed multipole -capability on or off. If this element is set to "True" and the relevant data is -available, OpenMC will use the windowed multipole method to evaluate and Doppler -broaden cross sections in the resolved resonance range. - - *Default*: False - ```` Element ----------------------- diff --git a/openmc/settings.py b/openmc/settings.py index 5019980eb..84fe20485 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -1054,12 +1054,8 @@ class Settings(object): def _create_temperature_subelements(self): if self.temperature: for key, value in self.temperature.items(): - if (key == 'multipole'): - element = ET.SubElement(self._settings_file, - "use_windowed_multipole") - else: - element = ET.SubElement(self._settings_file, - "temperature_{}".format(key)) + element = ET.SubElement(self._settings_file, + "temperature_{}".format(key)) element.text = str(value) def _create_threads_subelement(self): diff --git a/src/global.F90 b/src/global.F90 index d424e1cec..c41ab52c0 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -99,11 +99,9 @@ module global ! What to assume for expanding natural elements integer :: default_expand = ENDF_BVII1 - ! Whether or not windowed multipole cross sections should be used. - logical :: multipole_active = .false. - ! Default temperature and method for choosing temperatures integer :: temperature_method = TEMPERATURE_NEAREST + logical :: temperature_multipole = .false. real(8) :: temperature_tolerance = 10.0_8 real(8) :: temperature_default = 293.6_8 diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 74b5f47ae..8691a9d5c 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1063,20 +1063,6 @@ contains end select end if - ! Check to see if windowed multipole functionality is requested - if (check_for_node(doc, "use_windowed_multipole")) then - call get_node_value(doc, "use_windowed_multipole", temp_str) - select case (to_lower(temp_str)) - case ('true', '1') - multipole_active = .true. - case ('false', '0') - multipole_active = .false. - case default - call fatal_error("Unrecognized value for in & - &settings.xml") - end select - end if - call get_node_list(doc, "volume_calc", node_vol_list) n = get_list_size(node_vol_list) allocate(volume_calcs(n)) @@ -1103,6 +1089,18 @@ contains if (check_for_node(doc, "temperature_tolerance")) then call get_node_value(doc, "temperature_tolerance", temperature_tolerance) end if + if (check_for_node(doc, "temperature_multipole")) then + call get_node_value(doc, "temperature_multipole", temp_str) + select case (to_lower(temp_str)) + case ('true', '1') + temperature_multipole = .true. + case ('false', '0') + temperature_multipole = .false. + case default + call fatal_error("Unrecognized value for in & + &settings.xml") + end select + end if ! Close settings XML file call close_xmldoc(doc) @@ -5798,7 +5796,7 @@ contains call already_read % add(name) ! Read multipole file into the appropriate entry on the nuclides array - if (multipole_active) call read_multipole_data(i_nuclide) + if (temperature_multipole) call read_multipole_data(i_nuclide) end if ! Check if material is fissionable @@ -5852,7 +5850,7 @@ contains end do ! If the user wants multipole, make sure we found a multipole library. - if (multipole_active) then + if (temperature_multipole) then mp_found = .false. do i = 1, size(nuclides) if (nuclides(i) % mp_present) then diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index 70550a40f..b05ab7d6b 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -132,6 +132,8 @@ element settings { element temperature_method { xsd:string }? & + element temperature_multipole { xsd:boolean }? & + element temperature_tolerance { xsd:double }? & element threads { xsd:positiveInteger }? & @@ -182,6 +184,4 @@ element settings { attribute E_max { xsd:double })? }* }? & - - element use_windowed_multipole { xsd:boolean }? } diff --git a/src/relaxng/settings.rng b/src/relaxng/settings.rng index 246c78e68..cbeac25a5 100644 --- a/src/relaxng/settings.rng +++ b/src/relaxng/settings.rng @@ -575,6 +575,11 @@ + + + + + @@ -816,10 +821,5 @@ - - - - - diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index 9ff8c6e39..3b2b43ec7 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -1 +1 @@ -cab3356c163ceace74251d20cafc1b46f9fc3af428685cf5cea9964f5356d59a967468a14b3a2cd2ad3eea04b1d164b5daee8259f38be8ec5fb04fa7b4982830 \ No newline at end of file +2be927608035759f52a2ac88b2c84e28c06e0f7905187bfd4695fecd80f417e727d8879c52fe03253938f7aa0301061f72dce9b5ae46b8675049b5bc4d9525a0 \ No newline at end of file From c7c5e671cfdca54cb9ed93c9f8c19da7aebc7636 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 7 Oct 2016 16:26:46 -0400 Subject: [PATCH 4/6] Use ordered dict in test_multipole --- tests/test_multipole/inputs_true.dat | 2 +- tests/test_multipole/test_multipole.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index 3b2b43ec7..83e9fc6fd 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -1 +1 @@ -2be927608035759f52a2ac88b2c84e28c06e0f7905187bfd4695fecd80f417e727d8879c52fe03253938f7aa0301061f72dce9b5ae46b8675049b5bc4d9525a0 \ No newline at end of file +28e3b5cba12061ff7c410585117d40425d830a53fa2e7324d8f96deee28a57fb4cc4de393aa600f44816e72a0f66f22f5f4c65d52977d99f6a0d53275d263067 \ No newline at end of file diff --git a/tests/test_multipole/test_multipole.py b/tests/test_multipole/test_multipole.py index 32b38dd76..035a6c894 100644 --- a/tests/test_multipole/test_multipole.py +++ b/tests/test_multipole/test_multipole.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from collections import OrderedDict import os import sys sys.path.insert(0, os.pardir) @@ -68,7 +69,9 @@ class MultipoleTestHarness(PyAPITestHarness): sets_file.particles = 1000 sets_file.source = Source(space=Box([-1, -1, -1], [1, 1, 1])) sets_file.output = {'summary': True} - sets_file.temperature = {'tolerance': 1000, 'multipole': True} + sets_file.temperature = OrderedDict() + sets_file.temperature['tolerance'] = 1000 + sets_file.temperature['multipole'] = True sets_file.export_to_xml() #################### From b4df08ac336c3a26c5a94a55ecba2ef006e7cb36 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 7 Oct 2016 20:54:57 -0400 Subject: [PATCH 5/6] Sort the output of temperature dictionary --- openmc/settings.py | 2 +- tests/test_multipole/inputs_true.dat | 2 +- tests/test_multipole/test_multipole.py | 5 +---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/openmc/settings.py b/openmc/settings.py index 84fe20485..335de839a 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -1053,7 +1053,7 @@ class Settings(object): def _create_temperature_subelements(self): if self.temperature: - for key, value in self.temperature.items(): + for key, value in sorted(self.temperature.items()): element = ET.SubElement(self._settings_file, "temperature_{}".format(key)) element.text = str(value) diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index 83e9fc6fd..3b2b43ec7 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -1 +1 @@ -28e3b5cba12061ff7c410585117d40425d830a53fa2e7324d8f96deee28a57fb4cc4de393aa600f44816e72a0f66f22f5f4c65d52977d99f6a0d53275d263067 \ No newline at end of file +2be927608035759f52a2ac88b2c84e28c06e0f7905187bfd4695fecd80f417e727d8879c52fe03253938f7aa0301061f72dce9b5ae46b8675049b5bc4d9525a0 \ No newline at end of file diff --git a/tests/test_multipole/test_multipole.py b/tests/test_multipole/test_multipole.py index 035a6c894..32b38dd76 100644 --- a/tests/test_multipole/test_multipole.py +++ b/tests/test_multipole/test_multipole.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -from collections import OrderedDict import os import sys sys.path.insert(0, os.pardir) @@ -69,9 +68,7 @@ class MultipoleTestHarness(PyAPITestHarness): sets_file.particles = 1000 sets_file.source = Source(space=Box([-1, -1, -1], [1, 1, 1])) sets_file.output = {'summary': True} - sets_file.temperature = OrderedDict() - sets_file.temperature['tolerance'] = 1000 - sets_file.temperature['multipole'] = True + sets_file.temperature = {'tolerance': 1000, 'multipole': True} sets_file.export_to_xml() #################### From 7eefb7306ff0f8745af1447789d8cddc9778617f Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 9 Oct 2016 15:10:24 -0400 Subject: [PATCH 6/6] Fixed errors in tally.F90 which would have resulted in erroneous tallied values. --- src/tally.F90 | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index 3c008e30e..f7d8ab5a2 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -149,7 +149,7 @@ contains if (survival_biasing) then ! We need to account for the fact that some weight was already ! absorbed - score = p % last_wgt + p % absorb_wgt * flux + score = (p % last_wgt + p % absorb_wgt) * flux else score = p % last_wgt * flux end if @@ -417,6 +417,13 @@ contains case (SCORE_PROMPT_NU_FISSION) + ! make sure the correct energy is used + if (t % estimator == ESTIMATOR_TRACKLENGTH) then + E = p % E + else + E = p % last_E + end if + if (t % estimator == ESTIMATOR_ANALOG) then if (survival_biasing .or. p % fission) then if (t % find_filter(FILTER_ENERGYOUT) > 0) then @@ -453,13 +460,6 @@ contains end if else - ! make sure the correct energy is used - if (t % estimator == ESTIMATOR_TRACKLENGTH) then - E = p % E - else - E = p % last_E - end if - if (i_nuclide > 0) then score = micro_xs(i_nuclide) % fission * nuclides(i_nuclide) % & nu(E, EMISSION_PROMPT) * atom_density * flux @@ -675,6 +675,12 @@ contains case (SCORE_DECAY_RATE) + ! make sure the correct energy is used + if (t % estimator == ESTIMATOR_TRACKLENGTH) then + E = p % E + else + E = p % last_E + end if ! Set the delayedgroup filter index dg_filter = t % find_filter(FILTER_DELAYEDGROUP)