From e605ac43b2fdeba2ef42035144051518b1a3a3e3 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 30 Mar 2016 14:50:17 -0400 Subject: [PATCH] Address PR #618 comments --- docs/source/usersguide/input.rst | 2 +- openmc/universe.py | 2 +- src/ace.F90 | 26 ++++++++--- src/input_xml.F90 | 7 ++- src/multipole.F90 | 46 +++++++++++--------- tests/test_filter_distribcell/case-1/test.py | 7 +++ tests/test_multipole/test_multipole.py | 16 ++++--- 7 files changed, 69 insertions(+), 37 deletions(-) create mode 100644 tests/test_filter_distribcell/case-1/test.py diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index ace77a3954..324fbfc2db 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -290,7 +290,7 @@ 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" + .. note:: The element must also be set to "true" for windowed multipole functionality. ```` Element diff --git a/openmc/universe.py b/openmc/universe.py index 09baba7c9c..112346c198 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -475,7 +475,7 @@ class Cell(object): if self.temperature is not None: if isinstance(self.temperature, Iterable): element.set("temperature", ' '.join( - [str(t) for t in self.temperature])) + str(t) for t in self.temperature)) else: element.set("temperature", str(self.temperature)) diff --git a/src/ace.F90 b/src/ace.F90 index 48220ffeb0..e3e6161a67 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -56,6 +56,7 @@ contains integer :: temp_table ! temporary value for sorting character(12) :: name ! name of isotope, e.g. 92235.03c character(12) :: alias ! alias of nuclide, e.g. U-235.03c + logical :: mp_found ! if windowed multipole libraries were found type(Material), pointer :: mat type(NuclideCE), pointer :: nuc type(SAlphaBeta), pointer :: sab @@ -239,6 +240,21 @@ contains end if end do + ! If the user wants multipole, make sure we found a multipole library. + if (multipole_active) then + mp_found = .false. + do i = 1, n_nuclides_total + if (nuclides(i) % mp_present) then + mp_found = .true. + exit + end if + end do + if (.not. mp_found) call warning("Windowed multipole functionality is & + &turned on, but no multipole libraries were found. Set the & + & element in settings.xml or the & + &OPENMC_MULTIPOLE_LIBRARY environment variable.") + end if + end subroutine read_ace_xs !=============================================================================== @@ -429,12 +445,12 @@ contains subroutine read_multipole_data(i_table) - integer, intent(in) :: i_table ! index in nuclides/sab_tables + integer, intent(in) :: i_table ! index in nuclides/sab_tables - logical :: file_exists ! does multipole library exist? - character(7) :: readable ! is multipole library readable? - character(6) :: zaid_string ! String of the ZAID - character(MAX_FILE_LEN+9) :: filename ! path to multipole xs library + logical :: file_exists ! Does multipole library exist? + character(7) :: readable ! Is multipole library readable? + character(6) :: zaid_string ! String of the ZAID + character(MAX_FILE_LEN+9) :: filename ! Path to multipole xs library ! For the time being, and I know this is a bit hacky, we just assume ! that the file will be zaid.h5. diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 1f5b0d3e84..1ce5ceb876 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -167,8 +167,7 @@ contains ! Find the windowed multipole library if (run_mode /= MODE_PLOTTING) then - if (.not. check_for_node(doc, "multipole_library") .and. & - run_mode /= MODE_PLOTTING) then + if (.not. check_for_node(doc, "multipole_library")) then ! No library location specified in settings.xml, check ! environment variable call get_environment_variable("OPENMC_MULTIPOLE_LIBRARY", env_variable) @@ -1109,9 +1108,9 @@ contains 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', 't', '1', 'y') + case ('true', '1') multipole_active = .true. - case ('false', 'f', '0', 'n') + case ('false', '0') multipole_active = .false. case default call fatal_error("Unrecognized value for in & diff --git a/src/multipole.F90 b/src/multipole.F90 index da57c96a29..612e03d7a0 100644 --- a/src/multipole.F90 +++ b/src/multipole.F90 @@ -32,7 +32,6 @@ contains integer :: i, j integer, allocatable :: MT(:) logical :: accumulated_fission - character(len=3) :: MT_string character(len=24) :: MT_n ! Takes the form '/nuclide/reactions/MT???' integer :: is_fissionable @@ -91,13 +90,13 @@ contains allocate(nuc % nu_fission(nuc % n_grid)) allocate(nuc % absorption(nuc % n_grid)) - nuc % total = ZERO - nuc % absorption = ZERO - nuc % fission = ZERO + nuc % total(:) = ZERO + nuc % absorption(:) = ZERO + nuc % fission(:) = ZERO ! Read in new energy axis (converting eV to MeV) call read_dataset(group_id, "energy_points", nuc % energy) - nuc % energy = nuc % energy / 1.0D6 + nuc % energy = nuc % energy / 1.0e6_8 ! Get count and list of MT tables call read_dataset(group_id, "MT_count", NMT) @@ -111,8 +110,7 @@ contains ! Loop over each MT entry and load it into a reaction. do i = 1, NMT - write(MT_string, '(I3.3)') MT(i) - MT_n = "/nuclide/reactions/MT" // MT_string + write(MT_n, '(A, I3.3)') '/nuclide/reactions/MT', MT(i) group_id = open_group(file_id, MT_n) @@ -120,11 +118,11 @@ contains select case (MT(i)) case(ELASTIC) call read_dataset(group_id, "MT_sigma", nuc % elastic) - nuc % total = nuc % total + nuc % elastic + nuc % total(:) = nuc % total + nuc % elastic case(N_FISSION) call read_dataset(group_id, "MT_sigma", nuc % fission) - nuc % total = nuc % total + nuc % fission - nuc % absorption = nuc % absorption + nuc % fission + nuc % total(:) = nuc % total + nuc % fission + nuc % absorption(:) = nuc % absorption + nuc % fission accumulated_fission = .true. case default ! Search through all of our secondary reactions @@ -136,36 +134,42 @@ contains ! fission cross section. if ( (MT(i) == N_F .or. MT(i) == N_NF .or. MT(i) == N_2NF & .or. MT(i) == N_3NF) .and. accumulated_fission) then - nuc % total = nuc % total - nuc % fission - nuc % absorption = nuc % absorption - nuc % fission - nuc % fission = 0.0_8 + nuc % total(:) = nuc % total - nuc % fission + nuc % absorption(:) = nuc % absorption - nuc % fission + nuc % fission(:) = ZERO accumulated_fission = .false. end if deallocate(nuc % reactions(j) % sigma) allocate(nuc % reactions(j) % sigma(nuc % n_grid)) - call read_dataset(group_id, "MT_sigma", nuc % reactions(j) % sigma) - call read_dataset(group_id, "Q_value", nuc % reactions(j) % Q_value) - call read_dataset(group_id, "threshold", nuc % reactions(j) % threshold) + call read_dataset(group_id, "MT_sigma", & + nuc % reactions(j) % sigma) + call read_dataset(group_id, "Q_value", & + nuc % reactions(j) % Q_value) + call read_dataset(group_id, "threshold", & + nuc % reactions(j) % threshold) nuc % reactions(j) % threshold = 1 ! TODO: reconsider implications. - nuc % reactions(j) % Q_value = nuc % reactions(j) % Q_value / 1.0D6 + nuc % reactions(j) % Q_value = nuc % reactions(j) % Q_value & + / 1.0e6_8 ! Accumulate total if (MT(i) /= N_LEVEL .and. MT(i) <= N_DA) then - nuc % total = nuc % total + nuc % reactions(j) % sigma + nuc % total(:) = nuc % total + nuc % reactions(j) % sigma end if ! Accumulate absorption if (MT(i) >= N_GAMMA .and. MT(i) <= N_DA) then - nuc % absorption = nuc % absorption + nuc % reactions(j) % sigma + nuc % absorption(:) = nuc % absorption & + + nuc % reactions(j) % sigma end if ! Accumulate fission (if needed) if ( (MT(i) == N_F .or. MT(i) == N_NF .or. MT(i) == N_2NF & .or. MT(i) == N_3NF) ) then - nuc % fission = nuc % fission + nuc % reactions(j) % sigma - nuc % absorption = nuc % absorption + nuc % reactions(j) % sigma + nuc % fission(:) = nuc % fission + nuc % reactions(j) % sigma + nuc % absorption(:) = nuc % absorption & + + nuc % reactions(j) % sigma end if end if end do diff --git a/tests/test_filter_distribcell/case-1/test.py b/tests/test_filter_distribcell/case-1/test.py new file mode 100644 index 0000000000..a71516d5f6 --- /dev/null +++ b/tests/test_filter_distribcell/case-1/test.py @@ -0,0 +1,7 @@ +import openmc + + +su = openmc.Summary('summary.h5') +sp = openmc.StatePoint('statepoint.1.h5') +sp.link_with_summary(su) +print(sp.tallies[1].get_pandas_dataframe(summary=su)) diff --git a/tests/test_multipole/test_multipole.py b/tests/test_multipole/test_multipole.py index ea3108557f..f1deb92cb5 100644 --- a/tests/test_multipole/test_multipole.py +++ b/tests/test_multipole/test_multipole.py @@ -1,5 +1,4 @@ #!/usr/bin/env python - import os import sys sys.path.insert(0, os.pardir) @@ -9,7 +8,7 @@ from openmc.stats import Box from openmc.source import Source -class DistribmatTestHarness(PyAPITestHarness): +class MultipoleTestHarness(PyAPITestHarness): def _build_inputs(self): #################### # Materials @@ -116,8 +115,15 @@ class DistribmatTestHarness(PyAPITestHarness): plots_file.export_to_xml() + def execute_test(self): + if not 'OPENMC_MULTIPOLE_LIBRARY' in os.environ: + raise RuntimeError("The 'OPENMC_MULTIPOLE_LIBRARY' environment " + "variable must be specified for this test.") + else: + super(MultipoleTestHarness, self).execute_test() + def _get_results(self): - outstr = super(DistribmatTestHarness, self)._get_results() + outstr = super(MultipoleTestHarness, self)._get_results() su = openmc.Summary('summary.h5') outstr += str(su.get_cell_by_id(11)) return outstr @@ -126,9 +132,9 @@ class DistribmatTestHarness(PyAPITestHarness): f = os.path.join(os.getcwd(), 'plots.xml') if os.path.exists(f): os.remove(f) - super(DistribmatTestHarness, self)._cleanup() + super(MultipoleTestHarness, self)._cleanup() if __name__ == '__main__': - harness = DistribmatTestHarness('statepoint.5.*') + harness = MultipoleTestHarness('statepoint.5.*') harness.main()