From 6793ca9836d8d77f656b74d25a6b0b372f835cdf Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 17 Feb 2017 10:41:51 -0600 Subject: [PATCH 01/18] Add git SHA1 hash to --version output and summary/statepoint files --- docs/source/io_formats/statepoint.rst | 4 ++++ docs/source/io_formats/summary.rst | 4 ++++ src/output.F90 | 5 ++++- src/state_point.F90 | 3 +++ src/summary.F90 | 3 +++ 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/source/io_formats/statepoint.rst b/docs/source/io_formats/statepoint.rst index e334f2bf11..a93e2f26d1 100644 --- a/docs/source/io_formats/statepoint.rst +++ b/docs/source/io_formats/statepoint.rst @@ -27,6 +27,10 @@ The current revision of the statepoint file format is 15. Release version number for OpenMC +**/git_sha1** (*char[40]*) + + Git commit SHA-1 hash + **/date_and_time** (*char[]*) Date and time the state point was written. diff --git a/docs/source/io_formats/summary.rst b/docs/source/io_formats/summary.rst index 435cb45c87..3084c27383 100644 --- a/docs/source/io_formats/summary.rst +++ b/docs/source/io_formats/summary.rst @@ -27,6 +27,10 @@ The current revision of the summary file format is 4. Release version number for OpenMC +**/git_sha1** (*char[40]*) + + Git commit SHA-1 hash + **/date_and_time** (*char[]*) Date and time the summary was written. diff --git a/src/output.F90 b/src/output.F90 index c719dbed97..b1b8320c68 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -173,10 +173,13 @@ contains if (master) then write(UNIT=OUTPUT_UNIT, FMT='(1X,A,1X,I1,".",I1,".",I1)') & "OpenMC version", VERSION_MAJOR, VERSION_MINOR, VERSION_RELEASE +#ifdef GIT_SHA1 + write(UNIT=OUTPUT_UNIT, FMT='(1X,A,A)') "Git SHA1: ", GIT_SHA1 +#endif write(UNIT=OUTPUT_UNIT, FMT=*) "Copyright (c) 2011-2015 & &Massachusetts Institute of Technology" write(UNIT=OUTPUT_UNIT, FMT=*) "MIT/X license at & - &" + &" end if end subroutine print_version diff --git a/src/state_point.F90 b/src/state_point.F90 index 257753b5b4..5872fbadf4 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -77,6 +77,9 @@ contains call write_dataset(file_id, "version_major", VERSION_MAJOR) call write_dataset(file_id, "version_minor", VERSION_MINOR) call write_dataset(file_id, "version_release", VERSION_RELEASE) +#ifdef GIT_SHA1 + call write_dataset(file_id, "git_sha1", GIT_SHA1) +#endif ! Write current date and time call write_dataset(file_id, "date_and_time", time_stamp()) diff --git a/src/summary.F90 b/src/summary.F90 index 78a8276f16..a17aa5210d 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -96,6 +96,9 @@ contains call write_dataset(file_id, "version_major", VERSION_MAJOR) call write_dataset(file_id, "version_minor", VERSION_MINOR) call write_dataset(file_id, "version_release", VERSION_RELEASE) +#ifdef GIT_SHA1 + call write_dataset(file_id, "git_sha1", GIT_SHA1) +#endif ! Write current date and time call write_dataset(file_id, "date_and_time", time_stamp()) From 0c616c8b22b846132fc69645dc1231c877b4a6bb Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 17 Feb 2017 14:29:34 -0600 Subject: [PATCH 02/18] Handle HDF5 format versions consistently --- openmc/checkvalue.py | 33 ++++++++ openmc/particle_restart.py | 16 ++-- openmc/statepoint.py | 45 ++++------- openmc/summary.py | 22 ++---- openmc/volume.py | 4 + src/constants.F90 | 18 +++-- src/hdf5_interface.F90 | 79 +++++++++++++++++-- src/initialize.F90 | 12 +-- src/input_xml.F90 | 6 +- src/multipole.F90 | 9 ++- src/particle_restart.F90 | 5 +- src/particle_restart_write.F90 | 12 ++- src/state_point.F90 | 36 ++++----- src/summary.F90 | 57 ++----------- src/track_output.F90 | 8 +- src/volume_calc.F90 | 21 +++-- .../results_true.dat | 2 +- 17 files changed, 218 insertions(+), 167 deletions(-) diff --git a/openmc/checkvalue.py b/openmc/checkvalue.py index fe5683c06a..06e5240048 100644 --- a/openmc/checkvalue.py +++ b/openmc/checkvalue.py @@ -239,6 +239,39 @@ def check_greater_than(name, value, minimum, equality=False): raise ValueError(msg) +def check_filetype_version(obj, expected_type, expected_version): + """Check filetype and version of an HDF5 file. + + Parameters + ---------- + obj : h5py.File + HDF5 file to check + expected_type + Expected file type, e.g. 'statepoint' + expected_version + Expected major version number. + + """ + try: + this_filetype = obj.attrs['filetype'].decode() + this_version = obj.attrs['version'] + + # Check filetype + if this_filetype != expected_type: + raise IOError('{} is not a {} file.'.format( + obj.filename, expected_type)) + + # Check version + if this_version[0] != expected_version: + raise IOError('Statepoint file has a version of {} which is not ' + 'consistent with the version expected by OpenMC, {}' + .format('.'.join(this_version), expected_version)) + except AttributeError: + raise IOError('Could not read {} file. This most likely means the {} ' + 'file was produced by a different version of OpenMC than ' + 'the one you are using.'.format(expected_type)) + + class CheckedList(list): """A list for which each element is type-checked as it's added diff --git a/openmc/particle_restart.py b/openmc/particle_restart.py index cb13265860..651855a878 100644 --- a/openmc/particle_restart.py +++ b/openmc/particle_restart.py @@ -1,5 +1,9 @@ import h5py +import openmc.checkvalue as cv + +_VERSION_PARTICLE_RESTART = 2 + class Particle(object): """Information used to restart a specific particle that caused a simulation to fail. @@ -37,15 +41,9 @@ class Particle(object): def __init__(self, filename): self._f = h5py.File(filename, 'r') - # Ensure filetype and revision are correct - if 'filetype' not in self._f or self._f[ - 'filetype'].value.decode() != 'particle restart': - raise IOError('{} is not a particle restart file.'.format(filename)) - if self._f['revision'].value != 1: - raise IOError('Particle restart file has a file revision of {} ' - 'which is not consistent with the revision this ' - 'version of OpenMC expects ({}).'.format( - self._f['revision'].value, 1)) + # Ensure filetype and version are correct + cv.check_filetype_version(self._f, 'particle restart', + _VERSION_PARTICLE_RESTART) @property def current_batch(self): diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 144146ba3a..89eabdfd71 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -10,6 +10,8 @@ import h5py import openmc import openmc.checkvalue as cv +_VERSION_STATEPOINT = 16 + class StatePoint(object): """State information on a simulation at a certain point in time (at the end @@ -78,7 +80,7 @@ class StatePoint(object): path : str Working directory for simulation run_mode : str - Simulation run mode, e.g. 'k-eigenvalue' + Simulation run mode, e.g. 'eigenvalue' runtime : dict Dictionary whose keys are strings describing various runtime metrics and whose values are time values in seconds. @@ -110,21 +112,8 @@ class StatePoint(object): def __init__(self, filename, autolink=True): self._f = h5py.File(filename, 'r') - # Ensure filetype and revision are correct - try: - if 'filetype' not in self._f or self._f[ - 'filetype'].value.decode() != 'statepoint': - raise IOError('{} is not a statepoint file.'.format(filename)) - except AttributeError: - raise IOError('Could not read statepoint file. This most likely ' - 'means the statepoint file was produced by a ' - 'different version of OpenMC than the one you are ' - 'using.') - if self._f['revision'].value != 15: - raise IOError('Statepoint file has a file revision of {} ' - 'which is not consistent with the revision this ' - 'version of OpenMC expects ({}).'.format( - self._f['revision'].value, 15)) + # Check filetype and version + cv.check_filetype_version(self._f, 'statepoint', _VERSION_STATEPOINT) # Set flags for what data has been read self._meshes_read = False @@ -188,18 +177,18 @@ class StatePoint(object): @property def date_and_time(self): - return self._f['date_and_time'].value.decode() + return self._f.attrs['date_and_time'].decode() @property def entropy(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['entropy'].value else: return None @property def gen_per_batch(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['gen_per_batch'].value else: return None @@ -234,35 +223,35 @@ class StatePoint(object): @property def k_generation(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['k_generation'].value else: return None @property def k_combined(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['k_combined'].value else: return None @property def k_col_abs(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['k_col_abs'].value else: return None @property def k_col_tra(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['k_col_tra'].value else: return None @property def k_abs_tra(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['k_abs_tra'].value else: return None @@ -321,7 +310,7 @@ class StatePoint(object): @property def n_inactive(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['n_inactive'].value else: return None @@ -336,7 +325,7 @@ class StatePoint(object): @property def path(self): - return self._f['path'].value.decode() + return self._f.attrs['path'].decode() @property def run_mode(self): @@ -501,9 +490,7 @@ class StatePoint(object): @property def version(self): - return (self._f['version_major'].value, - self._f['version_minor'].value, - self._f['version_release'].value) + return self._f.attrs['version'] @property def summary(self): diff --git a/openmc/summary.py b/openmc/summary.py index 5bc4c56a2e..b219e2aafc 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -5,8 +5,11 @@ import numpy as np import h5py import openmc +import openmc.checkvalue as cv from openmc.region import Region +_VERSION_SUMMARY = 5 + class Summary(object): """Information summarizing the geometry, materials, and tallies used in a @@ -31,6 +34,8 @@ class Summary(object): raise ValueError(msg) self._f = h5py.File(filename, 'r') + cv.check_filetype_version(self._f, 'summary', _VERSION_SUMMARY) + self._openmc_geometry = None self._opencg_geometry = None @@ -53,22 +58,9 @@ class Summary(object): def _read_metadata(self): # Read OpenMC version - self.version = [self._f['version_major'].value, - self._f['version_minor'].value, - self._f['version_release'].value] + self.version = self._f.attrs['openmc_version'] # Read date and time - self.date_and_time = self._f['date_and_time'][...] - - # Read if continuous-energy or multi-group - self.run_CE = (self._f['run_CE'].value == 1) - - self.n_batches = self._f['n_batches'].value - self.n_particles = self._f['n_particles'].value - if 'n_inactive' in self._f: - self.n_active = self._f['n_active'].value - self.n_inactive = self._f['n_inactive'].value - self.gen_per_batch = self._f['gen_per_batch'].value - self.n_procs = self._f['n_procs'].value + self.date_and_time = self._f.attrs['date_and_time'] def _read_nuclides(self): self.nuclides = {} diff --git a/openmc/volume.py b/openmc/volume.py index b1391c687c..d85a9a17cc 100644 --- a/openmc/volume.py +++ b/openmc/volume.py @@ -10,6 +10,8 @@ import h5py import openmc import openmc.checkvalue as cv +_VERSION_VOLUME = 1 + class VolumeCalculation(object): """Stochastic volume calculation specifications and results. @@ -189,6 +191,8 @@ class VolumeCalculation(object): """ with h5py.File(filename, 'r') as f: + cv.check_filetype_version(f, "volume", _VERSION_VOLUME) + domain_type = f.attrs['domain_type'].decode() samples = f.attrs['samples'] lower_left = f.attrs['lower_left'] diff --git a/src/constants.F90 b/src/constants.F90 index 43ba2c223c..7f3cf87f83 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -9,17 +9,19 @@ module constants integer, parameter :: VERSION_MAJOR = 0 integer, parameter :: VERSION_MINOR = 8 integer, parameter :: VERSION_RELEASE = 0 + integer, parameter :: & + VERSION(3) = [VERSION_MAJOR, VERSION_MINOR, VERSION_RELEASE] ! HDF5 data format - integer, parameter :: HDF5_VERSION_MAJOR = 1 - integer, parameter :: HDF5_VERSION_MINOR = 0 + integer, parameter :: HDF5_VERSION(2) = [1, 0] - ! Revision numbers for binary files - integer, parameter :: REVISION_STATEPOINT = 15 - integer, parameter :: REVISION_PARTICLE_RESTART = 1 - integer, parameter :: REVISION_TRACK = 1 - integer, parameter :: REVISION_SUMMARY = 4 - character(10), parameter :: MULTIPOLE_VERSION = "v0.2" + ! Version numbers for binary files + integer, parameter :: VERSION_STATEPOINT(2) = [16, 0] + integer, parameter :: VERSION_PARTICLE_RESTART(2) = [2, 0] + integer, parameter :: VERSION_TRACK(2) = [2, 0] + integer, parameter :: VERSION_SUMMARY(2) = [5, 0] + integer, parameter :: VERSION_VOLUME(2) = [1, 0] + character(10), parameter :: VERSION_MULTIPOLE = "v0.2" ! ============================================================================ ! ADJUSTABLE PARAMETERS diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index e588cda146..6ca39e0001 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -75,6 +75,8 @@ module hdf5_interface module procedure write_attribute_double module procedure write_attribute_double_1D module procedure write_attribute_integer + module procedure write_attribute_integer_1D + module procedure write_attribute_string end interface write_attribute public :: write_dataset @@ -93,7 +95,6 @@ module hdf5_interface public :: close_dataset public :: get_shape public :: get_ndims - public :: write_attribute_string public :: get_groups public :: get_datasets public :: get_name @@ -2046,15 +2047,46 @@ contains ! WRITE_ATTRIBUTE_STRING !=============================================================================== - subroutine write_attribute_string(group_id, var, attr_type, attr_str) - integer(HID_T), intent(in) :: group_id - character(*), intent(in) :: var ! variable name for attr - character(*), intent(in) :: attr_type ! attr identifier type - character(*), intent(in) :: attr_str ! string for attr id type + subroutine write_attribute_string(obj_id, name, buffer) + integer(HID_T), intent(in) :: obj_id ! object to write attribute to + character(*), intent(in) :: name ! name of attribute + character(*), intent(in), target :: buffer ! string to write - integer :: hdf5_err + integer :: hdf5_err + integer(HID_T) :: dspace_id + integer(HID_T) :: attr_id + integer(HID_T) :: filetype + integer(SIZE_T) :: i + integer(SIZE_T) :: n + character(kind=C_CHAR), allocatable, target :: temp_buffer(:) + type(c_ptr) :: f_ptr - call h5ltset_attribute_string_f(group_id, var, attr_type, attr_str, hdf5_err) + ! Create datatype for HDF5 file based on C char + n = len_trim(buffer) + if (n > 0) then + call h5tcopy_f(H5T_C_S1, filetype, hdf5_err) + call h5tset_size_f(filetype, n, hdf5_err) + + ! Crate memory space and attribute + call h5screate_f(H5S_SCALAR_F, dspace_id, hdf5_err) + call h5acreate_f(obj_id, trim(name), filetype, dspace_id, & + attr_id, hdf5_err) + + ! Copy string to temporary buffer + allocate(temp_buffer(n)) + do i = 1, n + temp_buffer(i) = buffer(i:i) + end do + + ! Write attribute + f_ptr = c_loc(buffer(1:1)) + call h5awrite_f(attr_id, filetype, f_ptr, hdf5_err) + + ! Close attribute + call h5aclose_f(attr_id, hdf5_err) + call h5sclose_f(dspace_id, hdf5_err) + call h5tclose_f(filetype, hdf5_err) + end if end subroutine write_attribute_string subroutine read_attribute_double(buffer, obj_id, name) @@ -2270,6 +2302,37 @@ contains call h5aread_f(attr_id, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) end subroutine read_attribute_integer_1D_explicit + subroutine write_attribute_integer_1D(obj_id, name, buffer) + integer(HID_T), intent(in) :: obj_id + character(*), intent(in) :: name + integer, target, intent(in) :: buffer(:) + + integer(HSIZE_T) :: dims(1) + + dims(:) = shape(buffer) + call write_attribute_integer_1D_explicit(obj_id, dims, name, buffer) + end subroutine write_attribute_integer_1D + + subroutine write_attribute_integer_1D_explicit(obj_id, dims, name, buffer) + integer(HID_T), intent(in) :: obj_id + integer(HSIZE_T), intent(in) :: dims(1) + character(*), intent(in) :: name + integer, target, intent(in) :: buffer(dims(1)) + + integer :: hdf5_err + integer(HID_T) :: dspace_id + integer(HID_T) :: attr_id + type(C_PTR) :: f_ptr + + call h5screate_simple_f(1, dims, dspace_id, hdf5_err) + call h5acreate_f(obj_id, trim(name), H5T_NATIVE_INTEGER, dspace_id, & + attr_id, hdf5_err) + f_ptr = c_loc(buffer) + call h5awrite_f(attr_id, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + call h5aclose_f(attr_id, hdf5_err) + call h5sclose_f(dspace_id, hdf5_err) + end subroutine write_attribute_integer_1D_explicit + subroutine read_attribute_integer_2D(buffer, obj_id, name) integer, target, allocatable, intent(inout) :: buffer(:,:) integer(HID_T), intent(in) :: obj_id diff --git a/src/initialize.F90 b/src/initialize.F90 index d30f1e0144..ed1e663fdb 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -18,8 +18,8 @@ module initialize use geometry_header, only: Cell, Universe, Lattice, RectLattice, HexLattice,& &BASE_UNIVERSE use global - use hdf5_interface, only: file_open, read_dataset, file_close, hdf5_bank_t,& - hdf5_integer8_t + use hdf5_interface, only: file_open, read_attribute, file_close, & + hdf5_bank_t, hdf5_integer8_t use input_xml, only: read_input_xml, cells_in_univ_dict, read_plots_xml use material_header, only: Material use message_passing @@ -307,11 +307,11 @@ contains ! Check what type of file this is file_id = file_open(argv(i), 'r', parallel=.true.) - call read_dataset(filetype, file_id, 'filetype') + call read_attribute(filetype, file_id, 'filetype') call file_close(file_id) ! Set path and flag for type of run - select case (filetype) + select case (trim(filetype)) case ('statepoint') path_state_point = argv(i) restart_run = .true. @@ -319,7 +319,7 @@ contains path_particle_restart = argv(i) particle_restart_run = .true. case default - call fatal_error("Unrecognized file after restart flag.") + call fatal_error("Unrecognized file after restart flag: " // filetype // ".") end select ! If its a restart run check for additional source file @@ -333,7 +333,7 @@ contains ! Check file type is a source file file_id = file_open(argv(i), 'r', parallel=.true.) - call read_dataset(filetype, file_id, 'filetype') + call read_attribute(filetype, file_id, 'filetype') call file_close(file_id) if (filetype /= 'source') then call fatal_error("Second file after restart flag must be a & diff --git a/src/input_xml.F90 b/src/input_xml.F90 index fa2e9881c0..b1d62e6283 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -5412,16 +5412,16 @@ contains if (attribute_exists(file_id, 'version')) then call read_attribute(version, file_id, 'version') - if (version(1) /= HDF5_VERSION_MAJOR) then + if (version(1) /= HDF5_VERSION(1)) then call fatal_error("HDF5 data format uses version " // trim(to_str(& version(1))) // "." // trim(to_str(version(2))) // " whereas & &your installation of OpenMC expects version " // trim(to_str(& - HDF5_VERSION_MAJOR)) // ".x data.") + HDF5_VERSION(1))) // ".x data.") end if else call fatal_error("HDF5 data does not indicate a version. Your & &installation of OpenMC expects version " // trim(to_str(& - HDF5_VERSION_MAJOR)) // ".x data.") + HDF5_VERSION(1))) // ".x data.") end if end subroutine check_data_version diff --git a/src/multipole.F90 b/src/multipole.F90 index a099e50476..c59f947272 100644 --- a/src/multipole.F90 +++ b/src/multipole.F90 @@ -1,8 +1,9 @@ module multipole + use hdf5 + use constants use global - use hdf5 use hdf5_interface use multipole_header, only: MultipoleArray, FIT_T, FIT_A, FIT_F, & MP_FISS, FORM_MLBW, FORM_RM @@ -39,9 +40,9 @@ contains ! Check the file version number. call read_dataset(version, file_id, "version") - if (version /= MULTIPOLE_VERSION) call fatal_error("The current multipole& - & format version is " // trim(MULTIPOLE_VERSION) // " but the file "& - // trim(filename) // " uses version " // trim(version)) + if (version /= VERSION_MULTIPOLE) call fatal_error("The current multipole& + & format version is " // trim(VERSION_MULTIPOLE) // " but the file "& + // trim(filename) // " uses version " // trim(version) // ".") ! Load in all the array size scalars call read_dataset(multipole % length, group_id, "length") diff --git a/src/particle_restart.F90 b/src/particle_restart.F90 index a1c32f723e..e0174d05f8 100644 --- a/src/particle_restart.F90 +++ b/src/particle_restart.F90 @@ -69,7 +69,6 @@ contains type(Particle), intent(inout) :: p integer, intent(inout) :: previous_run_mode - integer :: int_scalar integer(HID_T) :: file_id character(MAX_WORD_LEN) :: tempstr @@ -81,15 +80,13 @@ contains file_id = file_open(path_particle_restart, 'r') ! Read data from file - call read_dataset(tempstr, file_id, 'filetype') - call read_dataset(int_scalar, file_id, 'revision') call read_dataset(current_batch, file_id, 'current_batch') call read_dataset(gen_per_batch, file_id, 'gen_per_batch') call read_dataset(current_gen, file_id, 'current_gen') call read_dataset(n_particles, file_id, 'n_particles') call read_dataset(tempstr, file_id, 'run_mode') select case (tempstr) - case ('k-eigenvalue') + case ('eigenvalue') previous_run_mode = MODE_EIGENVALUE case ('fixed source') previous_run_mode = MODE_FIXEDSOURCE diff --git a/src/particle_restart_write.F90 b/src/particle_restart_write.F90 index d983b3db8a..a2e01a7a6d 100644 --- a/src/particle_restart_write.F90 +++ b/src/particle_restart_write.F90 @@ -39,9 +39,15 @@ contains ! Get information about source particle src => source_bank(current_work) + ! Write filetype and version info + call write_attribute(file_id, 'filetype', 'particle restart') + call write_attribute(file_id, 'version', VERSION_PARTICLE_RESTART) + call write_attribute(file_id, "openmc_version", VERSION) +#ifdef GIT_SHA1 + call write_attribute(file_id, "git_sha1", GIT_SHA1) +#endif + ! Write data to file - call write_dataset(file_id, 'filetype', 'particle restart') - call write_dataset(file_id, 'revision', REVISION_PARTICLE_RESTART) call write_dataset(file_id, 'current_batch', current_batch) call write_dataset(file_id, 'gen_per_batch', gen_per_batch) call write_dataset(file_id, 'current_gen', current_gen) @@ -50,7 +56,7 @@ contains case (MODE_FIXEDSOURCE) call write_dataset(file_id, 'run_mode', 'fixed source') case (MODE_EIGENVALUE) - call write_dataset(file_id, 'run_mode', 'k-eigenvalue') + call write_dataset(file_id, 'run_mode', 'eigenvalue') case (MODE_PARTICLE) call write_dataset(file_id, 'run_mode', 'particle restart') end select diff --git a/src/state_point.F90 b/src/state_point.F90 index 5872fbadf4..cb4ae5157a 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -68,39 +68,37 @@ contains file_id = file_create(filename) ! Write file type - call write_dataset(file_id, "filetype", 'statepoint') + call write_attribute(file_id, "filetype", "statepoint") ! Write revision number for state point file - call write_dataset(file_id, "revision", REVISION_STATEPOINT) + call write_attribute(file_id, "version", VERSION_STATEPOINT) ! Write OpenMC version - call write_dataset(file_id, "version_major", VERSION_MAJOR) - call write_dataset(file_id, "version_minor", VERSION_MINOR) - call write_dataset(file_id, "version_release", VERSION_RELEASE) + call write_attribute(file_id, "openmc_version", VERSION) #ifdef GIT_SHA1 - call write_dataset(file_id, "git_sha1", GIT_SHA1) + call write_attribute(file_id, "git_sha1", GIT_SHA1) #endif ! Write current date and time - call write_dataset(file_id, "date_and_time", time_stamp()) + call write_attribute(file_id, "date_and_time", time_stamp()) ! Write path to input - call write_dataset(file_id, "path", path_input) + call write_attribute(file_id, "path", path_input) ! Write out random number seed call write_dataset(file_id, "seed", seed) ! Write run information if (run_CE) then - call write_dataset(file_id, "run_CE", 1) + call write_dataset(file_id, "energy_mode", "continuous-energy") else - call write_dataset(file_id, "run_CE", 0) + call write_dataset(file_id, "energy_mode", "multi-group") end if select case(run_mode) case (MODE_FIXEDSOURCE) call write_dataset(file_id, "run_mode", "fixed source") case (MODE_EIGENVALUE) - call write_dataset(file_id, "run_mode", "k-eigenvalue") + call write_dataset(file_id, "run_mode", "eigenvalue") end select call write_dataset(file_id, "n_particles", n_particles) call write_dataset(file_id, "n_batches", n_batches) @@ -670,13 +668,13 @@ contains integer :: i integer :: int_array(3) + integer, allocatable :: array(:) integer(HID_T) :: file_id integer(HID_T) :: cmfd_group integer(HID_T) :: tallies_group integer(HID_T) :: tally_group real(8) :: real_array(3) logical :: source_present - integer :: sp_run_CE character(MAX_WORD_LEN) :: word type(TallyObject), pointer :: tally @@ -688,15 +686,15 @@ contains file_id = file_open(path_state_point, 'r', parallel=.true.) ! Read filetype - call read_dataset(word, file_id, "filetype") + call read_attribute(word, file_id, "filetype") if (word /= 'statepoint') then call fatal_error("OpenMC tried to restart from a non-statepoint file.") end if ! Read revision number for state point file and make sure it matches with ! current version - call read_dataset(int_array(1), file_id, "revision") - if (int_array(1) /= REVISION_STATEPOINT) then + call read_attribute(array, file_id, "version") + if (any(array /= VERSION_STATEPOINT)) then call fatal_error("State point version does not match current version & &in OpenMC.") end if @@ -706,11 +704,11 @@ contains ! It is not impossible for a state point to be generated from a CE run but ! to be loaded in to an MG run (or vice versa), check to prevent that. - call read_dataset(sp_run_CE, file_id, "run_CE") - if (sp_run_CE == 0 .and. run_CE) then + call read_dataset(word, file_id, "energy_mode") + if (word == "multi-group" .and. run_CE) then call fatal_error("State point file is from multi-group run but & & current run is continous-energy!") - else if (sp_run_CE == 1 .and. .not. run_CE) then + else if (word == "continuous-energy" .and. .not. run_CE) then call fatal_error("State point file is from continuous-energy run but & & current run is multi-group!") end if @@ -720,7 +718,7 @@ contains select case(word) case ('fixed source') run_mode = MODE_FIXEDSOURCE - case ('k-eigenvalue') + case ('eigenvalue') run_mode = MODE_EIGENVALUE end select call read_dataset(n_particles, file_id, "n_particles") diff --git a/src/summary.F90 b/src/summary.F90 index a17aa5210d..10b26d0e0c 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -1,5 +1,7 @@ module summary + use hdf5 + use constants use endf, only: reaction_name use geometry_header, only: BASE_UNIVERSE, Cell, Universe, Lattice, & @@ -16,8 +18,6 @@ module summary use tally_header, only: TallyObject use tally_filter, only: find_offset - use hdf5 - implicit none private @@ -39,36 +39,6 @@ contains ! Write header information call write_header(file_id) - if (run_CE) then - call write_dataset(file_id, "run_CE", 1) - else - call write_dataset(file_id, "run_CE", 0) - end if - - ! Write number of particles - call write_dataset(file_id, "n_particles", n_particles) - call write_dataset(file_id, "n_batches", n_batches) - call write_attribute_string(file_id, "n_particles", & - "description", "Number of particles per generation") - call write_attribute_string(file_id, "n_batches", & - "description", "Total number of batches") - - ! Write eigenvalue information - if (run_mode == MODE_EIGENVALUE) then - ! write number of inactive/active batches and generations/batch - call write_dataset(file_id, "n_inactive", n_inactive) - call write_dataset(file_id, "n_active", n_active) - call write_dataset(file_id, "gen_per_batch", gen_per_batch) - - ! Add description of each variable - call write_attribute_string(file_id, "n_inactive", & - "description", "Number of inactive batches") - call write_attribute_string(file_id, "n_active", & - "description", "Number of active batches") - call write_attribute_string(file_id, "gen_per_batch", & - "description", "Number of generations per batch") - end if - call write_nuclides(file_id) call write_geometry(file_id) call write_materials(file_id) @@ -88,25 +58,16 @@ contains subroutine write_header(file_id) integer(HID_T), intent(in) :: file_id - ! Write filetype and revision - call write_dataset(file_id, "filetype", "summary") - call write_dataset(file_id, "revision", REVISION_SUMMARY) - - ! Write version information - call write_dataset(file_id, "version_major", VERSION_MAJOR) - call write_dataset(file_id, "version_minor", VERSION_MINOR) - call write_dataset(file_id, "version_release", VERSION_RELEASE) + ! Write filetype and version info + call write_attribute(file_id, "filetype", "summary") + call write_attribute(file_id, "version", VERSION_SUMMARY) + call write_attribute(file_id, "openmc_version", VERSION) #ifdef GIT_SHA1 - call write_dataset(file_id, "git_sha1", GIT_SHA1) + call write_attribute(file_id, "git_sha1", GIT_SHA1) #endif ! Write current date and time - call write_dataset(file_id, "date_and_time", time_stamp()) - - ! Write MPI information - call write_dataset(file_id, "n_procs", n_procs) - call write_attribute_string(file_id, "n_procs", "description", & - "Number of MPI processes") + call write_attribute(file_id, "date_and_time", time_stamp()) end subroutine write_header @@ -553,8 +514,6 @@ contains ! Write atom density with units call write_dataset(material_group, "atom_density", m % density) - call write_attribute_string(material_group, "atom_density", "units", & - "atom/b-cm") ! Copy ZAID for each nuclide to temporary array allocate(nucnames(m%n_nuclides)) diff --git a/src/track_output.F90 b/src/track_output.F90 index 1411738622..bdef9579c2 100644 --- a/src/track_output.F90 +++ b/src/track_output.F90 @@ -114,10 +114,10 @@ contains !$omp critical (FinalizeParticleTrack) file_id = file_create(fname) - call write_dataset(file_id, 'filetype', 'track') - call write_dataset(file_id, 'revision', REVISION_TRACK) - call write_dataset(file_id, 'n_particles', n_particle_tracks) - call write_dataset(file_id, 'n_coords', n_coords) + call write_attribute(file_id, 'filetype', 'track') + call write_attribute(file_id, 'version', VERSION_TRACK) + call write_attribute(file_id, 'n_particles', n_particle_tracks) + call write_attribute(file_id, 'n_coords', n_coords) do i = 1, n_particle_tracks call write_dataset(file_id, 'coordinates_' // trim(to_str(i)), & tracks(i)%coords) diff --git a/src/volume_calc.F90 b/src/volume_calc.F90 index a9584d672f..5fb4cb5b4d 100644 --- a/src/volume_calc.F90 +++ b/src/volume_calc.F90 @@ -9,8 +9,8 @@ module volume_calc use geometry, only: find_cell use global use hdf5_interface, only: file_create, file_close, write_attribute, & - create_group, close_group, write_dataset, write_attribute_string - use output, only: write_message, header + create_group, close_group, write_dataset + use output, only: write_message, header, time_stamp use message_passing use particle_header, only: Particle use random_lcg, only: prn, prn_set_stream, set_particle_seed @@ -426,14 +426,25 @@ contains ! Create HDF5 file file_id = file_create(filename) + ! Write header info + call write_attribute(file_id, "filetype", "volume") + call write_attribute(file_id, "version", VERSION_VOLUME) + call write_attribute(file_id, "openmc_version", VERSION) +#ifdef GIT_SHA1 + call write_attribute(file_id, "git_sha1", GIT_SHA1) +#endif + + ! Write current date and time + call write_attribute(file_id, "date_and_time", time_stamp()) + ! Write basic metadata select case (this % domain_type) case (FILTER_CELL) - call write_attribute_string(file_id, ".", "domain_type", "cell") + call write_attribute(file_id, "domain_type", "cell") case (FILTER_MATERIAL) - call write_attribute_string(file_id, ".", "domain_type", "material") + call write_attribute(file_id, "domain_type", "material") case (FILTER_UNIVERSE) - call write_attribute_string(file_id, ".", "domain_type", "universe") + call write_attribute(file_id, "domain_type", "universe") end select call write_attribute(file_id, "samples", this % samples) call write_attribute(file_id, "lower_left", this % lower_left) diff --git a/tests/test_particle_restart_eigval/results_true.dat b/tests/test_particle_restart_eigval/results_true.dat index e0a9864a07..5b548bca7c 100644 --- a/tests/test_particle_restart_eigval/results_true.dat +++ b/tests/test_particle_restart_eigval/results_true.dat @@ -5,7 +5,7 @@ current gen: particle id: 1.030000E+03 run mode: -k-eigenvalue +eigenvalue particle weight: 1.000000E+00 particle energy: From b4845f1474b13814f3ae0beedeb6177c6216e1ea Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 17 Feb 2017 15:21:42 -0600 Subject: [PATCH 03/18] Refactor openmc.Summary() class. Only store user IDs in summary/statepoint files --- openmc/mgxs/library.py | 54 +-- openmc/mgxs/mgxs.py | 10 +- openmc/statepoint.py | 30 +- openmc/summary.py | 377 ++++++------------ src/constants.F90 | 2 +- src/summary.F90 | 33 +- src/tally_filter.F90 | 55 ++- .../test_asymmetric_lattice.py | 5 +- tests/test_distribmat/test_distribmat.py | 3 +- tests/test_mg_convert/test_mg_convert.py | 1 - .../test_mgxs_library_ce_to_mg.py | 3 - .../test_mgxs_library_distribcell.py | 2 +- tests/test_multipole/test_multipole.py | 3 +- 13 files changed, 227 insertions(+), 351 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index f5342e844c..ac82ede1d3 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -31,7 +31,7 @@ class Library(object): Parameters ---------- - openmc_geometry : openmc.Geometry + geometry : openmc.Geometry A geometry which has been initialized with a root universe by_nuclide : bool If true, computes cross sections for each nuclide in each domain @@ -43,12 +43,8 @@ class Library(object): Attributes ---------- - openmc_geometry : openmc.Geometry + geometry : openmc.Geometry An geometry which has been initialized with a root universe - opencg_geometry : opencg.Geometry - An OpenCG geometry object equivalent to the OpenMC geometry - encapsulated by the summary file. Use of this attribute requires - installation of the OpenCG Python module. by_nuclide : bool If true, computes cross sections for each nuclide in each domain mgxs_types : Iterable of str @@ -100,12 +96,11 @@ class Library(object): """ - def __init__(self, openmc_geometry, by_nuclide=False, + def __init__(self, geometry, by_nuclide=False, mgxs_types=None, name=''): self._name = '' - self._openmc_geometry = None - self._opencg_geometry = None + self._geometry = None self._by_nuclide = None self._mgxs_types = [] self._domain_type = None @@ -126,7 +121,7 @@ class Library(object): self._estimator = None self.name = name - self.openmc_geometry = openmc_geometry + self.geometry = geometry self.by_nuclide = by_nuclide if mgxs_types is not None: @@ -139,8 +134,7 @@ class Library(object): if existing is None: clone = type(self).__new__(type(self)) clone._name = self.name - clone._openmc_geometry = self.openmc_geometry - clone._opencg_geometry = None + clone._geometry = self.geometry clone._by_nuclide = self.by_nuclide clone._mgxs_types = self.mgxs_types clone._domain_type = self.domain_type @@ -175,15 +169,8 @@ class Library(object): return existing @property - def openmc_geometry(self): - return self._openmc_geometry - - @property - def opencg_geometry(self): - if self._opencg_geometry is None: - from openmc.opencg_compatible import get_opencg_geometry - self._opencg_geometry = get_opencg_geometry(self._openmc_geometry) - return self._opencg_geometry + def geometry(self): + return self._geometry @property def name(self): @@ -205,11 +192,11 @@ class Library(object): def domains(self): if self._domains == 'all': if self.domain_type == 'material': - return self.openmc_geometry.get_all_materials() + return self.geometry.get_all_materials() elif self.domain_type in ['cell', 'distribcell']: - return self.openmc_geometry.get_all_material_cells() + return self.geometry.get_all_material_cells() elif self.domain_type == 'universe': - return self.openmc_geometry.get_all_universes() + return self.geometry.get_all_universes() elif self.domain_type == 'mesh': raise ValueError('Unable to get domains for Mesh domain type') else: @@ -277,11 +264,10 @@ class Library(object): def sparse(self): return self._sparse - @openmc_geometry.setter - def openmc_geometry(self, openmc_geometry): - cv.check_type('openmc_geometry', openmc_geometry, openmc.Geometry) - self._openmc_geometry = openmc_geometry - self._opencg_geometry = None + @geometry.setter + def geometry(self, geometry): + cv.check_type('geometry', geometry, openmc.Geometry) + self._geometry = geometry @name.setter def name(self, name): @@ -330,13 +316,13 @@ class Library(object): else: if self.domain_type == 'material': cv.check_iterable_type('domain', domains, openmc.Material) - all_domains = self.openmc_geometry.get_all_materials() + all_domains = self.geometry.get_all_materials() elif self.domain_type in ['cell', 'distribcell']: cv.check_iterable_type('domain', domains, openmc.Cell) - all_domains = self.openmc_geometry.get_all_material_cells() + all_domains = self.geometry.get_all_material_cells() elif self.domain_type == 'universe': cv.check_iterable_type('domain', domains, openmc.Universe) - all_domains = self.openmc_geometry.get_all_universes() + all_domains = self.geometry.get_all_universes() elif self.domain_type == 'mesh': cv.check_iterable_type('domain', domains, openmc.Mesh) @@ -597,7 +583,7 @@ class Library(object): raise ValueError(msg) self._sp_filename = statepoint._f.filename - self._openmc_geometry = statepoint.summary.openmc_geometry + self._geometry = statepoint.summary.geometry self._nuclides = statepoint.summary.nuclides if statepoint.run_mode == 'k-eigenvalue': @@ -1352,7 +1338,7 @@ class Library(object): else: # Create a copy of the Geometry for these Macroscopics - geometry = copy.deepcopy(self.openmc_geometry) + geometry = copy.deepcopy(self.geometry) materials = openmc.Materials() # Get all Cells from the Geometry for differentiation diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 7bbd257ca0..114c99a4a2 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -904,12 +904,16 @@ class MGXS(object): # Override the domain object that loaded from an OpenMC summary file # NOTE: This is necessary for micro cross-sections which require # the isotopic number densities as computed by OpenMC + su = statepoint.summary if self.domain_type == 'cell' or self.domain_type == 'distribcell': - self.domain = statepoint.summary.get_cell_by_id(self.domain.id) + cells = {c.id: c for c in su.geometry.get_all_cells()} + self.domain = cells[self.domain.id] elif self.domain_type == 'universe': - self.domain = statepoint.summary.get_universe_by_id(self.domain.id) + universes = {u.id: u for u in su.geometry.get_all_universes()} + self.domain = universes[self.domain.id] elif self.domain_type == 'material': - self.domain = statepoint.summary.get_material_by_id(self.domain.id) + mats = {m.id: m for m in su.materials} + self.domain = mats[self.domain.id] elif self.domain_type == 'mesh': self.domain = statepoint.meshes[self.domain.id] else: diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 89eabdfd71..b8257f5197 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -136,9 +136,6 @@ class StatePoint(object): vol = openmc.VolumeCalculation.from_hdf5(path_i) self.add_volume_information(vol) - def close(self): - self._f.close() - @property def cmfd_on(self): return self._f['cmfd_on'].value > 0 @@ -490,7 +487,7 @@ class StatePoint(object): @property def version(self): - return self._f.attrs['version'] + return tuple(self._f.attrs['version']) @property def summary(self): @@ -692,38 +689,21 @@ class StatePoint(object): RuntimeWarning) return - if not isinstance(summary, openmc.summary.Summary): + if not isinstance(summary, openmc.Summary): msg = 'Unable to link statepoint with "{0}" which ' \ 'is not a Summary object'.format(summary) raise ValueError(msg) + cell_dict = {c.id: c for c in summary.geometry.get_all_cells()} + for tally_id, tally in self.tallies.items(): tally.name = summary.tally_names[tally_id] tally.with_summary = True for tally_filter in tally.filters: - if isinstance(tally_filter, (openmc.CellFilter, - openmc.DistribcellFilter)): - distribcell_ids = [] - for bin in tally_filter.bins: - distribcell_ids.append(summary.cells[bin].id) - tally_filter.bins = distribcell_ids - if isinstance(tally_filter, (openmc.DistribcellFilter)): cell_id = tally_filter.bins[0] - cell = summary.get_cell_by_id(cell_id) + cell = cell_dict[cell_id] tally_filter.distribcell_paths = cell.distribcell_paths - if isinstance(tally_filter, openmc.UniverseFilter): - universe_ids = [] - for bin in tally_filter.bins: - universe_ids.append(summary.universes[bin].id) - tally_filter.bins = universe_ids - - if isinstance(tally_filter, openmc.MaterialFilter): - material_ids = [] - for bin in tally_filter.bins: - material_ids.append(summary.materials[bin].id) - tally_filter.bins = material_ids - self._summary = summary diff --git a/openmc/summary.py b/openmc/summary.py index b219e2aafc..6563d4f27f 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -12,17 +12,23 @@ _VERSION_SUMMARY = 5 class Summary(object): - """Information summarizing the geometry, materials, and tallies used in a - simulation. + """Summary of geometry, materials, and tallies used in a simulation. Attributes ---------- - openmc_geometry : openmc.Geometry - An OpenMC geometry object reconstructed from the summary file - opencg_geometry : opencg.Geometry - An OpenCG geometry object equivalent to the OpenMC geometry - encapsulated by the summary file. Use of this attribute requires - installation of the OpenCG Python module. + date_and_time : str + Date and time when simulation began + geometry : openmc.Geometry + The geometry reconstructed from the summary file + materials : openmc.Materials + The materials reconstructed from the summary file + nuclides : dict + Dictionary whose keys are nuclide names and values are atomic weight + ratios. + tally_names : dict + Dictionary whose keys are tally IDs and values are tally names. + version: tuple of int + Version of OpenMC """ @@ -36,31 +42,28 @@ class Summary(object): self._f = h5py.File(filename, 'r') cv.check_filetype_version(self._f, 'summary', _VERSION_SUMMARY) - self._openmc_geometry = None - self._opencg_geometry = None + self._geometry = openmc.Geometry() + self._materials = openmc.Materials() - self._read_metadata() self._read_nuclides() self._read_geometry() self._read_tallies() - self._f.close() @property - def openmc_geometry(self): - return self._openmc_geometry + def date_and_time(self): + return self._f.attrs['date_and_time'] @property - def opencg_geometry(self): - if self._opencg_geometry is None: - from openmc.opencg_compatible import get_opencg_geometry - self._opencg_geometry = get_opencg_geometry(self.openmc_geometry) - return self._opencg_geometry + def geometry(self): + return self._geometry - def _read_metadata(self): - # Read OpenMC version - self.version = self._f.attrs['openmc_version'] - # Read date and time - self.date_and_time = self._f.attrs['date_and_time'] + @property + def materials(self): + return self._materials + + @property + def version(self): + return tuple(self._f.attrs['openmc_version']) def _read_nuclides(self): self.nuclides = {} @@ -69,33 +72,26 @@ class Summary(object): awrs = self._f['nuclides/awrs'].value for n in range(n_nuclides): name = names[n].decode() - name = name[:name.find('.')] self.nuclides[name] = awrs[n] def _read_geometry(self): # Read in and initialize the Materials and Geometry self._read_materials() - self._read_surfaces() - self._read_cells() - self._read_universes() - self._read_lattices() - self._finalize_geometry() + surfaces = self._read_surfaces() + cells, cell_fills = self._read_cells(surfaces) + universes = self._read_universes(cells, cell_fills) + lattices = self._read_lattices(universes) + self._finalize_geometry(cells, cell_fills, universes, lattices) def _read_materials(self): self.n_materials = self._f['n_materials'].value - # Initialize dictionary for each Material - # Keys - Material keys - # Values - Material objects - self.materials = {} - for key, group in self._f['materials'].items(): if key == 'n_materials': continue material_id = int(key.lstrip('material ')) - index = group['index'].value name = group['name'].value.decode() density = group['atom_density'].value nuc_densities = group['nuclide_densities'][...] @@ -127,26 +123,20 @@ class Summary(object): percent=density, percent_type='ao') # Add the Material to the global dictionary of all Materials - self.materials[index] = material + self.materials.append(material) def _read_surfaces(self): - self.n_surfaces = self._f['geometry/n_surfaces'].value + surfaces = {} - # Initialize dictionary for each Surface - # Keys - Surface keys - # Values - Surfacee objects - self.surfaces = {} - - for key in self._f['geometry/surfaces'].keys(): + for key, group in self._f['geometry/surfaces'].items(): if key == 'n_surfaces': continue surface_id = int(key.lstrip('surface ')) - index = self._f['geometry/surfaces'][key]['index'].value - name = self._f['geometry/surfaces'][key]['name'].value.decode() - surf_type = self._f['geometry/surfaces'][key]['type'].value.decode() - bc = self._f['geometry/surfaces'][key]['boundary_condition'].value.decode() - coeffs = self._f['geometry/surfaces'][key]['coefficients'][...] + name = group['name'].value.decode() + surf_type = group['type'].value.decode() + bc = group['boundary_condition'].value.decode() + coeffs = group['coefficients'][...] # Create the Surface based on its type if surf_type == 'x-plane': @@ -212,42 +202,33 @@ class Summary(object): g, h, j, k, name) # Add Surface to global dictionary of all Surfaces - self.surfaces[index] = surface + surfaces[surface.id] = surface - def _read_cells(self): - self.n_cells = self._f['geometry/n_cells'].value + return surfaces - # Initialize dictionary for each Cell - # Keys - Cell keys - # Values - Cell objects - self.cells = {} + def _read_cells(self, surfaces): + cells = {} # Initialize dictionary for each Cell's fill - # (e.g., Material, Universe or Lattice ID) - # This dictionary is used later to link the fills with - # the corresponding objects - # Keys - Cell keys - # Values - Filling Material, Universe or Lattice ID - self._cell_fills = {} + cell_fills = {} - for key in self._f['geometry/cells'].keys(): + for key, group in self._f['geometry/cells'].items(): if key == 'n_cells': continue cell_id = int(key.lstrip('cell ')) - index = self._f['geometry/cells'][key]['index'].value - name = self._f['geometry/cells'][key]['name'].value.decode() - fill_type = self._f['geometry/cells'][key]['fill_type'].value.decode() + name = group['name'].value.decode() + fill_type = group['fill_type'].value.decode() if fill_type == 'normal': - fill = self._f['geometry/cells'][key]['material'].value + fill = group['material'].value elif fill_type == 'universe': - fill = self._f['geometry/cells'][key]['fill'].value + fill = group['fill'].value else: - fill = self._f['geometry/cells'][key]['lattice'].value + fill = group['lattice'].value - if 'region' in self._f['geometry/cells'][key].keys(): - region = self._f['geometry/cells'][key]['region'].value.decode() + if 'region' in group.keys(): + region = group['region'].value.decode() else: region = [] @@ -255,237 +236,220 @@ class Summary(object): cell = openmc.Cell(cell_id=cell_id, name=name) if fill_type == 'universe': - if 'offset' in self._f['geometry/cells'][key]: - offset = self._f['geometry/cells'][key]['offset'][...] + if 'offset' in group: + offset = group['offset'][...] cell.offsets = offset - if 'translation' in self._f['geometry/cells'][key]: - translation = \ - self._f['geometry/cells'][key]['translation'][...] + if 'translation' in group: + translation = group['translation'][...] translation = np.asarray(translation, dtype=np.float64) cell.translation = translation - if 'rotation' in self._f['geometry/cells'][key]: - rotation = \ - self._f['geometry/cells'][key]['rotation'][...] + if 'rotation' in group: + rotation = group['rotation'][...] rotation = np.asarray(rotation, dtype=np.int) cell._rotation = rotation elif fill_type == 'normal': - cell.temperature = \ - self._f['geometry/cells'][key]['temperature'][...] + cell.temperature = group['temperature'][...] # Store Cell fill information for after Universe/Lattice creation - self._cell_fills[index] = (fill_type, fill) + cell_fills[cell.id] = (fill_type, fill) # Generate Region object given infix expression if region: - cell.region = Region.from_expression( - region, {s.id: s for s in self.surfaces.values()}) + cell.region = Region.from_expression(region, surfaces) # Get the distribcell data - if 'distribcell_index' in self._f['geometry/cells'][key]: - ind = self._f['geometry/cells'][key]['distribcell_index'].value + if 'distribcell_index' in group: + ind = group['distribcell_index'].value cell.distribcell_index = ind - paths = self._f['geometry/cells'][key]['paths'][...] + paths = group['paths'][...] paths = [str(path.decode()) for path in paths] cell.distribcell_paths = paths # Add the Cell to the global dictionary of all Cells - self.cells[index] = cell + cells[cell.id] = cell - def _read_universes(self): - self.n_universes = self._f['geometry/n_universes'].value + return cells, cell_fills + def _read_universes(self, cells, cell_fills): # Initialize dictionary for each Universe # Keys - Universe keys # Values - Universe objects - self.universes = {} + universes = {} for key in self._f['geometry/universes'].keys(): if key == 'n_universes': continue universe_id = int(key.lstrip('universe ')) - index = self._f['geometry/universes'][key]['index'].value - cells = self._f['geometry/universes'][key]['cells'][...] + cell_ids = self._f['geometry/universes'][key]['cells'][...] # Create this Universe universe = openmc.Universe(universe_id=universe_id) # Add each Cell to the Universe - for cell_id in cells: - cell = self.cells[cell_id] - universe.add_cell(cell) + for cell_id in cell_ids: + universe.add_cell(cells[cell_id]) # Add the Universe to the global list of Universes - self.universes[index] = universe + universes[universe.id] = universe - def _read_lattices(self): - self.n_lattices = self._f['geometry/n_lattices'].value + return universes + def _read_lattices(self, universes): # Initialize lattices for each Lattice # Keys - Lattice keys # Values - Lattice objects - self.lattices = {} + lattices = {} - for key in self._f['geometry/lattices'].keys(): + for key, group in self._f['geometry/lattices'].items(): if key == 'n_lattices': continue lattice_id = int(key.lstrip('lattice ')) - index = self._f['geometry/lattices'][key]['index'].value - name = self._f['geometry/lattices'][key]['name'].value.decode() - lattice_type = self._f['geometry/lattices'][key]['type'].value.decode() + name = group['name'].value.decode() + lattice_type = group['type'].value.decode() - if 'offsets' in self._f['geometry/lattices'][key]: - offsets = self._f['geometry/lattices'][key]['offsets'][...] + if 'offsets' in group: + offsets = group['offsets'][...] else: offsets = None if lattice_type == 'rectangular': - dimension = self._f['geometry/lattices'][key]['dimension'][...] - lower_left = \ - self._f['geometry/lattices'][key]['lower_left'][...] - pitch = self._f['geometry/lattices'][key]['pitch'][...] - outer = self._f['geometry/lattices'][key]['outer'].value - universe_ids = \ - self._f['geometry/lattices'][key]['universes'][...] + dimension = group['dimension'][...] + lower_left = group['lower_left'][...] + pitch = group['pitch'][...] + outer = group['outer'].value + universe_ids = group['universes'][...] # Create the Lattice lattice = openmc.RectLattice(lattice_id=lattice_id, name=name) lattice.lower_left = lower_left lattice.pitch = pitch - # If the Universe specified outer the Lattice is not void (-22) - if outer != -22: - lattice.outer = self.universes[outer] + # If the Universe specified outer the Lattice is not void + if outer >= 0: + lattice.outer = universes[outer] # Build array of Universe pointers for the Lattice - universes = \ - np.empty(tuple(universe_ids.shape), dtype=openmc.Universe) + uarray = np.empty(universe_ids.shape, dtype=openmc.Universe) for z in range(universe_ids.shape[0]): for y in range(universe_ids.shape[1]): for x in range(universe_ids.shape[2]): - universes[z, y, x] = \ - self.get_universe_by_id(universe_ids[z, y, x]) + uarray[z, y, x] = universes[universe_ids[z, y, x]] # Use 2D NumPy array to store lattice universes for 2D lattices if len(dimension) == 2: - universes = np.squeeze(universes) - universes = np.atleast_2d(universes) + uarray = np.squeeze(uarray) + uarray = np.atleast_2d(uarray) # Set the universes for the lattice - lattice.universes = universes + lattice.universes = uarray # Set the distribcell offsets for the lattice if offsets is not None: lattice.offsets = offsets # Add the Lattice to the global dictionary of all Lattices - self.lattices[index] = lattice + lattices[lattice.id] = lattice - if lattice_type == 'hexagonal': - n_rings = self._f['geometry/lattices'][key]['n_rings'].value - n_axial = self._f['geometry/lattices'][key]['n_axial'].value - center = self._f['geometry/lattices'][key]['center'][...] - pitch = self._f['geometry/lattices'][key]['pitch'][...] - outer = self._f['geometry/lattices'][key]['outer'].value + elif lattice_type == 'hexagonal': + n_rings = group['n_rings'].value + n_axial = group['n_axial'].value + center = group['center'][...] + pitch = group['pitch'][...] + outer = group['outer'].value - universe_ids = self._f[ - 'geometry/lattices'][key]['universes'][...] + universe_ids = group['universes'][...] # Create the Lattice lattice = openmc.HexLattice(lattice_id=lattice_id, name=name) lattice.center = center lattice.pitch = pitch - # If the Universe specified outer the Lattice is not void (-22) - if outer != -22: - lattice.outer = self.universes[outer] + # If the Universe specified outer the Lattice is not void + if outer >= 0: + lattice.outer = universes[outer] # Build array of Universe pointers for the Lattice. Note that # we need to convert between the HDF5's square array of # (x, alpha, z) to the Python API's format of a ragged nested # list of (z, ring, theta). - universes = [] + uarray = [] for z in range(n_axial): # Add a list for this axial level. - universes.append([]) + uarray.append([]) x = n_rings - 1 a = 2*n_rings - 2 for r in range(n_rings - 1, 0, -1): # Add a list for this ring. - universes[-1].append([]) + uarray[-1].append([]) # Climb down the top-right. for i in range(r): - universes[-1][-1].append(universe_ids[z, a, x]) + uarray[-1][-1].append(universe_ids[z, a, x]) x += 1 a -= 1 # Climb down the right. for i in range(r): - universes[-1][-1].append(universe_ids[z, a, x]) + uarray[-1][-1].append(universe_ids[z, a, x]) a -= 1 # Climb down the bottom-right. for i in range(r): - universes[-1][-1].append(universe_ids[z, a, x]) + uarray[-1][-1].append(universe_ids[z, a, x]) x -= 1 # Climb up the bottom-left. for i in range(r): - universes[-1][-1].append(universe_ids[z, a, x]) + uarray[-1][-1].append(universe_ids[z, a, x]) x -= 1 a += 1 # Climb up the left. for i in range(r): - universes[-1][-1].append(universe_ids[z, a, x]) + uarray[-1][-1].append(universe_ids[z, a, x]) a += 1 # Climb up the top-left. for i in range(r): - universes[-1][-1].append(universe_ids[z, a, x]) + uarray[-1][-1].append(universe_ids[z, a, x]) x += 1 # Move down to the next ring. a -= 1 # Convert the ids into Universe objects. - universes[-1][-1] = [self.get_universe_by_id(u_id) - for u_id in universes[-1][-1]] + uarray[-1][-1] = [universes[u_id] + for u_id in uarray[-1][-1]] # Handle the degenerate center ring separately. u_id = universe_ids[z, a, x] - universes[-1].append([self.get_universe_by_id(u_id)]) + uarray[-1].append([universes[u_id]]) # Add the universes to the lattice. if len(pitch) == 2: # Lattice is 3D - lattice.universes = universes + lattice.universes = uarray else: # Lattice is 2D; extract the only axial level - lattice.universes = universes[0] + lattice.universes = uarray[0] if offsets is not None: lattice.offsets = offsets # Add the Lattice to the global dictionary of all Lattices - self.lattices[index] = lattice + lattices[lattice.id] = lattice - def _finalize_geometry(self): - # Initialize Geometry object - self._openmc_geometry = openmc.Geometry() + return lattices + def _finalize_geometry(self, cells, cell_fills, universes, lattices): # Iterate over all Cells and add fill Materials, Universes and Lattices - for cell_key in self._cell_fills.keys(): - # Determine fill type ('normal', 'universe', or 'lattice') and ID - fill_type = self._cell_fills[cell_key][0] - fill_id = self._cell_fills[cell_key][1] - + for cell_id, (fill_type, fill_id) in cell_fills.items(): # Retrieve the object corresponding to the fill type and ID if fill_type == 'normal': if isinstance(fill_id, Iterable): @@ -497,16 +461,15 @@ class Summary(object): else: fill = None elif fill_type == 'universe': - fill = self.get_universe_by_id(fill_id) + fill = universes[fill_id] else: - fill = self.get_lattice_by_id(fill_id) + fill = lattices[fill_id] # Set the fill for the Cell - self.cells[cell_key].fill = fill + cells[cell_id].fill = fill # Set the root universe for the Geometry - root_universe = self.get_universe_by_id(0) - self.openmc_geometry.root_universe = root_universe + self.geometry.root_universe = universes[0] def _read_tallies(self): # Initialize a dictionary for the tally names @@ -542,7 +505,7 @@ class Summary(object): Results from a stochastic volume calculation """ - self.openmc_geometry.add_volume_information(volume_calc) + self.geometry.add_volume_information(volume_calc) def get_material_by_id(self, material_id): """Return a Material object given the material id @@ -559,92 +522,8 @@ class Summary(object): """ - for material in self.materials.values(): + for material in self.materials: if material.id == material_id: return material return None - - def get_surface_by_id(self, surface_id): - """Return a Surface object given the surface id - - Parameters - ---------- - id : int - Unique identifier for the surface - - Returns - ------- - surface : openmc.Surface - Surface with given id - - """ - - for surface in self.surfaces.values(): - if surface.id == surface_id: - return surface - - return None - - def get_cell_by_id(self, cell_id): - """Return a Cell object given the cell id - - Parameters - ---------- - id : int - Unique identifier for the cell - - Returns - ------- - cell : openmc.Cell - Cell with given id - - """ - - for cell in self.cells.values(): - if cell.id == cell_id: - return cell - - return None - - def get_universe_by_id(self, universe_id): - """Return a Universe object given the universe id - - Parameters - ---------- - id : int - Unique identifier for the universe - - Returns - ------- - universe : openmc.Universe - Universe with given id - - """ - - for universe in self.universes.values(): - if universe.id == universe_id: - return universe - - return None - - def get_lattice_by_id(self, lattice_id): - """Return a Lattice object given the lattice id - - Parameters - ---------- - id : int - Unique identifier for the lattice - - Returns - ------- - lattice : openmc.Lattice - Lattice with given id - - """ - - for lattice in self.lattices.values(): - if lattice.id == lattice_id: - return lattice - - return None diff --git a/src/constants.F90 b/src/constants.F90 index 7f3cf87f83..d1095d786b 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -144,7 +144,7 @@ module constants SURF_CONE_Z = 11 ! Cone parallel to z-axis ! Flag to say that the outside of a lattice is not defined - integer, parameter :: NO_OUTER_UNIVERSE = -22 + integer, parameter :: NO_OUTER_UNIVERSE = -1 ! Maximum number of lost particles integer, parameter :: MAX_LOST_PARTICLES = 10 diff --git a/src/summary.F90 b/src/summary.F90 index 10b26d0e0c..638d232704 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -116,9 +116,10 @@ contains subroutine write_geometry(file_id) integer(HID_T), intent(in) :: file_id - integer :: i, j, k, m, offset + integer :: i, j, k, m, offset integer, allocatable :: lattice_universes(:,:,:) integer, allocatable :: cell_materials(:) + integer, allocatable :: cell_ids(:) real(8), allocatable :: cell_temperatures(:) integer(HID_T) :: geom_group integer(HID_T) :: cells_group, cell_group @@ -152,9 +153,6 @@ contains c => cells(i) cell_group = create_group(cells_group, "cell " // trim(to_str(c%id))) - ! Write internal OpenMC index for this cell - call write_dataset(cell_group, "index", i) - ! Write name for this cell call write_dataset(cell_group, "name", c%name) @@ -267,9 +265,6 @@ contains surface_group = create_group(surfaces_group, "surface " // & trim(to_str(s%id))) - ! Write internal OpenMC index for this surface - call write_dataset(surface_group, "index", i) - ! Write name for this surface call write_dataset(surface_group, "name", s%name) @@ -368,11 +363,15 @@ contains univ_group = create_group(universes_group, "universe " // & trim(to_str(u%id))) - ! Write internal OpenMC index for this universe - call write_dataset(univ_group, "index", i) - ! Write list of cells in this universe - if (u%n_cells > 0) call write_dataset(univ_group, "cells", u%cells) + if (u % n_cells > 0) then + allocate(cell_ids(u % n_cells)) + do j = 1, u % n_cells + cell_ids(j) = cells(u % cells(j)) % id + end do + call write_dataset(univ_group, "cells", cell_ids) + deallocate(cell_ids) + end if call close_group(univ_group) end do UNIVERSE_LOOP @@ -390,13 +389,14 @@ contains lat => lattices(i)%obj lattice_group = create_group(lattices_group, "lattice " // trim(to_str(lat%id))) - ! Write internal OpenMC index for this lattice - call write_dataset(lattice_group, "index", i) - ! Write name, pitch, and outer universe call write_dataset(lattice_group, "name", lat%name) call write_dataset(lattice_group, "pitch", lat%pitch) - call write_dataset(lattice_group, "outer", lat%outer) + if (lat % outer > 0) then + call write_dataset(lattice_group, "outer", universes(lat % outer) % id) + else + call write_dataset(lattice_group, "outer", lat % outer) + end if ! Write distribcell offsets if present if (allocated(lat%offset)) then @@ -506,9 +506,6 @@ contains call write_attribute(material_group, "depletable", 0) end if - ! Write internal OpenMC index for this material - call write_dataset(material_group, "index", i) - ! Write name for this material call write_dataset(material_group, "name", m % name) diff --git a/src/tally_filter.F90 b/src/tally_filter.F90 index 4b372defe0..a7b0fc46ae 100644 --- a/src/tally_filter.F90 +++ b/src/tally_filter.F90 @@ -501,9 +501,17 @@ contains class(UniverseFilter), intent(in) :: this integer(HID_T), intent(in) :: filter_group + integer :: i + integer, allocatable :: universe_ids(:) + call write_dataset(filter_group, "type", "universe") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % universes ) + + allocate(universe_ids(size(this % universes))) + do i = 1, size(this % universes) + universe_ids(i) = universes(this % universes(i)) % id + end do + call write_dataset(filter_group, "bins", universe_ids) end subroutine to_statepoint_universe subroutine initialize_universe(this) @@ -562,9 +570,17 @@ contains class(MaterialFilter), intent(in) :: this integer(HID_T), intent(in) :: filter_group + integer :: i + integer, allocatable :: material_ids(:) + call write_dataset(filter_group, "type", "material") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % materials ) + + allocate(material_ids(size(this % materials))) + do i = 1, size(this % materials) + material_ids(i) = materials(this % materials(i)) % id + end do + call write_dataset(filter_group, "bins", material_ids) end subroutine to_statepoint_material subroutine initialize_material(this) @@ -639,9 +655,17 @@ contains class(CellFilter), intent(in) :: this integer(HID_T), intent(in) :: filter_group + integer :: i + integer, allocatable :: cell_ids(:) + call write_dataset(filter_group, "type", "cell") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % cells ) + + allocate(cell_ids(size(this % cells))) + do i = 1, size(this % cells) + cell_ids(i) = cells(this % cells(i)) % id + end do + call write_dataset(filter_group, "bins", cell_ids) end subroutine to_statepoint_cell subroutine initialize_cell(this) @@ -725,7 +749,7 @@ contains call write_dataset(filter_group, "type", "distribcell") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % cell ) + call write_dataset(filter_group, "bins", cells(this % cell) % id) end subroutine to_statepoint_distribcell subroutine initialize_distribcell(this) @@ -784,9 +808,16 @@ contains class(CellbornFilter), intent(in) :: this integer(HID_T), intent(in) :: filter_group + integer :: i + integer, allocatable :: cell_ids(:) + call write_dataset(filter_group, "type", "cellborn") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % cells ) + allocate(cell_ids(size(this % cells))) + do i = 1, size(this % cells) + cell_ids(i) = cells(this % cells(i)) % id + end do + call write_dataset(filter_group, "bins", cell_ids) end subroutine to_statepoint_cellborn subroutine initialize_cellborn(this) @@ -852,7 +883,7 @@ contains call write_dataset(filter_group, "type", "surface") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % surfaces ) + call write_dataset(filter_group, "bins", this % surfaces) end subroutine to_statepoint_surface subroutine initialize_surface(this) @@ -941,7 +972,7 @@ contains call write_dataset(filter_group, "type", "energy") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % bins ) + call write_dataset(filter_group, "bins", this % bins) end subroutine to_statepoint_energy function text_label_energy(this, bin) result(label) @@ -1006,7 +1037,7 @@ contains call write_dataset(filter_group, "type", "energyout") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % bins ) + call write_dataset(filter_group, "bins", this % bins) end subroutine to_statepoint_energyout function text_label_energyout(this, bin) result(label) @@ -1048,7 +1079,7 @@ contains call write_dataset(filter_group, "type", "delayedgroup") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % groups ) + call write_dataset(filter_group, "bins", this % groups) end subroutine to_statepoint_dg function text_label_dg(this, bin) result(label) @@ -1097,7 +1128,7 @@ contains call write_dataset(filter_group, "type", "mu") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % bins ) + call write_dataset(filter_group, "bins", this % bins) end subroutine to_statepoint_mu function text_label_mu(this, bin) result(label) @@ -1160,7 +1191,7 @@ contains call write_dataset(filter_group, "type", "polar") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % bins ) + call write_dataset(filter_group, "bins", this % bins) end subroutine to_statepoint_polar function text_label_polar(this, bin) result(label) @@ -1223,7 +1254,7 @@ contains call write_dataset(filter_group, "type", "azimuthal") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % bins ) + call write_dataset(filter_group, "bins", this % bins) end subroutine to_statepoint_azimuthal function text_label_azimuthal(this, bin) result(label) diff --git a/tests/test_asymmetric_lattice/test_asymmetric_lattice.py b/tests/test_asymmetric_lattice/test_asymmetric_lattice.py index 45d392ad07..55f4b48525 100644 --- a/tests/test_asymmetric_lattice/test_asymmetric_lattice.py +++ b/tests/test_asymmetric_lattice/test_asymmetric_lattice.py @@ -89,8 +89,9 @@ class AsymmetricLatticeTestHarness(PyAPITestHarness): outstr += '\n'.join(map('{:.8e}'.format, tally.std_dev.flatten())) + '\n' # Extract fuel assembly lattices from the summary - core = sp.summary.get_cell_by_id(1) - fuel = sp.summary.get_cell_by_id(80) + cell_dict = {c.id: c for c in sp.summary.geometry.get_all_cells()} + core = cell_dict[1] + fuel = cell_dict[80] fuel = fuel.fill core = core.fill diff --git a/tests/test_distribmat/test_distribmat.py b/tests/test_distribmat/test_distribmat.py index ec19176c49..ad7fe09f04 100644 --- a/tests/test_distribmat/test_distribmat.py +++ b/tests/test_distribmat/test_distribmat.py @@ -116,7 +116,8 @@ class DistribmatTestHarness(PyAPITestHarness): def _get_results(self): outstr = super(DistribmatTestHarness, self)._get_results() su = openmc.Summary('summary.h5') - outstr += str(su.get_cell_by_id(11)) + cells = {c.id: c for c in su.geometry.get_all_cells()} + outstr += str(cells[11]) return outstr def _cleanup(self): diff --git a/tests/test_mg_convert/test_mg_convert.py b/tests/test_mg_convert/test_mg_convert.py index f4cd90e713..d8a9665d8f 100755 --- a/tests/test_mg_convert/test_mg_convert.py +++ b/tests/test_mg_convert/test_mg_convert.py @@ -153,7 +153,6 @@ class MGXSTestHarness(PyAPITestHarness): outstr += 'k-combined:\n' form = '{0:12.6E} {1:12.6E}\n' outstr += form.format(sp.k_combined[0], sp.k_combined[1]) - sp.close() return outstr diff --git a/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py b/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py index dbc2e0916c..f9f9a75097 100644 --- a/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py +++ b/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py @@ -71,9 +71,6 @@ class MGXSTestHarness(PyAPITestHarness): if os.path.exists('./tallies.xml'): os.remove('./tallies.xml') - # Close the statepoint to allow writing - sp.close() - # Re-run MG mode. if self._opts.mpi_exec is not None: mpi_args = [self._opts.mpi_exec, '-n', self._opts.mpi_np] diff --git a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py index 277e8583e3..a86b998b83 100644 --- a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py +++ b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py @@ -34,7 +34,7 @@ class MGXSTestHarness(PyAPITestHarness): self.mgxs_lib.num_delayed_groups = 6 self.mgxs_lib.legendre_order = 3 self.mgxs_lib.domain_type = 'distribcell' - cells = self.mgxs_lib.openmc_geometry.get_all_material_cells() + cells = self.mgxs_lib.geometry.get_all_material_cells() self.mgxs_lib.domains = [c for c in cells if c.name == 'fuel'] self.mgxs_lib.build_library() diff --git a/tests/test_multipole/test_multipole.py b/tests/test_multipole/test_multipole.py index 32b38dd76e..97ad249561 100644 --- a/tests/test_multipole/test_multipole.py +++ b/tests/test_multipole/test_multipole.py @@ -107,7 +107,8 @@ class MultipoleTestHarness(PyAPITestHarness): def _get_results(self): outstr = super(MultipoleTestHarness, self)._get_results() su = openmc.Summary('summary.h5') - outstr += str(su.get_cell_by_id(11)) + cells = {c.id: c for c in su.geometry.get_all_cells()} + outstr += str(cells[11]) return outstr def _cleanup(self): From 71b49aace8107fc618cccbcc757c358086181814 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 09:03:50 -0600 Subject: [PATCH 04/18] Rewrite documentation for summary and statepoint files. Continue making a few changes. --- docs/source/io_formats/statepoint.rst | 532 +++++++++----------------- docs/source/io_formats/summary.rst | 384 +++++++------------ openmc/statepoint.py | 100 ++--- openmc/summary.py | 57 +-- src/state_point.F90 | 50 +-- src/summary.F90 | 45 +-- 6 files changed, 380 insertions(+), 788 deletions(-) diff --git a/docs/source/io_formats/statepoint.rst b/docs/source/io_formats/statepoint.rst index a93e2f26d1..63ca703003 100644 --- a/docs/source/io_formats/statepoint.rst +++ b/docs/source/io_formats/statepoint.rst @@ -4,358 +4,180 @@ State Point File Format ======================= -The current revision of the statepoint file format is 15. - -**/filetype** (*char[]*) - - String indicating the type of file. - -**/revision** (*int*) - - Revision of the state point file format. Any time a change is made in the - format, this integer is incremented. - -**/version_major** (*int*) - - Major version number for OpenMC - -**/version_minor** (*int*) - - Minor version number for OpenMC - -**/version_release** (*int*) - - Release version number for OpenMC - -**/git_sha1** (*char[40]*) - - Git commit SHA-1 hash - -**/date_and_time** (*char[]*) - - Date and time the state point was written. - -**/path** (*char[]*) - - Absolute path to directory containing input files. - -**/seed** (*int8_t*) - - Pseudo-random number generator seed. - -**/run_CE** (*int*) - - Flag to denote continuous-energy or multi-group mode. A value of 1 - indicates a continuous-energy run while a value of 0 indicates a - multi-group run. - -**/run_mode** (*char[]*) - - Run mode used. A value of 1 indicates a fixed-source run and a value of 2 - indicates an eigenvalue run. - -**/n_particles** (*int8_t*) - - Number of particles used per generation. - -**/n_batches** (*int*) - - Number of batches to simulate. - -**/current_batch** (*int*) - - The number of batches already simulated. - -if run_mode == 'k-eigenvalue': - - **/n_inactive** (*int*) - - Number of inactive batches. - - **/gen_per_batch** (*int*) - - Number of generations per batch. - - **/k_generation** (*double[]*) - - k-effective for each generation simulated. - - **/entropy** (*double[]*) - - Shannon entropy for each generation simulated - - **/k_col_abs** (*double*) - - Sum of product of collision/absorption estimates of k-effective - - **/k_col_tra** (*double*) - - Sum of product of collision/track-length estimates of k-effective - - **/k_abs_tra** (*double*) - - Sum of product of absorption/track-length estimates of k-effective - - **/k_combined** (*double[2]*) - - Mean and standard deviation of a combined estimate of k-effective - - **/cmfd_on** (*int*) - - Flag indicating whether CMFD is on (1) or off (0). - - if (cmfd_on) - - **/cmfd/indices** (*int[4]*) - - Indices for cmfd mesh (i,j,k,g) - - **/cmfd/k_cmfd** (*double[]*) - - CMFD eigenvalues - - **/cmfd/cmfd_src** (*double[][][][]*) - - CMFD fission source - - **/cmfd/cmfd_entropy** (*double[]*) - - CMFD estimate of Shannon entropy - - **/cmfd/cmfd_balance** (*double[]*) - - RMS of the residual neutron balance equation on CMFD mesh - - **/cmfd/cmfd_dominance** (*double[]*) - - CMFD estimate of dominance ratio - - **/cmfd/cmfd_srccmp** (*double[]*) - - RMS comparison of difference between OpenMC and CMFD fission source - -**/tallies/n_meshes** (*int*) - - Number of meshes in tallies.xml file - -**/tally/meshes/ids** (*int[]*) - - Internal unique ID of each mesh. - -**/tally/meshes/keys** (*int[]*) - - User-identified unique ID of each mesh. - -**/tallies/meshes/mesh /type** (*char[]*) - - Type of mesh. - -**/tallies/meshes/mesh /dimension** (*int*) - - Number of mesh cells in each dimension. - -**/tallies/meshes/mesh /lower_left** (*double[]*) - - Coordinates of lower-left corner of mesh. - -**/tallies/meshes/mesh /upper_right** (*double[]*) - - Coordinates of upper-right corner of mesh. - -**/tallies/meshes/mesh /width** (*double[]*) - - Width of each mesh cell in each dimension. - -**/tallies/derivatives/derivative /independent variable** (*char[]*) - - Independent variable of tally derivative - -**/tallies/derivatives/derivative /material** (*int*) - - ID of the perturbed material - -**/tallies/derivatives/derivative /nuclide** (*char[]*) - - Alias of the perturbed nuclide - -**/tallies/n_tallies** (*int*) - - Number of user-defined tallies. - -**/tallies/ids** (*int[]*) - - Internal unique ID of each tally. - -**/tallies/keys** (*int[]*) - - User-identified unique ID of each tally. - -**/tallies/tally /estimator** (*char[]*) - - Type of tally estimator, either 'analog', 'tracklength', or 'collision'. - -**/tallies/tally /n_realizations** (*int*) - - Number of realizations. - -**/tallies/tally /n_filters** (*int*) - - Number of filters used. - -**/tallies/tally /filter /type** (*char[]*) - - Type of the j-th filter. Can be 'universe', 'material', 'cell', 'cellborn', - 'surface', 'mesh', 'energy', 'energyout', 'distribcell', 'mu', 'polar', - 'azimuthal', 'delayedgroup', or 'energyfunction'. - -**/tallies/tally /filter /n_bins** (*int*) - - Number of bins for the j-th filter. Not present for 'energyfunction' - filters. - -**/tallies/tally /filter /bins** (*int[]* or *double[]*) - - Value for each filter bin of this type. Not present for 'energyfunction' - filters. - -**/tallies/tally /filter /energy** (*double[]*) - - Energy grid points for energyfunction interpolation. Only used for - 'energyfunction' filters. - -**/tallies/tally /filter /y** (*double[]*) - - Interpolant values for energyfunction interpolation. Only used for - 'energyfunction' filters. - -**/tallies/tally /nuclides** (*char[][]*) - - Array of nuclides to tally. Note that if no nuclide is specified in the user - input, a single 'total' nuclide appears here. - -**/tallies/tally /derivative** (*int*) - - ID of the derivative applied to the tally. - -**/tallies/tally /n_score_bins** (*int*) - - Number of scoring bins for a single nuclide. In general, this can be greater - than the number of user-specified scores since each score might have - multiple scoring bins, e.g., scatter-PN. - -**/tallies/tally /score_bins** (*char[][]*) - - Values of specified scores. - -**/tallies/tally /n_user_scores** (*int*) - - Number of scores without accounting for those added by expansions, - e.g. scatter-PN. - -**/tallies/tally /moment_orders** (*char[][]*) - - Tallying moment orders for Legendre and spherical harmonic tally expansions - (*e.g.*, 'P2', 'Y1,2', etc.). - -**/tallies/tally /results** (*double[][][2]*) - - Accumulated sum and sum-of-squares for each bin of the i-th tally. The first - dimension represents combinations of filter bins, the second dimensions - represents scoring bins, and the third dimension has two entries for the sum - and the sum-of-squares. - -**/source_present** (*int*) - - Flag indicated if source bank is present in the file - -**/n_realizations** (*int*) - - Number of realizations for global tallies. - -**/n_global_tallies** (*int*) - - Number of global tally scores. - -**/global_tallies** (Compound type) - - Accumulated sum and sum-of-squares for each global tally. The compound type - has fields named ``sum`` and ``sum_sq``. - -**/tallies_present** (*int*) - - Flag indicated if tallies are present in the file. - -if (run_mode == 'k-eigenvalue' and source_present > 0) - - **/source_bank** (Compound type) - - Source bank information for each particle. The compound type has fields - ``wgt``, ``xyz``, ``uvw``, ``E``, ``g``, and ``delayed_group``, which - represent the weight, position, direction, energy, energy group, and - delayed_group of the source particle, respectively. - -**/runtime/total initialization** (*double*) - - Time (in seconds on the master process) spent reading inputs, allocating - arrays, etc. - -**/runtime/reading cross sections** (*double*) - - Time (in seconds on the master process) spent loading cross section - libraries (this is a subset of initialization). - -**/runtime/simulation** (*double*) - - Time (in seconds on the master process) spent between initialization and - finalization. - -**/runtime/transport** (*double*) - - Time (in seconds on the master process) spent transporting particles. - -**/runtime/inactive batches** (*double*) - - Time (in seconds on the master process) spent in the inactive batches - (including non-transport activities like communcating sites). - -**/runtime/active batches** (*double*) - - Time (in seconds on the master process) spent in the active batches - (including non-transport activities like communicating sites). - -**/runtime/synchronizing fission bank** (*double*) - - Time (in seconds on the master process) spent sampling source particles - from fission sites and communicating them to other processes for load - balancing. - -**/runtime/sampling source sites** (*double*) - - Time (in seconds on the master process) spent sampling source particles - from fission sites. - -**/runtime/SEND-RECV source sites** (*double*) - - Time (in seconds on the master process) spent communicating source sites - between processes for load balancing. - -**/runtime/accumulating tallies** (*double*) - - Time (in seconds on the master process) spent communicating tally results - and evaluating their statistics. - -**/runtime/CMFD** (*double*) - - Time (in seconds on the master process) spent evaluating CMFD. - -**/runtime/CMFD building matrices** (*double*) - - Time (in seconds on the master process) spent buliding CMFD matrices. - -**/runtime/CMFD solving matrices** (*double*) - - Time (in seconds on the master process) spent solving CMFD matrices. - -**/runtime/total** (*double*) - - Total time spent (in seconds on the master process) in the program. +The current revision of the statepoint file format is 16.0. + +**/** + +:Attributes: - **filetype** (*char[]*) -- String indicating the type of file. + - **version** (*int[2]*) -- Major and minor version of the + statepoint file format. + - **openmc_version** (*int[3]*) -- Major, minor, and release + version number for OpenMC. + - **git_sha1** (*char[40]*) -- Git commit SHA-1 hash. + - **date_and_time** (*char[]*) -- Date and time the summary was + written. + - **path** (*char[]*) -- Path to directory containing input files. + - **cmfd_on** (*int*) -- Flag indicating whether CMFD is on (1) or + off (0). + - **tallies_present** (*int*) -- Flag indicating if tallies are + present in the file. + - **source_present** (*int*) -- Flag indicating if source bank is + present in the file. + +:Datasets: - **seed** (*int8_t*) -- Pseudo-random number generator seed. + - **energy_mode** (*char[]*) -- Energy mode of the run, either + 'continuous-energy' or 'multi-group'. + - **run_mode** (*char[]*) -- Run mode used, either 'eigenvalue' or + 'fixed source'. + - **n_particles** (*int8_t*) -- Number of particles used per generation. + - **n_batches** (*int*) -- Number of batches to simulate. + - **current_batch** (*int*) -- The number of batches already simulated. + - **n_inactive** (*int*) -- Number of inactive batches. Only present + when `run_mode` is 'eigenvalue'. + - **gen_per_batch** (*int*) -- Number of generations per batch. Only + present when `run_mode` is 'eigenvalue'. + - **k_generation** (*double[]*) -- k-effective for each generation + simulated. + - **entropy** (*double[]*) -- Shannon entropy for each generation + simulated. + - **k_col_abs** (*double*) -- Sum of product of collision/absorption + estimates of k-effective. + - **k_col_tra** (*double*) -- Sum of product of + collision/track-length estimates of k-effective. + - **k_abs_tra** (*double*) -- Sum of product of + absorption/track-length estimates of k-effective. + - **k_combined** (*double[2]*) -- Mean and standard deviation of a + combined estimate of k-effective. + - **n_realizations** (*int*) -- Number of realizations for global + tallies. + - **global_tallies** (*double[][2]*) -- Accumulated sum and + sum-of-squares for each global tally. + - **source_bank** (Compound type) -- Source bank information for each + particle. The compound type has fields ``wgt``, ``xyz``, ``uvw``, + ``E``, ``g``, and ``delayed_group``, which represent the weight, + position, direction, energy, energy group, and delayed_group of the + source particle, respectively. Only present when `run_mode` is + 'eigenvalue'. + +**/cmfd/** + +:Datasets: - **indices** (*int[4]*) -- Indices for cmfd mesh (i,j,k,g) + - **k_cmfd** (*double[]*) -- CMFD eigenvalues + - **cmfd_src** (*double[][][][]*) -- CMFD fission source + - **cmfd_entropy** (*double[]*) -- CMFD estimate of Shannon entropy + - **cmfd_balance** (*double[]*) -- RMS of the residual neutron + balance equation on CMFD mesh + - **cmfd_dominance** (*double[]*) -- CMFD estimate of dominance ratio + - **cmfd_srccmp** (*double[]*) -- RMS comparison of difference + between OpenMC and CMFD fission source + +**/tallies/** + +:Attributes: - **n_tallies** (*int*) -- Number of user-defined tallies. + +:Datasets: - **ids** (*int[]*) -- Internal unique ID of each tally. + - **keys** (*int[]*) -- User-defined unique ID of each tally. + +**/tallies/meshes/** + +:Attributes: - **n_meshes** (*int*) -- Number of meshes in the problem. + +:Datasets: - **ids** (*int[]*) -- Internal unique ID of each mesh. + - **keys** (*int[]*) -- User-identified unique ID of each mesh. + +**/tallies/meshes/mesh /** + +:Datasets: - **type** (*char[]*) -- Type of mesh. + - **dimension** (*int*) -- Number of mesh cells in each dimension. + - **lower_left** (*double[]*) -- Coordinates of lower-left corner of + mesh. + - **upper_right** (*double[]*) -- Coordinates of upper-right corner + of mesh. + - **width** (*double[]*) -- Width of each mesh cell in each + dimension. + +**/tallies/derivatives/derivative /** + +:Datasets: - **independent variable** (*char[]*) -- Independent variable of + tally derivative. + - **material** (*int*) -- ID of the perturbed material. + - **nuclide** (*char[]*) -- Alias of the perturbed nuclide. + - **estimator** (*char[]*) -- Type of tally estimator, either + 'analog', 'tracklength', or 'collision'. + +**/tallies/tally /** + +:Datasets: - **n_realizations** (*int*) -- Number of realizations. + - **n_filters** (*int*) -- Number of filters used. + - **nuclides** (*char[][]*) -- Array of nuclides to tally. Note that + if no nuclide is specified in the user input, a single 'total' + nuclide appears here. + - **derivative** (*int*) -- ID of the derivative applied to the + tally. + - **n_score_bins** (*int*) -- Number of scoring bins for a single + nuclide. In general, this can be greater than the number of + user-specified scores since each score might have multiple scoring + bins, e.g., scatter-PN. + - **score_bins** (*char[][]*) -- Values of specified scores. + - **n_user_scores** (*int*) -- Number of scores without accounting + for those added by expansions, e.g. scatter-PN. + - **moment_orders** (*char[][]*) -- Tallying moment orders for + Legendre and spherical harmonic tally expansions (e.g., 'P2', + 'Y1,2', etc.). + - **results** (*double[][][2]*) -- Accumulated sum and sum-of-squares + for each bin of the i-th tally. The first dimension represents + combinations of filter bins, the second dimensions represents + scoring bins, and the third dimension has two entries for the sum + and the sum-of-squares. + +**/tallies/tally /filter /** + +:Datasets: - **type** (*char[]*) -- Type of the j-th filter. Can be 'universe', + 'material', 'cell', 'cellborn', 'surface', 'mesh', 'energy', + 'energyout', 'distribcell', 'mu', 'polar', 'azimuthal', + 'delayedgroup', or 'energyfunction'. + - **n_bins** (*int*) -- Number of bins for the j-th filter. Not + present for 'energyfunction' filters. + - **bins** (*int[]* or *double[]*) -- Value for each filter bin of + this type. Not present for 'energyfunction' filters. + - **energy** (*double[]*) -- Energy grid points for energyfunction + interpolation. Only used for 'energyfunction' filters. + - **y** (*double[]*) -- Interpolant values for energyfunction + interpolation. Only used for 'energyfunction' filters. + +**/runtime/** + +:Datasets: - **total initialization** (*double*) -- Time (in seconds on the + master process) spent reading inputs, allocating arrays, etc. + - **reading cross sections** (*double*) -- Time (in seconds on the + master process) spent loading cross section libraries (this is a + subset of initialization). + - **simulation** (*double*) -- Time (in seconds on the master + process) spent between initialization and finalization. + - **transport** (*double*) -- Time (in seconds on the master process) + spent transporting particles. + - **inactive batches** (*double*) -- Time (in seconds on the master + process) spent in the inactive batches (including non-transport + activities like communcating sites). + - **active batches** (*double*) -- Time (in seconds on the master + process) spent in the active batches (including non-transport + activities like communicating sites). + - **synchronizing fission bank** (*double*) -- Time (in seconds on + the master process) spent sampling source particles from fission + sites and communicating them to other processes for load balancing. + - **sampling source sites** (*double*) -- Time (in seconds on the + master process) spent sampling source particles from fission sites. + - **SEND-RECV source sites** (*double*) -- Time (in seconds on the + master process) spent communicating source sites between processes + for load balancing. + - **accumulating tallies** (*double*) -- Time (in seconds on the + master process) spent communicating tally results and evaluating + their statistics. + - **CMFD** (*double*) -- Time (in seconds on the master process) + spent evaluating CMFD. + - **CMFD building matrices** (*double*) -- Time (in seconds on the + master process) spent buliding CMFD matrices. + - **CMFD solving matrices** (*double*) -- Time (in seconds on the + master process) spent solving CMFD matrices. + - **total** (*double*) -- Total time spent (in seconds on the master + process) in the program. diff --git a/docs/source/io_formats/summary.rst b/docs/source/io_formats/summary.rst index 3084c27383..28aca93498 100644 --- a/docs/source/io_formats/summary.rst +++ b/docs/source/io_formats/summary.rst @@ -4,259 +4,131 @@ Summary File Format =================== -The current revision of the summary file format is 4. - -**/filetype** (*char[]*) - - String indicating the type of file. - -**/revision** (*int*) - - Revision of the summary file format. Any time a change is made in the - format, this integer is incremented. - -**/version_major** (*int*) - - Major version number for OpenMC - -**/version_minor** (*int*) - - Minor version number for OpenMC - -**/version_release** (*int*) - - Release version number for OpenMC - -**/git_sha1** (*char[40]*) - - Git commit SHA-1 hash - -**/date_and_time** (*char[]*) - - Date and time the summary was written. - -**/n_procs** (*int*) - - Number of MPI processes used. - -**/n_particles** (*int8_t*) - - Number of particles used per generation. - -**/n_batches** (*int*) - - Number of batches to simulate. - -**/n_inactive** (*int*) - - Number of inactive batches. Only present if /run_mode is set to - 'k-eigenvalue'. - -**/n_active** (*int*) - - Number of active batches. Only present if /run_mode is set to - 'k-eigenvalue'. - -**/gen_per_batch** (*int*) - - Number of generations per batch. Only present if /run_mode is set to - 'k-eigenvalue'. - -**/geometry/n_cells** (*int*) - - Number of cells in the problem. - -**/geometry/n_surfaces** (*int*) - - Number of surfaces in the problem. - -**/geometry/n_universes** (*int*) - - Number of unique universes in the problem. - -**/geometry/n_lattices** (*int*) - - Number of lattices in the problem. - -**/geometry/cells/cell /index** (*int*) - - Index in cells array used internally in OpenMC. - -**/geometry/cells/cell /name** (*char[]*) - - Name of the cell. - -**/geometry/cells/cell /universe** (*int*) - - Universe assigned to the cell. If none is specified, the default - universe (0) is assigned. - -**/geometry/cells/cell /fill_type** (*char[]*) - - Type of fill for the cell. Can be 'normal', 'universe', or 'lattice'. - -**/geometry/cells/cell /material** (*int* or *int[]*) - - Unique ID of the material(s) assigned to the cell. This dataset is present - only if fill_type is set to 'normal'. The value '-1' signifies void - material. The data is an array if the cell uses distributed materials, - otherwise it is a scalar. - -**/geometry/cells/cell /temperature** (*double[]*) - - Temperature of the cell in Kelvin. - -**/geometry/cells/cell /offset** (*int[]*) - - Offsets used for distribcell tally filter. This dataset is present only if - fill_type is set to 'universe'. - -**/geometry/cells/cell /translation** (*double[3]*) - - Translation applied to the fill universe. This dataset is present only if - fill_type is set to 'universe'. - -**/geometry/cells/cell /rotation** (*double[3]*) - - Angles in degrees about the x-, y-, and z-axes for which the fill universe - should be rotated. This dataset is present only if fill_type is set to - 'universe'. - -**/geometry/cells/cell /lattice** (*int*) - - Unique ID of the lattice which fills the cell. Only present if fill_type is - set to 'lattice'. - -**/geometry/cells/cell /region** (*char[]*) - - Region specification for the cell. - -**/geometry/cells/cell /distribcell_index** (*int*) - - Index of this cell in distribcell arrays. Only present if this cell is - listed in a distribcell filter or if it uses distributed materials. - -**/geometry/cells/cell /paths** (*char[][]*) - - The paths traversed through the CSG tree to reach each distribcell - instance. This consists of the integer IDs for each universe, cell and - lattice delimited by '->'. Each lattice cell is specified by its (x,y) or - (x,y,z) indices. Only present if this cell is listed in a distribcell filter - or if it uses distributed materials. - -**/geometry/surfaces/surface /index** (*int*) - - Index in surfaces array used internally in OpenMC. - -**/geometry/surfaces/surface /name** (*char[]*) - - Name of the surface. - -**/geometry/surfaces/surface /type** (*char[]*) - - Type of the surface. Can be 'x-plane', 'y-plane', 'z-plane', 'plane', - 'x-cylinder', 'y-cylinder', 'sphere', 'x-cone', 'y-cone', 'z-cone', or - 'quadric'. - -**/geometry/surfaces/surface /coefficients** (*double[]*) - - Array of coefficients that define the surface. See :ref:`surface_element` - for what coefficients are defined for each surface type. - -**/geometry/surfaces/surface /boundary_condition** (*char[]*) - - Boundary condition applied to the surface. Can be 'transmission', 'vacuum', - 'reflective', or 'periodic'. - -**/geometry/universes/universe /index** (*int*) - - Index in the universes array used internally in OpenMC. - -**/geometry/universes/universe /cells** (*int[]*) - - Array of unique IDs of cells that appear in the universe. - -**/geometry/lattices/lattice /index** (*int*) - - Index in the lattices array used internally in OpenMC. - -**/geometry/lattices/lattice /name** (*char[]*) - - Name of the lattice. - -**/geometry/lattices/lattice /type** (*char[]*) - - Type of the lattice, either 'rectangular' or 'hexagonal'. - -**/geometry/lattices/lattice /pitch** (*double[]*) - - Pitch of the lattice. - -**/geometry/lattices/lattice /outer** (*int*) - - Outer universe assigned to lattice cells outside the defined range. - -**/geometry/lattices/lattice /offsets** (*int[]*) - - Offsets used for distribcell tally filter. - -**/geometry/lattices/lattice /universes** (*int[]*) - - Three-dimensional array of universes assigned to each cell of the lattice. - -**/geometry/lattices/lattice /dimension** (*int[]*) - - The number of lattice cells in each direction. This dataset is present only - when the 'type' dataset is set to 'rectangular'. - -**/geometry/lattices/lattice /lower_left** (*double[]*) - - The coordinates of the lower-left corner of the lattice. This dataset is - present only when the 'type' dataset is set to 'rectangular'. - -**/geometry/lattices/lattice /n_rings** (*int*) - - Number of radial ring positions in the xy-plane. This dataset is present - only when the 'type' dataset is set to 'hexagonal'. - -**/geometry/lattices/lattice /n_axial** (*int*) - - Number of lattice positions along the z-axis. This dataset is present only - when the 'type' dataset is set to 'hexagonal'. - -**/geometry/lattices/lattice /center** (*double[]*) - - Coordinates of the center of the lattice. This dataset is present only when - the 'type' dataset is set to 'hexagonal'. - -**/n_materials** (*int*) - - Number of materials in the problem. - -**/materials/material /index** (*int*) - - Index in materials array used internally in OpenMC. - -**/materials/material /name** (*char[]*) - - Name of the material. - -**/materials/material /atom_density** (*double[]*) - - Total atom density of the material in atom/b-cm. - -**/materials/material /nuclides** (*char[][]*) - - Array of nuclides present in the material, e.g., 'U-235.71c'. - -**/materials/material /nuclide_densities** (*double[]*) - - Atom density of each nuclide. - -**/materials/material /sab_names** (*char[][]*) - - Names of S(:math:`\alpha`,:math:`\beta`) tables assigned to the material. - -**/tallies/tally /name** (*char[]*) - - Name of the tally. +The current version of the summary file format is 5.0. + +**/** + +:Attributes: - **filetype** (*char[]*) -- String indicating the type of file. + - **version** (*int[2]*) -- Major and minor version of the summary + file format. + - **openmc_version** (*int[3]*) -- Major, minor, and release + version number for OpenMC. + - **git_sha1** (*char[40]*) -- Git commit SHA-1 hash. + - **date_and_time** (*char[]*) -- Date and time the summary was + written. + +**/geometry/** + +:Attributes: - **n_cells** (*int*) -- Number of cells in the problem. + - **n_surfaces** (*int*) -- Number of surfaces in the problem. + - **n_universes** (*int*) -- Number of unique universes in the + problem. + - **n_lattices** (*int*) -- Number of lattices in the problem. + +**/geometry/cells/cell /** + +:Datasets: - **name** (*char[]*) -- Name of the cell. + - **universe** (*int*) -- Universe assigned to the cell. If none is + specified, the default universe (0) is assigned. + - **fill_type** (*char[]*) -- Type of fill for the cell. Can be + 'normal', 'universe', or 'lattice'. + - **material** (*int* or *int[]*) -- Unique ID of the material(s) + assigned to the cell. This dataset is present only if fill_type is + set to 'normal'. The value '-1' signifies void material. The data + is an array if the cell uses distributed materials, otherwise it is + a scalar. + - **temperature** (*double[]*) -- Temperature of the cell in Kelvin. + - **offset** (*int[]*) -- Offsets used for distribcell tally + filter. This dataset is present only if fill_type is set to + 'universe'. + - **translation** (*double[3]*) -- Translation applied to the fill + universe. This dataset is present only if fill_type is set to + 'universe'. + - **rotation** (*double[3]*) -- Angles in degrees about the x-, y-, + and z-axes for which the fill universe should be rotated. This + dataset is present only if fill_type is set to 'universe'. + - **lattice** (*int*) -- Unique ID of the lattice which fills the + cell. Only present if fill_type is set to 'lattice'. + - **region** (*char[]*) -- Region specification for the cell. + - **distribcell_index** (*int*) -- Index of this cell in distribcell + arrays. Only present if this cell is listed in a distribcell filter + or if it uses distributed materials. + - **paths** (*char[][]*) -- The paths traversed through the CSG tree + to reach each distribcell instance. This consists of the integer + IDs for each universe, cell and lattice delimited by '->'. Each + lattice cell is specified by its (x,y) or (x,y,z) indices. Only + present if this cell is listed in a distribcell filter or if it + uses distributed materials. + +**/geometry/surfaces/surface /** + +:Datasets: - **name** (*char[]*) -- Name of the surface. + - **type** (*char[]*) -- Type of the surface. Can be 'x-plane', + 'y-plane', 'z-plane', 'plane', 'x-cylinder', 'y-cylinder', + 'z-cylinder', 'sphere', 'x-cone', 'y-cone', 'z-cone', or 'quadric'. + - **coefficients** (*double[]*) -- Array of coefficients that define + the surface. See :ref:`surface_element` for what coefficients are + defined for each surface type. + - **boundary_condition** (*char[]*) -- Boundary condition applied to + the surface. Can be 'transmission', 'vacuum', 'reflective', or + 'periodic'. + +**/geometry/universes/universe /** + +:Datasets: + - **cells** (*int[]*) -- Array of unique IDs of cells that appear in + the universe. + +**/geometry/lattices/lattice /** + +:Datasets: - **name** (*char[]*) -- Name of the lattice. + - **type** (*char[]*) -- Type of the lattice, either 'rectangular' or + 'hexagonal'. + - **pitch** (*double[]*) -- Pitch of the lattice in centimeters. + - **outer** (*int*) -- Outer universe assigned to lattice cells + outside the defined range. + - **offsets** (*int[]*) -- Offsets used for distribcell tally filter. + - **universes** (*int[][][]*) -- Three-dimensional array of universes + assigned to each cell of the lattice. + - **dimension** (*int[]*) -- The number of lattice cells in each + direction. This dataset is present only when the 'type' dataset is + set to 'rectangular'. + - **lower_left** (*double[]*) -- The coordinates of the lower-left + corner of the lattice. This dataset is present only when the 'type' + dataset is set to 'rectangular'. + - **n_rings** (*int*) -- Number of radial ring positions in the + xy-plane. This dataset is present only when the 'type' dataset is + set to 'hexagonal'. + - **n_axial** (*int*) -- Number of lattice positions along the + z-axis. This dataset is present only when the 'type' dataset is set + to 'hexagonal'. + - **center** (*double[]*) -- Coordinates of the center of the + lattice. This dataset is present only when the 'type' dataset is + set to 'hexagonal'. + +**/materials/** + +:Attributes: - **n_materials** (*int*) -- Number of materials in the problem. + + +**/materials/material /** + +:Datasets: - **name** (*char[]*) -- Name of the material. + - **atom_density** (*double[]*) -- Total atom density of the material + in atom/b-cm. + - **nuclides** (*char[][]*) -- Array of nuclides present in the + material, e.g., 'U235'. + - **nuclide_densities** (*double[]*) -- Atom density of each nuclide. + - **sab_names** (*char[][]*) -- Names of + S(:math:`\alpha`,:math:`\beta`) tables assigned to the material. + +**/nuclides/** + +:Attributes: - **n_nuclides** (*int*) -- Number of nuclides in the problem. + +:Datasets: - **names** (*char[][]*) -- Names of nuclides. + - **awrs** (*float[]*) -- Atomic weight ratio of each nuclide. + +**/tallies/tally /** + +:Datasets: - **name** (*char[]*) -- Name of the tally. diff --git a/openmc/statepoint.py b/openmc/statepoint.py index b8257f5197..c3436ceb57 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -138,7 +138,7 @@ class StatePoint(object): @property def cmfd_on(self): - return self._f['cmfd_on'].value > 0 + return self._f.attrs['cmfd_on'] > 0 @property def cmfd_balance(self): @@ -262,7 +262,7 @@ class StatePoint(object): self._meshes = {} # Read the number of Meshes - n_meshes = self._f['tallies/meshes/n_meshes'].value + n_meshes = self._f['tallies/meshes'].attrs['n_meshes'] # Read a list of the IDs for each Mesh if n_meshes > 0: @@ -271,28 +271,17 @@ class StatePoint(object): else: mesh_keys = [] - # Build dictionary of Meshes - base = 'tallies/meshes/mesh ' - # Iterate over all Meshes for mesh_key in mesh_keys: - # Read the mesh type - mesh_type = self._f['{0}{1}/type'.format(base, mesh_key)].value.decode() + group = self._f['tallies/meshes/mesh {}'.format(mesh_key)] - # Read the mesh dimensions, lower-left coordinates, - # upper-right coordinates, and width of each mesh cell - dimension = self._f['{0}{1}/dimension'.format(base, mesh_key)].value - lower_left = self._f['{0}{1}/lower_left'.format(base, mesh_key)].value - upper_right = self._f['{0}{1}/upper_right'.format(base, mesh_key)].value - width = self._f['{0}{1}/width'.format(base, mesh_key)].value - - # Create the Mesh and assign properties to it + # Read and assign mesh properties mesh = openmc.Mesh(mesh_key) - mesh.dimension = dimension - mesh.width = width - mesh.lower_left = lower_left - mesh.upper_right = upper_right - mesh.type = mesh_type + mesh.type = group['type'].value.decode() + mesh.dimension = group['dimension'].value + mesh.lower_left = group['lower_left'].value + mesh.upper_right = group['upper_right'].value + mesh.width = group['width'].value # Add mesh to the global dictionary of all Meshes self._meshes[mesh_key] = mesh @@ -343,7 +332,7 @@ class StatePoint(object): @property def source_present(self): - return self._f['source_present'].value > 0 + return self._f.attrs['source_present'] > 0 @property def sparse(self): @@ -356,7 +345,7 @@ class StatePoint(object): self._tallies = {} # Read the number of tallies - n_tallies = self._f['tallies/n_tallies'].value + n_tallies = self._f['tallies'].attrs['n_tallies'] # Read a list of the IDs for each Tally if n_tallies > 0: @@ -365,54 +354,44 @@ class StatePoint(object): else: tally_keys = [] - base = 'tallies/tally ' - # Iterate over all Tallies for tally_key in tally_keys: + group = self._f['tallies/tally {}'.format(tally_key)] + # Read the Tally size specifications - n_realizations = \ - self._f['{0}{1}/n_realizations'.format(base, tally_key)].value + n_realizations = group['n_realizations'].value # Create Tally object and assign basic properties tally = openmc.Tally(tally_id=tally_key) tally._sp_filename = self._f.filename - tally.estimator = self._f['{0}{1}/estimator'.format( - base, tally_key)].value.decode() + tally.name = group['name'].value.decode() + tally.estimator = group['estimator'].value.decode() tally.num_realizations = n_realizations # Read derivative information. - if 'derivative' in self._f['{0}{1}'.format(base, tally_key)]: - deriv_id = self._f['{0}{1}/derivative'.format( - base, tally_key)].value + if 'derivative' in group: + deriv_id = group['derivative'].value tally.derivative = self.tally_derivatives[deriv_id] - # Read the number of Filters - n_filters = \ - self._f['{0}{1}/n_filters'.format(base, tally_key)].value - - subbase = '{0}{1}/filter '.format(base, tally_key) - # Read all filters - for j in range(1, n_filters+1): - subsubbase = '{0}{1}'.format(subbase, j) - new_filter = openmc.Filter.from_hdf5(self._f[subsubbase], + n_filters = group['n_filters'].value + for j in range(1, n_filters + 1): + filter_group = group['filter {}'.format(j)] + new_filter = openmc.Filter.from_hdf5(filter_group, meshes=self.meshes) tally.filters.append(new_filter) - # Read Nuclide bins - nuclide_names = \ - self._f['{0}{1}/nuclides'.format(base, tally_key)].value + # Read nuclide bins + nuclide_names = group['nuclides'].value - # Add all Nuclides to the Tally + # Add all nuclides to the Tally for name in nuclide_names: nuclide = openmc.Nuclide(name.decode().strip()) tally.nuclides.append(nuclide) - scores = self._f['{0}{1}/score_bins'.format( - base, tally_key)].value - n_score_bins = self._f['{0}{1}/n_score_bins' - .format(base, tally_key)].value + scores = group['score_bins'].value + n_score_bins = group['n_score_bins'].value # Compute and set the filter strides for i in range(n_filters): @@ -423,8 +402,7 @@ class StatePoint(object): tally_filter.stride *= tally.filters[j].num_bins # Read scattering moment order strings (e.g., P3, Y1,2, etc.) - moments = self._f['{0}{1}/moment_orders'.format( - base, tally_key)].value + moments = group['moment_orders'].value # Add the scores to the Tally for j, score in enumerate(scores): @@ -446,7 +424,7 @@ class StatePoint(object): @property def tallies_present(self): - return self._f['tallies/tallies_present'].value + return self._f.attrs['tallies_present'] > 0 @property def tally_derivatives(self): @@ -464,21 +442,20 @@ class StatePoint(object): # Create each derivative object and add it to the dictionary. for d_id in deriv_ids: - base = 'tallies/derivatives/derivative {:d}'.format(d_id) + group = self._f['tallies/derivatives/derivative {}' + .format(d_id)] deriv = openmc.TallyDerivative(derivative_id=d_id) - deriv.variable = \ - self._f[base + '/independent variable'].value.decode() + deriv.variable = group['independent variable'].value.decode() if deriv.variable == 'density': - deriv.material = self._f[base + '/material'].value + deriv.material = group['material'].value elif deriv.variable == 'nuclide_density': - deriv.material = self._f[base + '/material'].value - deriv.nuclide = \ - self._f[base + '/nuclide'].value.decode() + deriv.material = group['material'].value + deriv.nuclide = group['nuclide'].value.decode() elif deriv.variable == 'temperature': - deriv.material = self._f[base + '/material'].value + deriv.material = group['material'].value else: - raise RuntimeError('Unrecognized tally differential ' - 'variable') + raise ValueError('Unrecognized tally differential ' + 'variable') self._derivs[d_id] = deriv self._derivs_read = True @@ -697,7 +674,6 @@ class StatePoint(object): cell_dict = {c.id: c for c in summary.geometry.get_all_cells()} for tally_id, tally in self.tallies.items(): - tally.name = summary.tally_names[tally_id] tally.with_summary = True for tally_filter in tally.filters: diff --git a/openmc/summary.py b/openmc/summary.py index 6563d4f27f..e11b05d456 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -25,8 +25,6 @@ class Summary(object): nuclides : dict Dictionary whose keys are nuclide names and values are atomic weight ratios. - tally_names : dict - Dictionary whose keys are tally IDs and values are tally names. version: tuple of int Version of OpenMC @@ -44,10 +42,10 @@ class Summary(object): self._geometry = openmc.Geometry() self._materials = openmc.Materials() + self._nuclides = {} self._read_nuclides() self._read_geometry() - self._read_tallies() @property def date_and_time(self): @@ -61,18 +59,19 @@ class Summary(object): def materials(self): return self._materials + @property + def nuclides(self): + return self._nuclides + @property def version(self): return tuple(self._f.attrs['openmc_version']) def _read_nuclides(self): - self.nuclides = {} - n_nuclides = self._f['nuclides/n_nuclides_total'].value names = self._f['nuclides/names'].value awrs = self._f['nuclides/awrs'].value - for n in range(n_nuclides): - name = names[n].decode() - self.nuclides[name] = awrs[n] + for name, awr in zip(names, awrs): + self._nuclides[name.decode()] = awr def _read_geometry(self): # Read in and initialize the Materials and Geometry @@ -84,12 +83,7 @@ class Summary(object): self._finalize_geometry(cells, cell_fills, universes, lattices) def _read_materials(self): - self.n_materials = self._f['n_materials'].value - for key, group in self._f['materials'].items(): - if key == 'n_materials': - continue - material_id = int(key.lstrip('material ')) name = group['name'].value.decode() @@ -129,9 +123,6 @@ class Summary(object): surfaces = {} for key, group in self._f['geometry/surfaces'].items(): - if key == 'n_surfaces': - continue - surface_id = int(key.lstrip('surface ')) name = group['name'].value.decode() surf_type = group['type'].value.decode() @@ -213,9 +204,6 @@ class Summary(object): cell_fills = {} for key, group in self._f['geometry/cells'].items(): - if key == 'n_cells': - continue - cell_id = int(key.lstrip('cell ')) name = group['name'].value.decode() fill_type = group['fill_type'].value.decode() @@ -280,9 +268,6 @@ class Summary(object): universes = {} for key in self._f['geometry/universes'].keys(): - if key == 'n_universes': - continue - universe_id = int(key.lstrip('universe ')) cell_ids = self._f['geometry/universes'][key]['cells'][...] @@ -305,9 +290,6 @@ class Summary(object): lattices = {} for key, group in self._f['geometry/lattices'].items(): - if key == 'n_lattices': - continue - lattice_id = int(key.lstrip('lattice ')) name = group['name'].value.decode() lattice_type = group['type'].value.decode() @@ -471,31 +453,6 @@ class Summary(object): # Set the root universe for the Geometry self.geometry.root_universe = universes[0] - def _read_tallies(self): - # Initialize a dictionary for the tally names - # Keys - Tally IDs - # Values - Tally names - self.tally_names = {} - - # Read the number of tallies - if 'tallies' not in self._f: - return - - # OpenMC Tally keys - all_keys = self._f['tallies/'].keys() - tally_keys = [key for key in all_keys if 'tally' in key] - - base = 'tallies/tally ' - - # Iterate over all Tallies - for tally_key in tally_keys: - tally_id = int(tally_key.strip('tally ')) - subbase = '{0}{1}'.format(base, tally_id) - - # Read Tally name metadata - tally_name = self._f['{0}/name'.format(subbase)].value.decode() - self.tally_names[tally_id] = tally_name - def add_volume_information(self, volume_calc): """Add volume information to the geometry within the summary file diff --git a/src/state_point.F90 b/src/state_point.F90 index cb4ae5157a..ee7c7bf528 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -108,9 +108,9 @@ contains ! Indicate whether source bank is stored in statepoint if (source_separate) then - call write_dataset(file_id, "source_present", 0) + call write_attribute(file_id, "source_present", 0) else - call write_dataset(file_id, "source_present", 1) + call write_attribute(file_id, "source_present", 1) end if ! Write out information for eigenvalue run @@ -126,7 +126,7 @@ contains ! Write out CMFD info if (cmfd_on) then - call write_dataset(file_id, "cmfd_on", 1) + call write_attribute(file_id, "cmfd_on", 1) cmfd_group = create_group(file_id, "cmfd") call write_dataset(cmfd_group, "indices", cmfd % indices) @@ -138,7 +138,7 @@ contains call write_dataset(cmfd_group, "cmfd_srccmp", cmfd % src_cmp) call close_group(cmfd_group) else - call write_dataset(file_id, "cmfd_on", 0) + call write_attribute(file_id, "cmfd_on", 0) end if end if @@ -146,7 +146,7 @@ contains ! Write number of meshes meshes_group = create_group(tallies_group, "meshes") - call write_dataset(meshes_group, "n_meshes", n_meshes) + call write_attribute(meshes_group, "n_meshes", n_meshes) if (n_meshes > 0) then @@ -229,7 +229,7 @@ contains end if ! Write number of tallies - call write_dataset(tallies_group, "n_tallies", n_tallies) + call write_attribute(tallies_group, "n_tallies", n_tallies) if (n_tallies > 0) then @@ -257,6 +257,9 @@ contains tally_group = create_group(tallies_group, "tally " // & trim(to_str(tally % id))) + ! Write the name for this tally + call write_dataset(tally_group, "name", tally % name) + select case(tally % estimator) case (ESTIMATOR_ANALOG) call write_dataset(tally_group, "estimator", "analog") @@ -373,14 +376,14 @@ contains call write_dataset(file_id, "n_realizations", n_realizations) ! Write global tallies - call write_dataset(file_id, "n_global_tallies", N_GLOBAL_TALLIES) call write_dataset(file_id, "global_tallies", global_tallies) ! Write tallies - tallies_group = open_group(file_id, "tallies") if (tallies_on) then ! Indicate that tallies are on - call write_dataset(tallies_group, "tallies_present", 1) + call write_attribute(file_id, "tallies_present", 1) + + tallies_group = open_group(file_id, "tallies") ! Write all tally results TALLY_RESULTS: do i = 1, n_tallies @@ -394,12 +397,12 @@ contains call close_group(tally_group) end do TALLY_RESULTS + call close_group(tallies_group) else ! Indicate tallies are off - call write_dataset(tallies_group, "tallies_present", 0) + call write_attribute(file_id, "tallies_present", 0) end if - call close_group(tallies_group) ! Write out the runtime metrics. runtime_group = create_group(file_id, "runtime") @@ -571,7 +574,7 @@ contains if (tallies_on) then ! Indicate that tallies are on if (master) then - call write_dataset(tallies_group, "tallies_present", 1) + call write_attribute(file_id, "tallies_present", 1) ! Build list of tally IDs current => tally_dict%keys() @@ -649,14 +652,12 @@ contains deallocate(id_array) + if (master) call close_group(tallies_group) else - if (master) then - ! Indicate that tallies are off - call write_dataset(tallies_group, "tallies_present", 0) - end if + ! Indicate that tallies are off + if (master) call write_dataset(file_id, "tallies_present", 0) end if - if (master) call close_group(tallies_group) end subroutine write_tally_results_nr @@ -731,7 +732,7 @@ contains call read_dataset(restart_batch, file_id, "current_batch") ! Check for source in statepoint if needed - call read_dataset(int_array(1), file_id, "source_present") + call read_attribute(int_array(1), file_id, "source_present") if (int_array(1) == 1) then source_present = .true. else @@ -760,7 +761,7 @@ contains n_inactive = max(n_inactive, int_array(1)) ! Read in to see if CMFD was on - call read_dataset(int_array(1), file_id, "cmfd_on") + call read_attribute(int_array(1), file_id, "cmfd_on") ! Read in CMFD info if (int_array(1) == 1) then @@ -801,12 +802,12 @@ contains call read_dataset(global_tallies, file_id, "global_tallies") ! Check if tally results are present - tallies_group = open_group(file_id, "tallies") - call read_dataset(int_array(1), tallies_group, "tallies_present", & - indep=.true.) + call read_attribute(int_array(1), file_id, "tallies_present") ! Read in sum and sum squared if (int_array(1) == 1) then + tallies_group = open_group(file_id, "tallies") + TALLY_RESULTS: do i = 1, n_tallies ! Set pointer to tally tally => tallies(i) @@ -819,12 +820,11 @@ contains "n_realizations") call close_group(tally_group) end do TALLY_RESULTS + + call close_group(tallies_group) end if - - call close_group(tallies_group) end if - ! Read source if in eigenvalue mode if (run_mode == MODE_EIGENVALUE) then diff --git a/src/summary.F90 b/src/summary.F90 index 638d232704..fa5681052f 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -36,15 +36,10 @@ contains ! Create a new file using default properties. file_id = file_create("summary.h5") - ! Write header information call write_header(file_id) - call write_nuclides(file_id) call write_geometry(file_id) call write_materials(file_id) - if (n_tallies > 0) then - call write_tallies(file_id) - end if ! Terminate access to the file. call file_close(file_id) @@ -84,7 +79,7 @@ contains ! Write useful data from nuclide objects nuclide_group = create_group(file_id, "nuclides") - call write_dataset(nuclide_group, "n_nuclides_total", n_nuclides_total) + call write_attribute(nuclide_group, "n_nuclides", n_nuclides_total) ! Build array of nuclide names and awrs allocate(nucnames(n_nuclides_total)) @@ -137,10 +132,10 @@ contains ! Use H5LT interface to write number of geometry objects geom_group = create_group(file_id, "geometry") - call write_dataset(geom_group, "n_cells", n_cells) - call write_dataset(geom_group, "n_surfaces", n_surfaces) - call write_dataset(geom_group, "n_universes", n_universes) - call write_dataset(geom_group, "n_lattices", n_lattices) + call write_attribute(geom_group, "n_cells", n_cells) + call write_attribute(geom_group, "n_surfaces", n_surfaces) + call write_attribute(geom_group, "n_universes", n_universes) + call write_attribute(geom_group, "n_lattices", n_lattices) ! ========================================================================== ! WRITE INFORMATION ON CELLS @@ -542,34 +537,4 @@ contains end subroutine write_materials -!=============================================================================== -! WRITE_TALLIES -!=============================================================================== - - subroutine write_tallies(file_id) - integer(HID_T), intent(in) :: file_id - - integer :: i - integer(HID_T) :: tallies_group - integer(HID_T) :: tally_group - type(TallyObject), pointer :: t - - tallies_group = create_group(file_id, "tallies") - - TALLY_METADATA: do i = 1, n_tallies - ! Get pointer to tally - t => tallies(i) - tally_group = create_group(tallies_group, "tally " & - // trim(to_str(t % id))) - - ! Write the name for this tally - call write_dataset(tally_group, "name", t % name) - - call close_group(tally_group) - end do TALLY_METADATA - - call close_group(tallies_group) - - end subroutine write_tallies - end module summary From e642b401a2fc6d849234b8b8a4b89d58e02c57ea Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 09:45:42 -0600 Subject: [PATCH 05/18] Get rid of last instance of internal IDs in statepoint --- docs/source/io_formats/statepoint.rst | 8 +- docs/source/io_formats/summary.rst | 2 +- openmc/statepoint.py | 52 +++---- src/state_point.F90 | 204 ++++++++++---------------- 4 files changed, 97 insertions(+), 169 deletions(-) diff --git a/docs/source/io_formats/statepoint.rst b/docs/source/io_formats/statepoint.rst index 63ca703003..f2fa223c89 100644 --- a/docs/source/io_formats/statepoint.rst +++ b/docs/source/io_formats/statepoint.rst @@ -74,16 +74,12 @@ The current revision of the statepoint file format is 16.0. **/tallies/** :Attributes: - **n_tallies** (*int*) -- Number of user-defined tallies. - -:Datasets: - **ids** (*int[]*) -- Internal unique ID of each tally. - - **keys** (*int[]*) -- User-defined unique ID of each tally. + - **ids** (*int[]*) -- User-defined unique ID of each tally. **/tallies/meshes/** :Attributes: - **n_meshes** (*int*) -- Number of meshes in the problem. - -:Datasets: - **ids** (*int[]*) -- Internal unique ID of each mesh. - - **keys** (*int[]*) -- User-identified unique ID of each mesh. + - **ids** (*int[]*) -- User-identified unique ID of each mesh. **/tallies/meshes/mesh /** diff --git a/docs/source/io_formats/summary.rst b/docs/source/io_formats/summary.rst index 28aca93498..671fa33348 100644 --- a/docs/source/io_formats/summary.rst +++ b/docs/source/io_formats/summary.rst @@ -120,7 +120,7 @@ The current version of the summary file format is 5.0. material, e.g., 'U235'. - **nuclide_densities** (*double[]*) -- Atom density of each nuclide. - **sab_names** (*char[][]*) -- Names of - S(:math:`\alpha`,:math:`\beta`) tables assigned to the material. + S(:math:`\alpha,\beta`) tables assigned to the material. **/nuclides/** diff --git a/openmc/statepoint.py b/openmc/statepoint.py index c3436ceb57..3354181fd5 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -111,6 +111,8 @@ class StatePoint(object): def __init__(self, filename, autolink=True): self._f = h5py.File(filename, 'r') + self._meshes = {} + self._tallies = {} # Check filetype and version cv.check_filetype_version(self._f, 'statepoint', _VERSION_STATEPOINT) @@ -256,27 +258,14 @@ class StatePoint(object): @property def meshes(self): if not self._meshes_read: - # Initialize dictionaries for the Meshes - # Keys - Mesh IDs - # Values - Mesh objects - self._meshes = {} - - # Read the number of Meshes - n_meshes = self._f['tallies/meshes'].attrs['n_meshes'] - - # Read a list of the IDs for each Mesh - if n_meshes > 0: - # User-defined Mesh IDs - mesh_keys = self._f['tallies/meshes/keys'].value - else: - mesh_keys = [] + mesh_group = self._f['tallies/meshes'] # Iterate over all Meshes - for mesh_key in mesh_keys: - group = self._f['tallies/meshes/mesh {}'.format(mesh_key)] + for key, group in mesh_group.items(): + mesh_id = int(key.lstrip('mesh ')) # Read and assign mesh properties - mesh = openmc.Mesh(mesh_key) + mesh = openmc.Mesh(mesh_id) mesh.type = group['type'].value.decode() mesh.dimension = group['dimension'].value mesh.lower_left = group['lower_left'].value @@ -284,7 +273,7 @@ class StatePoint(object): mesh.width = group['width'].value # Add mesh to the global dictionary of all Meshes - self._meshes[mesh_key] = mesh + self._meshes[mesh_id] = mesh self._meshes_read = True @@ -340,30 +329,27 @@ class StatePoint(object): @property def tallies(self): - if not self._tallies_read: - # Initialize dictionary for tallies - self._tallies = {} - + if self.tallies_present and not self._tallies_read: # Read the number of tallies - n_tallies = self._f['tallies'].attrs['n_tallies'] + tallies_group = self._f['tallies'] + n_tallies = tallies_group.attrs['n_tallies'] # Read a list of the IDs for each Tally if n_tallies > 0: - # OpenMC Tally IDs (redefined internally from user definitions) - tally_keys = self._f['tallies/keys'].value + # Tally used-defined IDs + tally_ids = tallies_group.attrs['ids'] else: - tally_keys = [] + tally_ids = [] - # Iterate over all Tallies - for tally_key in tally_keys: - group = self._f['tallies/tally {}'.format(tally_key)] + # Iterate over all tallies + for tally_id in tally_ids: + group = tallies_group['tally {}'.format(tally_id)] - - # Read the Tally size specifications + # Read the number of realizations n_realizations = group['n_realizations'].value # Create Tally object and assign basic properties - tally = openmc.Tally(tally_id=tally_key) + tally = openmc.Tally(tally_id) tally._sp_filename = self._f.filename tally.name = group['name'].value.decode() tally.estimator = group['estimator'].value.decode() @@ -416,7 +402,7 @@ class StatePoint(object): # Add Tally to the global dictionary of all Tallies tally.sparse = self.sparse - self._tallies[tally_key] = tally + self._tallies[tally_id] = tally self._tallies_read = True diff --git a/src/state_point.F90 b/src/state_point.F90 index ee7c7bf528..fcbe9f6daf 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -16,7 +16,6 @@ module state_point use hdf5 use constants - use dict_header, only: ElemKeyValueII, ElemKeyValueCI use endf, only: reaction_name use error, only: fatal_error, warning use global @@ -50,10 +49,7 @@ contains runtime_group character(MAX_WORD_LEN), allocatable :: str_array(:) character(MAX_FILE_LEN) :: filename - type(RegularMesh), pointer :: meshp type(TallyObject), pointer :: tally - type(ElemKeyValueII), pointer :: current - type(ElemKeyValueII), pointer :: next ! Set filename for state point filename = trim(path_output) // 'statepoint.' // & @@ -149,49 +145,32 @@ contains call write_attribute(meshes_group, "n_meshes", n_meshes) if (n_meshes > 0) then - - ! Print list of mesh IDs - current => mesh_dict % keys() - + ! Write IDs of meshes allocate(id_array(n_meshes)) - allocate(key_array(n_meshes)) - i = 1 - - do while (associated(current)) - key_array(i) = current % key - id_array(i) = current % value - - ! Move to next mesh - next => current % next - deallocate(current) - current => next - i = i + 1 + do i = 1, n_meshes + id_array(i) = meshes(i) % id end do - - call write_dataset(meshes_group, "ids", id_array) - call write_dataset(meshes_group, "keys", key_array) - - deallocate(key_array) + call write_attribute(meshes_group, "ids", id_array) + deallocate(id_array) ! Write information for meshes MESH_LOOP: do i = 1, n_meshes - meshp => meshes(id_array(i)) - mesh_group = create_group(meshes_group, "mesh " & - // trim(to_str(meshp % id))) + associate (m => meshes(i)) + mesh_group = create_group(meshes_group, "mesh " & + // trim(to_str(m % id))) - select case (meshp % type) - case (MESH_REGULAR) - call write_dataset(mesh_group, "type", "regular") - end select - call write_dataset(mesh_group, "dimension", meshp % dimension) - call write_dataset(mesh_group, "lower_left", meshp % lower_left) - call write_dataset(mesh_group, "upper_right", meshp % upper_right) - call write_dataset(mesh_group, "width", meshp % width) + select case (m % type) + case (MESH_REGULAR) + call write_dataset(mesh_group, "type", "regular") + end select + call write_dataset(mesh_group, "dimension", m % dimension) + call write_dataset(mesh_group, "lower_left", m % lower_left) + call write_dataset(mesh_group, "upper_right", m % upper_right) + call write_dataset(mesh_group, "width", m % width) - call close_group(mesh_group) + call close_group(mesh_group) + end associate end do MESH_LOOP - - deallocate(id_array) end if call close_group(meshes_group) @@ -232,22 +211,13 @@ contains call write_attribute(tallies_group, "n_tallies", n_tallies) if (n_tallies > 0) then - - ! Print list of tally IDs + ! Write array of tally IDs allocate(id_array(n_tallies)) - allocate(key_array(n_tallies)) - - ! Write all tally information except results do i = 1, n_tallies - tally => tallies(i) - key_array(i) = tally % id - id_array(i) = i + id_array(i) = tallies(i) % id end do - - call write_dataset(tallies_group, "ids", id_array) - call write_dataset(tallies_group, "keys", key_array) - - deallocate(key_array) + call write_attribute(tallies_group, "ids", id_array) + deallocate(id_array) ! Write all tally information except results TALLY_METADATA: do i = 1, n_tallies @@ -525,10 +495,6 @@ contains #ifdef MPI real(8) :: dummy ! temporary receive buffer for non-root reduces #endif - integer, allocatable :: id_array(:) - type(ElemKeyValueII), pointer :: current - type(ElemKeyValueII), pointer :: next - type(TallyObject), pointer :: tally type(TallyObject) :: dummy_tally ! ========================================================================== @@ -575,83 +541,65 @@ contains ! Indicate that tallies are on if (master) then call write_attribute(file_id, "tallies_present", 1) - - ! Build list of tally IDs - current => tally_dict%keys() - allocate(id_array(n_tallies)) - i = 1 - - do while (associated(current)) - id_array(i) = current%value - ! Move to next tally - next => current%next - deallocate(current) - current => next - i = i + 1 - end do - end if ! Write all tally results TALLY_RESULTS: do i = 1, n_tallies + associate (t => tallies(i)) + ! Determine size of tally results array + m = size(t % results, 2) + n = size(t % results, 3) + n_bins = m*n*2 - tally => tallies(i) + ! Allocate array for storing sums and sums of squares, but + ! contiguously in memory for each + allocate(tally_temp(2,m,n)) + tally_temp(1,:,:) = t % results(RESULT_SUM,:,:) + tally_temp(2,:,:) = t % results(RESULT_SUM_SQ,:,:) - ! Determine size of tally results array - m = size(tally%results, 2) - n = size(tally%results, 3) - n_bins = m*n*2 + if (master) then + tally_group = open_group(tallies_group, "tally " // & + trim(to_str(t % id))) - ! Allocate array for storing sums and sums of squares, but - ! contiguously in memory for each - allocate(tally_temp(2,m,n)) - tally_temp(1,:,:) = tally%results(RESULT_SUM,:,:) - tally_temp(2,:,:) = tally%results(RESULT_SUM_SQ,:,:) - - if (master) then - tally_group = open_group(tallies_group, "tally " // & - trim(to_str(tally%id))) - - ! The MPI_IN_PLACE specifier allows the master to copy values into - ! a receive buffer without having a temporary variable + ! The MPI_IN_PLACE specifier allows the master to copy values into + ! a receive buffer without having a temporary variable #ifdef MPI - call MPI_REDUCE(MPI_IN_PLACE, tally_temp, n_bins, MPI_REAL8, & - MPI_SUM, 0, mpi_intracomm, mpi_err) + call MPI_REDUCE(MPI_IN_PLACE, tally_temp, n_bins, MPI_REAL8, & + MPI_SUM, 0, mpi_intracomm, mpi_err) #endif - ! At the end of the simulation, store the results back in the - ! regular TallyResults array - if (current_batch == n_max_batches .or. satisfy_triggers) then - tally%results(RESULT_SUM,:,:) = tally_temp(1,:,:) - tally%results(RESULT_SUM_SQ,:,:) = tally_temp(2,:,:) + ! At the end of the simulation, store the results back in the + ! regular TallyResults array + if (current_batch == n_max_batches .or. satisfy_triggers) then + t % results(RESULT_SUM,:,:) = tally_temp(1,:,:) + t % results(RESULT_SUM_SQ,:,:) = tally_temp(2,:,:) + end if + + ! Put in temporary tally result + allocate(dummy_tally % results(3,m,n)) + dummy_tally % results(RESULT_SUM,:,:) = tally_temp(1,:,:) + dummy_tally % results(RESULT_SUM_SQ,:,:) = tally_temp(2,:,:) + + ! Write reduced tally results to file + call dummy_tally % write_results_hdf5(tally_group) + + ! Deallocate temporary tally result + deallocate(dummy_tally % results) + else + ! Receive buffer not significant at other processors +#ifdef MPI + call MPI_REDUCE(tally_temp, dummy, n_bins, MPI_REAL8, MPI_SUM, & + 0, mpi_intracomm, mpi_err) +#endif end if - ! Put in temporary tally result - allocate(dummy_tally % results(3,m,n)) - dummy_tally % results(RESULT_SUM,:,:) = tally_temp(1,:,:) - dummy_tally % results(RESULT_SUM_SQ,:,:) = tally_temp(2,:,:) + ! Deallocate temporary copy of tally results + deallocate(tally_temp) - ! Write reduced tally results to file - call dummy_tally % write_results_hdf5(tally_group) - - ! Deallocate temporary tally result - deallocate(dummy_tally % results) - else - ! Receive buffer not significant at other processors -#ifdef MPI - call MPI_REDUCE(tally_temp, dummy, n_bins, MPI_REAL8, MPI_SUM, & - 0, mpi_intracomm, mpi_err) -#endif - end if - - ! Deallocate temporary copy of tally results - deallocate(tally_temp) - - if (master) call close_group(tally_group) + if (master) call close_group(tally_group) + end associate end do TALLY_RESULTS - deallocate(id_array) - if (master) call close_group(tallies_group) else ! Indicate that tallies are off @@ -677,7 +625,6 @@ contains real(8) :: real_array(3) logical :: source_present character(MAX_WORD_LEN) :: word - type(TallyObject), pointer :: tally ! Write message call write_message("Loading state point " // trim(path_state_point) & @@ -809,16 +756,15 @@ contains tallies_group = open_group(file_id, "tallies") TALLY_RESULTS: do i = 1, n_tallies - ! Set pointer to tally - tally => tallies(i) - - ! Read sum, sum_sq, and N for each bin - tally_group = open_group(tallies_group, "tally " // & - trim(to_str(tally % id))) - call tally % read_results_hdf5(tally_group) - call read_dataset(tally % n_realizations, tally_group, & - "n_realizations") - call close_group(tally_group) + associate (t => tallies(i)) + ! Read sum, sum_sq, and N for each bin + tally_group = open_group(tallies_group, "tally " // & + trim(to_str(t % id))) + call t % read_results_hdf5(tally_group) + call read_dataset(t % n_realizations, tally_group, & + "n_realizations") + call close_group(tally_group) + end associate end do TALLY_RESULTS call close_group(tallies_group) From 4729754ce51e88507158d6312fcd2bb34baabd5b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 09:49:48 -0600 Subject: [PATCH 06/18] Make StatePoint.generations_per_batch consistent with Settings --- docs/source/io_formats/statepoint.rst | 4 ++-- openmc/statepoint.py | 6 +++--- src/state_point.F90 | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/source/io_formats/statepoint.rst b/docs/source/io_formats/statepoint.rst index f2fa223c89..eff590605a 100644 --- a/docs/source/io_formats/statepoint.rst +++ b/docs/source/io_formats/statepoint.rst @@ -34,8 +34,8 @@ The current revision of the statepoint file format is 16.0. - **current_batch** (*int*) -- The number of batches already simulated. - **n_inactive** (*int*) -- Number of inactive batches. Only present when `run_mode` is 'eigenvalue'. - - **gen_per_batch** (*int*) -- Number of generations per batch. Only - present when `run_mode` is 'eigenvalue'. + - **generations_per_batch** (*int*) -- Number of generations per + batch. Only present when `run_mode` is 'eigenvalue'. - **k_generation** (*double[]*) -- k-effective for each generation simulated. - **entropy** (*double[]*) -- Shannon entropy for each generation diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 3354181fd5..affca19646 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -52,7 +52,7 @@ class StatePoint(object): Date and time when simulation began entropy : numpy.ndarray Shannon entropy of fission source at each batch - gen_per_batch : Integral + generations_per_batch : int Number of fission generations per batch global_tallies : numpy.ndarray of compound datatype Global tallies for k-effective estimates and leakage. The compound @@ -186,9 +186,9 @@ class StatePoint(object): return None @property - def gen_per_batch(self): + def generations_per_batch(self): if self.run_mode == 'eigenvalue': - return self._f['gen_per_batch'].value + return self._f['generations_per_batch'].value else: return None diff --git a/src/state_point.F90 b/src/state_point.F90 index fcbe9f6daf..378fde6519 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -112,7 +112,7 @@ contains ! Write out information for eigenvalue run if (run_mode == MODE_EIGENVALUE) then call write_dataset(file_id, "n_inactive", n_inactive) - call write_dataset(file_id, "gen_per_batch", gen_per_batch) + call write_dataset(file_id, "generations_per_batch", gen_per_batch) call write_dataset(file_id, "k_generation", k_generation) call write_dataset(file_id, "entropy", entropy) call write_dataset(file_id, "k_col_abs", k_col_abs) @@ -694,7 +694,7 @@ contains ! Read information specific to eigenvalue run if (run_mode == MODE_EIGENVALUE) then call read_dataset(int_array(1), file_id, "n_inactive") - call read_dataset(gen_per_batch, file_id, "gen_per_batch") + call read_dataset(gen_per_batch, file_id, "generations_per_batch") call read_dataset(k_generation(1:restart_batch*gen_per_batch), & file_id, "k_generation") call read_dataset(entropy(1:restart_batch*gen_per_batch), & From 8f2efa19dd7bfecfb34ada63f7639acebff4e970 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 10:22:15 -0600 Subject: [PATCH 07/18] Create Mesh.from_hdf5() and Surface.from_hdf5() methods --- openmc/mesh.py | 27 ++++++++++++++ openmc/statepoint.py | 16 ++------- openmc/summary.py | 84 +++----------------------------------------- openmc/surface.py | 70 ++++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 93 deletions(-) diff --git a/openmc/mesh.py b/openmc/mesh.py index 960ce4a1bf..24c39b530b 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -160,6 +160,33 @@ class Mesh(EqualityMixin): string += '{0: <16}{1}{2}\n'.format('\tPixels', '=\t', self._width) return string + @classmethod + def from_hdf5(cls, group): + """Create mesh from HDF5 group + + Parameters + ---------- + group : h5py.Group + Group in HDF5 file + + Returns + ------- + openmc.Mesh + Mesh instance + + """ + mesh_id = int(group.name.split('/')[-1].lstrip('mesh ')) + + # Read and assign mesh properties + mesh = cls(mesh_id) + mesh.type = group['type'].value.decode() + mesh.dimension = group['dimension'].value + mesh.lower_left = group['lower_left'].value + mesh.upper_right = group['upper_right'].value + mesh.width = group['width'].value + + return mesh + def cell_generator(self): """Generator function to traverse through every [i,j,k] index of the mesh. diff --git a/openmc/statepoint.py b/openmc/statepoint.py index affca19646..f29829a417 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -261,19 +261,9 @@ class StatePoint(object): mesh_group = self._f['tallies/meshes'] # Iterate over all Meshes - for key, group in mesh_group.items(): - mesh_id = int(key.lstrip('mesh ')) - - # Read and assign mesh properties - mesh = openmc.Mesh(mesh_id) - mesh.type = group['type'].value.decode() - mesh.dimension = group['dimension'].value - mesh.lower_left = group['lower_left'].value - mesh.upper_right = group['upper_right'].value - mesh.width = group['width'].value - - # Add mesh to the global dictionary of all Meshes - self._meshes[mesh_id] = mesh + for group in mesh_group.values(): + mesh = openmc.Mesh.from_hdf5(group) + self._meshes[mesh.id] = mesh self._meshes_read = True diff --git a/openmc/summary.py b/openmc/summary.py index e11b05d456..3b39d7489e 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -78,7 +78,7 @@ class Summary(object): self._read_materials() surfaces = self._read_surfaces() cells, cell_fills = self._read_cells(surfaces) - universes = self._read_universes(cells, cell_fills) + universes = self._read_universes(cells) lattices = self._read_lattices(universes) self._finalize_geometry(cells, cell_fills, universes, lattices) @@ -121,78 +121,8 @@ class Summary(object): def _read_surfaces(self): surfaces = {} - - for key, group in self._f['geometry/surfaces'].items(): - surface_id = int(key.lstrip('surface ')) - name = group['name'].value.decode() - surf_type = group['type'].value.decode() - bc = group['boundary_condition'].value.decode() - coeffs = group['coefficients'][...] - - # Create the Surface based on its type - if surf_type == 'x-plane': - x0 = coeffs[0] - surface = openmc.XPlane(surface_id, bc, x0, name) - - elif surf_type == 'y-plane': - y0 = coeffs[0] - surface = openmc.YPlane(surface_id, bc, y0, name) - - elif surf_type == 'z-plane': - z0 = coeffs[0] - surface = openmc.ZPlane(surface_id, bc, z0, name) - - elif surf_type == 'plane': - A = coeffs[0] - B = coeffs[1] - C = coeffs[2] - D = coeffs[3] - surface = openmc.Plane(surface_id, bc, A, B, C, D, name) - - elif surf_type == 'x-cylinder': - y0 = coeffs[0] - z0 = coeffs[1] - R = coeffs[2] - surface = openmc.XCylinder(surface_id, bc, y0, z0, R, name) - - elif surf_type == 'y-cylinder': - x0 = coeffs[0] - z0 = coeffs[1] - R = coeffs[2] - surface = openmc.YCylinder(surface_id, bc, x0, z0, R, name) - - elif surf_type == 'z-cylinder': - x0 = coeffs[0] - y0 = coeffs[1] - R = coeffs[2] - surface = openmc.ZCylinder(surface_id, bc, x0, y0, R, name) - - elif surf_type == 'sphere': - x0 = coeffs[0] - y0 = coeffs[1] - z0 = coeffs[2] - R = coeffs[3] - surface = openmc.Sphere(surface_id, bc, x0, y0, z0, R, name) - - elif surf_type in ['x-cone', 'y-cone', 'z-cone']: - x0 = coeffs[0] - y0 = coeffs[1] - z0 = coeffs[2] - R2 = coeffs[3] - - if surf_type == 'x-cone': - surface = openmc.XCone(surface_id, bc, x0, y0, z0, R2, name) - if surf_type == 'y-cone': - surface = openmc.YCone(surface_id, bc, x0, y0, z0, R2, name) - if surf_type == 'z-cone': - surface = openmc.ZCone(surface_id, bc, x0, y0, z0, R2, name) - - elif surf_type == 'quadric': - a, b, c, d, e, f, g, h, j, k = coeffs - surface = openmc.Quadric(surface_id, bc, a, b, c, d, e, f, - g, h, j, k, name) - - # Add Surface to global dictionary of all Surfaces + for group in self._f['geometry/surfaces'].values(): + surface = openmc.Surface.from_hdf5(group) surfaces[surface.id] = surface return surfaces @@ -261,10 +191,7 @@ class Summary(object): return cells, cell_fills - def _read_universes(self, cells, cell_fills): - # Initialize dictionary for each Universe - # Keys - Universe keys - # Values - Universe objects + def _read_universes(self, cells): universes = {} for key in self._f['geometry/universes'].keys(): @@ -284,9 +211,6 @@ class Summary(object): return universes def _read_lattices(self, universes): - # Initialize lattices for each Lattice - # Keys - Lattice keys - # Values - Lattice objects lattices = {} for key, group in self._f['geometry/lattices'].items(): diff --git a/openmc/surface.py b/openmc/surface.py index 04c7f95981..193afe3100 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -186,6 +186,76 @@ class Surface(object): return element + @staticmethod + def from_hdf5(group): + """Create surface from HDF5 group + + Parameters + ---------- + group : h5py.Group + Group in HDF5 file + + Returns + ------- + openmc.Surface + Instance of surface subclass + + """ + surface_id = int(group.name.split('/')[-1].lstrip('surface ')) + name = group['name'].value.decode() + surf_type = group['type'].value.decode() + bc = group['boundary_condition'].value.decode() + coeffs = group['coefficients'][...] + + # Create the Surface based on its type + if surf_type == 'x-plane': + x0 = coeffs[0] + surface = XPlane(surface_id, bc, x0, name) + + elif surf_type == 'y-plane': + y0 = coeffs[0] + surface = YPlane(surface_id, bc, y0, name) + + elif surf_type == 'z-plane': + z0 = coeffs[0] + surface = ZPlane(surface_id, bc, z0, name) + + elif surf_type == 'plane': + A, B, C, D = coeffs + surface = Plane(surface_id, bc, A, B, C, D, name) + + elif surf_type == 'x-cylinder': + y0, z0, R = coeffs + surface = XCylinder(surface_id, bc, y0, z0, R, name) + + elif surf_type == 'y-cylinder': + x0, z0, R = coeffs + surface = YCylinder(surface_id, bc, x0, z0, R, name) + + elif surf_type == 'z-cylinder': + x0, y0, R = coeffs + surface = ZCylinder(surface_id, bc, x0, y0, R, name) + + elif surf_type == 'sphere': + x0, y0, z0, R = coeffs + surface = Sphere(surface_id, bc, x0, y0, z0, R, name) + + elif surf_type in ['x-cone', 'y-cone', 'z-cone']: + x0, y0, z0, R2 = coeffs + if surf_type == 'x-cone': + surface = XCone(surface_id, bc, x0, y0, z0, R2, name) + elif surf_type == 'y-cone': + surface = YCone(surface_id, bc, x0, y0, z0, R2, name) + elif surf_type == 'z-cone': + surface = ZCone(surface_id, bc, x0, y0, z0, R2, name) + + elif surf_type == 'quadric': + a, b, c, d, e, f, g, h, j, k = coeffs + surface = Quadric(surface_id, bc, a, b, c, d, e, f, g, + h, j, k, name) + + return surface + class Plane(Surface): """An arbitrary plane of the form :math:`Ax + By + Cz = D`. From 26e260114108c3cee6653e9c57e80c98fdd5dbfc Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 10:47:51 -0600 Subject: [PATCH 08/18] Update particle restart format and documentation --- docs/source/io_formats/particle_restart.rst | 74 +++++++------------ docs/source/io_formats/statepoint.rst | 2 +- openmc/particle_restart.py | 12 +-- src/particle_restart.F90 | 4 +- src/particle_restart_write.F90 | 52 +++++++------ .../results_true.dat | 2 +- .../results_true.dat | 2 +- tests/testing_harness.py | 4 +- 8 files changed, 63 insertions(+), 89 deletions(-) diff --git a/docs/source/io_formats/particle_restart.rst b/docs/source/io_formats/particle_restart.rst index 3dee8c47db..9f34184955 100644 --- a/docs/source/io_formats/particle_restart.rst +++ b/docs/source/io_formats/particle_restart.rst @@ -4,55 +4,31 @@ Particle Restart File Format ============================ -The current revision of the particle restart file format is 1. +The current version of the particle restart file format is 2.0. -**/filetype** (*char[]*) +**/** - String indicating the type of file. +:Attributes: - **filetype** (*char[]*) -- String indicating the type of file. + - **version** (*int[2]*) -- Major and minor version of the summary + file format. + - **openmc_version** (*int[3]*) -- Major, minor, and release + version number for OpenMC. + - **git_sha1** (*char[40]*) -- Git commit SHA-1 hash. -**/revision** (*int*) - - Revision of the particle restart file format. Any time a change is made in - the format, this integer is incremented. - -**/current_batch** (*int*) - - The number of batches already simulated. - -**/gen_per_batch** (*int*) - - Number of generations per batch. - -**/current_gen** (*int*) - - The number of generations already simulated. - -**/n_particles** (*int8_t*) - - Number of particles used per generation. - -**/run_mode** (*int*) - - Run mode used. A value of 1 indicates a fixed-source run and a value of 2 - indicates an eigenvalue run. - -**/id** (*int8_t*) - - Unique identifier of the particle. - -**/weight** (*double*) - - Weight of the particle. - -**/energy** (*double*) - - Energy of the particle in eV for continuous-energy mode, or the energy - group of the particle for multi-group mode. - -**/xyz** (*double[3]*) - - Position of the particle. - -**/uvw** (*double[3]*) - - Direction of the particle. +:Datasets: - **current_batch** (*int*) -- The number of batches already + simulated. + - **generations_per_batch** (*int*) -- Number of generations per + batch. + - **current_generation** (*int*) -- The number of generations already + simulated. + - **n_particles** (*int8_t*) -- Number of particles used per + generation. + - **run_mode** (*char[]*) -- Run mode used, either 'fixed source', + 'eigenvalue', or 'particle restart'. + - **id** (*int8_t*) -- Unique identifier of the particle. + - **weight** (*double*) -- Weight of the particle. + - **energy** (*double*) -- Energy of the particle in eV for + continuous-energy mode, or the energy group of the particle for + multi-group mode. + - **xyz** (*double[3]*) -- Position of the particle. + - **uvw** (*double[3]*) -- Direction of the particle. diff --git a/docs/source/io_formats/statepoint.rst b/docs/source/io_formats/statepoint.rst index eff590605a..8026c258e6 100644 --- a/docs/source/io_formats/statepoint.rst +++ b/docs/source/io_formats/statepoint.rst @@ -4,7 +4,7 @@ State Point File Format ======================= -The current revision of the statepoint file format is 16.0. +The current version of the statepoint file format is 16.0. **/** diff --git a/openmc/particle_restart.py b/openmc/particle_restart.py index 651855a878..4fab8e5634 100644 --- a/openmc/particle_restart.py +++ b/openmc/particle_restart.py @@ -17,9 +17,9 @@ class Particle(object): ---------- current_batch : int The batch containing the particle - gen_per_batch : int + generations_per_batch : int Number of generations per batch - current_gen : int + current_generation : int The generation containing the particle n_particles : int Number of particles per generation @@ -50,16 +50,16 @@ class Particle(object): return self._f['current_batch'].value @property - def current_gen(self): - return self._f['current_gen'].value + def current_generation(self): + return self._f['current_generation'].value @property def energy(self): return self._f['energy'].value @property - def gen_per_batch(self): - return self._f['gen_per_batch'].value + def generations_per_batch(self): + return self._f['generations_per_batch'].value @property def id(self): diff --git a/src/particle_restart.F90 b/src/particle_restart.F90 index e0174d05f8..430ee4d447 100644 --- a/src/particle_restart.F90 +++ b/src/particle_restart.F90 @@ -81,8 +81,8 @@ contains ! Read data from file call read_dataset(current_batch, file_id, 'current_batch') - call read_dataset(gen_per_batch, file_id, 'gen_per_batch') - call read_dataset(current_gen, file_id, 'current_gen') + call read_dataset(gen_per_batch, file_id, 'generations_per_batch') + call read_dataset(current_gen, file_id, 'current_generation') call read_dataset(n_particles, file_id, 'n_particles') call read_dataset(tempstr, file_id, 'run_mode') select case (tempstr) diff --git a/src/particle_restart_write.F90 b/src/particle_restart_write.F90 index a2e01a7a6d..08e80ea1b0 100644 --- a/src/particle_restart_write.F90 +++ b/src/particle_restart_write.F90 @@ -23,7 +23,6 @@ contains integer(HID_T) :: file_id character(MAX_FILE_LEN) :: filename - type(Bank), pointer :: src ! Dont write another restart file if in particle restart mode if (run_mode == MODE_PARTICLE) return @@ -36,35 +35,34 @@ contains ! Create file file_id = file_create(filename) - ! Get information about source particle - src => source_bank(current_work) - - ! Write filetype and version info - call write_attribute(file_id, 'filetype', 'particle restart') - call write_attribute(file_id, 'version', VERSION_PARTICLE_RESTART) - call write_attribute(file_id, "openmc_version", VERSION) + associate (src => source_bank(current_work)) + ! Write filetype and version info + call write_attribute(file_id, 'filetype', 'particle restart') + call write_attribute(file_id, 'version', VERSION_PARTICLE_RESTART) + call write_attribute(file_id, "openmc_version", VERSION) #ifdef GIT_SHA1 - call write_attribute(file_id, "git_sha1", GIT_SHA1) + call write_attribute(file_id, "git_sha1", GIT_SHA1) #endif - ! Write data to file - call write_dataset(file_id, 'current_batch', current_batch) - call write_dataset(file_id, 'gen_per_batch', gen_per_batch) - call write_dataset(file_id, 'current_gen', current_gen) - call write_dataset(file_id, 'n_particles', n_particles) - select case(run_mode) - case (MODE_FIXEDSOURCE) - call write_dataset(file_id, 'run_mode', 'fixed source') - case (MODE_EIGENVALUE) - call write_dataset(file_id, 'run_mode', 'eigenvalue') - case (MODE_PARTICLE) - call write_dataset(file_id, 'run_mode', 'particle restart') - end select - call write_dataset(file_id, 'id', p%id) - call write_dataset(file_id, 'weight', src%wgt) - call write_dataset(file_id, 'energy', src%E) - call write_dataset(file_id, 'xyz', src%xyz) - call write_dataset(file_id, 'uvw', src%uvw) + ! Write data to file + call write_dataset(file_id, 'current_batch', current_batch) + call write_dataset(file_id, 'generations_per_batch', gen_per_batch) + call write_dataset(file_id, 'current_generation', current_gen) + call write_dataset(file_id, 'n_particles', n_particles) + select case(run_mode) + case (MODE_FIXEDSOURCE) + call write_dataset(file_id, 'run_mode', 'fixed source') + case (MODE_EIGENVALUE) + call write_dataset(file_id, 'run_mode', 'eigenvalue') + case (MODE_PARTICLE) + call write_dataset(file_id, 'run_mode', 'particle restart') + end select + call write_dataset(file_id, 'id', p%id) + call write_dataset(file_id, 'weight', src%wgt) + call write_dataset(file_id, 'energy', src%E) + call write_dataset(file_id, 'xyz', src%xyz) + call write_dataset(file_id, 'uvw', src%uvw) + end associate ! Close file call file_close(file_id) diff --git a/tests/test_particle_restart_eigval/results_true.dat b/tests/test_particle_restart_eigval/results_true.dat index 5b548bca7c..d1f933582e 100644 --- a/tests/test_particle_restart_eigval/results_true.dat +++ b/tests/test_particle_restart_eigval/results_true.dat @@ -1,6 +1,6 @@ current batch: 1.000000E+01 -current gen: +current generation: 1.000000E+00 particle id: 1.030000E+03 diff --git a/tests/test_particle_restart_fixed/results_true.dat b/tests/test_particle_restart_fixed/results_true.dat index 0a5126de83..c4ac94c4d8 100644 --- a/tests/test_particle_restart_fixed/results_true.dat +++ b/tests/test_particle_restart_fixed/results_true.dat @@ -1,6 +1,6 @@ current batch: 7.000000E+00 -current gen: +current generation: 1.000000E+00 particle id: 1.440000E+02 diff --git a/tests/testing_harness.py b/tests/testing_harness.py index fc3b4f9346..352022b260 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -219,8 +219,8 @@ class ParticleRestartTestHarness(TestHarness): outstr = '' outstr += 'current batch:\n' outstr += "{0:12.6E}\n".format(p.current_batch) - outstr += 'current gen:\n' - outstr += "{0:12.6E}\n".format(p.current_gen) + outstr += 'current generation:\n' + outstr += "{0:12.6E}\n".format(p.current_generation) outstr += 'particle id:\n' outstr += "{0:12.6E}\n".format(p.id) outstr += 'run mode:\n' From 05d7e817947799f4a68be7bf9e939945695bb947 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 11:05:52 -0600 Subject: [PATCH 09/18] Update documentation for remaining file formats --- docs/source/io_formats/particle_restart.rst | 4 +-- docs/source/io_formats/track.rst | 33 ++++++++------------ docs/source/io_formats/volume.rst | 18 +++++++++-- docs/source/io_formats/voxel.rst | 34 +++++++++++---------- scripts/openmc-voxel-to-silovtk | 8 ++--- src/constants.F90 | 1 + src/plot.F90 | 21 +++++++++---- src/state_point.F90 | 1 - tests/test_plot/test_plot.py | 8 ++--- 9 files changed, 71 insertions(+), 57 deletions(-) diff --git a/docs/source/io_formats/particle_restart.rst b/docs/source/io_formats/particle_restart.rst index 9f34184955..6ebf7e7baa 100644 --- a/docs/source/io_formats/particle_restart.rst +++ b/docs/source/io_formats/particle_restart.rst @@ -9,8 +9,8 @@ The current version of the particle restart file format is 2.0. **/** :Attributes: - **filetype** (*char[]*) -- String indicating the type of file. - - **version** (*int[2]*) -- Major and minor version of the summary - file format. + - **version** (*int[2]*) -- Major and minor version of the particle + restart file format. - **openmc_version** (*int[3]*) -- Major, minor, and release version number for OpenMC. - **git_sha1** (*char[40]*) -- Git commit SHA-1 hash. diff --git a/docs/source/io_formats/track.rst b/docs/source/io_formats/track.rst index e5cb5d46e3..c617cd73e3 100644 --- a/docs/source/io_formats/track.rst +++ b/docs/source/io_formats/track.rst @@ -4,27 +4,18 @@ Track File Format ================= -The current revision of the particle track file format is 1. +The current revision of the particle track file format is 2.0. -**/filetype** (*char[]*) +**/** - String indicating the type of file. +:Attributes: - **filetype** (*char[]*) -- String indicating the type of file. + - **version** (*int[2]*) -- Major and minor version of the track + file format. + - **n_particles** (*int*) -- Number of particles for which tracks + are recorded. + - **n_coords** (*int[]*) -- Number of coordinates for each + particle. -**/revision** (*int*) - - Revision of the track file format. Any time a change is made in the format, - this integer is incremented. - -**/n_particles** (*int*) - - Number of particles for which tracks are recorded. - -**/n_coords** (*int[]*) - - Number of coordinates for each particle. - -*do i = 1, n_particles* - - **/coordinates_i** (*double[][3]*) - - (x,y,z) coordinates for the *i*-th particle. +:Datasets: + - **coordinates_** (*double[][3]*) -- (x,y,z) coordinates for the + *i*-th particle. diff --git a/docs/source/io_formats/volume.rst b/docs/source/io_formats/volume.rst index 10b7a3b732..456a06eef5 100644 --- a/docs/source/io_formats/volume.rst +++ b/docs/source/io_formats/volume.rst @@ -4,19 +4,31 @@ Volume File Format ================== +The current version of the volume file format is 1.0. + **/** -:Attributes: - **samples** (*int*) -- Number of samples +:Attributes: - **filetype** (*char[]*) -- String indicating the type of file. + - **version** (*int[2]*) -- Major and minor version of the summary + file format. + - **openmc_version** (*int[3]*) -- Major, minor, and release + version number for OpenMC. + - **git_sha1** (*char[40]*) -- Git commit SHA-1 hash. + - **date_and_time** (*char[]*) -- Date and time the summary was + written. + - **domain_type** (*char[]*) -- The type of domain for which + volumes are calculated, either 'cell', 'material', or 'universe'. + - **samples** (*int*) -- Number of samples - **lower_left** (*double[3]*) -- Lower-left coordinates of bounding box - **upper_right** (*double[3]*) -- Upper-right coordinates of bounding box -**/cell_/** +**/domain_/** :Datasets: - **volume** (*double[2]*) -- Calculated volume and its uncertainty in cubic centimeters - **nuclides** (*char[][]*) -- Names of nuclides identified in the - cell + domain - **atoms** (*double[][2]*) -- Total number of atoms of each nuclide and its uncertainty diff --git a/docs/source/io_formats/voxel.rst b/docs/source/io_formats/voxel.rst index 6b73f2800a..52ae78aaa0 100644 --- a/docs/source/io_formats/voxel.rst +++ b/docs/source/io_formats/voxel.rst @@ -4,22 +4,24 @@ Voxel Plot File Format ====================== -**/filetype** (*char[]*) +The current version of the voxel file format is 1.0. - String indicating the type of file. +**/** -**/num_voxels** (*int[3]*) +:Attributes: - **filetype** (*char[]*) -- String indicating the type of file. + - **version** (*int[2]*) -- Major and minor version of the voxel + file format. + - **openmc_version** (*int[3]*) -- Major, minor, and release + version number for OpenMC. + - **git_sha1** (*char[40]*) -- Git commit SHA-1 hash. + - **date_and_time** (*char[]*) -- Date and time the summary was + written. + - **num_voxels** (*int[3]*) -- Number of voxels in the x-, y-, and + z- directions. + - **voxel_width** (*double[3]*) -- Width of a voxel in centimeters. + - **lower_left** (*double[3]*) -- Cartesian coordinates of the + lower-left corner of the plot. - Number of voxels in the x-, y-, and z- directions. - -**/voxel_width** (*double[3]*) - - Width of a voxel in centimeters. - -**/lower_left** (*double[3]*) - - Cartesian coordinates of the lower-left corner of the plot. - -**/data** (*int[][][]*) - - Data for each voxel that represents a material or cell ID. +:Datasets: + - **data** (*int[][][]*) -- Data for each voxel that represents a + material or cell ID. diff --git a/scripts/openmc-voxel-to-silovtk b/scripts/openmc-voxel-to-silovtk index 1329b6b6c7..471047127e 100755 --- a/scripts/openmc-voxel-to-silovtk +++ b/scripts/openmc-voxel-to-silovtk @@ -27,9 +27,9 @@ def parse_options(): def main(filename, o): # Read data from voxel file fh = h5py.File(filename, 'r') - dimension = fh['num_voxels'].value - width = fh['voxel_width'].value - lower_left = fh['lower_left'].value + dimension = fh.attrs['num_voxels'] + width = fh.attrs['voxel_width'] + lower_left = fh.attrs['lower_left'] voxel_data = fh['data'].value nx, ny, nz = dimension @@ -40,7 +40,7 @@ def main(filename, o): import vtk except: print('The vtk python bindings do not appear to be installed ' - 'properly.\nOn Ubuntu: sudo apt-get install python-vtk\n' + 'properly.\nOn Ubuntu: sudo apt install python-vtk\n' 'See: http://www.vtk.org/') return diff --git a/src/constants.F90 b/src/constants.F90 index d1095d786b..4b57ac5406 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -21,6 +21,7 @@ module constants integer, parameter :: VERSION_TRACK(2) = [2, 0] integer, parameter :: VERSION_SUMMARY(2) = [5, 0] integer, parameter :: VERSION_VOLUME(2) = [1, 0] + integer, parameter :: VERSION_VOXEL(2) = [1, 0] character(10), parameter :: VERSION_MULTIPOLE = "v0.2" ! ============================================================================ diff --git a/src/plot.F90 b/src/plot.F90 index b5832bbdfa..5ed6ee853f 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -8,7 +8,7 @@ module plot use hdf5_interface use mesh, only: get_mesh_indices use mesh_header, only: RegularMesh - use output, only: write_message + use output, only: write_message, time_stamp use particle_header, only: LocalCoord, Particle use plot_header use ppmlib, only: Image, init_image, allocate_image, & @@ -381,11 +381,20 @@ contains ! Open binary plot file for writing file_id = file_create(pl%path_plot) - ! write plot header info - call write_dataset(file_id, "filetype", 'voxel') - call write_dataset(file_id, "num_voxels", pl%pixels) - call write_dataset(file_id, "voxel_width", vox) - call write_dataset(file_id, "lower_left", ll) + ! write header info + call write_attribute(file_id, "filetype", 'voxel') + call write_attribute(file_id, "version", VERSION_VOXEL) + call write_attribute(file_id, "openmc_version", VERSION) +#ifdef GIT_SHA1 + call write_attribute(file_id, "git_sha1", GIT_SHA1) +#endif + + ! Write current date and time + call write_attribute(file_id, "date_and_time", time_stamp()) + + call write_attribute(file_id, "num_voxels", pl%pixels) + call write_attribute(file_id, "voxel_width", vox) + call write_attribute(file_id, "lower_left", ll) ! Create dataset for voxel data -- note that the dimensions are reversed ! since we want the order in the file to be z, y, x diff --git a/src/state_point.F90 b/src/state_point.F90 index 378fde6519..f3b452953b 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -42,7 +42,6 @@ contains integer :: n_order ! loop index for moment orders integer :: nm_order ! loop index for Ynm moment orders integer, allocatable :: id_array(:) - integer, allocatable :: key_array(:) integer(HID_T) :: file_id integer(HID_T) :: cmfd_group, tallies_group, tally_group, meshes_group, & mesh_group, filter_group, derivs_group, deriv_group, & diff --git a/tests/test_plot/test_plot.py b/tests/test_plot/test_plot.py index 606a1fd647..718d6505c9 100644 --- a/tests/test_plot/test_plot.py +++ b/tests/test_plot/test_plot.py @@ -50,10 +50,10 @@ class PlotTestHarness(TestHarness): voxel_files = glob.glob(os.path.join(os.getcwd(), '*.voxel')) for fname in sorted(voxel_files): with h5py.File(fname, 'r') as fh: - outstr += fh['filetype'].value - outstr += fh['num_voxels'].value.tostring() - outstr += fh['lower_left'].value.tostring() - outstr += fh['voxel_width'].value.tostring() + outstr += fh.attrs['filetype'] + outstr += fh.attrs['num_voxels'].tostring() + outstr += fh.attrs['lower_left'].tostring() + outstr += fh.attrs['voxel_width'].tostring() outstr += fh['data'].value.tostring() # Hash the information and return. From f0d9acc59625f202b3960a9552eb7f4f485faf79 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 12:12:18 -0600 Subject: [PATCH 10/18] Change plot names (plot ID as suffix). Voxel files are now .h5 --- src/input_xml.F90 | 4 +- src/plot.F90 | 171 +++++++++++++++++------------------ tests/test_plot/settings.xml | 11 +-- tests/test_plot/test_plot.py | 35 ++++--- 4 files changed, 101 insertions(+), 120 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index b1d62e6283..fc4d5a581c 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -4261,14 +4261,14 @@ contains end select ! Set output file path - filename = trim(to_str(pl % id)) // "_plot" + filename = "plot_" // trim(to_str(pl % id)) if (check_for_node(node_plot, "filename")) & call get_node_value(node_plot, "filename", filename) select case (pl % type) case (PLOT_TYPE_SLICE) pl % path_plot = trim(path_input) // trim(filename) // ".ppm" case (PLOT_TYPE_VOXEL) - pl % path_plot = trim(path_input) // trim(filename) // ".voxel" + pl % path_plot = trim(path_input) // trim(filename) // ".h5" end select ! Copy plot pixel size diff --git a/src/plot.F90 b/src/plot.F90 index 5ed6ee853f..dd0d4bfbd8 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -29,22 +29,21 @@ contains subroutine run_plot() integer :: i ! loop index for plots - type(ObjectPlot), pointer :: pl => null() do i = 1, n_plots - pl => plots(i) + associate (pl => plots(i)) + ! Display output message + call write_message("Processing plot " // trim(to_str(pl % id)) & + // ": " // trim(pl % path_plot) // " ...", 5) - ! Display output message - call write_message("Processing plot " // trim(to_str(pl % id)) & - &// ": " // trim(pl % path_plot) // " ...", 5) - - if (pl % type == PLOT_TYPE_SLICE) then - ! create 2d image - call create_ppm(pl) - else if (pl % type == PLOT_TYPE_VOXEL) then - ! create dump for 3D silomesh utility script - call create_3d_dump(pl) - end if + if (pl % type == PLOT_TYPE_SLICE) then + ! create 2d image + call create_ppm(pl) + else if (pl % type == PLOT_TYPE_VOXEL) then + ! create dump for 3D silomesh utility script + call create_3d_dump(pl) + end if + end associate end do end subroutine run_plot @@ -55,15 +54,13 @@ contains !=============================================================================== subroutine position_rgb(p, pl, rgb, id) - - type(Particle), intent(inout) :: p - type(ObjectPlot), pointer, intent(in) :: pl - integer, intent(out) :: rgb(3) - integer, intent(out) :: id + type(Particle), intent(inout) :: p + type(ObjectPlot), intent(in) :: pl + integer, intent(out) :: rgb(3) + integer, intent(out) :: id integer :: j logical :: found_cell - type(Cell), pointer :: c p % n_coord = 1 @@ -81,19 +78,20 @@ contains else if (pl % color_by == PLOT_COLOR_MATS) then ! Assign color based on material - c => cells(p % coord(j) % cell) - if (c % type == CELL_FILL) then - ! If we stopped on a middle universe level, treat as if not found - rgb = pl % not_found % rgb - id = -1 - else if (p % material == MATERIAL_VOID) then - ! By default, color void cells white - rgb = 255 - id = -1 - else - rgb = pl % colors(p % material) % rgb - id = materials(p % material) % id - end if + associate (c => cells(p % coord(j) % cell)) + if (c % type == CELL_FILL) then + ! If we stopped on a middle universe level, treat as if not found + rgb = pl % not_found % rgb + id = -1 + else if (p % material == MATERIAL_VOID) then + ! By default, color void cells white + rgb = 255 + id = -1 + else + rgb = pl % colors(p % material) % rgb + id = materials(p % material) % id + end if + end associate else if (pl % color_by == PLOT_COLOR_CELLS) then ! Assign color based on cell rgb = pl % colors(p % coord(j) % cell) % rgb @@ -112,8 +110,7 @@ contains !=============================================================================== subroutine create_ppm(pl) - - type(ObjectPlot), pointer :: pl + type(ObjectPlot), intent(in) :: pl integer :: in_i integer :: out_i @@ -183,7 +180,7 @@ contains if (associated(pl % meshlines_mesh)) call draw_mesh_lines(pl, img) ! Write out the ppm to a file - call output_ppm(pl,img) + call output_ppm(pl, img) ! Free up space call deallocate_image(img) @@ -196,10 +193,10 @@ contains !=============================================================================== ! DRAW_MESH_LINES draws mesh line boundaries on an image !=============================================================================== - subroutine draw_mesh_lines(pl, img) - type(ObjectPlot), pointer, intent(in) :: pl - type(Image), intent(inout) :: img + subroutine draw_mesh_lines(pl, img) + type(ObjectPlot), intent(in) :: pl + type(Image), intent(inout) :: img logical :: in_mesh integer :: out_, in_ ! pixel location @@ -216,9 +213,6 @@ contains real(8) :: xyz_ur_plot(3) ! upper right xyz of plot image real(8) :: xyz_ll(3) ! lower left xyz real(8) :: xyz_ur(3) ! upper right xyz - type(RegularMesh), pointer :: m - - m => pl % meshlines_mesh r = pl % meshlines_color % rgb(1) g = pl % meshlines_color % rgb(2) @@ -246,55 +240,57 @@ contains width = xyz_ur_plot - xyz_ll_plot - call get_mesh_indices(m, xyz_ll_plot, ijk_ll(:m % n_dimension), in_mesh) - call get_mesh_indices(m, xyz_ur_plot, ijk_ur(:m % n_dimension), in_mesh) + associate (m => pl % meshlines_mesh) + call get_mesh_indices(m, xyz_ll_plot, ijk_ll(:m % n_dimension), in_mesh) + call get_mesh_indices(m, xyz_ur_plot, ijk_ur(:m % n_dimension), in_mesh) - ! sweep through all meshbins on this plane and draw borders - do i = ijk_ll(outer), ijk_ur(outer) - do j = ijk_ll(inner), ijk_ur(inner) - ! check if we're in the mesh for this ijk - if (i > 0 .and. i <= m % dimension(outer) .and. & - j > 0 .and. j <= m % dimension(inner)) then + ! sweep through all meshbins on this plane and draw borders + do i = ijk_ll(outer), ijk_ur(outer) + do j = ijk_ll(inner), ijk_ur(inner) + ! check if we're in the mesh for this ijk + if (i > 0 .and. i <= m % dimension(outer) .and. & + j > 0 .and. j <= m % dimension(inner)) then - ! get xyz's of lower left and upper right of this mesh cell - xyz_ll(outer) = m % lower_left(outer) + m % width(outer) * (i - 1) - xyz_ll(inner) = m % lower_left(inner) + m % width(inner) * (j - 1) - xyz_ur(outer) = m % lower_left(outer) + m % width(outer) * i - xyz_ur(inner) = m % lower_left(inner) + m % width(inner) * j + ! get xyz's of lower left and upper right of this mesh cell + xyz_ll(outer) = m % lower_left(outer) + m % width(outer) * (i - 1) + xyz_ll(inner) = m % lower_left(inner) + m % width(inner) * (j - 1) + xyz_ur(outer) = m % lower_left(outer) + m % width(outer) * i + xyz_ur(inner) = m % lower_left(inner) + m % width(inner) * j - ! map the xyz ranges to pixel ranges + ! map the xyz ranges to pixel ranges - frac = (xyz_ll(outer) - xyz_ll_plot(outer)) / width(outer) - outrange(1) = int(frac * real(img % width, 8)) - frac = (xyz_ur(outer) - xyz_ll_plot(outer)) / width(outer) - outrange(2) = int(frac * real(img % width, 8)) + frac = (xyz_ll(outer) - xyz_ll_plot(outer)) / width(outer) + outrange(1) = int(frac * real(img % width, 8)) + frac = (xyz_ur(outer) - xyz_ll_plot(outer)) / width(outer) + outrange(2) = int(frac * real(img % width, 8)) - frac = (xyz_ur(inner) - xyz_ll_plot(inner)) / width(inner) - inrange(1) = int((ONE - frac) * real(img % height, 8)) - frac = (xyz_ll(inner) - xyz_ll_plot(inner)) / width(inner) - inrange(2) = int((ONE - frac) * real(img % height, 8)) + frac = (xyz_ur(inner) - xyz_ll_plot(inner)) / width(inner) + inrange(1) = int((ONE - frac) * real(img % height, 8)) + frac = (xyz_ll(inner) - xyz_ll_plot(inner)) / width(inner) + inrange(2) = int((ONE - frac) * real(img % height, 8)) - ! draw lines - do out_ = outrange(1), outrange(2) - do plus = 0, pl % meshlines_width - call set_pixel(img, out_, inrange(1) + plus, r, g, b) - call set_pixel(img, out_, inrange(2) + plus, r, g, b) - call set_pixel(img, out_, inrange(1) - plus, r, g, b) - call set_pixel(img, out_, inrange(2) - plus, r, g, b) + ! draw lines + do out_ = outrange(1), outrange(2) + do plus = 0, pl % meshlines_width + call set_pixel(img, out_, inrange(1) + plus, r, g, b) + call set_pixel(img, out_, inrange(2) + plus, r, g, b) + call set_pixel(img, out_, inrange(1) - plus, r, g, b) + call set_pixel(img, out_, inrange(2) - plus, r, g, b) + end do end do - end do - do in_ = inrange(1), inrange(2) - do plus = 0, pl % meshlines_width - call set_pixel(img, outrange(1) + plus, in_, r, g, b) - call set_pixel(img, outrange(2) + plus, in_, r, g, b) - call set_pixel(img, outrange(1) - plus, in_, r, g, b) - call set_pixel(img, outrange(2) - plus, in_, r, g, b) + do in_ = inrange(1), inrange(2) + do plus = 0, pl % meshlines_width + call set_pixel(img, outrange(1) + plus, in_, r, g, b) + call set_pixel(img, outrange(2) + plus, in_, r, g, b) + call set_pixel(img, outrange(1) - plus, in_, r, g, b) + call set_pixel(img, outrange(2) - plus, in_, r, g, b) + end do end do - end do - end if + end if + end do end do - end do + end associate end subroutine draw_mesh_lines @@ -303,9 +299,8 @@ contains !=============================================================================== subroutine output_ppm(pl, img) - - type(ObjectPlot), pointer :: pl - type(Image), intent(in) :: img + type(ObjectPlot), intent(in) :: pl + type(Image), intent(in) :: img integer :: i ! loop index for height integer :: j ! loop index for width @@ -316,20 +311,19 @@ contains ! Write header write(unit_plot, '(A2)') 'P6' - write(unit_plot, '(I0,'' '',I0)') img%width, img%height + write(unit_plot, '(I0,'' '',I0)') img % width, img % height write(unit_plot, '(A)') '255' ! Write color for each pixel do j = 1, img % height do i = 1, img % width - write(unit_plot, '(3A1)', advance='no') achar(img%red(i,j)), & - achar(img%green(i,j)), achar(img%blue(i,j)) + write(unit_plot, '(3A1)', advance='no') achar(img % red(i,j)), & + achar(img % green(i,j)), achar(img % blue(i,j)) end do end do ! Close plot file close(UNIT=unit_plot) - end subroutine output_ppm !=============================================================================== @@ -345,8 +339,7 @@ contains !=============================================================================== subroutine create_3d_dump(pl) - - type(ObjectPlot), pointer :: pl + type(ObjectPlot), intent(in) :: pl integer :: x, y, z ! voxel location indices integer :: rgb(3) ! colors (red, green, blue) from 0-255 diff --git a/tests/test_plot/settings.xml b/tests/test_plot/settings.xml index 37623cb1fb..197b9c7093 100644 --- a/tests/test_plot/settings.xml +++ b/tests/test_plot/settings.xml @@ -1,16 +1,7 @@ - eigenvalue - 10 - 5 - 1000 - - - - -4 -4 -4 4 4 4 - - + plot 5 4 3 diff --git a/tests/test_plot/test_plot.py b/tests/test_plot/test_plot.py index 718d6505c9..b21e1aada8 100644 --- a/tests/test_plot/test_plot.py +++ b/tests/test_plot/test_plot.py @@ -33,28 +33,25 @@ class PlotTestHarness(TestHarness): for fname in self._plot_names: path = os.path.join(os.getcwd(), fname) if os.path.exists(path): - #os.remove(path) - pass + os.remove(path) def _get_results(self): """Return a string hash of the plot files.""" outstr = bytes() - # Add PPM output to results - ppm_files = glob.glob(os.path.join(os.getcwd(), '*.ppm')) - for fname in sorted(ppm_files): - with open(fname, 'rb') as fh: - outstr += fh.read() - - # Add voxel data to results - voxel_files = glob.glob(os.path.join(os.getcwd(), '*.voxel')) - for fname in sorted(voxel_files): - with h5py.File(fname, 'r') as fh: - outstr += fh.attrs['filetype'] - outstr += fh.attrs['num_voxels'].tostring() - outstr += fh.attrs['lower_left'].tostring() - outstr += fh.attrs['voxel_width'].tostring() - outstr += fh['data'].value.tostring() + for fname in self._plot_names: + if fname.endswith('.ppm'): + # Add PPM output to results + with open(fname, 'rb') as fh: + outstr += fh.read() + elif fname.endswith('.h5'): + # Add voxel data to results + with h5py.File(fname, 'r') as fh: + outstr += fh.attrs['filetype'] + outstr += fh.attrs['num_voxels'].tostring() + outstr += fh.attrs['lower_left'].tostring() + outstr += fh.attrs['voxel_width'].tostring() + outstr += fh['data'].value.tostring() # Hash the information and return. sha512 = hashlib.sha512() @@ -65,6 +62,6 @@ class PlotTestHarness(TestHarness): if __name__ == '__main__': - harness = PlotTestHarness(('1_plot.ppm', '2_plot.ppm', '3_plot.ppm', - '4_plot.voxel')) + harness = PlotTestHarness(('plot_1.ppm', 'plot_2.ppm', 'plot_3.ppm', + 'plot_4.h5')) harness.main() From 40a931f97bfdc03380820f86cf9243f218baf99b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 13:17:50 -0600 Subject: [PATCH 11/18] Parallelize slice plots --- CMakeLists.txt | 1 - src/plot.F90 | 118 +++++++++++++++++++++-------------------- src/ppmlib.F90 | 127 --------------------------------------------- src/ppmlib.LICENSE | 4 -- 4 files changed, 58 insertions(+), 192 deletions(-) delete mode 100644 src/ppmlib.F90 delete mode 100644 src/ppmlib.LICENSE diff --git a/CMakeLists.txt b/CMakeLists.txt index 098de3de2a..3ecdc1e9bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -318,7 +318,6 @@ set(LIBOPENMC_FORTRAN_SRC src/physics_mg.F90 src/plot.F90 src/plot_header.F90 - src/ppmlib.F90 src/product_header.F90 src/progress_header.F90 src/random_lcg.F90 diff --git a/src/plot.F90 b/src/plot.F90 index dd0d4bfbd8..86d303b3dd 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -11,14 +11,19 @@ module plot use output, only: write_message, time_stamp use particle_header, only: LocalCoord, Particle use plot_header - use ppmlib, only: Image, init_image, allocate_image, & - deallocate_image, set_pixel use progress_header, only: ProgressBar use string, only: to_str use hdf5 implicit none + private + + public :: run_plot + + integer, parameter :: RED = 1 + integer, parameter :: GREEN = 2 + integer, parameter :: BLUE = 3 contains @@ -41,7 +46,7 @@ contains call create_ppm(pl) else if (pl % type == PLOT_TYPE_VOXEL) then ! create dump for 3D silomesh utility script - call create_3d_dump(pl) + call create_voxel(pl) end if end associate end do @@ -117,19 +122,22 @@ contains integer :: x, y ! pixel location integer :: rgb(3) ! colors (red, green, blue) from 0-255 integer :: id + integer :: height, width real(8) :: in_pixel real(8) :: out_pixel real(8) :: xyz(3) - type(Image) :: img + integer, allocatable :: data(:,:,:) type(Particle) :: p - type(ProgressBar) :: progress - ! Initialize and allocate space for image - call init_image(img) - call allocate_image(img, pl % pixels(1), pl % pixels(2)) + width = pl % pixels(1) + height = pl % pixels(2) - in_pixel = pl % width(1)/dble(pl % pixels(1)) - out_pixel = pl % width(2)/dble(pl % pixels(2)) + in_pixel = pl % width(1)/dble(width) + out_pixel = pl % width(2)/dble(height) + + ! Allocate and initialize results array + allocate(data(3, width, height)) + data(:,:,:) = 0 if (pl % basis == PLOT_BASIS_XY) then in_i = 1 @@ -157,36 +165,28 @@ contains p % coord(1) % uvw = [ HALF, HALF, HALF ] p % coord(1) % universe = BASE_UNIVERSE - do y = 1, img % height - call progress % set_value(dble(y)/dble(img % height)*100) - do x = 1, img % width +!$omp parallel do firstprivate(p) private(x, rgb, id) reduction(+ : data) + do y = 1, height + ! Set y coordinate + p % coord(1) % xyz(out_i) = xyz(out_i) - out_pixel*(y - 1) + do x = 1, width + ! Set x coordinate + p % coord(1) % xyz(in_i) = xyz(in_i) + in_pixel*(x - 1) ! get pixel color call position_rgb(p, pl, rgb, id) ! Create a pixel at (x,y) with color (r,g,b) - call set_pixel(img, x-1, y-1, rgb(1), rgb(2), rgb(3)) - - ! Advance pixel in first direction - p % coord(1) % xyz(in_i) = p % coord(1) % xyz(in_i) + in_pixel + data(:, x, y) = rgb end do - - ! Advance pixel in second direction - p % coord(1) % xyz(in_i) = xyz(in_i) - p % coord(1) % xyz(out_i) = p % coord(1) % xyz(out_i) - out_pixel end do +!$omp end parallel do ! Draw tally mesh boundaries on the image if requested - if (associated(pl % meshlines_mesh)) call draw_mesh_lines(pl, img) + if (associated(pl % meshlines_mesh)) call draw_mesh_lines(pl, data) ! Write out the ppm to a file - call output_ppm(pl, img) - - ! Free up space - call deallocate_image(img) - - ! Clear particle - call p % clear() + call output_ppm(pl, data) end subroutine create_ppm @@ -194,13 +194,13 @@ contains ! DRAW_MESH_LINES draws mesh line boundaries on an image !=============================================================================== - subroutine draw_mesh_lines(pl, img) + subroutine draw_mesh_lines(pl, data) type(ObjectPlot), intent(in) :: pl - type(Image), intent(inout) :: img + integer, intent(inout) :: data(:,:,:) logical :: in_mesh integer :: out_, in_ ! pixel location - integer :: r, g, b ! RGB color for meshlines pixels + integer :: rgb(3) ! RGB color for meshlines pixels integer :: outrange(2), inrange(2) ! range of pixel locations integer :: i, j ! loop indices integer :: plus @@ -214,9 +214,7 @@ contains real(8) :: xyz_ll(3) ! lower left xyz real(8) :: xyz_ur(3) ! upper right xyz - r = pl % meshlines_color % rgb(1) - g = pl % meshlines_color % rgb(2) - b = pl % meshlines_color % rgb(3) + rgb(:) = pl % meshlines_color % rgb select case (pl % basis) case(PLOT_BASIS_XY) @@ -260,30 +258,30 @@ contains ! map the xyz ranges to pixel ranges frac = (xyz_ll(outer) - xyz_ll_plot(outer)) / width(outer) - outrange(1) = int(frac * real(img % width, 8)) + outrange(1) = int(frac * real(pl % pixels(1), 8)) frac = (xyz_ur(outer) - xyz_ll_plot(outer)) / width(outer) - outrange(2) = int(frac * real(img % width, 8)) + outrange(2) = int(frac * real(pl % pixels(1), 8)) frac = (xyz_ur(inner) - xyz_ll_plot(inner)) / width(inner) - inrange(1) = int((ONE - frac) * real(img % height, 8)) + inrange(1) = int((ONE - frac) * real(pl % pixels(2), 8)) frac = (xyz_ll(inner) - xyz_ll_plot(inner)) / width(inner) - inrange(2) = int((ONE - frac) * real(img % height, 8)) + inrange(2) = int((ONE - frac) * real(pl % pixels(2), 8)) ! draw lines do out_ = outrange(1), outrange(2) do plus = 0, pl % meshlines_width - call set_pixel(img, out_, inrange(1) + plus, r, g, b) - call set_pixel(img, out_, inrange(2) + plus, r, g, b) - call set_pixel(img, out_, inrange(1) - plus, r, g, b) - call set_pixel(img, out_, inrange(2) - plus, r, g, b) + data(:, out_ + 1, inrange(1) + plus + 1) = rgb + data(:, out_ + 1, inrange(2) + plus + 1) = rgb + data(:, out_ + 1, inrange(1) - plus + 1) = rgb + data(:, out_ + 1, inrange(2) - plus + 1) = rgb end do end do do in_ = inrange(1), inrange(2) do plus = 0, pl % meshlines_width - call set_pixel(img, outrange(1) + plus, in_, r, g, b) - call set_pixel(img, outrange(2) + plus, in_, r, g, b) - call set_pixel(img, outrange(1) - plus, in_, r, g, b) - call set_pixel(img, outrange(2) - plus, in_, r, g, b) + data(:, outrange(1) + plus + 1, in_ + 1) = rgb + data(:, outrange(2) + plus + 1, in_ + 1) = rgb + data(:, outrange(1) - plus + 1, in_ + 1) = rgb + data(:, outrange(2) - plus + 1, in_ + 1) = rgb end do end do @@ -298,12 +296,12 @@ contains ! OUTPUT_PPM writes out a previously generated image to a PPM file !=============================================================================== - subroutine output_ppm(pl, img) + subroutine output_ppm(pl, data) type(ObjectPlot), intent(in) :: pl - type(Image), intent(in) :: img + integer, intent(in) :: data(:,:,:) - integer :: i ! loop index for height - integer :: j ! loop index for width + integer :: y ! loop index for height + integer :: x ! loop index for width integer :: unit_plot ! Open PPM file for writing @@ -311,14 +309,14 @@ contains ! Write header write(unit_plot, '(A2)') 'P6' - write(unit_plot, '(I0,'' '',I0)') img % width, img % height + write(unit_plot, '(I0,'' '',I0)') pl % pixels(1), pl % pixels(2) write(unit_plot, '(A)') '255' ! Write color for each pixel - do j = 1, img % height - do i = 1, img % width - write(unit_plot, '(3A1)', advance='no') achar(img % red(i,j)), & - achar(img % green(i,j)), achar(img % blue(i,j)) + do y = 1, pl % pixels(2) + do x = 1, pl % pixels(1) + write(unit_plot, '(3A1)', advance='no') achar(data(RED, x, y)), & + achar(data(GREEN, x, y)), achar(data(BLUE, x, y)) end do end do @@ -327,7 +325,7 @@ contains end subroutine output_ppm !=============================================================================== -! CREATE_3D_DUMP outputs a binary file that can be input into silomesh for 3D +! CREATE_VOXEL outputs a binary file that can be input into silomesh for 3D ! geometry visualization. It works the same way as create_ppm by dragging a ! particle across the geometry for the specified number of voxels. The first ! 3 int(4)'s in the binary are the number of x, y, and z voxels. The next 3 @@ -338,7 +336,7 @@ contains ! id. For 1 million voxels this produces a file of approximately 15MB. !=============================================================================== - subroutine create_3d_dump(pl) + subroutine create_voxel(pl) type(ObjectPlot), intent(in) :: pl integer :: x, y, z ! voxel location indices @@ -348,7 +346,7 @@ contains integer, target :: data(pl%pixels(3),pl%pixels(2)) integer(HID_T) :: file_id integer(HID_T) :: dspace - integeR(HID_T) :: memspace + integer(HID_T) :: memspace integer(HID_T) :: dset integer(HSIZE_T) :: dims(3) integer(HSIZE_T) :: dims_slab(3) @@ -445,6 +443,6 @@ contains call h5sclose_f(memspace, hdf5_err) call file_close(file_id) - end subroutine create_3d_dump + end subroutine create_voxel end module plot diff --git a/src/ppmlib.F90 b/src/ppmlib.F90 deleted file mode 100644 index ebd8105bef..0000000000 --- a/src/ppmlib.F90 +++ /dev/null @@ -1,127 +0,0 @@ -module ppmlib - - implicit none - -!=============================================================================== -! Image holds RGB information for output PPM image -!=============================================================================== - - type Image - integer, dimension(:,:), pointer :: red, green, blue - integer :: width, height - end type Image - -contains - -!=============================================================================== -! INIT_IMAGE initializes the Image derived type -!=============================================================================== - - subroutine init_image(img) - - type(Image), intent(out) :: img - - nullify(img % red) - nullify(img % green) - nullify(img % blue) - - img % width = 0 - img % height = 0 - - end subroutine init_image - -!=============================================================================== -! ALLOCATE_IMAGE sets the width and height of an image and allocates color -! arrays -!=============================================================================== - - subroutine allocate_image(img, w, h) - - type(Image), intent(inout) :: img - integer, intent(in) :: w ! width of image - integer, intent(in) :: h ! height of image - - ! allocate red, green, and blue array - allocate(img % red(w, h)) - allocate(img % green(w, h)) - allocate(img % blue(w, h)) - - ! set width and height - img % width = w - img % height = h - - end subroutine allocate_image - -!=============================================================================== -! DEALLOCATE_IMAGE -!=============================================================================== - - subroutine deallocate_image(img) - - type(Image) :: img - - if (associated(img % red)) deallocate(img % red) - if (associated(img % green)) deallocate(img % green) - if (associated(img % blue)) deallocate(img % blue) - - end subroutine deallocate_image - -!=============================================================================== -! INSIDE_IMAGE determines whether a point (x,y) is inside the image -!=============================================================================== - - - function inside_image(img, x, y) result(inside) - - type(Image), intent(in) :: img - integer, intent(in) :: x, y - logical :: inside - - inside = .false. - - if ((x < img % width) .and. (y < img % height) .and. & - (x >= 0) .and. (y >= 0)) inside = .true. - - end function inside_image - -!=============================================================================== -! VALID_IMAGE checks whether the image has a width and height and if its color -! arrays are allocated -!=============================================================================== - - function valid_image(img) result(valid) - - type(Image), intent(in) :: img - logical :: valid - - valid = .false. - - if (img % width == 0) return - if (img % height == 0) return - if (.not. associated(img % red) .or. & - .not. associated(img % green) .or. & - .not. associated(img % blue)) return - - valid = .true. - - end function valid_image - -!=============================================================================== -! SET_PIXEL sets the colors for a given pixel -!=============================================================================== - - subroutine set_pixel(img, x, y, r, g, b) - - type(Image), intent(inout) :: img - integer, intent(in) :: x, y ! coordinates - integer, intent(in) :: r, g, b ! red, green, and blue - - if (inside_image(img, x, y) .and. valid_image(img)) then - img % red(x+1,y+1) = mod(abs(r), 256) - img % green(x+1, y+1) = mod(abs(g), 256) - img % blue(x+1, y+1) = mod(abs(b), 256) - end if - - end subroutine set_pixel - -end module ppmlib diff --git a/src/ppmlib.LICENSE b/src/ppmlib.LICENSE deleted file mode 100644 index a733e8d3e9..0000000000 --- a/src/ppmlib.LICENSE +++ /dev/null @@ -1,4 +0,0 @@ -The source code in ppmlib.F90 is adapted from code found on Rosetta Code - which was authored -by Mauro Panigada. The authors of OpenMC have obtained permission from Mauro -Panigada to use and distribution this source code as part of OpenMC. From 7d01622403cd536e32bf45574ddf7210bba87854 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 21 Feb 2017 21:07:01 -0600 Subject: [PATCH 12/18] Update two Jupyter notebooks --- .../pythonapi/examples/mgxs-part-ii.ipynb | 1562 +++++++++-------- .../pythonapi/examples/mgxs-part-iii.ipynb | 484 ++--- 2 files changed, 1029 insertions(+), 1017 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb index bab3b6bfcc..5e48244b7e 100644 --- a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb @@ -34,7 +34,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/lib/python3.6/site-packages/matplotlib/__init__.py:1401: UserWarning: This call to matplotlib.use() has no effect\n", + "/home/romano/miniconda3/envs/python3/lib/python3.5/site-packages/matplotlib/__init__.py:1401: UserWarning: This call to matplotlib.use() has no effect\n", "because the backend has already been chosen;\n", "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", "or matplotlib.backends is imported for the first time.\n", @@ -46,7 +46,7 @@ "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", + "plt.style.use('seaborn-dark')\n", "\n", "import openmoc\n", "from openmoc.opencg_compatible import get_openmoc_geometry\n", @@ -54,6 +54,7 @@ "import openmc\n", "import openmc.mgxs as mgxs\n", "import openmc.data\n", + "from openmc.opencg_compatible import get_opencg_geometry\n", "\n", "%matplotlib inline" ] @@ -453,9 +454,9 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | 54b65c8bda6af5788bd762b8cf9855d1a8008238\n", - " Date/Time | 2017-02-12 13:37:37\n", - " OpenMP Threads | 8\n", + " Git SHA1 | dfc6f1d9bf1b31fc94dad1cb30bd672b25f47e04\n", + " Date/Time | 2017-02-21 15:07:51\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -465,11 +466,11 @@ " Reading geometry XML file...\n", " Reading materials XML file...\n", " Reading cross sections XML file...\n", - " Reading U235 from /opt/xsdata/nndc/U235.h5\n", - " Reading U238 from /opt/xsdata/nndc/U238.h5\n", - " Reading O16 from /opt/xsdata/nndc/O16.h5\n", - " Reading H1 from /opt/xsdata/nndc/H1.h5\n", - " Reading Zr90 from /opt/xsdata/nndc/Zr90.h5\n", + " Reading U235 from /home/romano/openmc/scripts/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/scripts/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/romano/openmc/scripts/nndc_hdf5/O16.h5\n", + " Reading H1 from /home/romano/openmc/scripts/nndc_hdf5/H1.h5\n", + " Reading Zr90 from /home/romano/openmc/scripts/nndc_hdf5/Zr90.h5\n", " Maximum neutron transport energy: 2.00000E+07 eV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -483,85 +484,93 @@ " ========= ======== ==================== \n", " 1/1 1.20332 \n", " 2/1 1.22209 \n", - " 3/1 1.24309 \n", - " 4/1 1.22833 \n", - " 5/1 1.21786 \n", - " 6/1 1.22005 \n", - " 7/1 1.20894 \n", - " 8/1 1.22071 \n", - " 9/1 1.21279 \n", - " 10/1 1.22198 \n", - " 11/1 1.22287 \n", - " 12/1 1.25490 1.23888 +/- 0.01602\n", - " 13/1 1.20224 1.22667 +/- 0.01532\n", - " 14/1 1.23375 1.22844 +/- 0.01098\n", - " 15/1 1.23068 1.22889 +/- 0.00851\n", - " 16/1 1.23073 1.22920 +/- 0.00696\n", - " 17/1 1.25364 1.23269 +/- 0.00684\n", - " 18/1 1.20820 1.22963 +/- 0.00667\n", - " 19/1 1.23138 1.22982 +/- 0.00588\n", - " 20/1 1.20682 1.22752 +/- 0.00574\n", - " 21/1 1.23580 1.22827 +/- 0.00525\n", - " 22/1 1.24190 1.22941 +/- 0.00492\n", - " 23/1 1.23125 1.22955 +/- 0.00453\n", - " 24/1 1.21606 1.22859 +/- 0.00430\n", - " 25/1 1.23653 1.22912 +/- 0.00404\n", - " 26/1 1.23850 1.22970 +/- 0.00383\n", - " 27/1 1.20986 1.22853 +/- 0.00378\n", - " 28/1 1.25277 1.22988 +/- 0.00381\n", - " 29/1 1.23334 1.23006 +/- 0.00361\n", - " 30/1 1.24345 1.23073 +/- 0.00349\n", - " 31/1 1.21565 1.23001 +/- 0.00339\n", - " 32/1 1.20555 1.22890 +/- 0.00342\n", - " 33/1 1.22995 1.22895 +/- 0.00327\n", - " 34/1 1.19763 1.22764 +/- 0.00339\n", - " 35/1 1.22645 1.22760 +/- 0.00325\n", - " 36/1 1.23900 1.22803 +/- 0.00316\n", - " 37/1 1.24305 1.22859 +/- 0.00309\n", - " 38/1 1.22484 1.22846 +/- 0.00298\n", - " 39/1 1.20986 1.22782 +/- 0.00294\n", - " 40/1 1.23764 1.22814 +/- 0.00286\n", - " 41/1 1.20476 1.22739 +/- 0.00287\n", - " 42/1 1.21652 1.22705 +/- 0.00280\n", - " 43/1 1.21279 1.22662 +/- 0.00275\n", - " 44/1 1.20210 1.22590 +/- 0.00276\n", - " 45/1 1.22644 1.22591 +/- 0.00268\n", - " 46/1 1.22907 1.22600 +/- 0.00261\n", - " 47/1 1.24057 1.22639 +/- 0.00257\n", - " 48/1 1.21610 1.22612 +/- 0.00251\n", - " 49/1 1.22199 1.22602 +/- 0.00245\n", - " 50/1 1.20860 1.22558 +/- 0.00243\n", - " Triggers unsatisfied, max unc./thresh. is 1.25496 for flux in tally 10050\n", - " The estimated number of batches is 73\n", + " 3/1 1.24322 \n", + " 4/1 1.21622 \n", + " 5/1 1.25850 \n", + " 6/1 1.22581 \n", + " 7/1 1.21118 \n", + " 8/1 1.23377 \n", + " 9/1 1.24254 \n", + " 10/1 1.21241 \n", + " 11/1 1.21042 \n", + " 12/1 1.23539 1.22290 +/- 0.01249\n", + " 13/1 1.22436 1.22339 +/- 0.00723\n", + " 14/1 1.22888 1.22476 +/- 0.00529\n", + " 15/1 1.22553 1.22491 +/- 0.00410\n", + " 16/1 1.24194 1.22775 +/- 0.00439\n", + " 17/1 1.24755 1.23058 +/- 0.00466\n", + " 18/1 1.21117 1.22815 +/- 0.00471\n", + " 19/1 1.22530 1.22784 +/- 0.00417\n", + " 20/1 1.20762 1.22582 +/- 0.00424\n", + " 21/1 1.20377 1.22381 +/- 0.00433\n", + " 22/1 1.24305 1.22541 +/- 0.00426\n", + " 23/1 1.22434 1.22533 +/- 0.00392\n", + " 24/1 1.22937 1.22562 +/- 0.00364\n", + " 25/1 1.22458 1.22555 +/- 0.00339\n", + " 26/1 1.18978 1.22332 +/- 0.00388\n", + " 27/1 1.20582 1.22229 +/- 0.00379\n", + " 28/1 1.22719 1.22256 +/- 0.00358\n", + " 29/1 1.21307 1.22206 +/- 0.00343\n", + " 30/1 1.20915 1.22141 +/- 0.00331\n", + " 31/1 1.22799 1.22173 +/- 0.00317\n", + " 32/1 1.21251 1.22131 +/- 0.00305\n", + " 33/1 1.20540 1.22062 +/- 0.00299\n", + " 34/1 1.20052 1.21978 +/- 0.00299\n", + " 35/1 1.24552 1.22081 +/- 0.00304\n", + " 36/1 1.21685 1.22066 +/- 0.00293\n", + " 37/1 1.22395 1.22078 +/- 0.00282\n", + " 38/1 1.22379 1.22089 +/- 0.00272\n", + " 39/1 1.20951 1.22049 +/- 0.00265\n", + " 40/1 1.25199 1.22154 +/- 0.00277\n", + " 41/1 1.23243 1.22190 +/- 0.00270\n", + " 42/1 1.20973 1.22152 +/- 0.00264\n", + " 43/1 1.24682 1.22228 +/- 0.00268\n", + " 44/1 1.20694 1.22183 +/- 0.00263\n", + " 45/1 1.22196 1.22183 +/- 0.00256\n", + " 46/1 1.20687 1.22142 +/- 0.00252\n", + " 47/1 1.22023 1.22139 +/- 0.00245\n", + " 48/1 1.22204 1.22140 +/- 0.00239\n", + " 49/1 1.22077 1.22139 +/- 0.00232\n", + " 50/1 1.23166 1.22164 +/- 0.00228\n", + " Triggers unsatisfied, max unc./thresh. is 1.17623 for flux in tally 10057\n", + " The estimated number of batches is 66\n", " Creating state point statepoint.050.h5...\n", - " 51/1 1.21850 1.22541 +/- 0.00237\n", - " 52/1 1.22833 1.22548 +/- 0.00232\n", - " 53/1 1.20239 1.22494 +/- 0.00233\n", - " 54/1 1.24876 1.22548 +/- 0.00234\n", - " 55/1 1.20670 1.22506 +/- 0.00232\n", - " 56/1 1.24260 1.22545 +/- 0.00230\n", - " 57/1 1.21039 1.22512 +/- 0.00228\n", - " 58/1 1.23929 1.22542 +/- 0.00225\n", - " 59/1 1.21357 1.22518 +/- 0.00221\n", - " 60/1 1.23456 1.22537 +/- 0.00218\n", - " 61/1 1.23963 1.22565 +/- 0.00215\n", - " 62/1 1.24020 1.22593 +/- 0.00213\n", - " 63/1 1.22325 1.22587 +/- 0.00209\n", - " 64/1 1.22070 1.22578 +/- 0.00205\n", - " 65/1 1.22423 1.22575 +/- 0.00201\n", - " 66/1 1.22973 1.22582 +/- 0.00198\n", - " 67/1 1.21842 1.22569 +/- 0.00195\n", - " 68/1 1.19552 1.22517 +/- 0.00198\n", - " 69/1 1.21475 1.22500 +/- 0.00196\n", - " 70/1 1.21888 1.22489 +/- 0.00193\n", - " 71/1 1.19720 1.22444 +/- 0.00195\n", - " 72/1 1.23770 1.22465 +/- 0.00193\n", - " 73/1 1.23894 1.22488 +/- 0.00191\n", - " Triggers unsatisfied, max unc./thresh. is 1.00243 for flux in tally 10050\n", - " The estimated number of batches is 74\n", - " 74/1 1.22437 1.22487 +/- 0.00188\n", - " Triggers satisfied for batch 74\n", - " Creating state point statepoint.074.h5...\n", + " 51/1 1.20071 1.22113 +/- 0.00228\n", + " 52/1 1.21423 1.22097 +/- 0.00223\n", + " 53/1 1.25595 1.22178 +/- 0.00233\n", + " 54/1 1.21806 1.22170 +/- 0.00227\n", + " 55/1 1.22911 1.22186 +/- 0.00223\n", + " 56/1 1.23054 1.22205 +/- 0.00219\n", + " 57/1 1.19384 1.22145 +/- 0.00222\n", + " 58/1 1.20625 1.22114 +/- 0.00220\n", + " 59/1 1.21977 1.22111 +/- 0.00216\n", + " 60/1 1.20813 1.22085 +/- 0.00213\n", + " 61/1 1.22077 1.22085 +/- 0.00209\n", + " 62/1 1.21956 1.22082 +/- 0.00205\n", + " 63/1 1.22360 1.22087 +/- 0.00201\n", + " 64/1 1.23955 1.22122 +/- 0.00200\n", + " 65/1 1.21143 1.22104 +/- 0.00197\n", + " 66/1 1.21791 1.22099 +/- 0.00194\n", + " Triggers unsatisfied, max unc./thresh. is 1.13207 for flux in tally 10057\n", + " The estimated number of batches is 82\n", + " 67/1 1.24897 1.22148 +/- 0.00196\n", + " 68/1 1.22221 1.22149 +/- 0.00193\n", + " 69/1 1.25627 1.22208 +/- 0.00199\n", + " 70/1 1.21493 1.22196 +/- 0.00196\n", + " 71/1 1.23406 1.22216 +/- 0.00193\n", + " 72/1 1.23842 1.22242 +/- 0.00192\n", + " 73/1 1.24542 1.22279 +/- 0.00193\n", + " 74/1 1.21314 1.22263 +/- 0.00190\n", + " 75/1 1.26484 1.22328 +/- 0.00198\n", + " 76/1 1.22243 1.22327 +/- 0.00195\n", + " 77/1 1.21865 1.22320 +/- 0.00192\n", + " 78/1 1.23500 1.22338 +/- 0.00190\n", + " 79/1 1.22125 1.22334 +/- 0.00187\n", + " 80/1 1.23793 1.22355 +/- 0.00186\n", + " 81/1 1.24238 1.22382 +/- 0.00185\n", + " 82/1 1.23493 1.22397 +/- 0.00183\n", + " Triggers satisfied for batch 82\n", + " Creating state point statepoint.082.h5...\n", "\n", " ===========================================================================\n", " ======================> SIMULATION FINISHED <======================\n", @@ -570,27 +579,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.4833E-01 seconds\n", - " Reading cross sections = 2.2326E-01 seconds\n", - " Total time in simulation = 3.0446E+01 seconds\n", - " Time in transport only = 2.9495E+01 seconds\n", - " Time in inactive batches = 1.6469E+00 seconds\n", - " Time in active batches = 2.8800E+01 seconds\n", - " Time synchronizing fission bank = 1.5962E-02 seconds\n", - " Sampling source sites = 1.1235E-02 seconds\n", - " SEND/RECV source sites = 4.6646E-03 seconds\n", - " Time accumulating tallies = 4.9838E-04 seconds\n", - " Total time for finalization = 1.5461E-02 seconds\n", - " Total time elapsed = 3.0842E+01 seconds\n", - " Calculation Rate (inactive) = 60719.1 neutrons/second\n", - " Calculation Rate (active) = 13889.1 neutrons/second\n", + " Total time for initialization = 3.6241E-01 seconds\n", + " Reading cross sections = 2.5754E-01 seconds\n", + " Total time in simulation = 9.0901E+01 seconds\n", + " Time in transport only = 9.0045E+01 seconds\n", + " Time in inactive batches = 2.9786E+00 seconds\n", + " Time in active batches = 8.7923E+01 seconds\n", + " Time synchronizing fission bank = 2.7221E-02 seconds\n", + " Sampling source sites = 1.6637E-02 seconds\n", + " SEND/RECV source sites = 1.0474E-02 seconds\n", + " Time accumulating tallies = 9.2191E-04 seconds\n", + " Total time for finalization = 1.2513E-02 seconds\n", + " Total time elapsed = 9.1307E+01 seconds\n", + " Calculation Rate (inactive) = 33572.9 neutrons/second\n", + " Calculation Rate (active) = 4549.45 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.22358 +/- 0.00179\n", - " k-effective (Track-length) = 1.22487 +/- 0.00188\n", - " k-effective (Absorption) = 1.22300 +/- 0.00114\n", - " Combined k-effective = 1.22347 +/- 0.00106\n", + " k-effective (Collision) = 1.22348 +/- 0.00169\n", + " k-effective (Track-length) = 1.22397 +/- 0.00183\n", + " k-effective (Absorption) = 1.22467 +/- 0.00117\n", + " Combined k-effective = 1.22448 +/- 0.00108\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -634,7 +643,7 @@ "outputs": [], "source": [ "# Load the last statepoint file\n", - "sp = openmc.StatePoint('statepoint.074.h5')" + "sp = openmc.StatePoint('statepoint.082.h5')" ] }, { @@ -696,25 +705,25 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU235\n", "\tCross Sections [barns]:\n", - " Group 1 [821000.0 - 20000000.0eV]:\t3.30e+00 +/- 2.19e-01%\n", - " Group 2 [5530.0 - 821000.0 eV]:\t3.96e+00 +/- 1.32e-01%\n", - " Group 3 [4.0 - 5530.0 eV]:\t5.52e+01 +/- 2.31e-01%\n", - " Group 4 [0.625 - 4.0 eV]:\t8.83e+01 +/- 2.96e-01%\n", - " Group 5 [0.28 - 0.625 eV]:\t2.90e+02 +/- 4.64e-01%\n", - " Group 6 [0.14 - 0.28 eV]:\t4.49e+02 +/- 4.22e-01%\n", - " Group 7 [0.058 - 0.14 eV]:\t6.87e+02 +/- 2.97e-01%\n", - " Group 8 [0.0 - 0.058 eV]:\t1.44e+03 +/- 2.91e-01%\n", + " Group 1 [821000.0 - 20000000.0eV]:\t3.30e+00 +/- 2.14e-01%\n", + " Group 2 [5530.0 - 821000.0 eV]:\t3.96e+00 +/- 1.33e-01%\n", + " Group 3 [4.0 - 5530.0 eV]:\t5.50e+01 +/- 2.29e-01%\n", + " Group 4 [0.625 - 4.0 eV]:\t8.85e+01 +/- 3.10e-01%\n", + " Group 5 [0.28 - 0.625 eV]:\t2.90e+02 +/- 3.94e-01%\n", + " Group 6 [0.14 - 0.28 eV]:\t4.49e+02 +/- 4.12e-01%\n", + " Group 7 [0.058 - 0.14 eV]:\t6.87e+02 +/- 3.01e-01%\n", + " Group 8 [0.0 - 0.058 eV]:\t1.44e+03 +/- 2.79e-01%\n", "\n", "\tNuclide =\tU238\n", "\tCross Sections [barns]:\n", - " Group 1 [821000.0 - 20000000.0eV]:\t1.06e+00 +/- 2.56e-01%\n", - " Group 2 [5530.0 - 821000.0 eV]:\t1.21e-03 +/- 2.55e-01%\n", - " Group 3 [4.0 - 5530.0 eV]:\t5.77e-04 +/- 3.67e+00%\n", - " Group 4 [0.625 - 4.0 eV]:\t6.54e-06 +/- 2.74e-01%\n", - " Group 5 [0.28 - 0.625 eV]:\t1.07e-05 +/- 4.55e-01%\n", - " Group 6 [0.14 - 0.28 eV]:\t1.55e-05 +/- 4.25e-01%\n", - " Group 7 [0.058 - 0.14 eV]:\t2.30e-05 +/- 2.97e-01%\n", - " Group 8 [0.0 - 0.058 eV]:\t4.24e-05 +/- 2.90e-01%\n", + " Group 1 [821000.0 - 20000000.0eV]:\t1.06e+00 +/- 2.53e-01%\n", + " Group 2 [5530.0 - 821000.0 eV]:\t1.21e-03 +/- 2.60e-01%\n", + " Group 3 [4.0 - 5530.0 eV]:\t5.73e-04 +/- 2.93e+00%\n", + " Group 4 [0.625 - 4.0 eV]:\t6.54e-06 +/- 2.72e-01%\n", + " Group 5 [0.28 - 0.625 eV]:\t1.07e-05 +/- 3.83e-01%\n", + " Group 6 [0.14 - 0.28 eV]:\t1.55e-05 +/- 4.13e-01%\n", + " Group 7 [0.058 - 0.14 eV]:\t2.30e-05 +/- 3.01e-01%\n", + " Group 8 [0.0 - 0.058 eV]:\t4.24e-05 +/- 2.79e-01%\n", "\n", "\n", "\n" @@ -724,7 +733,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] } @@ -757,14 +766,14 @@ "\tDomain Type =\tcell\n", "\tDomain ID =\t10000\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [821000.0 - 20000000.0eV]:\t2.52e-02 +/- 2.44e-01%\n", - " Group 2 [5530.0 - 821000.0 eV]:\t1.51e-03 +/- 1.30e-01%\n", - " Group 3 [4.0 - 5530.0 eV]:\t2.07e-02 +/- 2.31e-01%\n", - " Group 4 [0.625 - 4.0 eV]:\t3.31e-02 +/- 2.96e-01%\n", - " Group 5 [0.28 - 0.625 eV]:\t1.09e-01 +/- 4.64e-01%\n", - " Group 6 [0.14 - 0.28 eV]:\t1.69e-01 +/- 4.22e-01%\n", - " Group 7 [0.058 - 0.14 eV]:\t2.58e-01 +/- 2.97e-01%\n", - " Group 8 [0.0 - 0.058 eV]:\t5.40e-01 +/- 2.91e-01%\n", + " Group 1 [821000.0 - 20000000.0eV]:\t2.52e-02 +/- 2.41e-01%\n", + " Group 2 [5530.0 - 821000.0 eV]:\t1.51e-03 +/- 1.31e-01%\n", + " Group 3 [4.0 - 5530.0 eV]:\t2.07e-02 +/- 2.29e-01%\n", + " Group 4 [0.625 - 4.0 eV]:\t3.32e-02 +/- 3.10e-01%\n", + " Group 5 [0.28 - 0.625 eV]:\t1.09e-01 +/- 3.94e-01%\n", + " Group 6 [0.14 - 0.28 eV]:\t1.69e-01 +/- 4.12e-01%\n", + " Group 7 [0.058 - 0.14 eV]:\t2.58e-01 +/- 3.01e-01%\n", + " Group 8 [0.0 - 0.058 eV]:\t5.40e-01 +/- 2.79e-01%\n", "\n", "\n", "\n" @@ -794,7 +803,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -821,8 +830,8 @@ " 1\n", " 1\n", " H1\n", - " 0.234115\n", - " 0.003568\n", + " 0.233991\n", + " 0.003752\n", " \n", " \n", " 127\n", @@ -830,8 +839,8 @@ " 1\n", " 1\n", " O16\n", - " 1.563707\n", - " 0.005953\n", + " 1.569288\n", + " 0.006360\n", " \n", " \n", " 124\n", @@ -839,8 +848,8 @@ " 1\n", " 2\n", " H1\n", - " 1.594129\n", - " 0.002369\n", + " 1.587279\n", + " 0.003098\n", " \n", " \n", " 125\n", @@ -848,8 +857,8 @@ " 1\n", " 2\n", " O16\n", - " 0.285761\n", - " 0.001676\n", + " 0.285599\n", + " 0.001422\n", " \n", " \n", " 122\n", @@ -857,8 +866,8 @@ " 1\n", " 3\n", " H1\n", - " 0.011089\n", - " 0.000248\n", + " 0.010482\n", + " 0.000220\n", " \n", " \n", " 123\n", @@ -875,8 +884,8 @@ " 1\n", " 4\n", " H1\n", - " 0.000000\n", - " 0.000000\n", + " 0.000009\n", + " 0.000006\n", " \n", " \n", " 121\n", @@ -893,8 +902,8 @@ " 1\n", " 5\n", " H1\n", - " 0.000000\n", - " 0.000000\n", + " 0.000005\n", + " 0.000005\n", " \n", " \n", " 119\n", @@ -911,15 +920,15 @@ ], "text/plain": [ " cell group in group out nuclide mean std. dev.\n", - "126 10002 1 1 H1 0.234115 0.003568\n", - "127 10002 1 1 O16 1.563707 0.005953\n", - "124 10002 1 2 H1 1.594129 0.002369\n", - "125 10002 1 2 O16 0.285761 0.001676\n", - "122 10002 1 3 H1 0.011089 0.000248\n", + "126 10002 1 1 H1 0.233991 0.003752\n", + "127 10002 1 1 O16 1.569288 0.006360\n", + "124 10002 1 2 H1 1.587279 0.003098\n", + "125 10002 1 2 O16 0.285599 0.001422\n", + "122 10002 1 3 H1 0.010482 0.000220\n", "123 10002 1 3 O16 0.000000 0.000000\n", - "120 10002 1 4 H1 0.000000 0.000000\n", + "120 10002 1 4 H1 0.000009 0.000006\n", "121 10002 1 4 O16 0.000000 0.000000\n", - "118 10002 1 5 H1 0.000000 0.000000\n", + "118 10002 1 5 H1 0.000005 0.000005\n", "119 10002 1 5 O16 0.000000 0.000000" ] }, @@ -980,18 +989,18 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU235\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.625 - 20000000.0eV]:\t7.73e-03 +/- 5.06e-01%\n", - " Group 2 [0.0 - 0.625 eV]:\t1.82e-01 +/- 2.05e-01%\n", + " Group 1 [0.625 - 20000000.0eV]:\t7.84e-03 +/- 4.34e-01%\n", + " Group 2 [0.0 - 0.625 eV]:\t1.82e-01 +/- 1.91e-01%\n", "\n", "\tNuclide =\tU238\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.625 - 20000000.0eV]:\t2.17e-01 +/- 1.44e-01%\n", - " Group 2 [0.0 - 0.625 eV]:\t2.53e-01 +/- 2.57e-01%\n", + " Group 1 [0.625 - 20000000.0eV]:\t2.17e-01 +/- 1.38e-01%\n", + " Group 2 [0.0 - 0.625 eV]:\t2.53e-01 +/- 2.27e-01%\n", "\n", "\tNuclide =\tO16\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.625 - 20000000.0eV]:\t1.46e-01 +/- 1.60e-01%\n", - " Group 2 [0.0 - 0.625 eV]:\t1.75e-01 +/- 2.94e-01%\n", + " Group 1 [0.625 - 20000000.0eV]:\t1.45e-01 +/- 1.54e-01%\n", + " Group 2 [0.0 - 0.625 eV]:\t1.74e-01 +/- 2.60e-01%\n", "\n", "\n", "\n" @@ -1030,48 +1039,48 @@ " 10000\n", " 1\n", " U235\n", - " 20.611692\n", - " 0.104237\n", + " 20.912730\n", + " 0.090857\n", " \n", " \n", " 4\n", " 10000\n", " 1\n", " U238\n", - " 9.585358\n", - " 0.013808\n", + " 9.577234\n", + " 0.013248\n", " \n", " \n", " 5\n", " 10000\n", " 1\n", " O16\n", - " 3.164190\n", - " 0.005049\n", + " 3.158619\n", + " 0.004864\n", " \n", " \n", " 0\n", " 10000\n", " 2\n", " U235\n", - " 485.413426\n", - " 0.996410\n", + " 485.364898\n", + " 0.925632\n", " \n", " \n", " 1\n", " 10000\n", " 2\n", " U238\n", - " 11.190386\n", - " 0.028731\n", + " 11.196946\n", + " 0.025466\n", " \n", " \n", " 2\n", " 10000\n", " 2\n", " O16\n", - " 3.794859\n", - " 0.011139\n", + " 3.788841\n", + " 0.009855\n", " \n", " \n", "\n", @@ -1079,12 +1088,12 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "3 10000 1 U235 20.611692 0.104237\n", - "4 10000 1 U238 9.585358 0.013808\n", - "5 10000 1 O16 3.164190 0.005049\n", - "0 10000 2 U235 485.413426 0.996410\n", - "1 10000 2 U238 11.190386 0.028731\n", - "2 10000 2 O16 3.794859 0.011139" + "3 10000 1 U235 20.912730 0.090857\n", + "4 10000 1 U238 9.577234 0.013248\n", + "5 10000 1 O16 3.158619 0.004864\n", + "0 10000 2 U235 485.364898 0.925632\n", + "1 10000 2 U238 11.196946 0.025466\n", + "2 10000 2 O16 3.788841 0.009855" ] }, "execution_count": 22, @@ -1119,8 +1128,9 @@ }, "outputs": [], "source": [ - "# Create an OpenMOC Geometry from the OpenCG Geometry\n", - "openmoc_geometry = get_openmoc_geometry(sp.summary.opencg_geometry)" + "# Create an OpenMOC Geometry from an equivalent OpenCG Geometry\n", + "opencg_geometry = get_opencg_geometry(sp.summary.geometry)\n", + "openmoc_geometry = get_openmoc_geometry(opencg_geometry)" ] }, { @@ -1141,11 +1151,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1201,239 +1211,239 @@ "text": [ "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.423123\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.475922\tres = 5.769E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.491444\tres = 1.248E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.487441\tres = 3.261E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.483949\tres = 8.144E-03\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.477326\tres = 7.164E-03\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.469012\tres = 1.369E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.460422\tres = 1.742E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.450721\tres = 1.832E-02\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.441532\tres = 2.107E-02\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.432168\tres = 2.039E-02\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.423131\tres = 2.121E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.414705\tres = 2.091E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.406943\tres = 1.991E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.399627\tres = 1.872E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.393329\tres = 1.798E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.387699\tres = 1.576E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.382949\tres = 1.431E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.379028\tres = 1.225E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.375935\tres = 1.024E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.373785\tres = 8.161E-03\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.372655\tres = 5.719E-03\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.372273\tres = 3.023E-03\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.372879\tres = 1.024E-03\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.374353\tres = 1.629E-03\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.376678\tres = 3.952E-03\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.379854\tres = 6.211E-03\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.383870\tres = 8.433E-03\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.388664\tres = 1.057E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.394216\tres = 1.249E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.400506\tres = 1.429E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.407502\tres = 1.596E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.415145\tres = 1.747E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.423426\tres = 1.876E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.432299\tres = 1.995E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.441713\tres = 2.095E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.451665\tres = 2.178E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.462081\tres = 2.253E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.472952\tres = 2.306E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.484221\tres = 2.352E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.495862\tres = 2.383E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.507836\tres = 2.404E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.520110\tres = 2.415E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.532648\tres = 2.417E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.545419\tres = 2.411E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.558389\tres = 2.398E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.571526\tres = 2.378E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.584803\tres = 2.353E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.598190\tres = 2.323E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.611658\tres = 2.289E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.625182\tres = 2.252E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.638739\tres = 2.211E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.652303\tres = 2.168E-02\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.665851\tres = 2.124E-02\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.679365\tres = 2.077E-02\n", - "[ NORMAL ] Iteration 55:\tk_eff = 0.692822\tres = 2.030E-02\n", - "[ NORMAL ] Iteration 56:\tk_eff = 0.706205\tres = 1.981E-02\n", - "[ NORMAL ] Iteration 57:\tk_eff = 0.719497\tres = 1.932E-02\n", - "[ NORMAL ] Iteration 58:\tk_eff = 0.732680\tres = 1.882E-02\n", - "[ NORMAL ] Iteration 59:\tk_eff = 0.745741\tres = 1.832E-02\n", - "[ NORMAL ] Iteration 60:\tk_eff = 0.758665\tres = 1.783E-02\n", - "[ NORMAL ] Iteration 61:\tk_eff = 0.771440\tres = 1.733E-02\n", - "[ NORMAL ] Iteration 62:\tk_eff = 0.784054\tres = 1.684E-02\n", - "[ NORMAL ] Iteration 63:\tk_eff = 0.796496\tres = 1.635E-02\n", - "[ NORMAL ] Iteration 64:\tk_eff = 0.808757\tres = 1.587E-02\n", - "[ NORMAL ] Iteration 65:\tk_eff = 0.820828\tres = 1.539E-02\n", - "[ NORMAL ] Iteration 66:\tk_eff = 0.832701\tres = 1.493E-02\n", - "[ NORMAL ] Iteration 67:\tk_eff = 0.844370\tres = 1.446E-02\n", - "[ NORMAL ] Iteration 68:\tk_eff = 0.855828\tres = 1.401E-02\n", - "[ NORMAL ] Iteration 69:\tk_eff = 0.867071\tres = 1.357E-02\n", - "[ NORMAL ] Iteration 70:\tk_eff = 0.878094\tres = 1.314E-02\n", - "[ NORMAL ] Iteration 71:\tk_eff = 0.888893\tres = 1.271E-02\n", - "[ NORMAL ] Iteration 72:\tk_eff = 0.899465\tres = 1.230E-02\n", - "[ NORMAL ] Iteration 73:\tk_eff = 0.909808\tres = 1.189E-02\n", - "[ NORMAL ] Iteration 74:\tk_eff = 0.919919\tres = 1.150E-02\n", - "[ NORMAL ] Iteration 75:\tk_eff = 0.929799\tres = 1.111E-02\n", - "[ NORMAL ] Iteration 76:\tk_eff = 0.939445\tres = 1.074E-02\n", - "[ NORMAL ] Iteration 77:\tk_eff = 0.948857\tres = 1.037E-02\n", - "[ NORMAL ] Iteration 78:\tk_eff = 0.958037\tres = 1.002E-02\n", - "[ NORMAL ] Iteration 79:\tk_eff = 0.966984\tres = 9.675E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 0.975699\tres = 9.339E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 0.984185\tres = 9.012E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 0.992442\tres = 8.697E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.000473\tres = 8.390E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.008281\tres = 8.092E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.015867\tres = 7.804E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.023234\tres = 7.524E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.030387\tres = 7.253E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.037327\tres = 6.990E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.044059\tres = 6.736E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.050586\tres = 6.489E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.056911\tres = 6.251E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.063039\tres = 6.021E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.068972\tres = 5.798E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.074717\tres = 5.582E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.080275\tres = 5.373E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.085652\tres = 5.172E-03\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.090851\tres = 4.977E-03\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.095877\tres = 4.789E-03\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.100733\tres = 4.607E-03\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.105424\tres = 4.432E-03\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.109955\tres = 4.262E-03\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.114329\tres = 4.098E-03\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.118550\tres = 3.941E-03\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.122623\tres = 3.789E-03\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.126552\tres = 3.641E-03\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.130340\tres = 3.499E-03\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.133992\tres = 3.362E-03\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.137511\tres = 3.231E-03\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.140902\tres = 3.103E-03\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.144169\tres = 2.981E-03\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.147314\tres = 2.863E-03\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.150342\tres = 2.750E-03\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.153257\tres = 2.639E-03\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.156062\tres = 2.534E-03\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.158761\tres = 2.432E-03\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.161357\tres = 2.334E-03\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.163854\tres = 2.240E-03\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.166253\tres = 2.150E-03\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.168560\tres = 2.062E-03\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.170777\tres = 1.978E-03\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.172907\tres = 1.897E-03\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.174953\tres = 1.819E-03\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.176918\tres = 1.745E-03\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.178805\tres = 1.672E-03\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.180617\tres = 1.603E-03\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.182356\tres = 1.537E-03\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.184025\tres = 1.473E-03\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.185626\tres = 1.412E-03\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.187163\tres = 1.352E-03\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.188637\tres = 1.296E-03\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.190050\tres = 1.241E-03\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.191406\tres = 1.189E-03\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.192704\tres = 1.139E-03\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.193949\tres = 1.090E-03\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.195144\tres = 1.044E-03\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.196287\tres = 1.001E-03\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.197383\tres = 9.567E-04\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.198433\tres = 9.157E-04\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.199438\tres = 8.775E-04\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.200401\tres = 8.388E-04\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.201324\tres = 8.030E-04\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.202206\tres = 7.682E-04\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.203051\tres = 7.348E-04\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.203860\tres = 7.028E-04\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.204634\tres = 6.722E-04\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.205375\tres = 6.429E-04\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.206084\tres = 6.153E-04\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.206762\tres = 5.883E-04\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.207411\tres = 5.617E-04\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.208031\tres = 5.377E-04\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.208623\tres = 5.137E-04\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.209191\tres = 4.906E-04\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.209733\tres = 4.694E-04\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.210251\tres = 4.486E-04\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.210747\tres = 4.280E-04\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.211220\tres = 4.098E-04\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.211673\tres = 3.908E-04\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.212105\tres = 3.738E-04\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.212518\tres = 3.567E-04\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.212913\tres = 3.409E-04\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.213290\tres = 3.260E-04\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.213650\tres = 3.104E-04\n", - "[ NORMAL ] Iteration 163:\tk_eff = 1.213995\tres = 2.965E-04\n", - "[ NORMAL ] Iteration 164:\tk_eff = 1.214322\tres = 2.838E-04\n", - "[ NORMAL ] Iteration 165:\tk_eff = 1.214637\tres = 2.701E-04\n", - "[ NORMAL ] Iteration 166:\tk_eff = 1.214937\tres = 2.587E-04\n", - "[ NORMAL ] Iteration 167:\tk_eff = 1.215222\tres = 2.469E-04\n", - "[ NORMAL ] Iteration 168:\tk_eff = 1.215494\tres = 2.348E-04\n", - "[ NORMAL ] Iteration 169:\tk_eff = 1.215755\tres = 2.242E-04\n", - "[ NORMAL ] Iteration 170:\tk_eff = 1.216004\tres = 2.144E-04\n", - "[ NORMAL ] Iteration 171:\tk_eff = 1.216241\tres = 2.048E-04\n", - "[ NORMAL ] Iteration 172:\tk_eff = 1.216467\tres = 1.950E-04\n", - "[ NORMAL ] Iteration 173:\tk_eff = 1.216683\tres = 1.857E-04\n", - "[ NORMAL ] Iteration 174:\tk_eff = 1.216889\tres = 1.778E-04\n", - "[ NORMAL ] Iteration 175:\tk_eff = 1.217085\tres = 1.696E-04\n", - "[ NORMAL ] Iteration 176:\tk_eff = 1.217273\tres = 1.614E-04\n", - "[ NORMAL ] Iteration 177:\tk_eff = 1.217452\tres = 1.543E-04\n", - "[ NORMAL ] Iteration 178:\tk_eff = 1.217623\tres = 1.465E-04\n", - "[ NORMAL ] Iteration 179:\tk_eff = 1.217785\tres = 1.405E-04\n", - "[ NORMAL ] Iteration 180:\tk_eff = 1.217940\tres = 1.335E-04\n", - "[ NORMAL ] Iteration 181:\tk_eff = 1.218088\tres = 1.269E-04\n", - "[ NORMAL ] Iteration 182:\tk_eff = 1.218229\tres = 1.218E-04\n", - "[ NORMAL ] Iteration 183:\tk_eff = 1.218363\tres = 1.157E-04\n", - "[ NORMAL ] Iteration 184:\tk_eff = 1.218492\tres = 1.101E-04\n", - "[ NORMAL ] Iteration 185:\tk_eff = 1.218615\tres = 1.056E-04\n", - "[ NORMAL ] Iteration 186:\tk_eff = 1.218731\tres = 1.007E-04\n", - "[ NORMAL ] Iteration 187:\tk_eff = 1.218841\tres = 9.536E-05\n", - "[ NORMAL ] Iteration 188:\tk_eff = 1.218947\tres = 9.039E-05\n", - "[ NORMAL ] Iteration 189:\tk_eff = 1.219048\tres = 8.671E-05\n", - "[ NORMAL ] Iteration 190:\tk_eff = 1.219144\tres = 8.281E-05\n", - "[ NORMAL ] Iteration 191:\tk_eff = 1.219236\tres = 7.903E-05\n", - "[ NORMAL ] Iteration 192:\tk_eff = 1.219323\tres = 7.535E-05\n", - "[ NORMAL ] Iteration 193:\tk_eff = 1.219406\tres = 7.153E-05\n", - "[ NORMAL ] Iteration 194:\tk_eff = 1.219485\tres = 6.803E-05\n", - "[ NORMAL ] Iteration 195:\tk_eff = 1.219561\tres = 6.458E-05\n", - "[ NORMAL ] Iteration 196:\tk_eff = 1.219633\tres = 6.195E-05\n", - "[ NORMAL ] Iteration 197:\tk_eff = 1.219701\tres = 5.920E-05\n", - "[ NORMAL ] Iteration 198:\tk_eff = 1.219766\tres = 5.593E-05\n", - "[ NORMAL ] Iteration 199:\tk_eff = 1.219829\tres = 5.350E-05\n", - "[ NORMAL ] Iteration 200:\tk_eff = 1.219887\tres = 5.127E-05\n", - "[ NORMAL ] Iteration 201:\tk_eff = 1.219944\tres = 4.821E-05\n", - "[ NORMAL ] Iteration 202:\tk_eff = 1.219998\tres = 4.617E-05\n", - "[ NORMAL ] Iteration 203:\tk_eff = 1.220048\tres = 4.406E-05\n", - "[ NORMAL ] Iteration 204:\tk_eff = 1.220097\tres = 4.167E-05\n", - "[ NORMAL ] Iteration 205:\tk_eff = 1.220143\tres = 4.017E-05\n", - "[ NORMAL ] Iteration 206:\tk_eff = 1.220188\tres = 3.759E-05\n", - "[ NORMAL ] Iteration 207:\tk_eff = 1.220230\tres = 3.628E-05\n", - "[ NORMAL ] Iteration 208:\tk_eff = 1.220270\tres = 3.429E-05\n", - "[ NORMAL ] Iteration 209:\tk_eff = 1.220307\tres = 3.268E-05\n", - "[ NORMAL ] Iteration 210:\tk_eff = 1.220343\tres = 3.102E-05\n", - "[ NORMAL ] Iteration 211:\tk_eff = 1.220377\tres = 2.945E-05\n", - "[ NORMAL ] Iteration 212:\tk_eff = 1.220410\tres = 2.801E-05\n", - "[ NORMAL ] Iteration 213:\tk_eff = 1.220441\tres = 2.693E-05\n", - "[ NORMAL ] Iteration 214:\tk_eff = 1.220470\tres = 2.516E-05\n", - "[ NORMAL ] Iteration 215:\tk_eff = 1.220498\tres = 2.414E-05\n", - "[ NORMAL ] Iteration 216:\tk_eff = 1.220525\tres = 2.300E-05\n", - "[ NORMAL ] Iteration 217:\tk_eff = 1.220550\tres = 2.205E-05\n", - "[ NORMAL ] Iteration 218:\tk_eff = 1.220575\tres = 2.056E-05\n", - "[ NORMAL ] Iteration 219:\tk_eff = 1.220598\tres = 2.005E-05\n", - "[ NORMAL ] Iteration 220:\tk_eff = 1.220620\tres = 1.878E-05\n", - "[ NORMAL ] Iteration 221:\tk_eff = 1.220640\tres = 1.785E-05\n", - "[ NORMAL ] Iteration 222:\tk_eff = 1.220660\tres = 1.689E-05\n", - "[ NORMAL ] Iteration 223:\tk_eff = 1.220679\tres = 1.624E-05\n", - "[ NORMAL ] Iteration 224:\tk_eff = 1.220697\tres = 1.546E-05\n", - "[ NORMAL ] Iteration 225:\tk_eff = 1.220714\tres = 1.473E-05\n", - "[ NORMAL ] Iteration 226:\tk_eff = 1.220731\tres = 1.431E-05\n", - "[ NORMAL ] Iteration 227:\tk_eff = 1.220747\tres = 1.359E-05\n", - "[ NORMAL ] Iteration 228:\tk_eff = 1.220762\tres = 1.274E-05\n", - "[ NORMAL ] Iteration 229:\tk_eff = 1.220776\tres = 1.210E-05\n", - "[ NORMAL ] Iteration 230:\tk_eff = 1.220789\tres = 1.159E-05\n", - "[ NORMAL ] Iteration 231:\tk_eff = 1.220801\tres = 1.069E-05\n", - "[ NORMAL ] Iteration 232:\tk_eff = 1.220813\tres = 1.043E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.423140\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.475976\tres = 5.769E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.491509\tres = 1.249E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.487503\tres = 3.263E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.484002\tres = 8.150E-03\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.477365\tres = 7.181E-03\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.469036\tres = 1.371E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.460429\tres = 1.745E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.450711\tres = 1.835E-02\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.441506\tres = 2.111E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.432127\tres = 2.042E-02\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.423076\tres = 2.124E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.414637\tres = 2.095E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.406863\tres = 1.995E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.399537\tres = 1.875E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.393230\tres = 1.801E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.387592\tres = 1.579E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.382836\tres = 1.434E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.378910\tres = 1.227E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.375812\tres = 1.026E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.373658\tres = 8.176E-03\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.372526\tres = 5.730E-03\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.372142\tres = 3.031E-03\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.372747\tres = 1.030E-03\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.374220\tres = 1.627E-03\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.376545\tres = 3.951E-03\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.379722\tres = 6.213E-03\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.383738\tres = 8.437E-03\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.388532\tres = 1.058E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.394086\tres = 1.249E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.400378\tres = 1.429E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.407375\tres = 1.597E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.415020\tres = 1.747E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.423303\tres = 1.877E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.432177\tres = 1.996E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.441592\tres = 2.096E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.451546\tres = 2.179E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.461964\tres = 2.254E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.472835\tres = 2.307E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.484106\tres = 2.353E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.495748\tres = 2.384E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.507723\tres = 2.405E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.519997\tres = 2.416E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.532536\tres = 2.418E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.545307\tres = 2.411E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.558277\tres = 2.398E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.571414\tres = 2.379E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.584691\tres = 2.353E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.598077\tres = 2.323E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.611545\tres = 2.289E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.625068\tres = 2.252E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.638624\tres = 2.211E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.652187\tres = 2.169E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.665734\tres = 2.124E-02\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.679246\tres = 2.077E-02\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.692702\tres = 2.030E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 0.706083\tres = 1.981E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 0.719373\tres = 1.932E-02\n", + "[ NORMAL ] Iteration 58:\tk_eff = 0.732554\tres = 1.882E-02\n", + "[ NORMAL ] Iteration 59:\tk_eff = 0.745613\tres = 1.832E-02\n", + "[ NORMAL ] Iteration 60:\tk_eff = 0.758535\tres = 1.783E-02\n", + "[ NORMAL ] Iteration 61:\tk_eff = 0.771307\tres = 1.733E-02\n", + "[ NORMAL ] Iteration 62:\tk_eff = 0.783919\tres = 1.684E-02\n", + "[ NORMAL ] Iteration 63:\tk_eff = 0.796359\tres = 1.635E-02\n", + "[ NORMAL ] Iteration 64:\tk_eff = 0.808617\tres = 1.587E-02\n", + "[ NORMAL ] Iteration 65:\tk_eff = 0.820685\tres = 1.539E-02\n", + "[ NORMAL ] Iteration 66:\tk_eff = 0.832556\tres = 1.492E-02\n", + "[ NORMAL ] Iteration 67:\tk_eff = 0.844222\tres = 1.446E-02\n", + "[ NORMAL ] Iteration 68:\tk_eff = 0.855678\tres = 1.401E-02\n", + "[ NORMAL ] Iteration 69:\tk_eff = 0.866918\tres = 1.357E-02\n", + "[ NORMAL ] Iteration 70:\tk_eff = 0.877939\tres = 1.314E-02\n", + "[ NORMAL ] Iteration 71:\tk_eff = 0.888734\tres = 1.271E-02\n", + "[ NORMAL ] Iteration 72:\tk_eff = 0.899303\tres = 1.230E-02\n", + "[ NORMAL ] Iteration 73:\tk_eff = 0.909643\tres = 1.189E-02\n", + "[ NORMAL ] Iteration 74:\tk_eff = 0.919752\tres = 1.150E-02\n", + "[ NORMAL ] Iteration 75:\tk_eff = 0.929628\tres = 1.111E-02\n", + "[ NORMAL ] Iteration 76:\tk_eff = 0.939271\tres = 1.074E-02\n", + "[ NORMAL ] Iteration 77:\tk_eff = 0.948681\tres = 1.037E-02\n", + "[ NORMAL ] Iteration 78:\tk_eff = 0.957857\tres = 1.002E-02\n", + "[ NORMAL ] Iteration 79:\tk_eff = 0.966802\tres = 9.673E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 0.975514\tres = 9.338E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 0.983997\tres = 9.012E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 0.992252\tres = 8.696E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.000280\tres = 8.389E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.008085\tres = 8.091E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.015668\tres = 7.803E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.023034\tres = 7.522E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.030183\tres = 7.252E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.037121\tres = 6.989E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.043850\tres = 6.735E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.050374\tres = 6.488E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.056697\tres = 6.250E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.062823\tres = 6.020E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.068754\tres = 5.797E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.074496\tres = 5.581E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.080052\tres = 5.372E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.085427\tres = 5.171E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.090623\tres = 4.976E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.095647\tres = 4.788E-03\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.100501\tres = 4.606E-03\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.105190\tres = 4.431E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.109719\tres = 4.261E-03\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.114091\tres = 4.098E-03\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.118310\tres = 3.940E-03\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.122382\tres = 3.787E-03\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.126308\tres = 3.640E-03\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.130095\tres = 3.498E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.133745\tres = 3.362E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.137262\tres = 3.230E-03\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.140652\tres = 3.102E-03\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.143916\tres = 2.980E-03\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.147061\tres = 2.862E-03\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.150087\tres = 2.749E-03\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.153001\tres = 2.638E-03\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.155805\tres = 2.534E-03\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.158502\tres = 2.432E-03\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.161096\tres = 2.333E-03\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.163591\tres = 2.239E-03\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.165989\tres = 2.149E-03\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.168295\tres = 2.061E-03\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.170511\tres = 1.978E-03\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.172640\tres = 1.896E-03\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.174685\tres = 1.819E-03\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.176649\tres = 1.744E-03\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.178535\tres = 1.672E-03\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.180345\tres = 1.603E-03\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.182083\tres = 1.536E-03\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.183751\tres = 1.473E-03\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.185352\tres = 1.411E-03\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.186888\tres = 1.352E-03\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.188360\tres = 1.295E-03\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.189772\tres = 1.241E-03\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.191127\tres = 1.189E-03\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.192425\tres = 1.138E-03\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.193670\tres = 1.090E-03\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.194863\tres = 1.044E-03\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.196006\tres = 9.995E-04\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.197101\tres = 9.566E-04\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.198150\tres = 9.162E-04\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.199155\tres = 8.766E-04\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.200116\tres = 8.384E-04\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.201038\tres = 8.017E-04\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.201920\tres = 7.684E-04\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.202765\tres = 7.343E-04\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.203573\tres = 7.030E-04\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.204347\tres = 6.718E-04\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.205087\tres = 6.424E-04\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.205796\tres = 6.147E-04\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.206473\tres = 5.881E-04\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.207122\tres = 5.614E-04\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.207741\tres = 5.376E-04\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.208334\tres = 5.136E-04\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.208901\tres = 4.903E-04\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.209443\tres = 4.695E-04\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.209961\tres = 4.482E-04\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.210455\tres = 4.282E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.210928\tres = 4.088E-04\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.211380\tres = 3.910E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.211813\tres = 3.730E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.212225\tres = 3.573E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.212620\tres = 3.403E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.212997\tres = 3.256E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.213356\tres = 3.107E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.213700\tres = 2.965E-04\n", + "[ NORMAL ] Iteration 164:\tk_eff = 1.214028\tres = 2.829E-04\n", + "[ NORMAL ] Iteration 165:\tk_eff = 1.214341\tres = 2.706E-04\n", + "[ NORMAL ] Iteration 166:\tk_eff = 1.214640\tres = 2.581E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.214926\tres = 2.465E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.215199\tres = 2.352E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.215459\tres = 2.241E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.215707\tres = 2.144E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.215944\tres = 2.036E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.216170\tres = 1.952E-04\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.216386\tres = 1.854E-04\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.216592\tres = 1.780E-04\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.216788\tres = 1.689E-04\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.216976\tres = 1.615E-04\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.217154\tres = 1.545E-04\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.217325\tres = 1.462E-04\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.217487\tres = 1.400E-04\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.217642\tres = 1.336E-04\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.217789\tres = 1.271E-04\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.217931\tres = 1.212E-04\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.218065\tres = 1.160E-04\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.218193\tres = 1.102E-04\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.218315\tres = 1.054E-04\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.218431\tres = 9.964E-05\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.218542\tres = 9.572E-05\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.218647\tres = 9.081E-05\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.218748\tres = 8.632E-05\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.218844\tres = 8.232E-05\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.218936\tres = 7.887E-05\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.219023\tres = 7.563E-05\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.219106\tres = 7.154E-05\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.219185\tres = 6.778E-05\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.219261\tres = 6.484E-05\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.219333\tres = 6.207E-05\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.219401\tres = 5.898E-05\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.219466\tres = 5.590E-05\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.219528\tres = 5.305E-05\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.219587\tres = 5.076E-05\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.219643\tres = 4.829E-05\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.219696\tres = 4.595E-05\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.219747\tres = 4.399E-05\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.219796\tres = 4.161E-05\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.219842\tres = 3.973E-05\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.219886\tres = 3.781E-05\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.219928\tres = 3.629E-05\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.219968\tres = 3.451E-05\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.220006\tres = 3.274E-05\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.220042\tres = 3.108E-05\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.220076\tres = 2.951E-05\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.220108\tres = 2.785E-05\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.220139\tres = 2.664E-05\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.220169\tres = 2.518E-05\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.220197\tres = 2.463E-05\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.220224\tres = 2.318E-05\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.220249\tres = 2.189E-05\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.220273\tres = 2.075E-05\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.220296\tres = 1.964E-05\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.220318\tres = 1.922E-05\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.220339\tres = 1.776E-05\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.220358\tres = 1.701E-05\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.220377\tres = 1.615E-05\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.220395\tres = 1.559E-05\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.220412\tres = 1.443E-05\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.220429\tres = 1.403E-05\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.220444\tres = 1.354E-05\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.220459\tres = 1.235E-05\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.220472\tres = 1.204E-05\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.220485\tres = 1.135E-05\n", + "[ NORMAL ] Iteration 231:\tk_eff = 1.220498\tres = 1.085E-05\n", + "[ NORMAL ] Iteration 232:\tk_eff = 1.220510\tres = 1.022E-05\n" ] } ], @@ -1465,9 +1475,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.223474\n", - "openmoc keff = 1.220813\n", - "bias [pcm]: -266.0\n" + "openmc keff = 1.224484\n", + "openmoc keff = 1.220510\n", + "bias [pcm]: -397.4\n" ] } ], @@ -1500,17 +1510,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } ], "source": [ - "openmoc_geometry = get_openmoc_geometry(sp.summary.opencg_geometry)\n", + "opencg_geometry = get_opencg_geometry(sp.summary.geometry)\n", + "openmoc_geometry = get_openmoc_geometry(opencg_geometry)\n", "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", "\n", "# Inject multi-group cross sections into OpenMOC Materials\n", @@ -1555,347 +1566,347 @@ "text": [ "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.366907\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.391217\tres = 6.331E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.393027\tres = 6.626E-02\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.381142\tres = 4.627E-03\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.375065\tres = 3.024E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.369644\tres = 1.594E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.365597\tres = 1.445E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.363111\tres = 1.095E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.361532\tres = 6.802E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.361339\tres = 4.349E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.362062\tres = 5.320E-04\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.363777\tres = 2.001E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.366396\tres = 4.735E-03\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.369859\tres = 7.199E-03\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.374042\tres = 9.454E-03\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.378972\tres = 1.131E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.384524\tres = 1.318E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.390678\tres = 1.465E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.397373\tres = 1.600E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.404563\tres = 1.714E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.412208\tres = 1.809E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.420270\tres = 1.890E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.428695\tres = 1.956E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.437463\tres = 2.005E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.446530\tres = 2.045E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.455867\tres = 2.073E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.465443\tres = 2.091E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.475229\tres = 2.101E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.485199\tres = 2.103E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.495328\tres = 2.098E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.505592\tres = 2.088E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.515970\tres = 2.072E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.526441\tres = 2.053E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.536986\tres = 2.029E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.547587\tres = 2.003E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.558228\tres = 1.974E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.568894\tres = 1.943E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.579570\tres = 1.911E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.590242\tres = 1.877E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.600898\tres = 1.841E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.611527\tres = 1.805E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.622119\tres = 1.769E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.632663\tres = 1.732E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.643149\tres = 1.695E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.653571\tres = 1.658E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.663920\tres = 1.620E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.674190\tres = 1.583E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.684373\tres = 1.547E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.694464\tres = 1.510E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.704458\tres = 1.475E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.714349\tres = 1.439E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.724134\tres = 1.404E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.733809\tres = 1.370E-02\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.743369\tres = 1.336E-02\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.752812\tres = 1.303E-02\n", - "[ NORMAL ] Iteration 55:\tk_eff = 0.762135\tres = 1.270E-02\n", - "[ NORMAL ] Iteration 56:\tk_eff = 0.771336\tres = 1.238E-02\n", - "[ NORMAL ] Iteration 57:\tk_eff = 0.780412\tres = 1.207E-02\n", - "[ NORMAL ] Iteration 58:\tk_eff = 0.789363\tres = 1.177E-02\n", - "[ NORMAL ] Iteration 59:\tk_eff = 0.798184\tres = 1.147E-02\n", - "[ NORMAL ] Iteration 60:\tk_eff = 0.806878\tres = 1.118E-02\n", - "[ NORMAL ] Iteration 61:\tk_eff = 0.815440\tres = 1.089E-02\n", - "[ NORMAL ] Iteration 62:\tk_eff = 0.823872\tres = 1.061E-02\n", - "[ NORMAL ] Iteration 63:\tk_eff = 0.832173\tres = 1.034E-02\n", - "[ NORMAL ] Iteration 64:\tk_eff = 0.840341\tres = 1.007E-02\n", - "[ NORMAL ] Iteration 65:\tk_eff = 0.848378\tres = 9.816E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 0.856281\tres = 9.563E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 0.864053\tres = 9.316E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 0.871694\tres = 9.076E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 0.879202\tres = 8.842E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 0.886580\tres = 8.614E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 0.893828\tres = 8.392E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 0.900946\tres = 8.175E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 0.907936\tres = 7.964E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 0.914798\tres = 7.758E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 0.921534\tres = 7.558E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 0.928144\tres = 7.363E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 0.934630\tres = 7.173E-03\n", - "[ NORMAL ] Iteration 78:\tk_eff = 0.940992\tres = 6.988E-03\n", - "[ NORMAL ] Iteration 79:\tk_eff = 0.947233\tres = 6.807E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 0.953353\tres = 6.633E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 0.959355\tres = 6.461E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 0.965239\tres = 6.295E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 0.971007\tres = 6.133E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 0.976660\tres = 5.975E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 0.982199\tres = 5.822E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 0.987627\tres = 5.672E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 0.992946\tres = 5.526E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 0.998156\tres = 5.385E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.003259\tres = 5.247E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.008257\tres = 5.113E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.013151\tres = 4.982E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.017944\tres = 4.854E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.022636\tres = 4.730E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.027230\tres = 4.609E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.031726\tres = 4.492E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.036126\tres = 4.377E-03\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.040434\tres = 4.265E-03\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.044649\tres = 4.157E-03\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.048774\tres = 4.052E-03\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.052810\tres = 3.949E-03\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.056758\tres = 3.848E-03\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.060621\tres = 3.751E-03\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.064400\tres = 3.655E-03\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.068096\tres = 3.563E-03\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.071711\tres = 3.472E-03\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.075247\tres = 3.384E-03\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.078705\tres = 3.299E-03\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.082086\tres = 3.216E-03\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.085392\tres = 3.135E-03\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.088624\tres = 3.056E-03\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.091784\tres = 2.977E-03\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.094875\tres = 2.903E-03\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.097895\tres = 2.831E-03\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.100847\tres = 2.759E-03\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.103734\tres = 2.689E-03\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.106555\tres = 2.622E-03\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.109312\tres = 2.556E-03\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.112007\tres = 2.492E-03\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.114640\tres = 2.429E-03\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.117214\tres = 2.368E-03\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.119728\tres = 2.309E-03\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.122186\tres = 2.251E-03\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.124587\tres = 2.195E-03\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.126934\tres = 2.140E-03\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.129226\tres = 2.086E-03\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.131465\tres = 2.034E-03\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.133653\tres = 1.983E-03\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.135791\tres = 1.934E-03\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.137879\tres = 1.886E-03\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.139918\tres = 1.839E-03\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.141911\tres = 1.792E-03\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.143857\tres = 1.748E-03\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.145758\tres = 1.704E-03\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.147615\tres = 1.662E-03\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.149428\tres = 1.621E-03\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.151199\tres = 1.580E-03\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.152929\tres = 1.541E-03\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.154618\tres = 1.503E-03\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.156268\tres = 1.465E-03\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.157878\tres = 1.429E-03\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.159452\tres = 1.393E-03\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.160988\tres = 1.359E-03\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.162488\tres = 1.325E-03\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.163953\tres = 1.292E-03\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.165384\tres = 1.261E-03\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.166780\tres = 1.229E-03\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.168144\tres = 1.198E-03\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.169476\tres = 1.169E-03\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.170776\tres = 1.140E-03\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.172045\tres = 1.111E-03\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.173284\tres = 1.084E-03\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.174493\tres = 1.057E-03\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.175674\tres = 1.031E-03\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.176828\tres = 1.005E-03\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.177953\tres = 9.813E-04\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.179052\tres = 9.563E-04\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.180125\tres = 9.324E-04\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.181172\tres = 9.100E-04\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.182194\tres = 8.877E-04\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.183192\tres = 8.650E-04\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.184167\tres = 8.445E-04\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.185117\tres = 8.233E-04\n", - "[ NORMAL ] Iteration 163:\tk_eff = 1.186045\tres = 8.028E-04\n", - "[ NORMAL ] Iteration 164:\tk_eff = 1.186951\tres = 7.831E-04\n", - "[ NORMAL ] Iteration 165:\tk_eff = 1.187836\tres = 7.636E-04\n", - "[ NORMAL ] Iteration 166:\tk_eff = 1.188699\tres = 7.452E-04\n", - "[ NORMAL ] Iteration 167:\tk_eff = 1.189541\tres = 7.265E-04\n", - "[ NORMAL ] Iteration 168:\tk_eff = 1.190363\tres = 7.087E-04\n", - "[ NORMAL ] Iteration 169:\tk_eff = 1.191166\tres = 6.911E-04\n", - "[ NORMAL ] Iteration 170:\tk_eff = 1.191949\tres = 6.742E-04\n", - "[ NORMAL ] Iteration 171:\tk_eff = 1.192714\tres = 6.578E-04\n", - "[ NORMAL ] Iteration 172:\tk_eff = 1.193460\tres = 6.414E-04\n", - "[ NORMAL ] Iteration 173:\tk_eff = 1.194188\tres = 6.255E-04\n", - "[ NORMAL ] Iteration 174:\tk_eff = 1.194899\tres = 6.097E-04\n", - "[ NORMAL ] Iteration 175:\tk_eff = 1.195593\tres = 5.957E-04\n", - "[ NORMAL ] Iteration 176:\tk_eff = 1.196270\tres = 5.807E-04\n", - "[ NORMAL ] Iteration 177:\tk_eff = 1.196931\tres = 5.660E-04\n", - "[ NORMAL ] Iteration 178:\tk_eff = 1.197576\tres = 5.523E-04\n", - "[ NORMAL ] Iteration 179:\tk_eff = 1.198204\tres = 5.389E-04\n", - "[ NORMAL ] Iteration 180:\tk_eff = 1.198819\tres = 5.250E-04\n", - "[ NORMAL ] Iteration 181:\tk_eff = 1.199418\tres = 5.125E-04\n", - "[ NORMAL ] Iteration 182:\tk_eff = 1.200003\tres = 5.002E-04\n", - "[ NORMAL ] Iteration 183:\tk_eff = 1.200574\tres = 4.878E-04\n", - "[ NORMAL ] Iteration 184:\tk_eff = 1.201131\tres = 4.760E-04\n", - "[ NORMAL ] Iteration 185:\tk_eff = 1.201674\tres = 4.637E-04\n", - "[ NORMAL ] Iteration 186:\tk_eff = 1.202206\tres = 4.523E-04\n", - "[ NORMAL ] Iteration 187:\tk_eff = 1.202724\tres = 4.421E-04\n", - "[ NORMAL ] Iteration 188:\tk_eff = 1.203229\tres = 4.306E-04\n", - "[ NORMAL ] Iteration 189:\tk_eff = 1.203722\tres = 4.200E-04\n", - "[ NORMAL ] Iteration 190:\tk_eff = 1.204203\tres = 4.099E-04\n", - "[ NORMAL ] Iteration 191:\tk_eff = 1.204673\tres = 3.998E-04\n", - "[ NORMAL ] Iteration 192:\tk_eff = 1.205131\tres = 3.903E-04\n", - "[ NORMAL ] Iteration 193:\tk_eff = 1.205578\tres = 3.802E-04\n", - "[ NORMAL ] Iteration 194:\tk_eff = 1.206014\tres = 3.706E-04\n", - "[ NORMAL ] Iteration 195:\tk_eff = 1.206440\tres = 3.618E-04\n", - "[ NORMAL ] Iteration 196:\tk_eff = 1.206855\tres = 3.530E-04\n", - "[ NORMAL ] Iteration 197:\tk_eff = 1.207261\tres = 3.443E-04\n", - "[ NORMAL ] Iteration 198:\tk_eff = 1.207657\tres = 3.359E-04\n", - "[ NORMAL ] Iteration 199:\tk_eff = 1.208043\tres = 3.282E-04\n", - "[ NORMAL ] Iteration 200:\tk_eff = 1.208419\tres = 3.196E-04\n", - "[ NORMAL ] Iteration 201:\tk_eff = 1.208787\tres = 3.116E-04\n", - "[ NORMAL ] Iteration 202:\tk_eff = 1.209145\tres = 3.039E-04\n", - "[ NORMAL ] Iteration 203:\tk_eff = 1.209495\tres = 2.962E-04\n", - "[ NORMAL ] Iteration 204:\tk_eff = 1.209836\tres = 2.895E-04\n", - "[ NORMAL ] Iteration 205:\tk_eff = 1.210170\tres = 2.824E-04\n", - "[ NORMAL ] Iteration 206:\tk_eff = 1.210495\tres = 2.756E-04\n", - "[ NORMAL ] Iteration 207:\tk_eff = 1.210812\tres = 2.687E-04\n", - "[ NORMAL ] Iteration 208:\tk_eff = 1.211122\tres = 2.619E-04\n", - "[ NORMAL ] Iteration 209:\tk_eff = 1.211423\tres = 2.559E-04\n", - "[ NORMAL ] Iteration 210:\tk_eff = 1.211718\tres = 2.491E-04\n", - "[ NORMAL ] Iteration 211:\tk_eff = 1.212006\tres = 2.430E-04\n", - "[ NORMAL ] Iteration 212:\tk_eff = 1.212286\tres = 2.376E-04\n", - "[ NORMAL ] Iteration 213:\tk_eff = 1.212560\tres = 2.313E-04\n", - "[ NORMAL ] Iteration 214:\tk_eff = 1.212827\tres = 2.257E-04\n", - "[ NORMAL ] Iteration 215:\tk_eff = 1.213088\tres = 2.203E-04\n", - "[ NORMAL ] Iteration 216:\tk_eff = 1.213341\tres = 2.149E-04\n", - "[ NORMAL ] Iteration 217:\tk_eff = 1.213590\tres = 2.092E-04\n", - "[ NORMAL ] Iteration 218:\tk_eff = 1.213831\tres = 2.047E-04\n", - "[ NORMAL ] Iteration 219:\tk_eff = 1.214068\tres = 1.990E-04\n", - "[ NORMAL ] Iteration 220:\tk_eff = 1.214298\tres = 1.945E-04\n", - "[ NORMAL ] Iteration 221:\tk_eff = 1.214523\tres = 1.900E-04\n", - "[ NORMAL ] Iteration 222:\tk_eff = 1.214743\tres = 1.850E-04\n", - "[ NORMAL ] Iteration 223:\tk_eff = 1.214956\tres = 1.807E-04\n", - "[ NORMAL ] Iteration 224:\tk_eff = 1.215166\tres = 1.760E-04\n", - "[ NORMAL ] Iteration 225:\tk_eff = 1.215370\tres = 1.724E-04\n", - "[ NORMAL ] Iteration 226:\tk_eff = 1.215569\tres = 1.677E-04\n", - "[ NORMAL ] Iteration 227:\tk_eff = 1.215762\tres = 1.637E-04\n", - "[ NORMAL ] Iteration 228:\tk_eff = 1.215951\tres = 1.595E-04\n", - "[ NORMAL ] Iteration 229:\tk_eff = 1.216136\tres = 1.554E-04\n", - "[ NORMAL ] Iteration 230:\tk_eff = 1.216316\tres = 1.518E-04\n", - "[ NORMAL ] Iteration 231:\tk_eff = 1.216492\tres = 1.479E-04\n", - "[ NORMAL ] Iteration 232:\tk_eff = 1.216663\tres = 1.446E-04\n", - "[ NORMAL ] Iteration 233:\tk_eff = 1.216831\tres = 1.411E-04\n", - "[ NORMAL ] Iteration 234:\tk_eff = 1.216994\tres = 1.377E-04\n", - "[ NORMAL ] Iteration 235:\tk_eff = 1.217153\tres = 1.341E-04\n", - "[ NORMAL ] Iteration 236:\tk_eff = 1.217309\tres = 1.307E-04\n", - "[ NORMAL ] Iteration 237:\tk_eff = 1.217461\tres = 1.279E-04\n", - "[ NORMAL ] Iteration 238:\tk_eff = 1.217608\tres = 1.246E-04\n", - "[ NORMAL ] Iteration 239:\tk_eff = 1.217752\tres = 1.215E-04\n", - "[ NORMAL ] Iteration 240:\tk_eff = 1.217893\tres = 1.183E-04\n", - "[ NORMAL ] Iteration 241:\tk_eff = 1.218031\tres = 1.156E-04\n", - "[ NORMAL ] Iteration 242:\tk_eff = 1.218165\tres = 1.129E-04\n", - "[ NORMAL ] Iteration 243:\tk_eff = 1.218296\tres = 1.104E-04\n", - "[ NORMAL ] Iteration 244:\tk_eff = 1.218423\tres = 1.072E-04\n", - "[ NORMAL ] Iteration 245:\tk_eff = 1.218548\tres = 1.045E-04\n", - "[ NORMAL ] Iteration 246:\tk_eff = 1.218669\tres = 1.024E-04\n", - "[ NORMAL ] Iteration 247:\tk_eff = 1.218788\tres = 9.969E-05\n", - "[ NORMAL ] Iteration 248:\tk_eff = 1.218903\tres = 9.716E-05\n", - "[ NORMAL ] Iteration 249:\tk_eff = 1.219016\tres = 9.478E-05\n", - "[ NORMAL ] Iteration 250:\tk_eff = 1.219126\tres = 9.241E-05\n", - "[ NORMAL ] Iteration 251:\tk_eff = 1.219233\tres = 9.028E-05\n", - "[ NORMAL ] Iteration 252:\tk_eff = 1.219338\tres = 8.820E-05\n", - "[ NORMAL ] Iteration 253:\tk_eff = 1.219440\tres = 8.585E-05\n", - "[ NORMAL ] Iteration 254:\tk_eff = 1.219540\tres = 8.383E-05\n", - "[ NORMAL ] Iteration 255:\tk_eff = 1.219638\tres = 8.191E-05\n", - "[ NORMAL ] Iteration 256:\tk_eff = 1.219732\tres = 8.000E-05\n", - "[ NORMAL ] Iteration 257:\tk_eff = 1.219825\tres = 7.789E-05\n", - "[ NORMAL ] Iteration 258:\tk_eff = 1.219915\tres = 7.582E-05\n", - "[ NORMAL ] Iteration 259:\tk_eff = 1.220003\tres = 7.393E-05\n", - "[ NORMAL ] Iteration 260:\tk_eff = 1.220089\tres = 7.210E-05\n", - "[ NORMAL ] Iteration 261:\tk_eff = 1.220173\tres = 7.026E-05\n", - "[ NORMAL ] Iteration 262:\tk_eff = 1.220255\tres = 6.882E-05\n", - "[ NORMAL ] Iteration 263:\tk_eff = 1.220335\tres = 6.737E-05\n", - "[ NORMAL ] Iteration 264:\tk_eff = 1.220412\tres = 6.552E-05\n", - "[ NORMAL ] Iteration 265:\tk_eff = 1.220488\tres = 6.380E-05\n", - "[ NORMAL ] Iteration 266:\tk_eff = 1.220562\tres = 6.221E-05\n", - "[ NORMAL ] Iteration 267:\tk_eff = 1.220635\tres = 6.069E-05\n", - "[ NORMAL ] Iteration 268:\tk_eff = 1.220705\tres = 5.922E-05\n", - "[ NORMAL ] Iteration 269:\tk_eff = 1.220774\tres = 5.778E-05\n", - "[ NORMAL ] Iteration 270:\tk_eff = 1.220842\tres = 5.661E-05\n", - "[ NORMAL ] Iteration 271:\tk_eff = 1.220907\tres = 5.519E-05\n", - "[ NORMAL ] Iteration 272:\tk_eff = 1.220971\tres = 5.373E-05\n", - "[ NORMAL ] Iteration 273:\tk_eff = 1.221033\tres = 5.234E-05\n", - "[ NORMAL ] Iteration 274:\tk_eff = 1.221094\tres = 5.116E-05\n", - "[ NORMAL ] Iteration 275:\tk_eff = 1.221153\tres = 4.958E-05\n", - "[ NORMAL ] Iteration 276:\tk_eff = 1.221211\tres = 4.859E-05\n", - "[ NORMAL ] Iteration 277:\tk_eff = 1.221268\tres = 4.726E-05\n", - "[ NORMAL ] Iteration 278:\tk_eff = 1.221323\tres = 4.630E-05\n", - "[ NORMAL ] Iteration 279:\tk_eff = 1.221377\tres = 4.510E-05\n", - "[ NORMAL ] Iteration 280:\tk_eff = 1.221429\tres = 4.409E-05\n", - "[ NORMAL ] Iteration 281:\tk_eff = 1.221481\tres = 4.282E-05\n", - "[ NORMAL ] Iteration 282:\tk_eff = 1.221531\tres = 4.223E-05\n", - "[ NORMAL ] Iteration 283:\tk_eff = 1.221579\tres = 4.097E-05\n", - "[ NORMAL ] Iteration 284:\tk_eff = 1.221627\tres = 3.991E-05\n", - "[ NORMAL ] Iteration 285:\tk_eff = 1.221673\tres = 3.900E-05\n", - "[ NORMAL ] Iteration 286:\tk_eff = 1.221719\tres = 3.805E-05\n", - "[ NORMAL ] Iteration 287:\tk_eff = 1.221763\tres = 3.705E-05\n", - "[ NORMAL ] Iteration 288:\tk_eff = 1.221806\tres = 3.605E-05\n", - "[ NORMAL ] Iteration 289:\tk_eff = 1.221848\tres = 3.540E-05\n", - "[ NORMAL ] Iteration 290:\tk_eff = 1.221889\tres = 3.451E-05\n", - "[ NORMAL ] Iteration 291:\tk_eff = 1.221929\tres = 3.361E-05\n", - "[ NORMAL ] Iteration 292:\tk_eff = 1.221968\tres = 3.264E-05\n", - "[ NORMAL ] Iteration 293:\tk_eff = 1.222006\tres = 3.194E-05\n", - "[ NORMAL ] Iteration 294:\tk_eff = 1.222043\tres = 3.100E-05\n", - "[ NORMAL ] Iteration 295:\tk_eff = 1.222079\tres = 3.021E-05\n", - "[ NORMAL ] Iteration 296:\tk_eff = 1.222114\tres = 2.963E-05\n", - "[ NORMAL ] Iteration 297:\tk_eff = 1.222149\tres = 2.899E-05\n", - "[ NORMAL ] Iteration 298:\tk_eff = 1.222183\tres = 2.802E-05\n", - "[ NORMAL ] Iteration 299:\tk_eff = 1.222216\tres = 2.767E-05\n", - "[ NORMAL ] Iteration 300:\tk_eff = 1.222248\tres = 2.667E-05\n", - "[ NORMAL ] Iteration 301:\tk_eff = 1.222279\tres = 2.625E-05\n", - "[ NORMAL ] Iteration 302:\tk_eff = 1.222309\tres = 2.557E-05\n", - "[ NORMAL ] Iteration 303:\tk_eff = 1.222339\tres = 2.475E-05\n", - "[ NORMAL ] Iteration 304:\tk_eff = 1.222368\tres = 2.429E-05\n", - "[ NORMAL ] Iteration 305:\tk_eff = 1.222396\tres = 2.362E-05\n", - "[ NORMAL ] Iteration 306:\tk_eff = 1.222423\tres = 2.316E-05\n", - "[ NORMAL ] Iteration 307:\tk_eff = 1.222450\tres = 2.258E-05\n", - "[ NORMAL ] Iteration 308:\tk_eff = 1.222476\tres = 2.210E-05\n", - "[ NORMAL ] Iteration 309:\tk_eff = 1.222502\tres = 2.143E-05\n", - "[ NORMAL ] Iteration 310:\tk_eff = 1.222527\tres = 2.108E-05\n", - "[ NORMAL ] Iteration 311:\tk_eff = 1.222551\tres = 2.047E-05\n", - "[ NORMAL ] Iteration 312:\tk_eff = 1.222575\tres = 1.989E-05\n", - "[ NORMAL ] Iteration 313:\tk_eff = 1.222598\tres = 1.935E-05\n", - "[ NORMAL ] Iteration 314:\tk_eff = 1.222621\tres = 1.921E-05\n", - "[ NORMAL ] Iteration 315:\tk_eff = 1.222643\tres = 1.851E-05\n", - "[ NORMAL ] Iteration 316:\tk_eff = 1.222665\tres = 1.815E-05\n", - "[ NORMAL ] Iteration 317:\tk_eff = 1.222686\tres = 1.771E-05\n", - "[ NORMAL ] Iteration 318:\tk_eff = 1.222707\tres = 1.734E-05\n", - "[ NORMAL ] Iteration 319:\tk_eff = 1.222727\tres = 1.689E-05\n", - "[ NORMAL ] Iteration 320:\tk_eff = 1.222746\tres = 1.648E-05\n", - "[ NORMAL ] Iteration 321:\tk_eff = 1.222766\tres = 1.591E-05\n", - "[ NORMAL ] Iteration 322:\tk_eff = 1.222784\tres = 1.559E-05\n", - "[ NORMAL ] Iteration 323:\tk_eff = 1.222802\tres = 1.522E-05\n", - "[ NORMAL ] Iteration 324:\tk_eff = 1.222820\tres = 1.491E-05\n", - "[ NORMAL ] Iteration 325:\tk_eff = 1.222837\tres = 1.449E-05\n", - "[ NORMAL ] Iteration 326:\tk_eff = 1.222854\tres = 1.405E-05\n", - "[ NORMAL ] Iteration 327:\tk_eff = 1.222870\tres = 1.371E-05\n", - "[ NORMAL ] Iteration 328:\tk_eff = 1.222886\tres = 1.337E-05\n", - "[ NORMAL ] Iteration 329:\tk_eff = 1.222902\tres = 1.321E-05\n", - "[ NORMAL ] Iteration 330:\tk_eff = 1.222917\tres = 1.281E-05\n", - "[ NORMAL ] Iteration 331:\tk_eff = 1.222932\tres = 1.247E-05\n", - "[ NORMAL ] Iteration 332:\tk_eff = 1.222947\tres = 1.215E-05\n", - "[ NORMAL ] Iteration 333:\tk_eff = 1.222961\tres = 1.201E-05\n", - "[ NORMAL ] Iteration 334:\tk_eff = 1.222975\tres = 1.163E-05\n", - "[ NORMAL ] Iteration 335:\tk_eff = 1.222988\tres = 1.122E-05\n", - "[ NORMAL ] Iteration 336:\tk_eff = 1.223001\tres = 1.090E-05\n", - "[ NORMAL ] Iteration 337:\tk_eff = 1.223014\tres = 1.070E-05\n", - "[ NORMAL ] Iteration 338:\tk_eff = 1.223027\tres = 1.047E-05\n", - "[ NORMAL ] Iteration 339:\tk_eff = 1.223039\tres = 1.015E-05\n", - "[ NORMAL ] Iteration 340:\tk_eff = 1.223051\tres = 1.002E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.366890\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.391200\tres = 6.331E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.393015\tres = 6.626E-02\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.381131\tres = 4.640E-03\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.375055\tres = 3.024E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.369635\tres = 1.594E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.365588\tres = 1.445E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.363102\tres = 1.095E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.361522\tres = 6.801E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.361329\tres = 4.350E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.362052\tres = 5.337E-04\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.363766\tres = 2.000E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.366383\tres = 4.733E-03\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.369846\tres = 7.196E-03\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.374028\tres = 9.452E-03\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.378957\tres = 1.131E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.384508\tres = 1.318E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.390660\tres = 1.465E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.397354\tres = 1.600E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.404542\tres = 1.713E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.412186\tres = 1.809E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.420246\tres = 1.889E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.428671\tres = 1.956E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.437437\tres = 2.005E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.446503\tres = 2.045E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.455839\tres = 2.073E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.465413\tres = 2.091E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.475198\tres = 2.100E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.485167\tres = 2.103E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.495295\tres = 2.098E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.505558\tres = 2.087E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.515935\tres = 2.072E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.526405\tres = 2.053E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.536950\tres = 2.029E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.547551\tres = 2.003E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.558191\tres = 1.974E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.568856\tres = 1.943E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.579532\tres = 1.911E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.590203\tres = 1.877E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.600860\tres = 1.841E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.611489\tres = 1.806E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.622080\tres = 1.769E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.632623\tres = 1.732E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.643111\tres = 1.695E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.653533\tres = 1.658E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.663882\tres = 1.621E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.674152\tres = 1.584E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.684335\tres = 1.547E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.694427\tres = 1.511E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.704421\tres = 1.475E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.714313\tres = 1.439E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.724099\tres = 1.404E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.733774\tres = 1.370E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.743335\tres = 1.336E-02\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.752778\tres = 1.303E-02\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.762103\tres = 1.270E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 0.771304\tres = 1.239E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 0.780382\tres = 1.207E-02\n", + "[ NORMAL ] Iteration 58:\tk_eff = 0.789332\tres = 1.177E-02\n", + "[ NORMAL ] Iteration 59:\tk_eff = 0.798155\tres = 1.147E-02\n", + "[ NORMAL ] Iteration 60:\tk_eff = 0.806849\tres = 1.118E-02\n", + "[ NORMAL ] Iteration 61:\tk_eff = 0.815413\tres = 1.089E-02\n", + "[ NORMAL ] Iteration 62:\tk_eff = 0.823846\tres = 1.061E-02\n", + "[ NORMAL ] Iteration 63:\tk_eff = 0.832147\tres = 1.034E-02\n", + "[ NORMAL ] Iteration 64:\tk_eff = 0.840316\tres = 1.008E-02\n", + "[ NORMAL ] Iteration 65:\tk_eff = 0.848354\tres = 9.817E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 0.856259\tres = 9.565E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 0.864033\tres = 9.318E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 0.871674\tres = 9.078E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 0.879184\tres = 8.844E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 0.886563\tres = 8.616E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 0.893812\tres = 8.393E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 0.900932\tres = 8.177E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 0.907923\tres = 7.965E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 0.914786\tres = 7.760E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 0.921523\tres = 7.560E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 0.928134\tres = 7.365E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 0.934621\tres = 7.174E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 0.940985\tres = 6.989E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 0.947227\tres = 6.809E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 0.953349\tres = 6.634E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 0.959352\tres = 6.463E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 0.965237\tres = 6.297E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 0.971006\tres = 6.134E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 0.976660\tres = 5.977E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 0.982201\tres = 5.823E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 0.987631\tres = 5.674E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 0.992950\tres = 5.528E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 0.998161\tres = 5.386E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.003266\tres = 5.248E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.008265\tres = 5.114E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.013161\tres = 4.983E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.017954\tres = 4.856E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.022648\tres = 4.731E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.027243\tres = 4.611E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.031741\tres = 4.493E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.036143\tres = 4.379E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.040452\tres = 4.267E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.044667\tres = 4.159E-03\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.048794\tres = 4.052E-03\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.052831\tres = 3.950E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.056781\tres = 3.849E-03\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.060645\tres = 3.752E-03\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.064425\tres = 3.656E-03\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.068122\tres = 3.564E-03\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.071738\tres = 3.474E-03\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.075274\tres = 3.386E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.078734\tres = 3.300E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.082116\tres = 3.217E-03\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.085423\tres = 3.136E-03\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.088657\tres = 3.056E-03\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.091818\tres = 2.980E-03\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.094909\tres = 2.904E-03\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.097930\tres = 2.831E-03\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.100884\tres = 2.760E-03\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.103771\tres = 2.690E-03\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.106593\tres = 2.623E-03\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.109351\tres = 2.557E-03\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.112047\tres = 2.492E-03\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.114682\tres = 2.430E-03\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.117257\tres = 2.369E-03\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.119772\tres = 2.310E-03\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.122231\tres = 2.251E-03\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.124633\tres = 2.196E-03\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.126980\tres = 2.140E-03\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.129273\tres = 2.087E-03\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.131514\tres = 2.035E-03\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.133703\tres = 1.984E-03\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.135840\tres = 1.934E-03\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.137929\tres = 1.886E-03\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.139970\tres = 1.839E-03\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.141963\tres = 1.793E-03\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.143910\tres = 1.749E-03\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.145812\tres = 1.705E-03\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.147670\tres = 1.663E-03\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.149484\tres = 1.622E-03\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.151256\tres = 1.581E-03\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.152986\tres = 1.541E-03\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.154676\tres = 1.503E-03\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.156326\tres = 1.466E-03\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.157938\tres = 1.429E-03\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.159512\tres = 1.394E-03\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.161049\tres = 1.359E-03\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.162549\tres = 1.326E-03\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.164015\tres = 1.292E-03\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.165446\tres = 1.261E-03\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.166843\tres = 1.229E-03\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.168208\tres = 1.199E-03\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.169540\tres = 1.169E-03\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.170840\tres = 1.140E-03\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.172110\tres = 1.112E-03\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.173350\tres = 1.085E-03\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.174560\tres = 1.058E-03\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.175742\tres = 1.031E-03\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.176895\tres = 1.006E-03\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.178021\tres = 9.812E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.179121\tres = 9.567E-04\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.180194\tres = 9.336E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.181242\tres = 9.100E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.182264\tres = 8.875E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.183264\tres = 8.656E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.184238\tres = 8.452E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.185189\tres = 8.233E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.186118\tres = 8.029E-04\n", + "[ NORMAL ] Iteration 164:\tk_eff = 1.187024\tres = 7.839E-04\n", + "[ NORMAL ] Iteration 165:\tk_eff = 1.187908\tres = 7.641E-04\n", + "[ NORMAL ] Iteration 166:\tk_eff = 1.188772\tres = 7.449E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.189615\tres = 7.271E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.190438\tres = 7.093E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.191241\tres = 6.915E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.192024\tres = 6.742E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.192789\tres = 6.576E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.193536\tres = 6.419E-04\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.194265\tres = 6.263E-04\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.194976\tres = 6.104E-04\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.195670\tres = 5.955E-04\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.196347\tres = 5.806E-04\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.197008\tres = 5.665E-04\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.197653\tres = 5.525E-04\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.198284\tres = 5.388E-04\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.198898\tres = 5.263E-04\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.199498\tres = 5.126E-04\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.200083\tres = 5.000E-04\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.200654\tres = 4.880E-04\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.201212\tres = 4.757E-04\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.201756\tres = 4.647E-04\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.202286\tres = 4.528E-04\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.202804\tres = 4.414E-04\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.203310\tres = 4.310E-04\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.203803\tres = 4.203E-04\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.204285\tres = 4.100E-04\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.204755\tres = 4.003E-04\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.205214\tres = 3.902E-04\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.205661\tres = 3.810E-04\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.206097\tres = 3.711E-04\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.206523\tres = 3.617E-04\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.206939\tres = 3.528E-04\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.207345\tres = 3.447E-04\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.207740\tres = 3.363E-04\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.208127\tres = 3.281E-04\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.208503\tres = 3.198E-04\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.208871\tres = 3.119E-04\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.209230\tres = 3.041E-04\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.209580\tres = 2.968E-04\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.209921\tres = 2.897E-04\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.210255\tres = 2.824E-04\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.210580\tres = 2.759E-04\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.210898\tres = 2.688E-04\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.211208\tres = 2.622E-04\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.211510\tres = 2.563E-04\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.211804\tres = 2.495E-04\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.212092\tres = 2.428E-04\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.212373\tres = 2.374E-04\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.212647\tres = 2.318E-04\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.212914\tres = 2.258E-04\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.213175\tres = 2.200E-04\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.213429\tres = 2.153E-04\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.213678\tres = 2.097E-04\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.213920\tres = 2.049E-04\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.214156\tres = 1.996E-04\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.214387\tres = 1.945E-04\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.214612\tres = 1.904E-04\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.214832\tres = 1.853E-04\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.215046\tres = 1.806E-04\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.215255\tres = 1.762E-04\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.215459\tres = 1.722E-04\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.215658\tres = 1.676E-04\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.215852\tres = 1.637E-04\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.216041\tres = 1.597E-04\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.216226\tres = 1.557E-04\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.216407\tres = 1.520E-04\n", + "[ NORMAL ] Iteration 231:\tk_eff = 1.216582\tres = 1.483E-04\n", + "[ NORMAL ] Iteration 232:\tk_eff = 1.216754\tres = 1.444E-04\n", + "[ NORMAL ] Iteration 233:\tk_eff = 1.216921\tres = 1.409E-04\n", + "[ NORMAL ] Iteration 234:\tk_eff = 1.217084\tres = 1.376E-04\n", + "[ NORMAL ] Iteration 235:\tk_eff = 1.217244\tres = 1.344E-04\n", + "[ NORMAL ] Iteration 236:\tk_eff = 1.217399\tres = 1.309E-04\n", + "[ NORMAL ] Iteration 237:\tk_eff = 1.217551\tres = 1.274E-04\n", + "[ NORMAL ] Iteration 238:\tk_eff = 1.217699\tres = 1.247E-04\n", + "[ NORMAL ] Iteration 239:\tk_eff = 1.217843\tres = 1.216E-04\n", + "[ NORMAL ] Iteration 240:\tk_eff = 1.217983\tres = 1.184E-04\n", + "[ NORMAL ] Iteration 241:\tk_eff = 1.218121\tres = 1.154E-04\n", + "[ NORMAL ] Iteration 242:\tk_eff = 1.218255\tres = 1.131E-04\n", + "[ NORMAL ] Iteration 243:\tk_eff = 1.218386\tres = 1.101E-04\n", + "[ NORMAL ] Iteration 244:\tk_eff = 1.218514\tres = 1.075E-04\n", + "[ NORMAL ] Iteration 245:\tk_eff = 1.218639\tres = 1.048E-04\n", + "[ NORMAL ] Iteration 246:\tk_eff = 1.218760\tres = 1.024E-04\n", + "[ NORMAL ] Iteration 247:\tk_eff = 1.218879\tres = 9.989E-05\n", + "[ NORMAL ] Iteration 248:\tk_eff = 1.218994\tres = 9.739E-05\n", + "[ NORMAL ] Iteration 249:\tk_eff = 1.219107\tres = 9.487E-05\n", + "[ NORMAL ] Iteration 250:\tk_eff = 1.219217\tres = 9.257E-05\n", + "[ NORMAL ] Iteration 251:\tk_eff = 1.219324\tres = 9.035E-05\n", + "[ NORMAL ] Iteration 252:\tk_eff = 1.219429\tres = 8.803E-05\n", + "[ NORMAL ] Iteration 253:\tk_eff = 1.219531\tres = 8.599E-05\n", + "[ NORMAL ] Iteration 254:\tk_eff = 1.219631\tres = 8.364E-05\n", + "[ NORMAL ] Iteration 255:\tk_eff = 1.219728\tres = 8.175E-05\n", + "[ NORMAL ] Iteration 256:\tk_eff = 1.219823\tres = 7.971E-05\n", + "[ NORMAL ] Iteration 257:\tk_eff = 1.219916\tres = 7.776E-05\n", + "[ NORMAL ] Iteration 258:\tk_eff = 1.220006\tres = 7.582E-05\n", + "[ NORMAL ] Iteration 259:\tk_eff = 1.220094\tres = 7.438E-05\n", + "[ NORMAL ] Iteration 260:\tk_eff = 1.220181\tres = 7.227E-05\n", + "[ NORMAL ] Iteration 261:\tk_eff = 1.220264\tres = 7.058E-05\n", + "[ NORMAL ] Iteration 262:\tk_eff = 1.220346\tres = 6.872E-05\n", + "[ NORMAL ] Iteration 263:\tk_eff = 1.220426\tres = 6.695E-05\n", + "[ NORMAL ] Iteration 264:\tk_eff = 1.220504\tres = 6.549E-05\n", + "[ NORMAL ] Iteration 265:\tk_eff = 1.220580\tres = 6.375E-05\n", + "[ NORMAL ] Iteration 266:\tk_eff = 1.220654\tres = 6.240E-05\n", + "[ NORMAL ] Iteration 267:\tk_eff = 1.220726\tres = 6.073E-05\n", + "[ NORMAL ] Iteration 268:\tk_eff = 1.220797\tres = 5.942E-05\n", + "[ NORMAL ] Iteration 269:\tk_eff = 1.220866\tres = 5.792E-05\n", + "[ NORMAL ] Iteration 270:\tk_eff = 1.220933\tres = 5.661E-05\n", + "[ NORMAL ] Iteration 271:\tk_eff = 1.220999\tres = 5.501E-05\n", + "[ NORMAL ] Iteration 272:\tk_eff = 1.221063\tres = 5.368E-05\n", + "[ NORMAL ] Iteration 273:\tk_eff = 1.221125\tres = 5.286E-05\n", + "[ NORMAL ] Iteration 274:\tk_eff = 1.221187\tres = 5.103E-05\n", + "[ NORMAL ] Iteration 275:\tk_eff = 1.221246\tres = 5.013E-05\n", + "[ NORMAL ] Iteration 276:\tk_eff = 1.221304\tres = 4.861E-05\n", + "[ NORMAL ] Iteration 277:\tk_eff = 1.221360\tres = 4.737E-05\n", + "[ NORMAL ] Iteration 278:\tk_eff = 1.221416\tres = 4.629E-05\n", + "[ NORMAL ] Iteration 279:\tk_eff = 1.221470\tres = 4.515E-05\n", + "[ NORMAL ] Iteration 280:\tk_eff = 1.221522\tres = 4.417E-05\n", + "[ NORMAL ] Iteration 281:\tk_eff = 1.221574\tres = 4.309E-05\n", + "[ NORMAL ] Iteration 282:\tk_eff = 1.221624\tres = 4.219E-05\n", + "[ NORMAL ] Iteration 283:\tk_eff = 1.221673\tres = 4.099E-05\n", + "[ NORMAL ] Iteration 284:\tk_eff = 1.221721\tres = 3.998E-05\n", + "[ NORMAL ] Iteration 285:\tk_eff = 1.221767\tres = 3.891E-05\n", + "[ NORMAL ] Iteration 286:\tk_eff = 1.221812\tres = 3.781E-05\n", + "[ NORMAL ] Iteration 287:\tk_eff = 1.221857\tres = 3.698E-05\n", + "[ NORMAL ] Iteration 288:\tk_eff = 1.221900\tres = 3.633E-05\n", + "[ NORMAL ] Iteration 289:\tk_eff = 1.221942\tres = 3.535E-05\n", + "[ NORMAL ] Iteration 290:\tk_eff = 1.221983\tres = 3.445E-05\n", + "[ NORMAL ] Iteration 291:\tk_eff = 1.222023\tres = 3.355E-05\n", + "[ NORMAL ] Iteration 292:\tk_eff = 1.222062\tres = 3.281E-05\n", + "[ NORMAL ] Iteration 293:\tk_eff = 1.222100\tres = 3.203E-05\n", + "[ NORMAL ] Iteration 294:\tk_eff = 1.222138\tres = 3.108E-05\n", + "[ NORMAL ] Iteration 295:\tk_eff = 1.222174\tres = 3.049E-05\n", + "[ NORMAL ] Iteration 296:\tk_eff = 1.222209\tres = 2.969E-05\n", + "[ NORMAL ] Iteration 297:\tk_eff = 1.222244\tres = 2.902E-05\n", + "[ NORMAL ] Iteration 298:\tk_eff = 1.222278\tres = 2.820E-05\n", + "[ NORMAL ] Iteration 299:\tk_eff = 1.222310\tres = 2.747E-05\n", + "[ NORMAL ] Iteration 300:\tk_eff = 1.222342\tres = 2.679E-05\n", + "[ NORMAL ] Iteration 301:\tk_eff = 1.222374\tres = 2.626E-05\n", + "[ NORMAL ] Iteration 302:\tk_eff = 1.222404\tres = 2.554E-05\n", + "[ NORMAL ] Iteration 303:\tk_eff = 1.222434\tres = 2.483E-05\n", + "[ NORMAL ] Iteration 304:\tk_eff = 1.222463\tres = 2.432E-05\n", + "[ NORMAL ] Iteration 305:\tk_eff = 1.222492\tres = 2.387E-05\n", + "[ NORMAL ] Iteration 306:\tk_eff = 1.222519\tres = 2.316E-05\n", + "[ NORMAL ] Iteration 307:\tk_eff = 1.222546\tres = 2.274E-05\n", + "[ NORMAL ] Iteration 308:\tk_eff = 1.222573\tres = 2.220E-05\n", + "[ NORMAL ] Iteration 309:\tk_eff = 1.222599\tres = 2.168E-05\n", + "[ NORMAL ] Iteration 310:\tk_eff = 1.222624\tres = 2.107E-05\n", + "[ NORMAL ] Iteration 311:\tk_eff = 1.222648\tres = 2.062E-05\n", + "[ NORMAL ] Iteration 312:\tk_eff = 1.222672\tres = 2.005E-05\n", + "[ NORMAL ] Iteration 313:\tk_eff = 1.222696\tres = 1.959E-05\n", + "[ NORMAL ] Iteration 314:\tk_eff = 1.222718\tres = 1.898E-05\n", + "[ NORMAL ] Iteration 315:\tk_eff = 1.222740\tres = 1.841E-05\n", + "[ NORMAL ] Iteration 316:\tk_eff = 1.222762\tres = 1.808E-05\n", + "[ NORMAL ] Iteration 317:\tk_eff = 1.222783\tres = 1.765E-05\n", + "[ NORMAL ] Iteration 318:\tk_eff = 1.222803\tres = 1.713E-05\n", + "[ NORMAL ] Iteration 319:\tk_eff = 1.222823\tres = 1.674E-05\n", + "[ NORMAL ] Iteration 320:\tk_eff = 1.222843\tres = 1.638E-05\n", + "[ NORMAL ] Iteration 321:\tk_eff = 1.222862\tres = 1.593E-05\n", + "[ NORMAL ] Iteration 322:\tk_eff = 1.222880\tres = 1.546E-05\n", + "[ NORMAL ] Iteration 323:\tk_eff = 1.222898\tres = 1.519E-05\n", + "[ NORMAL ] Iteration 324:\tk_eff = 1.222916\tres = 1.487E-05\n", + "[ NORMAL ] Iteration 325:\tk_eff = 1.222933\tres = 1.446E-05\n", + "[ NORMAL ] Iteration 326:\tk_eff = 1.222950\tres = 1.403E-05\n", + "[ NORMAL ] Iteration 327:\tk_eff = 1.222967\tres = 1.379E-05\n", + "[ NORMAL ] Iteration 328:\tk_eff = 1.222982\tres = 1.342E-05\n", + "[ NORMAL ] Iteration 329:\tk_eff = 1.222998\tres = 1.298E-05\n", + "[ NORMAL ] Iteration 330:\tk_eff = 1.223013\tres = 1.278E-05\n", + "[ NORMAL ] Iteration 331:\tk_eff = 1.223028\tres = 1.236E-05\n", + "[ NORMAL ] Iteration 332:\tk_eff = 1.223043\tres = 1.227E-05\n", + "[ NORMAL ] Iteration 333:\tk_eff = 1.223057\tres = 1.177E-05\n", + "[ NORMAL ] Iteration 334:\tk_eff = 1.223070\tres = 1.146E-05\n", + "[ NORMAL ] Iteration 335:\tk_eff = 1.223084\tres = 1.122E-05\n", + "[ NORMAL ] Iteration 336:\tk_eff = 1.223097\tres = 1.105E-05\n", + "[ NORMAL ] Iteration 337:\tk_eff = 1.223110\tres = 1.063E-05\n", + "[ NORMAL ] Iteration 338:\tk_eff = 1.223122\tres = 1.054E-05\n", + "[ NORMAL ] Iteration 339:\tk_eff = 1.223134\tres = 1.015E-05\n", + "[ NORMAL ] Iteration 340:\tk_eff = 1.223146\tres = 1.005E-05\n" ] } ], @@ -1920,9 +1931,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.223474\n", - "openmoc keff = 1.223051\n", - "bias [pcm]: -42.3\n" + "openmc keff = 1.224484\n", + "openmoc keff = 1.223146\n", + "bias [pcm]: -133.8\n" ] } ], @@ -1979,7 +1990,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -1995,9 +2006,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\nxhiT4P4fD4z+wrudGZ0AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2080,9 +2091,9 @@ "outputs": [ { "data": { - "image/png": "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\ni7uZWYH+P/3NVBUejmSDAAAAAElFTkSuQmCC\n", + "image/png": "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\nK8T/B194ISi0+XToAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2096,7 +2107,6 @@ "plt.title('H-1 Scattering Matrix')\n", "plt.xlabel('Group Out')\n", "plt.ylabel('Group In')\n", - "plt.grid()\n", "\n", "# Create plot of the O-16 scattering matrix\n", "fig2 = plt.subplot(122)\n", @@ -2104,7 +2114,6 @@ "plt.title('O-16 Scattering Matrix')\n", "plt.xlabel('Group Out')\n", "plt.ylabel('Group In')\n", - "plt.grid()\n", "\n", "# Show the plot on screen\n", "plt.show()" @@ -2112,8 +2121,9 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" }, @@ -2127,7 +2137,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index 2927466daf..40e195d65d 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -32,7 +32,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/lib/python3.6/site-packages/matplotlib/__init__.py:1401: UserWarning: This call to matplotlib.use() has no effect\n", + "/home/romano/miniconda3/envs/python3/lib/python3.5/site-packages/matplotlib/__init__.py:1401: UserWarning: This call to matplotlib.use() has no effect\n", "because the backend has already been chosen;\n", "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", "or matplotlib.backends is imported for the first time.\n", @@ -51,6 +51,7 @@ "\n", "import openmc\n", "import openmc.mgxs\n", + "from openmc.opencg_compatible import get_opencg_geometry\n", "import openmoc\n", "import openmoc.process\n", "from openmoc.opencg_compatible import get_openmoc_geometry\n", @@ -457,7 +458,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+ECDA0nH37PopwAAAWFSURBVGje7Zs7cttADIZ9CSvX\ncrP0iCxUqbBc8Ag6xR6BhV2EvYvwFD4CCx1ABT1jMdgndpegRQnOrCbjpPlGESISC4A/gd27e8H5\n83CX3b4+iKJrRHkS4vkghMPBonRYWGwtfgD2YN+dRDUOoh6lACw0Noi9w2fESuEoAR/uVuMolX03\n9oXGT7F3eFL2iEfhUX1f4cPdL/ishs+68ai+udE4xPhexbjX2FfjGNoPj/DPNX4Tsd+EODr8FvsV\ndf1Hd9P2VvCi4+s/aXvrf+upAD+1/9GV1mkOH5X9vV6THtfvACslcaUCbESL61drBPtdI8SrFMWr\nELsXCkuFDYW75gbiP7d9Cf7bAYI/aCwUShrBvh30+lWQkzVgZ/HD4OixNCgcQpJ3BxU/Ln91elKo\nM5VEE38QtJ+Yv6cQ9xjKNYayyl8TypP8DfJnQ2H/b/N3ye9P83cT33SQv/sQh9gV7zZ/0dNj5HQa\nC5vVzv9+/WFN2w8KVaZ2BwL1+pv4g0x1QRfjq0dB4Q3kT277oP6VNL6gKxNU9a8zK+WLbi/Wwpdi\nhbboKqyxFOulHMj6v4W/AXbmUeAxrv9J/CqEBXaRKsXaodD4nsYvkT/G6H1D4SR/iPy1Roj9JsQ5\ne18/7EUHv1+Fvx/Xj5V9Ugb5K8TW4TZEEdcvoz/up0VTe9qsVIppKVX6a7D6y9ZvwEKjrtQxPtv6\nfXII9vCxKOGaIeAIfEF8IvAG8ie3vRK9rRQl+PPpSctbhfpTUCpviH+kxsZgpT91+snoX1l49KK3\niUQvICRy5aUw6l8leoVwoo3Uv1rKreF/UFLY6d9QP4L9Wf2r7EP9GOSfcsjZ56f60kz+XmVPXv+R\nuP49ff0T/53Rv6n/7m2lvXT9Wqd/VUz8hvh5M/ED6ILmt4mfHYZSaePnTWpsf/SvqV9O6dLYYClL\nEetnoH/LBLFoBvrX189uTv8++kot5vTvQD4/9jP690g9P/4z/bvo/XVG/xYoZZx+8fr3MxAtsf7t\nUOkG2JqsTtCIpgCt/qX1226KqZS7gfzJbe+c9jLrtIZ8lXD+s4umlW6AKIVrlML2/cXjgPFjlJqI\nRC+Fj0bVJe+vSh56pSdR6YkQ1ygF10Wqf0FeLta/iKn9Mv1L24ti2e+7W4n1b3T/W+L+t9H9T/Sv\nVboUmqJJon1/hZq8LnzRDlDrX1u0xRT1+6vEpomMmyYkqi95vIH8yW1PN+122KkLcNLKi/WTF01z\n/cNASrWE/l3ev6T17zX909z9X27/euK/Rf3zWP+Waf9eEv37KkWJ+rfDl6ZglNDa+cEBhwYDvkoN\nP/rX69814NaI3imq0l7OYDy/qSdDGwr7r+Y3VbzoKZr6XX2lfxfOb87qXzr+b1j/Xlp/nP6dn98M\ncdH7cn7zjPObKsYWS3Eb9w8n85smHtqQuPuZ30T2dlIT6F9xFl+n8xslegL9a4c2KRr9W4rp/GYq\numiM9Nec/j2v/yj9u1h//hv9e93vc++f63/u+rPjL3f+5Lbn1j9m/eXWf+7zh/v8+2b9e/Hzn6s/\nuPqHrb8g71n6L3f+5Lbnvn8w33+4718/+5d47//c/gO7/5E7/nPbc/tv3P4fs//I7X9y+6/fqH+v\n6j9z+9/c/ju3/8+eP+TOn9z23PkXc/7Gnf9x5483q38Xzn+582fu/Js9fy8kb/6fO39y23P3n3S8\n/S/c/Tfc/T83uX/pgv1XE/9duP+Lu/+Mvf8td/znti8kb/8ld/9nx9t/Sjw/Ltr/yt1/+337f6/b\nf0zoB3nJ/ucVc/81d/83e/957vzJbc89/8A8f8E9/5HE78XnT/4H/cs5f8Q9/8Q9f8U+/5U7f3Lb\nc88fdrzzjyvm+cuf/Uu887/c88fs88954/8vO4SjPC+2QRIAAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTctMDItMTJUMTM6Mzk6MzEtMDU6MDDnX1ZVAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE3LTAyLTEy\nVDEzOjM5OjMxLTA1OjAwlgLu6QAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+ECFRULN01vixUAAAWFSURBVGje7Zs7cttADIZ9CSvX\ncrP0iCxUqbBc8Ag6xR6BhV2EvYvwFD4CCx1ABT1jMdgndpegRQnOrCbjpPlGESISC4A/gd27e8H5\n83CX3b4+iKJrRHkS4vkghMPBonRYWGwtfgD2YN+dRDUOoh6lACw0Noi9w2fESuEoAR/uVuMolX03\n9oXGT7F3eFL2iEfhUX1f4cPdL/ishs+68ai+udE4xPhexbjX2FfjGNoPj/DPNX4Tsd+EODr8FvsV\ndf1Hd9P2VvCi4+s/aXvrf+upAD+1/9GV1mkOH5X9vV6THtfvACslcaUCbESL61drBPtdI8SrFMWr\nELsXCkuFDYW75gbiP7d9Cf7bAYI/aCwUShrBvh30+lWQkzVgZ/HD4OixNCgcQpJ3BxU/Ln91elKo\nM5VEE38QtJ+Yv6cQ9xjKNYayyl8TypP8DfJnQ2H/b/N3ye9P83cT33SQv/sQh9gV7zZ/0dNj5HQa\nC5vVzv9+/WFN2w8KVaZ2BwL1+pv4g0x1QRfjq0dB4Q3kT277oP6VNL6gKxNU9a8zK+WLbi/Wwpdi\nhbboKqyxFOulHMj6v4W/AXbmUeAxrv9J/CqEBXaRKsXaodD4nsYvkT/G6H1D4SR/iPy1Roj9JsQ5\ne18/7EUHv1+Fvx/Xj5V9Ugb5K8TW4TZEEdcvoz/up0VTe9qsVIppKVX6a7D6y9ZvwEKjrtQxPtv6\nfXII9vCxKOGaIeAIfEF8IvAG8ie3vRK9rRQl+PPpSctbhfpTUCpviH+kxsZgpT91+snoX1l49KK3\niUQvICRy5aUw6l8leoVwoo3Uv1rKreF/UFLY6d9QP4L9Wf2r7EP9GOSfcsjZ56f60kz+XmVPXv+R\nuP49ff0T/53Rv6n/7m2lvXT9Wqd/VUz8hvh5M/ED6ILmt4mfHYZSaePnTWpsf/SvqV9O6dLYYClL\nEetnoH/LBLFoBvrX189uTv8++kot5vTvQD4/9jP690g9P/4z/bvo/XVG/xYoZZx+8fr3MxAtsf7t\nUOkG2JqsTtCIpgCt/qX1226KqZS7gfzJbe+c9jLrtIZ8lXD+s4umlW6AKIVrlML2/cXjgPFjlJqI\nRC+Fj0bVJe+vSh56pSdR6YkQ1ygF10Wqf0FeLta/iKn9Mv1L24ti2e+7W4n1b3T/W+L+t9H9T/Sv\nVboUmqJJon1/hZq8LnzRDlDrX1u0xRT1+6vEpomMmyYkqi95vIH8yW1PN+122KkLcNLKi/WTF01z\n/cNASrWE/l3ev6T17zX909z9X27/euK/Rf3zWP+Waf9eEv37KkWJ+rfDl6ZglNDa+cEBhwYDvkoN\nP/rX69814NaI3imq0l7OYDy/qSdDGwr7r+Y3VbzoKZr6XX2lfxfOb87qXzr+b1j/Xlp/nP6dn98M\ncdH7cn7zjPObKsYWS3Eb9w8n85smHtqQuPuZ30T2dlIT6F9xFl+n8xslegL9a4c2KRr9W4rp/GYq\numiM9Nec/j2v/yj9u1h//hv9e93vc++f63/u+rPjL3f+5Lbn1j9m/eXWf+7zh/v8+2b9e/Hzn6s/\nuPqHrb8g71n6L3f+5Lbnvn8w33+4718/+5d47//c/gO7/5E7/nPbc/tv3P4fs//I7X9y+6/fqH+v\n6j9z+9/c/ju3/8+eP+TOn9z23PkXc/7Gnf9x5483q38Xzn+582fu/Js9fy8kb/6fO39y23P3n3S8\n/S/c/Tfc/T83uX/pgv1XE/9duP+Lu/+Mvf8td/znti8kb/8ld/9nx9t/Sjw/Ltr/yt1/+337f6/b\nf0zoB3nJ/ucVc/81d/83e/957vzJbc89/8A8f8E9/5HE78XnT/4H/cs5f8Q9/8Q9f8U+/5U7f3Lb\nc88fdrzzjyvm+cuf/Uu887/c88fs88954/8vO4SjPC+2QRIAAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTctMDItMjFUMTU6MTE6NTUtMDY6MDBWxh2xAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE3LTAyLTIx\nVDE1OjExOjU1LTA2OjAwJ5ulDQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -742,9 +743,9 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | 54b65c8bda6af5788bd762b8cf9855d1a8008238\n", - " Date/Time | 2017-02-12 13:39:31\n", - " OpenMP Threads | 8\n", + " Git SHA1 | dfc6f1d9bf1b31fc94dad1cb30bd672b25f47e04\n", + " Date/Time | 2017-02-21 15:11:55\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -754,12 +755,12 @@ " Reading geometry XML file...\n", " Reading materials XML file...\n", " Reading cross sections XML file...\n", - " Reading U235 from /opt/xsdata/nndc/U235.h5\n", - " Reading U238 from /opt/xsdata/nndc/U238.h5\n", - " Reading O16 from /opt/xsdata/nndc/O16.h5\n", - " Reading H1 from /opt/xsdata/nndc/H1.h5\n", - " Reading B10 from /opt/xsdata/nndc/B10.h5\n", - " Reading Zr90 from /opt/xsdata/nndc/Zr90.h5\n", + " Reading U235 from /home/romano/openmc/scripts/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/scripts/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/romano/openmc/scripts/nndc_hdf5/O16.h5\n", + " Reading H1 from /home/romano/openmc/scripts/nndc_hdf5/H1.h5\n", + " Reading B10 from /home/romano/openmc/scripts/nndc_hdf5/B10.h5\n", + " Reading Zr90 from /home/romano/openmc/scripts/nndc_hdf5/Zr90.h5\n", " Maximum neutron transport energy: 2.00000E+07 eV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -774,53 +775,53 @@ " 1/1 1.03852 \n", " 2/1 0.99743 \n", " 3/1 1.02987 \n", - " 4/1 1.04472 \n", - " 5/1 1.02183 \n", - " 6/1 1.05263 \n", - " 7/1 0.99048 \n", - " 8/1 1.02753 \n", - " 9/1 1.03159 \n", - " 10/1 1.04005 \n", - " 11/1 1.05278 \n", - " 12/1 1.02555 1.03917 +/- 0.01362\n", - " 13/1 0.99400 1.02411 +/- 0.01699\n", - " 14/1 1.03508 1.02685 +/- 0.01232\n", - " 15/1 1.00055 1.02159 +/- 0.01090\n", - " 16/1 1.01334 1.02022 +/- 0.00900\n", - " 17/1 0.99822 1.01707 +/- 0.00823\n", - " 18/1 1.01767 1.01715 +/- 0.00713\n", - " 19/1 1.05052 1.02086 +/- 0.00730\n", - " 20/1 1.03133 1.02190 +/- 0.00661\n", - " 21/1 1.04112 1.02365 +/- 0.00623\n", - " 22/1 1.04175 1.02516 +/- 0.00588\n", - " 23/1 1.01909 1.02469 +/- 0.00543\n", - " 24/1 1.07119 1.02801 +/- 0.00603\n", - " 25/1 0.97414 1.02442 +/- 0.00666\n", - " 26/1 1.04709 1.02584 +/- 0.00639\n", - " 27/1 1.05872 1.02777 +/- 0.00631\n", - " 28/1 1.03930 1.02841 +/- 0.00598\n", - " 29/1 1.01488 1.02770 +/- 0.00570\n", - " 30/1 1.04513 1.02857 +/- 0.00548\n", - " 31/1 0.99538 1.02699 +/- 0.00545\n", - " 32/1 1.00106 1.02581 +/- 0.00532\n", - " 33/1 0.99389 1.02442 +/- 0.00527\n", - " 34/1 0.99938 1.02338 +/- 0.00516\n", - " 35/1 1.02161 1.02331 +/- 0.00495\n", - " 36/1 1.04084 1.02398 +/- 0.00480\n", - " 37/1 0.98801 1.02265 +/- 0.00481\n", - " 38/1 1.01348 1.02232 +/- 0.00464\n", - " 39/1 1.06693 1.02386 +/- 0.00474\n", - " 40/1 1.07729 1.02564 +/- 0.00491\n", - " 41/1 1.03191 1.02585 +/- 0.00475\n", - " 42/1 1.05209 1.02667 +/- 0.00468\n", - " 43/1 1.02997 1.02677 +/- 0.00453\n", - " 44/1 1.07288 1.02812 +/- 0.00460\n", - " 45/1 1.01268 1.02768 +/- 0.00449\n", - " 46/1 1.03759 1.02796 +/- 0.00437\n", - " 47/1 1.02620 1.02791 +/- 0.00425\n", - " 48/1 1.02509 1.02783 +/- 0.00414\n", - " 49/1 1.01075 1.02740 +/- 0.00406\n", - " 50/1 0.99403 1.02656 +/- 0.00404\n", + " 4/1 1.04397 \n", + " 5/1 1.06262 \n", + " 6/1 1.06657 \n", + " 7/1 0.98574 \n", + " 8/1 1.04364 \n", + " 9/1 1.01253 \n", + " 10/1 1.02094 \n", + " 11/1 0.99586 \n", + " 12/1 1.00508 1.00047 +/- 0.00461\n", + " 13/1 1.05292 1.01795 +/- 0.01769\n", + " 14/1 1.04732 1.02530 +/- 0.01450\n", + " 15/1 1.04886 1.03001 +/- 0.01218\n", + " 16/1 1.00948 1.02659 +/- 0.01052\n", + " 17/1 1.02684 1.02662 +/- 0.00889\n", + " 18/1 0.97234 1.01984 +/- 0.01026\n", + " 19/1 0.99754 1.01736 +/- 0.00938\n", + " 20/1 0.98964 1.01459 +/- 0.00884\n", + " 21/1 1.04140 1.01703 +/- 0.00836\n", + " 22/1 1.03854 1.01882 +/- 0.00784\n", + " 23/1 1.05917 1.02192 +/- 0.00785\n", + " 24/1 1.02413 1.02208 +/- 0.00727\n", + " 25/1 1.03113 1.02268 +/- 0.00679\n", + " 26/1 1.05113 1.02446 +/- 0.00660\n", + " 27/1 1.03252 1.02494 +/- 0.00622\n", + " 28/1 1.05196 1.02644 +/- 0.00605\n", + " 29/1 0.99663 1.02487 +/- 0.00593\n", + " 30/1 1.01820 1.02454 +/- 0.00564\n", + " 31/1 1.02753 1.02468 +/- 0.00537\n", + " 32/1 1.02162 1.02454 +/- 0.00512\n", + " 33/1 1.04083 1.02525 +/- 0.00494\n", + " 34/1 1.03335 1.02558 +/- 0.00474\n", + " 35/1 1.01304 1.02508 +/- 0.00458\n", + " 36/1 0.99299 1.02385 +/- 0.00457\n", + " 37/1 1.04936 1.02479 +/- 0.00450\n", + " 38/1 1.02856 1.02493 +/- 0.00433\n", + " 39/1 1.03706 1.02535 +/- 0.00420\n", + " 40/1 1.08118 1.02721 +/- 0.00447\n", + " 41/1 1.00149 1.02638 +/- 0.00440\n", + " 42/1 1.00233 1.02563 +/- 0.00433\n", + " 43/1 1.03023 1.02577 +/- 0.00419\n", + " 44/1 1.03230 1.02596 +/- 0.00407\n", + " 45/1 0.98123 1.02468 +/- 0.00416\n", + " 46/1 1.02126 1.02458 +/- 0.00404\n", + " 47/1 0.99772 1.02386 +/- 0.00400\n", + " 48/1 1.02773 1.02396 +/- 0.00389\n", + " 49/1 1.01690 1.02378 +/- 0.00379\n", + " 50/1 1.02890 1.02391 +/- 0.00370\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -830,27 +831,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.2114E-01 seconds\n", - " Reading cross sections = 2.9270E-01 seconds\n", - " Total time in simulation = 7.0359E+00 seconds\n", - " Time in transport only = 6.4162E+00 seconds\n", - " Time in inactive batches = 4.6555E-01 seconds\n", - " Time in active batches = 6.5703E+00 seconds\n", - " Time synchronizing fission bank = 2.7486E-03 seconds\n", - " Sampling source sites = 1.8012E-03 seconds\n", - " SEND/RECV source sites = 9.0751E-04 seconds\n", - " Time accumulating tallies = 3.3323E-04 seconds\n", - " Total time for finalization = 2.6483E-05 seconds\n", - " Total time elapsed = 7.4667E+00 seconds\n", - " Calculation Rate (inactive) = 53700.2 neutrons/second\n", - " Calculation Rate (active) = 15219.9 neutrons/second\n", + " Total time for initialization = 5.2287E-01 seconds\n", + " Reading cross sections = 3.5267E-01 seconds\n", + " Total time in simulation = 1.3331E+01 seconds\n", + " Time in transport only = 1.3109E+01 seconds\n", + " Time in inactive batches = 9.4551E-01 seconds\n", + " Time in active batches = 1.2385E+01 seconds\n", + " Time synchronizing fission bank = 3.8467E-03 seconds\n", + " Sampling source sites = 2.5076E-03 seconds\n", + " SEND/RECV source sites = 1.2758E-03 seconds\n", + " Time accumulating tallies = 7.0302E-04 seconds\n", + " Total time for finalization = 1.5000E-05 seconds\n", + " Total time elapsed = 1.3863E+01 seconds\n", + " Calculation Rate (inactive) = 26440.9 neutrons/second\n", + " Calculation Rate (active) = 8074.24 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02436 +/- 0.00318\n", - " k-effective (Track-length) = 1.02656 +/- 0.00404\n", - " k-effective (Absorption) = 1.02601 +/- 0.00333\n", - " Combined k-effective = 1.02539 +/- 0.00276\n", + " k-effective (Collision) = 1.02621 +/- 0.00393\n", + " k-effective (Track-length) = 1.02391 +/- 0.00370\n", + " k-effective (Absorption) = 1.02077 +/- 0.00423\n", + " Combined k-effective = 1.02331 +/- 0.00353\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -970,7 +971,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -995,16 +996,16 @@ " 10000\n", " 1\n", " U235\n", - " 8.047288e-03\n", - " 2.712731e-05\n", + " 8.096764e-03\n", + " 3.130177e-05\n", " \n", " \n", " 4\n", " 10000\n", " 1\n", " U238\n", - " 7.364803e-03\n", - " 4.197956e-05\n", + " 7.364515e-03\n", + " 4.510564e-05\n", " \n", " \n", " 5\n", @@ -1019,16 +1020,16 @@ " 10000\n", " 2\n", " U235\n", - " 3.616058e-01\n", - " 2.178190e-03\n", + " 3.611153e-01\n", + " 2.048312e-03\n", " \n", " \n", " 1\n", " 10000\n", " 2\n", " U238\n", - " 6.743624e-07\n", - " 4.004691e-09\n", + " 6.735070e-07\n", + " 3.780177e-09\n", " \n", " \n", " 2\n", @@ -1044,11 +1045,11 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "3 10000 1 U235 8.047288e-03 2.712731e-05\n", - "4 10000 1 U238 7.364803e-03 4.197956e-05\n", + "3 10000 1 U235 8.096764e-03 3.130177e-05\n", + "4 10000 1 U238 7.364515e-03 4.510564e-05\n", "5 10000 1 O16 0.000000e+00 0.000000e+00\n", - "0 10000 2 U235 3.616058e-01 2.178190e-03\n", - "1 10000 2 U238 6.743624e-07 4.004691e-09\n", + "0 10000 2 U235 3.611153e-01 2.048312e-03\n", + "1 10000 2 U238 6.735070e-07 3.780177e-09\n", "2 10000 2 O16 0.000000e+00 0.000000e+00" ] }, @@ -1086,13 +1087,13 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU235\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.625 - 20000000.0eV]:\t8.05e-03 +/- 3.37e-01%\n", - " Group 2 [0.0 - 0.625 eV]:\t3.62e-01 +/- 6.02e-01%\n", + " Group 1 [0.625 - 20000000.0eV]:\t8.10e-03 +/- 3.87e-01%\n", + " Group 2 [0.0 - 0.625 eV]:\t3.61e-01 +/- 5.67e-01%\n", "\n", "\tNuclide =\tU238\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.625 - 20000000.0eV]:\t7.36e-03 +/- 5.70e-01%\n", - " Group 2 [0.0 - 0.625 eV]:\t6.74e-07 +/- 5.94e-01%\n", + " Group 1 [0.625 - 20000000.0eV]:\t7.36e-03 +/- 6.12e-01%\n", + " Group 2 [0.0 - 0.625 eV]:\t6.74e-07 +/- 5.61e-01%\n", "\n", "\tNuclide =\tO16\n", "\tCross Sections [cm^-1]:\n", @@ -1107,7 +1108,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1506: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1506: RuntimeWarning: invalid value encountered in true_divide\n", " data = self.std_dev[indices] / self.mean[indices]\n" ] } @@ -1134,11 +1135,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1212,7 +1213,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -1237,16 +1238,16 @@ " 10000\n", " 1\n", " U235\n", - " 0.074714\n", - " 0.000331\n", + " 0.074393\n", + " 0.000308\n", " \n", " \n", " 1\n", " 10000\n", " 1\n", " U238\n", - " 0.005976\n", - " 0.000034\n", + " 0.005982\n", + " 0.000036\n", " \n", " \n", " 2\n", @@ -1262,8 +1263,8 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "0 10000 1 U235 0.074714 0.000331\n", - "1 10000 1 U238 0.005976 0.000034\n", + "0 10000 1 U235 0.074393 0.000308\n", + "1 10000 1 U238 0.005982 0.000036\n", "2 10000 1 O16 0.000000 0.000000" ] }, @@ -1303,7 +1304,8 @@ "outputs": [], "source": [ "# Create an OpenMOC Geometry from the OpenCG Geometry\n", - "openmoc_geometry = get_openmoc_geometry(mgxs_lib.opencg_geometry)" + "opencg_geometry = get_opencg_geometry(mgxs_lib.geometry)\n", + "openmoc_geometry = get_openmoc_geometry(opencg_geometry)" ] }, { @@ -1324,11 +1326,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1359,131 +1361,131 @@ "text": [ "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.823553\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.780331\tres = 1.940E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.739473\tres = 6.545E-02\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.710842\tres = 5.284E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.689636\tres = 3.926E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.675006\tres = 3.007E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.665799\tres = 2.138E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.661143\tres = 1.377E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.660269\tres = 7.173E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.662521\tres = 1.977E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.667334\tres = 3.703E-03\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.674221\tres = 7.406E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.682763\tres = 1.042E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.692603\tres = 1.275E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.703433\tres = 1.448E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.714994\tres = 1.570E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.727063\tres = 1.649E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.739455\tres = 1.694E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.752013\tres = 1.710E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.764605\tres = 1.703E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.777124\tres = 1.679E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.789481\tres = 1.642E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.801604\tres = 1.595E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.813436\tres = 1.540E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.824931\tres = 1.480E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.836055\tres = 1.417E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.846783\tres = 1.352E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.857097\tres = 1.287E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.866984\tres = 1.221E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.876441\tres = 1.157E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.885464\tres = 1.094E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.894057\tres = 1.032E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.902225\tres = 9.732E-03\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.909975\tres = 9.161E-03\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.917318\tres = 8.615E-03\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.924266\tres = 8.093E-03\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.930830\tres = 7.596E-03\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.937025\tres = 7.123E-03\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.942865\tres = 6.675E-03\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.948364\tres = 6.251E-03\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.953538\tres = 5.850E-03\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.958400\tres = 5.472E-03\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.962967\tres = 5.115E-03\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.967251\tres = 4.779E-03\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.971269\tres = 4.464E-03\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.975034\tres = 4.167E-03\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.978560\tres = 3.889E-03\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.981859\tres = 3.627E-03\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.984944\tres = 3.382E-03\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.987828\tres = 3.153E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.990523\tres = 2.938E-03\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.993039\tres = 2.737E-03\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.995388\tres = 2.549E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.997579\tres = 2.373E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.999623\tres = 2.209E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.001528\tres = 2.056E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.003303\tres = 1.912E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.004956\tres = 1.779E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.006496\tres = 1.654E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.007930\tres = 1.538E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.009264\tres = 1.429E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.010505\tres = 1.328E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.011659\tres = 1.234E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.012732\tres = 1.147E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.013730\tres = 1.065E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.014657\tres = 9.889E-04\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.015518\tres = 9.182E-04\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.016319\tres = 8.524E-04\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.017062\tres = 7.912E-04\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.017752\tres = 7.343E-04\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.018393\tres = 6.813E-04\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.018987\tres = 6.321E-04\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.019539\tres = 5.864E-04\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.020051\tres = 5.439E-04\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.020527\tres = 5.044E-04\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.020967\tres = 4.677E-04\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.021376\tres = 4.337E-04\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.021755\tres = 4.021E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.022107\tres = 3.727E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.022432\tres = 3.454E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.022734\tres = 3.201E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.023014\tres = 2.966E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.023273\tres = 2.749E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.023514\tres = 2.547E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.023736\tres = 2.359E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.023943\tres = 2.185E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.024134\tres = 2.024E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.024311\tres = 1.875E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.024475\tres = 1.736E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.024626\tres = 1.608E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.024767\tres = 1.489E-04\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.024897\tres = 1.378E-04\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.025018\tres = 1.276E-04\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.025129\tres = 1.181E-04\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.025232\tres = 1.093E-04\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.025328\tres = 1.012E-04\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.025416\tres = 9.368E-05\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.025498\tres = 8.671E-05\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.025574\tres = 8.025E-05\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.025644\tres = 7.426E-05\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.025709\tres = 6.871E-05\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.025769\tres = 6.361E-05\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.025824\tres = 5.884E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.025876\tres = 5.443E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.025923\tres = 5.037E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.025967\tres = 4.659E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.026008\tres = 4.311E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.026046\tres = 3.987E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.026081\tres = 3.688E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.026113\tres = 3.412E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.026143\tres = 3.154E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.026170\tres = 2.920E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.026196\tres = 2.699E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.026219\tres = 2.497E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.026241\tres = 2.311E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.026261\tres = 2.135E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.026279\tres = 1.974E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.026297\tres = 1.826E-05\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.026312\tres = 1.690E-05\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.026327\tres = 1.563E-05\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.026341\tres = 1.446E-05\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.026353\tres = 1.337E-05\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.026365\tres = 1.235E-05\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.026376\tres = 1.141E-05\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.026386\tres = 1.057E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.823793\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.780554\tres = 1.938E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.739678\tres = 6.539E-02\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.711003\tres = 5.285E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.689738\tres = 3.931E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.675038\tres = 3.014E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.665753\tres = 2.147E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.661013\tres = 1.389E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.660052\tres = 7.293E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.662216\tres = 2.057E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.666942\tres = 3.576E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.673743\tres = 7.278E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.682202\tres = 1.030E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.691961\tres = 1.264E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.702715\tres = 1.438E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.714203\tres = 1.561E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.726205\tres = 1.641E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.738532\tres = 1.686E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.751030\tres = 1.703E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.763567\tres = 1.697E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.776034\tres = 1.674E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.788344\tres = 1.637E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.800423\tres = 1.591E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.812215\tres = 1.536E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.823673\tres = 1.477E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.834764\tres = 1.415E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.845462\tres = 1.350E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.855748\tres = 1.285E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.865611\tres = 1.220E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.875045\tres = 1.156E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.884048\tres = 1.093E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.892623\tres = 1.032E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.900775\tres = 9.727E-03\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.908511\tres = 9.158E-03\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.915841\tres = 8.613E-03\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.922778\tres = 8.092E-03\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.929332\tres = 7.596E-03\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.935519\tres = 7.124E-03\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.941351\tres = 6.676E-03\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.946843\tres = 6.253E-03\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.952011\tres = 5.852E-03\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.956869\tres = 5.474E-03\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.961431\tres = 5.118E-03\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.965712\tres = 4.783E-03\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.969727\tres = 4.467E-03\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.973489\tres = 4.170E-03\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.977013\tres = 3.892E-03\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.980310\tres = 3.631E-03\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.983394\tres = 3.386E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.986277\tres = 3.156E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.988971\tres = 2.942E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.991487\tres = 2.740E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.993835\tres = 2.552E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.996026\tres = 2.376E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.998069\tres = 2.212E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.999974\tres = 2.059E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.001749\tres = 1.915E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.003403\tres = 1.782E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.004943\tres = 1.657E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.006377\tres = 1.540E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.007711\tres = 1.432E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.008952\tres = 1.331E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.010107\tres = 1.237E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.011181\tres = 1.149E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.012179\tres = 1.067E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.013107\tres = 9.909E-04\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.013969\tres = 9.201E-04\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.014769\tres = 8.542E-04\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.015513\tres = 7.929E-04\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.016204\tres = 7.358E-04\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.016845\tres = 6.828E-04\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.017440\tres = 6.335E-04\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.017993\tres = 5.877E-04\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.018505\tres = 5.451E-04\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.018980\tres = 5.056E-04\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.019422\tres = 4.688E-04\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.019831\tres = 4.347E-04\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.020210\tres = 4.030E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.020562\tres = 3.736E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.020888\tres = 3.463E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.021190\tres = 3.209E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.021471\tres = 2.974E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.021730\tres = 2.756E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.021971\tres = 2.553E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.022194\tres = 2.365E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.022400\tres = 2.191E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.022592\tres = 2.030E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.022769\tres = 1.880E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.022933\tres = 1.741E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.023085\tres = 1.612E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.023226\tres = 1.493E-04\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.023356\tres = 1.382E-04\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.023477\tres = 1.279E-04\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.023589\tres = 1.184E-04\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.023692\tres = 1.096E-04\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.023788\tres = 1.015E-04\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.023876\tres = 9.392E-05\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.023958\tres = 8.694E-05\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.024034\tres = 8.044E-05\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.024104\tres = 7.445E-05\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.024169\tres = 6.889E-05\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.024229\tres = 6.374E-05\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.024285\tres = 5.896E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.024336\tres = 5.457E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.024384\tres = 5.048E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.024428\tres = 4.671E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.024469\tres = 4.320E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.024507\tres = 3.994E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.024541\tres = 3.696E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.024574\tres = 3.416E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.024603\tres = 3.163E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.024631\tres = 2.924E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.024656\tres = 2.704E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.024680\tres = 2.501E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.024702\tres = 2.312E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.024722\tres = 2.138E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.024741\tres = 1.981E-05\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.024758\tres = 1.827E-05\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.024774\tres = 1.690E-05\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.024789\tres = 1.564E-05\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.024802\tres = 1.446E-05\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.024815\tres = 1.338E-05\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.024827\tres = 1.236E-05\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.024837\tres = 1.143E-05\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.024847\tres = 1.057E-05\n" ] } ], @@ -1515,9 +1517,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.025390\n", - "openmoc keff = 1.026386\n", - "bias [pcm]: 99.6\n" + "openmc keff = 1.023307\n", + "openmoc keff = 1.024847\n", + "bias [pcm]: 154.0\n" ] } ], @@ -1625,7 +1627,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 43, @@ -1634,9 +1636,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1662,7 +1664,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" }, @@ -1676,7 +1678,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.5.2" } }, "nbformat": 4, From 8059854a77f22f3e92fc6ccba8f3c800cba5033a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 22 Feb 2017 06:56:13 -0600 Subject: [PATCH 13/18] Update settings.xml RELAX NG schema --- src/relaxng/settings.rnc | 41 ++++------- src/relaxng/settings.rng | 145 ++++++++++++--------------------------- 2 files changed, 56 insertions(+), 130 deletions(-) diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index 62d9451c3d..988fd0471a 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -1,29 +1,7 @@ element settings { - element confidence_intervals { xsd:boolean }? & + element batches { xsd:positiveInteger }? & - ( - element eigenvalue { - (element batches { xsd:positiveInteger } | - attribute batches { xsd:positiveInteger }) & - (element inactive { xsd:nonNegativeInteger } | - attribute inactive { xsd:nonNegativeInteger }) & - (element particles { xsd:positiveInteger } | - attribute particles { xsd:positiveInteger }) & - (element generations_per_batch { xsd:positiveInteger } | - attribute generations_per_batch { xsd:positiveInteger })? & - (element keff_trigger { - (element type { xsd:string } | attribute type { xsd:string }) & - (element threshold { xsd:double} | attribute threshold { xsd:double }) - } - )? - } | - element fixed_source { - (element batches { xsd:positiveInteger } | - attribute batches { xsd:positiveInteger }) & - (element particles { xsd:positiveInteger } | - attribute particles { xsd:positiveInteger }) - } - ) & + element confidence_intervals { xsd:boolean }? & element cutoff { (element weight { xsd:double } | attribute weight { xsd:double })? & @@ -43,12 +21,19 @@ element settings { attribute upper_right { list { xsd:double+ } }) }? & + element generations_per_batch { xsd:positiveInteger }? & + + element inactive { xsd:nonNegativeInteger }? & + + element keff_trigger { + (element type { xsd:string } | attribute type { xsd:string }) & + (element threshold { xsd:double} | attribute threshold { xsd:double }) + }? & + element log_grid_bins { xsd:positiveInteger }? & element max_order { xsd:nonNegativeInteger }? & - element natural_elements { xsd:string { maxLength = "20" } }? & - element no_reduce { xsd:boolean }? & element output { @@ -60,6 +45,8 @@ element settings { element output_path { xsd:string { maxLength = "255" } }? & + element particles { xsd:positiveInteger }? & + element ptables { xsd:boolean }? & element run_cmfd { xsd:boolean }? & @@ -179,5 +166,5 @@ element settings { (element E_max { xsd:double } | attribute E_max { xsd:double })? }* - }? & + }? } diff --git a/src/relaxng/settings.rng b/src/relaxng/settings.rng index cbeac25a51..fe0a294f42 100644 --- a/src/relaxng/settings.rng +++ b/src/relaxng/settings.rng @@ -1,107 +1,16 @@ + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 255 - - - - - - - 255 - - - @@ -208,6 +117,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -218,13 +159,6 @@ - - - - 20 - - - @@ -273,6 +207,11 @@ + + + + + From 58bb9c18eede9f4940b0f9e9df6527852c4d42ed Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 22 Feb 2017 14:50:16 -0600 Subject: [PATCH 14/18] Address easy comments from @wbinventor --- docs/source/io_formats/statepoint.rst | 73 +++++++++---------- docs/source/io_formats/summary.rst | 2 +- .../pythonapi/examples/mgxs-part-iii.ipynb | 2 +- openmc/checkvalue.py | 5 +- openmc/statepoint.py | 11 +-- openmc/surface.py | 6 +- src/hdf5_interface.F90 | 2 +- src/initialize.F90 | 6 +- src/summary.F90 | 10 +-- 9 files changed, 53 insertions(+), 64 deletions(-) diff --git a/docs/source/io_formats/statepoint.rst b/docs/source/io_formats/statepoint.rst index 8026c258e6..cbd916d23e 100644 --- a/docs/source/io_formats/statepoint.rst +++ b/docs/source/io_formats/statepoint.rst @@ -19,10 +19,10 @@ The current version of the statepoint file format is 16.0. - **path** (*char[]*) -- Path to directory containing input files. - **cmfd_on** (*int*) -- Flag indicating whether CMFD is on (1) or off (0). - - **tallies_present** (*int*) -- Flag indicating if tallies are - present in the file. - - **source_present** (*int*) -- Flag indicating if source bank is - present in the file. + - **tallies_present** (*int*) -- Flag indicating whether tallies + are present (1) or not (0). + - **source_present** (*int*) -- Flag indicating whether the source + bank is present (1) or not (0). :Datasets: - **seed** (*int8_t*) -- Pseudo-random number generator seed. - **energy_mode** (*char[]*) -- Energy mode of the run, either @@ -79,7 +79,7 @@ The current version of the statepoint file format is 16.0. **/tallies/meshes/** :Attributes: - **n_meshes** (*int*) -- Number of meshes in the problem. - - **ids** (*int[]*) -- User-identified unique ID of each mesh. + - **ids** (*int[]*) -- User-defined unique ID of each mesh. **/tallies/meshes/mesh /** @@ -143,37 +143,32 @@ The current version of the statepoint file format is 16.0. **/runtime/** -:Datasets: - **total initialization** (*double*) -- Time (in seconds on the - master process) spent reading inputs, allocating arrays, etc. - - **reading cross sections** (*double*) -- Time (in seconds on the - master process) spent loading cross section libraries (this is a - subset of initialization). - - **simulation** (*double*) -- Time (in seconds on the master - process) spent between initialization and finalization. - - **transport** (*double*) -- Time (in seconds on the master process) - spent transporting particles. - - **inactive batches** (*double*) -- Time (in seconds on the master - process) spent in the inactive batches (including non-transport - activities like communcating sites). - - **active batches** (*double*) -- Time (in seconds on the master - process) spent in the active batches (including non-transport - activities like communicating sites). - - **synchronizing fission bank** (*double*) -- Time (in seconds on - the master process) spent sampling source particles from fission - sites and communicating them to other processes for load balancing. - - **sampling source sites** (*double*) -- Time (in seconds on the - master process) spent sampling source particles from fission sites. - - **SEND-RECV source sites** (*double*) -- Time (in seconds on the - master process) spent communicating source sites between processes - for load balancing. - - **accumulating tallies** (*double*) -- Time (in seconds on the - master process) spent communicating tally results and evaluating - their statistics. - - **CMFD** (*double*) -- Time (in seconds on the master process) - spent evaluating CMFD. - - **CMFD building matrices** (*double*) -- Time (in seconds on the - master process) spent buliding CMFD matrices. - - **CMFD solving matrices** (*double*) -- Time (in seconds on the - master process) spent solving CMFD matrices. - - **total** (*double*) -- Total time spent (in seconds on the master - process) in the program. +All values are given in seconds and are measured on the master process. + +:Datasets: - **total initialization** (*double*) -- Time spent reading inputs, + allocating arrays, etc. + - **reading cross sections** (*double*) -- Time spent loading cross + section libraries (this is a subset of initialization). + - **simulation** (*double*) -- Time spent between initialization and + finalization. + - **transport** (*double*) -- Time spent transporting particles. + - **inactive batches** (*double*) -- Time spent in the inactive + batches (including non-transport activities like communcating + sites). + - **active batches** (*double*) -- Time spent in the active batches + (including non-transport activities like communicating sites). + - **synchronizing fission bank** (*double*) -- Time spent sampling + source particles from fission sites and communicating them to other + processes for load balancing. + - **sampling source sites** (*double*) -- Time spent sampling source + particles from fission sites. + - **SEND-RECV source sites** (*double*) -- Time spent communicating + source sites between processes for load balancing. + - **accumulating tallies** (*double*) -- Time spent communicating + tally results and evaluating their statistics. + - **CMFD** (*double*) -- Time spent evaluating CMFD. + - **CMFD building matrices** (*double*) -- Time spent buliding CMFD + matrices. + - **CMFD solving matrices** (*double*) -- Time spent solving CMFD + matrices. + - **total** (*double*) -- Total time spent in the program. diff --git a/docs/source/io_formats/summary.rst b/docs/source/io_formats/summary.rst index 671fa33348..f882705490 100644 --- a/docs/source/io_formats/summary.rst +++ b/docs/source/io_formats/summary.rst @@ -27,7 +27,7 @@ The current version of the summary file format is 5.0. **/geometry/cells/cell /** -:Datasets: - **name** (*char[]*) -- Name of the cell. +:Datasets: - **name** (*char[]*) -- User-defined name of the cell. - **universe** (*int*) -- Universe assigned to the cell. If none is specified, the default universe (0) is assigned. - **fill_type** (*char[]*) -- Type of fill for the cell. Can be diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index 40e195d65d..b76696d7fb 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -1303,7 +1303,7 @@ }, "outputs": [], "source": [ - "# Create an OpenMOC Geometry from the OpenCG Geometry\n", + "# Create an OpenMOC Geometry from an equivalent OpenCG Geometry\n", "opencg_geometry = get_opencg_geometry(mgxs_lib.geometry)\n", "openmoc_geometry = get_openmoc_geometry(opencg_geometry)" ] diff --git a/openmc/checkvalue.py b/openmc/checkvalue.py index 06e5240048..aa4dc067f9 100644 --- a/openmc/checkvalue.py +++ b/openmc/checkvalue.py @@ -263,9 +263,10 @@ def check_filetype_version(obj, expected_type, expected_version): # Check version if this_version[0] != expected_version: - raise IOError('Statepoint file has a version of {} which is not ' + raise IOError('{} file has a version of {} which is not ' 'consistent with the version expected by OpenMC, {}' - .format('.'.join(this_version), expected_version)) + .format(this_filetype, '.'.join(this_version), + expected_version)) except AttributeError: raise IOError('Could not read {} file. This most likely means the {} ' 'file was produced by a different version of OpenMC than ' diff --git a/openmc/statepoint.py b/openmc/statepoint.py index f29829a417..9c96408855 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -113,6 +113,7 @@ class StatePoint(object): self._f = h5py.File(filename, 'r') self._meshes = {} self._tallies = {} + self._derivs = {} # Check filetype and version cv.check_filetype_version(self._f, 'statepoint', _VERSION_STATEPOINT) @@ -326,7 +327,7 @@ class StatePoint(object): # Read a list of the IDs for each Tally if n_tallies > 0: - # Tally used-defined IDs + # Tally user-defined IDs tally_ids = tallies_group.attrs['ids'] else: tally_ids = [] @@ -405,11 +406,6 @@ class StatePoint(object): @property def tally_derivatives(self): if not self._derivs_read: - # Initialize dictionaries for the Meshes - # Keys - Derivative IDs - # Values - TallyDerivative objects - self._derivs = {} - # Populate the dictionary if any derivatives are present. if 'derivatives' in self._f['tallies']: # Read the derivative ids. @@ -429,9 +425,6 @@ class StatePoint(object): deriv.nuclide = group['nuclide'].value.decode() elif deriv.variable == 'temperature': deriv.material = group['material'].value - else: - raise ValueError('Unrecognized tally differential ' - 'variable') self._derivs[d_id] = deriv self._derivs_read = True diff --git a/openmc/surface.py b/openmc/surface.py index 193afe3100..e7d999b15e 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -14,7 +14,7 @@ from openmc.region import Region, Intersection, Union # A static variable for auto-generated Surface IDs AUTO_SURFACE_ID = 10000 -_BC_TYPES = ['transmission', 'vacuum', 'reflective', 'periodic'] +_BOUNDARY_TYPES = ['transmission', 'vacuum', 'reflective', 'periodic'] def reset_auto_surface_id(): @@ -141,7 +141,7 @@ class Surface(object): @boundary_type.setter def boundary_type(self, boundary_type): check_type('boundary type', boundary_type, string_types) - check_value('boundary type', boundary_type, _BC_TYPES) + check_value('boundary type', boundary_type, _BOUNDARY_TYPES) self._boundary_type = boundary_type def bounding_box(self, side): @@ -204,7 +204,7 @@ class Surface(object): surface_id = int(group.name.split('/')[-1].lstrip('surface ')) name = group['name'].value.decode() surf_type = group['type'].value.decode() - bc = group['boundary_condition'].value.decode() + bc = group['boundary_type'].value.decode() coeffs = group['coefficients'][...] # Create the Surface based on its type diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 6ca39e0001..3a25825112 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -2067,7 +2067,7 @@ contains call h5tcopy_f(H5T_C_S1, filetype, hdf5_err) call h5tset_size_f(filetype, n, hdf5_err) - ! Crate memory space and attribute + ! Create memory space and attribute call h5screate_f(H5S_SCALAR_F, dspace_id, hdf5_err) call h5acreate_f(obj_id, trim(name), filetype, dspace_id, & attr_id, hdf5_err) diff --git a/src/initialize.F90 b/src/initialize.F90 index ed1e663fdb..be4b0f28a6 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -13,18 +13,18 @@ module initialize use set_header, only: SetInt use energy_grid, only: logarithmic_grid, grid_method use error, only: fatal_error, warning - use geometry, only: neighbor_lists, count_instance, calc_offsets, & + use geometry, only: neighbor_lists, count_instance, calc_offsets, & maximum_levels use geometry_header, only: Cell, Universe, Lattice, RectLattice, HexLattice,& &BASE_UNIVERSE use global - use hdf5_interface, only: file_open, read_attribute, file_close, & + use hdf5_interface, only: file_open, read_attribute, file_close, & hdf5_bank_t, hdf5_integer8_t use input_xml, only: read_input_xml, cells_in_univ_dict, read_plots_xml use material_header, only: Material use message_passing use mgxs_data, only: read_mgxs, create_macro_xs - use output, only: title, header, print_version, write_message, & + use output, only: title, header, print_version, write_message, & print_usage, print_plot use random_lcg, only: initialize_prng use state_point, only: load_state_point diff --git a/src/summary.F90 b/src/summary.F90 index fa5681052f..e6ad6f5d95 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -329,16 +329,16 @@ contains call write_dataset(surface_group, "coefficients", coeffs) deallocate(coeffs) - ! Write boundary condition + ! Write boundary type select case (s%bc) case (BC_TRANSMIT) - call write_dataset(surface_group, "boundary_condition", "transmission") + call write_dataset(surface_group, "boundary_type", "transmission") case (BC_VACUUM) - call write_dataset(surface_group, "boundary_condition", "vacuum") + call write_dataset(surface_group, "boundary_type", "vacuum") case (BC_REFLECT) - call write_dataset(surface_group, "boundary_condition", "reflective") + call write_dataset(surface_group, "boundary_type", "reflective") case (BC_PERIODIC) - call write_dataset(surface_group, "boundary_condition", "periodic") + call write_dataset(surface_group, "boundary_type", "periodic") end select call close_group(surface_group) From 01254d0b3de170a566d1c731757b90fe543c2801 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 22 Feb 2017 17:00:25 -0600 Subject: [PATCH 15/18] Make Universe, Lattice, and Material.from_hdf5 methods --- openmc/cell.py | 2 +- openmc/lattice.py | 151 ++++++++++++++++++++++++++++++ openmc/material.py | 43 +++++++++ openmc/summary.py | 224 +++------------------------------------------ openmc/surface.py | 22 ++++- openmc/universe.py | 29 ++++++ 6 files changed, 255 insertions(+), 216 deletions(-) diff --git a/openmc/cell.py b/openmc/cell.py index 8cd87daf3d..87dbb0797c 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -563,7 +563,7 @@ class Cell(object): if isinstance(node, Halfspace): path = "./surface[@id='{}']".format(node.surface.id) if xml_element.find(path) is None: - xml_element.append(node.surface.create_xml_subelement()) + xml_element.append(node.surface.to_xml_element()) elif isinstance(node, Complement): create_surface_elements(node.node, element) else: diff --git a/openmc/lattice.py b/openmc/lattice.py index d6f701e529..361c2a6be9 100644 --- a/openmc/lattice.py +++ b/openmc/lattice.py @@ -110,6 +110,157 @@ class Lattice(object): cv.check_type('outer universe', outer, openmc.Universe) self._outer = outer + @staticmethod + def from_hdf5(group, universes): + """Create lattice from HDF5 group + + Parameters + ---------- + group : h5py.Group + Group in HDF5 file + universes : dict + Dictionary mapping universe IDs to instances of + :class:`openmc.Universe`. + + Returns + ------- + openmc.Lattice + Instance of lattice subclass + + """ + lattice_id = int(group.name.split('/')[-1].lstrip('lattice ')) + name = group['name'].value.decode() + lattice_type = group['type'].value.decode() + + if 'offsets' in group: + offsets = group['offsets'][...] + else: + offsets = None + + if lattice_type == 'rectangular': + dimension = group['dimension'][...] + lower_left = group['lower_left'][...] + pitch = group['pitch'][...] + outer = group['outer'].value + universe_ids = group['universes'][...] + + # Create the Lattice + lattice = openmc.RectLattice(lattice_id, name) + lattice.lower_left = lower_left + lattice.pitch = pitch + + # If the Universe specified outer the Lattice is not void + if outer >= 0: + lattice.outer = universes[outer] + + # Build array of Universe pointers for the Lattice + uarray = np.empty(universe_ids.shape, dtype=openmc.Universe) + + for z in range(universe_ids.shape[0]): + for y in range(universe_ids.shape[1]): + for x in range(universe_ids.shape[2]): + uarray[z, y, x] = universes[universe_ids[z, y, x]] + + # Use 2D NumPy array to store lattice universes for 2D lattices + if len(dimension) == 2: + uarray = np.squeeze(uarray) + uarray = np.atleast_2d(uarray) + + # Set the universes for the lattice + lattice.universes = uarray + + # Set the distribcell offsets for the lattice + if offsets is not None: + lattice.offsets = offsets + + elif lattice_type == 'hexagonal': + n_rings = group['n_rings'].value + n_axial = group['n_axial'].value + center = group['center'][...] + pitch = group['pitch'][...] + outer = group['outer'].value + + universe_ids = group['universes'][...] + + # Create the Lattice + lattice = openmc.HexLattice(lattice_id, name) + lattice.center = center + lattice.pitch = pitch + + # If the Universe specified outer the Lattice is not void + if outer >= 0: + lattice.outer = universes[outer] + + # Build array of Universe pointers for the Lattice. Note that + # we need to convert between the HDF5's square array of + # (x, alpha, z) to the Python API's format of a ragged nested + # list of (z, ring, theta). + uarray = [] + for z in range(n_axial): + # Add a list for this axial level. + uarray.append([]) + x = n_rings - 1 + a = 2*n_rings - 2 + for r in range(n_rings - 1, 0, -1): + # Add a list for this ring. + uarray[-1].append([]) + + # Climb down the top-right. + for i in range(r): + uarray[-1][-1].append(universe_ids[z, a, x]) + x += 1 + a -= 1 + + # Climb down the right. + for i in range(r): + uarray[-1][-1].append(universe_ids[z, a, x]) + a -= 1 + + # Climb down the bottom-right. + for i in range(r): + uarray[-1][-1].append(universe_ids[z, a, x]) + x -= 1 + + # Climb up the bottom-left. + for i in range(r): + uarray[-1][-1].append(universe_ids[z, a, x]) + x -= 1 + a += 1 + + # Climb up the left. + for i in range(r): + uarray[-1][-1].append(universe_ids[z, a, x]) + a += 1 + + # Climb up the top-left. + for i in range(r): + uarray[-1][-1].append(universe_ids[z, a, x]) + x += 1 + + # Move down to the next ring. + a -= 1 + + # Convert the ids into Universe objects. + uarray[-1][-1] = [universes[u_id] + for u_id in uarray[-1][-1]] + + # Handle the degenerate center ring separately. + u_id = universe_ids[z, a, x] + uarray[-1].append([universes[u_id]]) + + # Add the universes to the lattice. + if len(pitch) == 2: + # Lattice is 3D + lattice.universes = uarray + else: + # Lattice is 2D; extract the only axial level + lattice.universes = uarray[0] + + if offsets is not None: + lattice.offsets = offsets + + return lattice + def get_unique_universes(self): """Determine all unique universes in the lattice diff --git a/openmc/material.py b/openmc/material.py index 7d59c52ee1..b9705243ec 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -259,6 +259,49 @@ class Material(object): depletable, bool) self._depletable = depletable + @classmethod + def from_hdf5(cls, group): + """Create material from HDF5 group + + Parameters + ---------- + group : h5py.Group + Group in HDF5 file + + Returns + ------- + openmc.Material + Material instance + + """ + mat_id = int(group.name.split('/')[-1].lstrip('material ')) + + name = group['name'].value.decode() + density = group['atom_density'].value + nuc_densities = group['nuclide_densities'][...] + nuclides = group['nuclides'].value + + # Create the Material + material = cls(mat_id, name) + material.depletable = bool(group.attrs['depletable']) + + # Read the names of the S(a,b) tables for this Material and add them + if 'sab_names' in group: + sab_tables = group['sab_names'].value + for sab_table in sab_tables: + name = sab_table.decode() + material.add_s_alpha_beta(name) + + # Set the Material's density to atom/b-cm as used by OpenMC + material.set_density(density=density, units='atom/b-cm') + + # Add all nuclides to the Material + for fullname, density in zip(nuclides, nuc_densities): + name = fullname.decode().strip() + material.add_nuclide(name, percent=density, percent_type='ao') + + return material + def set_density(self, units, density=None): """Set the density of the material diff --git a/openmc/summary.py b/openmc/summary.py index 3b39d7489e..40299a2e4a 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -83,40 +83,10 @@ class Summary(object): self._finalize_geometry(cells, cell_fills, universes, lattices) def _read_materials(self): - for key, group in self._f['materials'].items(): - material_id = int(key.lstrip('material ')) + for group in self._f['materials'].values(): + material = openmc.Material.from_hdf5(group) - name = group['name'].value.decode() - density = group['atom_density'].value - nuc_densities = group['nuclide_densities'][...] - nuclides = group['nuclides'].value - - # Create the Material - material = openmc.Material(material_id=material_id, name=name) - material.depletable = bool(group.attrs['depletable']) - - # Read the names of the S(a,b) tables for this Material and add them - if 'sab_names' in group: - sab_tables = group['sab_names'].value - for sab_table in sab_tables: - name = sab_table.decode() - material.add_s_alpha_beta(name) - - # Set the Material's density to atom/b-cm as used by OpenMC - material.set_density(density=density, units='atom/b-cm') - - # Add all nuclides to the Material - for fullname, density in zip(nuclides, nuc_densities): - name = fullname.decode().strip() - - if 'nat' in name: - material.add_element(openmc.Element(name=name), - percent=density, percent_type='ao') - else: - material.add_nuclide(openmc.Nuclide(name=name), - percent=density, percent_type='ao') - - # Add the Material to the global dictionary of all Materials + # Add the material to the Materials collection self.materials.append(material) def _read_surfaces(self): @@ -193,179 +163,30 @@ class Summary(object): def _read_universes(self, cells): universes = {} - - for key in self._f['geometry/universes'].keys(): - universe_id = int(key.lstrip('universe ')) - cell_ids = self._f['geometry/universes'][key]['cells'][...] - - # Create this Universe - universe = openmc.Universe(universe_id=universe_id) - - # Add each Cell to the Universe - for cell_id in cell_ids: - universe.add_cell(cells[cell_id]) - - # Add the Universe to the global list of Universes + for group in self._f['geometry/universes'].values(): + universe = openmc.Universe.from_hdf5(group, cells) universes[universe.id] = universe - return universes def _read_lattices(self, universes): lattices = {} - - for key, group in self._f['geometry/lattices'].items(): - lattice_id = int(key.lstrip('lattice ')) - name = group['name'].value.decode() - lattice_type = group['type'].value.decode() - - if 'offsets' in group: - offsets = group['offsets'][...] - else: - offsets = None - - if lattice_type == 'rectangular': - dimension = group['dimension'][...] - lower_left = group['lower_left'][...] - pitch = group['pitch'][...] - outer = group['outer'].value - universe_ids = group['universes'][...] - - # Create the Lattice - lattice = openmc.RectLattice(lattice_id=lattice_id, name=name) - lattice.lower_left = lower_left - lattice.pitch = pitch - - # If the Universe specified outer the Lattice is not void - if outer >= 0: - lattice.outer = universes[outer] - - # Build array of Universe pointers for the Lattice - uarray = np.empty(universe_ids.shape, dtype=openmc.Universe) - - for z in range(universe_ids.shape[0]): - for y in range(universe_ids.shape[1]): - for x in range(universe_ids.shape[2]): - uarray[z, y, x] = universes[universe_ids[z, y, x]] - - # Use 2D NumPy array to store lattice universes for 2D lattices - if len(dimension) == 2: - uarray = np.squeeze(uarray) - uarray = np.atleast_2d(uarray) - - # Set the universes for the lattice - lattice.universes = uarray - - # Set the distribcell offsets for the lattice - if offsets is not None: - lattice.offsets = offsets - - # Add the Lattice to the global dictionary of all Lattices - lattices[lattice.id] = lattice - - elif lattice_type == 'hexagonal': - n_rings = group['n_rings'].value - n_axial = group['n_axial'].value - center = group['center'][...] - pitch = group['pitch'][...] - outer = group['outer'].value - - universe_ids = group['universes'][...] - - # Create the Lattice - lattice = openmc.HexLattice(lattice_id=lattice_id, name=name) - lattice.center = center - lattice.pitch = pitch - - # If the Universe specified outer the Lattice is not void - if outer >= 0: - lattice.outer = universes[outer] - - # Build array of Universe pointers for the Lattice. Note that - # we need to convert between the HDF5's square array of - # (x, alpha, z) to the Python API's format of a ragged nested - # list of (z, ring, theta). - uarray = [] - for z in range(n_axial): - # Add a list for this axial level. - uarray.append([]) - x = n_rings - 1 - a = 2*n_rings - 2 - for r in range(n_rings - 1, 0, -1): - # Add a list for this ring. - uarray[-1].append([]) - - # Climb down the top-right. - for i in range(r): - uarray[-1][-1].append(universe_ids[z, a, x]) - x += 1 - a -= 1 - - # Climb down the right. - for i in range(r): - uarray[-1][-1].append(universe_ids[z, a, x]) - a -= 1 - - # Climb down the bottom-right. - for i in range(r): - uarray[-1][-1].append(universe_ids[z, a, x]) - x -= 1 - - # Climb up the bottom-left. - for i in range(r): - uarray[-1][-1].append(universe_ids[z, a, x]) - x -= 1 - a += 1 - - # Climb up the left. - for i in range(r): - uarray[-1][-1].append(universe_ids[z, a, x]) - a += 1 - - # Climb up the top-left. - for i in range(r): - uarray[-1][-1].append(universe_ids[z, a, x]) - x += 1 - - # Move down to the next ring. - a -= 1 - - # Convert the ids into Universe objects. - uarray[-1][-1] = [universes[u_id] - for u_id in uarray[-1][-1]] - - # Handle the degenerate center ring separately. - u_id = universe_ids[z, a, x] - uarray[-1].append([universes[u_id]]) - - # Add the universes to the lattice. - if len(pitch) == 2: - # Lattice is 3D - lattice.universes = uarray - else: - # Lattice is 2D; extract the only axial level - lattice.universes = uarray[0] - - if offsets is not None: - lattice.offsets = offsets - - # Add the Lattice to the global dictionary of all Lattices - lattices[lattice.id] = lattice - + for group in self._f['geometry/lattices'].values(): + lattice = openmc.Lattice.from_hdf5(group, universes) + lattices[lattice.id] = lattice return lattices def _finalize_geometry(self, cells, cell_fills, universes, lattices): + materials = {m.id: m for m in self.materials} + # Iterate over all Cells and add fill Materials, Universes and Lattices for cell_id, (fill_type, fill_id) in cell_fills.items(): # Retrieve the object corresponding to the fill type and ID if fill_type == 'normal': if isinstance(fill_id, Iterable): - fill = [self.get_material_by_id(mat) if mat > 0 else None + fill = [materials[mat] if mat > 0 else None for mat in fill_id] else: - if fill_id > 0: - fill = self.get_material_by_id(fill_id) - else: - fill = None + fill = materials[fill_id] if fill_id > 0 else None elif fill_type == 'universe': fill = universes[fill_id] else: @@ -387,24 +208,3 @@ class Summary(object): """ self.geometry.add_volume_information(volume_calc) - - def get_material_by_id(self, material_id): - """Return a Material object given the material id - - Parameters - ---------- - id : int - Unique identifier for the material - - Returns - ------- - material : openmc.Material - Material with given id - - """ - - for material in self.materials: - if material.id == material_id: - return material - - return None diff --git a/openmc/surface.py b/openmc/surface.py index e7d999b15e..5eb242003b 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -171,7 +171,15 @@ class Surface(object): return (np.array([-np.inf, -np.inf, -np.inf]), np.array([np.inf, np.inf, np.inf])) - def create_xml_subelement(self): + def to_xml_element(self): + """Return XML representation of the surface + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing source data + + """ element = ET.Element("surface") element.set("id", str(self._id)) @@ -384,8 +392,16 @@ class Plane(Surface): x, y, z = point return self.a*x + self.b*y + self.c*z - self.d - def create_xml_subelement(self): - element = super(Plane, self).create_xml_subelement() + def to_xml_element(self): + """Return XML representation of the surface + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing source data + + """ + element = super(Plane, self).to_xml_element() # Add periodic surface pair information if self.boundary_type == 'periodic': diff --git a/openmc/universe.py b/openmc/universe.py index b66a20cfe4..19f6cf47fd 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -118,6 +118,35 @@ class Universe(object): else: self._name = '' + @classmethod + def from_hdf5(cls, group, cells): + """Create universe from HDF5 group + + Parameters + ---------- + group : h5py.Group + Group in HDF5 file + cells : dict + Dictionary mapping cell IDs to instances of :class:`openmc.Cell`. + + Returns + ------- + openmc.Universe + Universe instance + + """ + universe_id = int(group.name.split('/')[-1].lstrip('universe ')) + cell_ids = group['cells'].value + + # Create this Universe + universe = cls(universe_id) + + # Add each Cell to the Universe + for cell_id in cell_ids: + universe.add_cell(cells[cell_id]) + + return universe + def find(self, point): """Find cells/universes/lattices which contain a given point From eecf45411b1631865f2876b40b908befb5356159 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 22 Feb 2017 17:09:19 -0600 Subject: [PATCH 16/18] 'normal' fill type -> 'material' --- docs/source/io_formats/summary.rst | 2 +- openmc/summary.py | 6 +++--- src/constants.F90 | 8 ++++---- src/geometry.F90 | 32 +++++++++++++++--------------- src/initialize.F90 | 10 +++++----- src/plot.F90 | 2 +- src/summary.F90 | 8 ++++---- src/tally_filter.F90 | 16 +++++++-------- 8 files changed, 42 insertions(+), 42 deletions(-) diff --git a/docs/source/io_formats/summary.rst b/docs/source/io_formats/summary.rst index f882705490..b047ac225c 100644 --- a/docs/source/io_formats/summary.rst +++ b/docs/source/io_formats/summary.rst @@ -31,7 +31,7 @@ The current version of the summary file format is 5.0. - **universe** (*int*) -- Universe assigned to the cell. If none is specified, the default universe (0) is assigned. - **fill_type** (*char[]*) -- Type of fill for the cell. Can be - 'normal', 'universe', or 'lattice'. + 'material', 'universe', or 'lattice'. - **material** (*int* or *int[]*) -- Unique ID of the material(s) assigned to the cell. This dataset is present only if fill_type is set to 'normal'. The value '-1' signifies void material. The data diff --git a/openmc/summary.py b/openmc/summary.py index 40299a2e4a..8347105b1e 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -108,7 +108,7 @@ class Summary(object): name = group['name'].value.decode() fill_type = group['fill_type'].value.decode() - if fill_type == 'normal': + if fill_type == 'material': fill = group['material'].value elif fill_type == 'universe': fill = group['fill'].value @@ -138,7 +138,7 @@ class Summary(object): rotation = np.asarray(rotation, dtype=np.int) cell._rotation = rotation - elif fill_type == 'normal': + elif fill_type == 'material': cell.temperature = group['temperature'][...] # Store Cell fill information for after Universe/Lattice creation @@ -181,7 +181,7 @@ class Summary(object): # Iterate over all Cells and add fill Materials, Universes and Lattices for cell_id, (fill_type, fill_id) in cell_fills.items(): # Retrieve the object corresponding to the fill type and ID - if fill_type == 'normal': + if fill_type == 'material': if isinstance(fill_id, Iterable): fill = [materials[mat] if mat > 0 else None for mat in fill_id] diff --git a/src/constants.F90 b/src/constants.F90 index 4b57ac5406..a2590a12a0 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -107,11 +107,11 @@ module constants OP_INTERSECTION = huge(0) - 3, & ! Intersection operator OP_UNION = huge(0) - 4 ! Union operator (^) - ! Cell types + ! Cell fill types integer, parameter :: & - CELL_NORMAL = 1, & ! Cell with a specified material - CELL_FILL = 2, & ! Cell filled by a separate universe - CELL_LATTICE = 3 ! Cell filled with a lattice + FILL_MATERIAL = 1, & ! Cell with a specified material + FILL_UNIVERSE = 2, & ! Cell filled by a separate universe + FILL_LATTICE = 3 ! Cell filled with a lattice ! Void material integer, parameter :: MATERIAL_VOID = -1 diff --git a/src/geometry.F90 b/src/geometry.F90 index d41ca14475..ecb76d0505 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -244,7 +244,7 @@ contains call write_message(" Entering cell " // trim(to_str(c % id))) end if - CELL_TYPE: if (c % type == CELL_NORMAL) then + CELL_TYPE: if (c % type == FILL_MATERIAL) then ! ====================================================================== ! AT LOWEST UNIVERSE, TERMINATE SEARCH @@ -260,10 +260,10 @@ contains distribcell_index = c % distribcell_index offset = 0 do k = 1, p % n_coord - if (cells(p % coord(k) % cell) % type == CELL_FILL) then + if (cells(p % coord(k) % cell) % type == FILL_UNIVERSE) then offset = offset + cells(p % coord(k) % cell) % & offset(distribcell_index) - elseif (cells(p % coord(k) % cell) % type == CELL_LATTICE) then + elseif (cells(p % coord(k) % cell) % type == FILL_LATTICE) then if (lattices(p % coord(k + 1) % lattice) % obj & % are_valid_indices([& p % coord(k + 1) % lattice_x, & @@ -293,7 +293,7 @@ contains p % sqrtkT = c % sqrtkT(1) end if - elseif (c % type == CELL_FILL) then CELL_TYPE + elseif (c % type == FILL_UNIVERSE) then CELL_TYPE ! ====================================================================== ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL @@ -322,7 +322,7 @@ contains j = p % n_coord if (.not. found) exit - elseif (c % type == CELL_LATTICE) then CELL_TYPE + elseif (c % type == FILL_LATTICE) then CELL_TYPE ! ====================================================================== ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL @@ -1116,11 +1116,11 @@ contains ! ==================================================================== ! AT LOWEST UNIVERSE, TERMINATE SEARCH - if (c % type == CELL_NORMAL) then + if (c % type == FILL_MATERIAL) then ! ==================================================================== ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL - elseif (c % type == CELL_FILL) then + elseif (c % type == FILL_UNIVERSE) then ! Set offset for the cell on this level c % offset(map) = offset @@ -1134,7 +1134,7 @@ contains ! ==================================================================== ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL - elseif (c % type == CELL_LATTICE) then + elseif (c % type == FILL_LATTICE) then ! Set current lattice lat => lattices(c % fill) % obj @@ -1232,11 +1232,11 @@ contains ! ==================================================================== ! AT LOWEST UNIVERSE, TERMINATE SEARCH - if (c % type == CELL_NORMAL) then + if (c % type == FILL_MATERIAL) then ! ==================================================================== ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL - elseif (c % type == CELL_FILL) then + elseif (c % type == FILL_UNIVERSE) then next_univ => universes(c % fill) @@ -1251,7 +1251,7 @@ contains ! ==================================================================== ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL - elseif (c % type == CELL_LATTICE) then + elseif (c % type == FILL_LATTICE) then ! Set current lattice lat => lattices(c % fill) % obj @@ -1346,11 +1346,11 @@ contains ! ==================================================================== ! AT LOWEST UNIVERSE, TERMINATE SEARCH - if (c % type == CELL_NORMAL) then + if (c % type == FILL_MATERIAL) then ! ==================================================================== ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL - elseif (c % type == CELL_FILL) then + elseif (c % type == FILL_UNIVERSE) then next_univ => universes(c % fill) @@ -1359,7 +1359,7 @@ contains ! ==================================================================== ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL - elseif (c % type == CELL_LATTICE) then + elseif (c % type == FILL_LATTICE) then ! Set current lattice lat => lattices(c % fill) % obj @@ -1428,14 +1428,14 @@ contains ! ==================================================================== ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL - if (c % type == CELL_FILL) then + if (c % type == FILL_UNIVERSE) then next_univ => universes(c % fill) levels_below = max(levels_below, maximum_levels(next_univ)) ! ==================================================================== ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL - elseif (c % type == CELL_LATTICE) then + elseif (c % type == FILL_LATTICE) then ! Set current lattice lat => lattices(c % fill) % obj diff --git a/src/initialize.F90 b/src/initialize.F90 index be4b0f28a6..2ed47a8baf 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -560,11 +560,11 @@ contains if (c % material(1) == NONE) then id = c % fill if (universe_dict % has_key(id)) then - c % type = CELL_FILL + c % type = FILL_UNIVERSE c % fill = universe_dict % get_key(id) elseif (lattice_dict % has_key(id)) then lid = lattice_dict % get_key(id) - c % type = CELL_LATTICE + c % type = FILL_LATTICE c % fill = lid else call fatal_error("Specified fill " // trim(to_str(id)) // " on cell "& @@ -575,9 +575,9 @@ contains do j = 1, size(c % material) id = c % material(j) if (id == MATERIAL_VOID) then - c % type = CELL_NORMAL + c % type = FILL_MATERIAL else if (material_dict % has_key(id)) then - c % type = CELL_NORMAL + c % type = FILL_MATERIAL c % material(j) = material_dict % get_key(id) else call fatal_error("Could not find material " // trim(to_str(id)) & @@ -934,7 +934,7 @@ contains ! Allocate offset table for fill cells do i = 1, n_cells - if (cells(i) % type /= CELL_NORMAL) then + if (cells(i) % type /= FILL_MATERIAL) then allocate(cells(i) % offset(n_maps)) end if end do diff --git a/src/plot.F90 b/src/plot.F90 index 86d303b3dd..ee8ffdb14f 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -84,7 +84,7 @@ contains if (pl % color_by == PLOT_COLOR_MATS) then ! Assign color based on material associate (c => cells(p % coord(j) % cell)) - if (c % type == CELL_FILL) then + if (c % type == FILL_UNIVERSE) then ! If we stopped on a middle universe level, treat as if not found rgb = pl % not_found % rgb id = -1 diff --git a/src/summary.F90 b/src/summary.F90 index e6ad6f5d95..2781273089 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -156,8 +156,8 @@ contains ! Write information on what fills this cell select case (c%type) - case (CELL_NORMAL) - call write_dataset(cell_group, "fill_type", "normal") + case (FILL_MATERIAL) + call write_dataset(cell_group, "fill_type", "material") if (size(c % material) == 1) then if (c % material(1) == MATERIAL_VOID) then @@ -185,7 +185,7 @@ contains call write_dataset(cell_group, "temperature", cell_temperatures) deallocate(cell_temperatures) - case (CELL_FILL) + case (FILL_UNIVERSE) call write_dataset(cell_group, "fill_type", "universe") call write_dataset(cell_group, "fill", universes(c%fill)%id) if (allocated(c%offset)) then @@ -201,7 +201,7 @@ contains call write_dataset(cell_group, "rotation", c%rotation) end if - case (CELL_LATTICE) + case (FILL_LATTICE) call write_dataset(cell_group, "fill_type", "lattice") call write_dataset(cell_group, "lattice", lattices(c%fill)%obj%id) end select diff --git a/src/tally_filter.F90 b/src/tally_filter.F90 index a7b0fc46ae..21fc3a472e 100644 --- a/src/tally_filter.F90 +++ b/src/tally_filter.F90 @@ -716,10 +716,10 @@ contains distribcell_index = cells(this % cell) % distribcell_index offset = 0 do i = 1, p % n_coord - if (cells(p % coord(i) % cell) % type == CELL_FILL) then + if (cells(p % coord(i) % cell) % type == FILL_UNIVERSE) then offset = offset + cells(p % coord(i) % cell) % & offset(distribcell_index) - elseif (cells(p % coord(i) % cell) % type == CELL_LATTICE) then + elseif (cells(p % coord(i) % cell) % type == FILL_LATTICE) then if (lattices(p % coord(i + 1) % lattice) % obj & % are_valid_indices([& p % coord(i + 1) % lattice_x, & @@ -1421,7 +1421,7 @@ contains c => cells(cell_index) ! Skip normal cells which do not have offsets - if (c % type == CELL_NORMAL) then + if (c % type == FILL_MATERIAL) then cycle end if @@ -1430,13 +1430,13 @@ contains end do ! Ensure we didn't just end the loop by iteration - if (c % type /= CELL_NORMAL) then + if (c % type /= FILL_MATERIAL) then ! There are more cells in this universe that it could be in later_cell = .true. ! Two cases, lattice or fill cell - if (c % type == CELL_FILL) then + if (c % type == FILL_UNIVERSE) then temp_offset = c % offset(map) ! Get the offset of the first lattice location @@ -1453,7 +1453,7 @@ contains end if end if - if (n == 1 .and. c % type /= CELL_NORMAL) then + if (n == 1 .and. c % type /= FILL_MATERIAL) then this_cell = .true. end if @@ -1471,7 +1471,7 @@ contains ! ==================================================================== ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL - if (c % type == CELL_FILL) then + if (c % type == FILL_UNIVERSE) then ! Enter this cell to update the current offset offset = c % offset(map) + offset @@ -1482,7 +1482,7 @@ contains ! ==================================================================== ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL - elseif (c % type == CELL_LATTICE) then + elseif (c % type == FILL_LATTICE) then ! Set current lattice lat => lattices(c % fill) % obj From 7ca46e809ce01fe7857ae36072822a1718f01aaf Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 23 Feb 2017 07:39:28 -0600 Subject: [PATCH 17/18] Make get_all_* methods consistent -- always return dict --- openmc/cell.py | 23 ++-- openmc/geometry.py | 105 +++++++----------- openmc/mgxs/library.py | 14 +-- openmc/mgxs/mgxs.py | 15 +-- openmc/plots.py | 4 +- openmc/statepoint.py | 4 +- openmc/universe.py | 11 +- .../test_asymmetric_lattice.py | 6 +- tests/test_distribmat/test_distribmat.py | 5 +- .../test_mgxs_library_distribcell.py | 2 +- tests/test_multipole/test_multipole.py | 5 +- 11 files changed, 81 insertions(+), 113 deletions(-) diff --git a/openmc/cell.py b/openmc/cell.py index 87dbb0797c..859adb6d1d 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -433,7 +433,7 @@ class Cell(object): Returns ------- - nuclides : dict + nuclides : collections.OrderedDict Dictionary whose keys are nuclide names and values are 2-tuples of (nuclide, density) @@ -467,7 +467,7 @@ class Cell(object): Returns ------- - cells : dict + cells : collections.orderedDict Dictionary whose keys are cell IDs and values are :class:`Cell` instances @@ -485,20 +485,23 @@ class Cell(object): Returns ------- - materials : dict + materials : collections.OrderedDict Dictionary whose keys are material IDs and values are :class:`Material` instances """ - materials = OrderedDict() if self.fill_type == 'material': materials[self.fill.id] = self.fill - - # Append all Cells in each Cell in the Universe to the dictionary - cells = self.get_all_cells() - for cell in cells.values(): - materials.update(cell.get_all_materials()) + elif self.fill_type == 'distribmat': + for m in self.fill: + if m is not None: + materials[m.id] = m + else: + # Append all Cells in each Cell in the Universe to the dictionary + cells = self.get_all_cells() + for cell in cells.values(): + materials.update(cell.get_all_materials()) return materials @@ -508,7 +511,7 @@ class Cell(object): Returns ------- - universes : dict + universes : collections.OrderedDict Dictionary whose keys are universe IDs and values are :class:`Universe` instances diff --git a/openmc/geometry.py b/openmc/geometry.py index 70f9c928f6..5f651af2f3 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -151,102 +151,80 @@ class Geometry(object): return offset def get_all_cells(self): - """Return all cells defined + """Return all cells in the geometry. Returns ------- - list of openmc.Cell - Cells in the geometry + collections.OrderedDict + Dictionary mapping cell IDs to :class:`openmc.Cell` instances """ - - all_cells = self.root_universe.get_all_cells() - cells = list(set(all_cells.values())) - cells.sort(key=lambda x: x.id) - return cells + return self.root_universe.get_all_cells() def get_all_universes(self): - """Return all universes defined + """Return all universes in the geometry. Returns ------- - list of openmc.Universe - Universes in the geometry + collections.OrderedDict + Dictionary mapping universe IDs to :class:`openmc.Universe` + instances """ - - all_universes = self._root_universe.get_all_universes() - universes = list(set(all_universes.values())) - universes.sort(key=lambda x: x.id) + universes = OrderedDict() + universes[self.root_universe.id] = self.root_universe + universes.update(self.root_universe.get_all_universes()) return universes def get_all_materials(self): - """Return all materials assigned to a cell + """Return all materials within the geometry. Returns ------- - list of openmc.Material - Materials in the geometry + collections.OrderedDict + Dictionary mapping material IDs to :class:`openmc.Material` + instances """ - - material_cells = self.get_all_material_cells() - materials = [] - - for cell in material_cells: - if cell.fill_type == 'distribmat': - for m in cell.fill: - if m is not None and m not in materials: - materials.append(m) - elif cell.fill_type == 'material': - if cell.fill not in materials: - materials.append(cell.fill) - - materials.sort(key=lambda x: x.id) - return materials + return self.root_universe.get_all_materials() def get_all_material_cells(self): """Return all cells filled by a material Returns ------- - list of openmc.Cell - Cells filled by Materials in the geometry + collections.OrderedDict + Dictionary mapping cell IDs to :class:`openmc.Cell` instances that + are filled with materials or distributed materials. """ + material_cells = OrderedDict() - all_cells = self.get_all_cells() - material_cells = [] - - for cell in all_cells: + for cell in self.get_all_cells().values(): if cell.fill_type in ('material', 'distribmat'): if cell not in material_cells: - material_cells.append(cell) + material_cells[cell.id] = cell - material_cells.sort(key=lambda x: x.id) return material_cells def get_all_material_universes(self): - """Return all universes composed of at least one non-fill cell + """Return all universes having at least one non-fill cell Returns ------- - list of openmc.Universe - Universes with non-fill cells + collections.OrderedDict + Dictionary mapping universe IDs to :class:`openmc.Universe` + instances with non-fill cells """ + material_universes = OrderedDict() - all_universes = self.get_all_universes() - material_universes = [] - - for universe in all_universes: - cells = universe.cells - for cell in cells: + for universe in self.get_all_universes(): + for cell in universe.cells: if cell.fill_type in ('material', 'distribmat', 'void'): if universe not in material_universes: - material_universes.append(universe) + material_universes[universe.id] = universe - material_universes.sort(key=lambda x: x.id) return material_universes def get_all_lattices(self): @@ -254,20 +232,17 @@ class Geometry(object): Returns ------- - list of openmc.Lattice - Lattices in the geometry + collections.OrderedDict + Dictionary mapping lattice IDs to :class:`openmc.Lattice` instances """ + lattices = OrderedDict() - cells = self.get_all_cells() - lattices = [] - - for cell in cells: + for cell in self.get_all_cells(): if cell.fill_type == 'lattice': if cell.fill not in lattices: - lattices.append(cell.fill) + lattices[cell.fill.id] = cell.fill - lattices.sort(key=lambda x: x.id) return lattices def get_materials_by_name(self, name, case_sensitive=False, matching=False): @@ -293,7 +268,7 @@ class Geometry(object): if not case_sensitive: name = name.lower() - all_materials = self.get_all_materials() + all_materials = self.get_all_materials().values() materials = set() for material in all_materials: @@ -333,7 +308,7 @@ class Geometry(object): if not case_sensitive: name = name.lower() - all_cells = self.get_all_cells() + all_cells = self.get_all_cells().values() cells = set() for cell in all_cells: @@ -373,7 +348,7 @@ class Geometry(object): if not case_sensitive: name = name.lower() - all_cells = self.get_all_cells() + all_cells = self.get_all_cells().values() cells = set() for cell in all_cells: @@ -413,7 +388,7 @@ class Geometry(object): if not case_sensitive: name = name.lower() - all_universes = self.get_all_universes() + all_universes = self.get_all_universes().values() universes = set() for universe in all_universes: @@ -453,7 +428,7 @@ class Geometry(object): if not case_sensitive: name = name.lower() - all_lattices = self.get_all_lattices() + all_lattices = self.get_all_lattices().values() lattices = set() for lattice in all_lattices: diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index ac82ede1d3..6b0bc39138 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -192,11 +192,11 @@ class Library(object): def domains(self): if self._domains == 'all': if self.domain_type == 'material': - return self.geometry.get_all_materials() + return list(self.geometry.get_all_materials().values()) elif self.domain_type in ['cell', 'distribcell']: - return self.geometry.get_all_material_cells() + return list(self.geometry.get_all_material_cells().values()) elif self.domain_type == 'universe': - return self.geometry.get_all_universes() + return list(self.geometry.get_all_universes().values()) elif self.domain_type == 'mesh': raise ValueError('Unable to get domains for Mesh domain type') else: @@ -316,13 +316,13 @@ class Library(object): else: if self.domain_type == 'material': cv.check_iterable_type('domain', domains, openmc.Material) - all_domains = self.geometry.get_all_materials() + all_domains = self.geometry.get_all_materials().values() elif self.domain_type in ['cell', 'distribcell']: cv.check_iterable_type('domain', domains, openmc.Cell) - all_domains = self.geometry.get_all_material_cells() + all_domains = self.geometry.get_all_material_cells().values() elif self.domain_type == 'universe': cv.check_iterable_type('domain', domains, openmc.Universe) - all_domains = self.geometry.get_all_universes() + all_domains = self.geometry.get_all_universes().values() elif self.domain_type == 'mesh': cv.check_iterable_type('domain', domains, openmc.Mesh) @@ -1342,7 +1342,7 @@ class Library(object): materials = openmc.Materials() # Get all Cells from the Geometry for differentiation - all_cells = geometry.get_all_material_cells() + all_cells = geometry.get_all_material_cells().values() # Create the xsdata object and add it to the mgxs_file for i, domain in enumerate(self.domains): diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 114c99a4a2..33bdeb83aa 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -894,7 +894,7 @@ class MGXS(object): """ - cv.check_type('statepoint', statepoint, openmc.statepoint.StatePoint) + cv.check_type('statepoint', statepoint, openmc.StatePoint) if statepoint.summary is None: msg = 'Unable to load data from a statepoint which has not been ' \ @@ -904,16 +904,13 @@ class MGXS(object): # Override the domain object that loaded from an OpenMC summary file # NOTE: This is necessary for micro cross-sections which require # the isotopic number densities as computed by OpenMC - su = statepoint.summary - if self.domain_type == 'cell' or self.domain_type == 'distribcell': - cells = {c.id: c for c in su.geometry.get_all_cells()} - self.domain = cells[self.domain.id] + geom = statepoint.summary.geometry + if self.domain_type in ('cell', 'distribcell'): + self.domain = geom.get_all_cells()[self.domain.id] elif self.domain_type == 'universe': - universes = {u.id: u for u in su.geometry.get_all_universes()} - self.domain = universes[self.domain.id] + self.domain = geom.get_all_universes()[self.domain.id] elif self.domain_type == 'material': - mats = {m.id: m for m in su.materials} - self.domain = mats[self.domain.id] + self.domain = geom.get_all_materials()[self.domain.id] elif self.domain_type == 'mesh': self.domain = statepoint.meshes[self.domain.id] else: diff --git a/openmc/plots.py b/openmc/plots.py index 48af6f23c3..bbefb10768 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -351,11 +351,11 @@ class Plot(object): # Generate random colors for each feature self.col_spec = {} - for domain in domains: + for domain_id in domains: r = np.random.randint(0, 256) g = np.random.randint(0, 256) b = np.random.randint(0, 256) - self.col_spec[domain] = (r, g, b) + self.col_spec[domain_id] = (r, g, b) def highlight_domains(self, geometry, domains, seed=1, alpha=0.5, background='gray'): diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 9c96408855..4101b066a1 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -640,7 +640,7 @@ class StatePoint(object): 'is not a Summary object'.format(summary) raise ValueError(msg) - cell_dict = {c.id: c for c in summary.geometry.get_all_cells()} + cells = summary.geometry.get_all_cells() for tally_id, tally in self.tallies.items(): tally.with_summary = True @@ -648,7 +648,7 @@ class StatePoint(object): for tally_filter in tally.filters: if isinstance(tally_filter, (openmc.DistribcellFilter)): cell_id = tally_filter.bins[0] - cell = cell_dict[cell_id] + cell = cells[cell_id] tally_filter.distribcell_paths = cell.distribcell_paths self._summary = summary diff --git a/openmc/universe.py b/openmc/universe.py index 19f6cf47fd..fa850968da 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -440,7 +440,7 @@ class Universe(object): Returns ------- - materials : Collections.OrderedDict + materials : collections.OrderedDict Dictionary whose keys are material IDs and values are :class:`Material` instances @@ -465,14 +465,9 @@ class Universe(object): :class:`Universe` instances """ - - # Get all Cells in this Universe - cells = self.get_all_cells() - + # Append all Universes within each Cell to the dictionary universes = OrderedDict() - - # Append all Universes containing each Cell to the dictionary - for cell in cells.values(): + for cell in self.get_all_cells().values(): universes.update(cell.get_all_universes()) return universes diff --git a/tests/test_asymmetric_lattice/test_asymmetric_lattice.py b/tests/test_asymmetric_lattice/test_asymmetric_lattice.py index 55f4b48525..eeeba5281e 100644 --- a/tests/test_asymmetric_lattice/test_asymmetric_lattice.py +++ b/tests/test_asymmetric_lattice/test_asymmetric_lattice.py @@ -89,9 +89,9 @@ class AsymmetricLatticeTestHarness(PyAPITestHarness): outstr += '\n'.join(map('{:.8e}'.format, tally.std_dev.flatten())) + '\n' # Extract fuel assembly lattices from the summary - cell_dict = {c.id: c for c in sp.summary.geometry.get_all_cells()} - core = cell_dict[1] - fuel = cell_dict[80] + cells = sp.summary.geometry.get_all_cells() + core = cells[1] + fuel = cells[80] fuel = fuel.fill core = core.fill diff --git a/tests/test_distribmat/test_distribmat.py b/tests/test_distribmat/test_distribmat.py index ad7fe09f04..6c1c5f79cf 100644 --- a/tests/test_distribmat/test_distribmat.py +++ b/tests/test_distribmat/test_distribmat.py @@ -116,8 +116,7 @@ class DistribmatTestHarness(PyAPITestHarness): def _get_results(self): outstr = super(DistribmatTestHarness, self)._get_results() su = openmc.Summary('summary.h5') - cells = {c.id: c for c in su.geometry.get_all_cells()} - outstr += str(cells[11]) + outstr += str(su.geometry.get_all_cells()[11]) return outstr def _cleanup(self): @@ -128,5 +127,5 @@ class DistribmatTestHarness(PyAPITestHarness): if __name__ == '__main__': - harness = DistribmatTestHarness('statepoint.5.*') + harness = DistribmatTestHarness('statepoint.5.h5') harness.main() diff --git a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py index a86b998b83..9ab7548fa8 100644 --- a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py +++ b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py @@ -34,7 +34,7 @@ class MGXSTestHarness(PyAPITestHarness): self.mgxs_lib.num_delayed_groups = 6 self.mgxs_lib.legendre_order = 3 self.mgxs_lib.domain_type = 'distribcell' - cells = self.mgxs_lib.geometry.get_all_material_cells() + cells = self.mgxs_lib.geometry.get_all_material_cells().values() self.mgxs_lib.domains = [c for c in cells if c.name == 'fuel'] self.mgxs_lib.build_library() diff --git a/tests/test_multipole/test_multipole.py b/tests/test_multipole/test_multipole.py index 97ad249561..85c360e734 100644 --- a/tests/test_multipole/test_multipole.py +++ b/tests/test_multipole/test_multipole.py @@ -107,8 +107,7 @@ class MultipoleTestHarness(PyAPITestHarness): def _get_results(self): outstr = super(MultipoleTestHarness, self)._get_results() su = openmc.Summary('summary.h5') - cells = {c.id: c for c in su.geometry.get_all_cells()} - outstr += str(cells[11]) + outstr += str(su.geometry.get_all_cells()[11]) return outstr def _cleanup(self): @@ -119,5 +118,5 @@ class MultipoleTestHarness(PyAPITestHarness): if __name__ == '__main__': - harness = MultipoleTestHarness('statepoint.5.*') + harness = MultipoleTestHarness('statepoint.5.h5') harness.main() From e40c89b34f2dea4b613d11a60a754ecc70ab6655 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 23 Feb 2017 09:43:00 -0600 Subject: [PATCH 18/18] Address a few more @wbinventor comments. Fix Jupyter notebooks. --- .../pythonapi/examples/mgxs-part-ii.ipynb | 2 +- .../pythonapi/examples/mgxs-part-iii.ipynb | 35 +- .../pythonapi/examples/mgxs-part-iv.ipynb | 337 +++++++++--------- openmc/geometry.py | 7 +- openmc/mgxs/library.py | 12 +- 5 files changed, 199 insertions(+), 194 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb index 5e48244b7e..359fd4eaa7 100644 --- a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb @@ -332,7 +332,7 @@ "outputs": [], "source": [ "# Extract all Cells filled by Materials\n", - "openmc_cells = openmc_geometry.get_all_material_cells()\n", + "openmc_cells = openmc_geometry.get_all_material_cells().values()\n", "\n", "# Create dictionary to store multi-group cross sections for all cells\n", "xs_library = {}\n", diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index b76696d7fb..69297d8841 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -594,7 +594,7 @@ "mgxs_lib.domain_type = 'cell'\n", "\n", "# Specify the cell domains over which to compute multi-group cross sections\n", - "mgxs_lib.domains = geometry.get_all_material_cells()" + "mgxs_lib.domains = geometry.get_all_material_cells().values()" ] }, { @@ -743,8 +743,8 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | dfc6f1d9bf1b31fc94dad1cb30bd672b25f47e04\n", - " Date/Time | 2017-02-21 15:11:55\n", + " Git SHA1 | 7ca46e809ce01fe7857ae36072822a1718f01aaf\n", + " Date/Time | 2017-02-23 09:36:51\n", " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", @@ -831,20 +831,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.2287E-01 seconds\n", - " Reading cross sections = 3.5267E-01 seconds\n", - " Total time in simulation = 1.3331E+01 seconds\n", - " Time in transport only = 1.3109E+01 seconds\n", - " Time in inactive batches = 9.4551E-01 seconds\n", - " Time in active batches = 1.2385E+01 seconds\n", - " Time synchronizing fission bank = 3.8467E-03 seconds\n", - " Sampling source sites = 2.5076E-03 seconds\n", - " SEND/RECV source sites = 1.2758E-03 seconds\n", - " Time accumulating tallies = 7.0302E-04 seconds\n", - " Total time for finalization = 1.5000E-05 seconds\n", - " Total time elapsed = 1.3863E+01 seconds\n", - " Calculation Rate (inactive) = 26440.9 neutrons/second\n", - " Calculation Rate (active) = 8074.24 neutrons/second\n", + " Total time for initialization = 4.2238E-01 seconds\n", + " Reading cross sections = 3.1986E-01 seconds\n", + " Total time in simulation = 1.3628E+01 seconds\n", + " Time in transport only = 1.3342E+01 seconds\n", + " Time in inactive batches = 1.1012E+00 seconds\n", + " Time in active batches = 1.2527E+01 seconds\n", + " Time synchronizing fission bank = 3.7750E-03 seconds\n", + " Sampling source sites = 2.4760E-03 seconds\n", + " SEND/RECV source sites = 1.2253E-03 seconds\n", + " Time accumulating tallies = 6.5502E-04 seconds\n", + " Total time for finalization = 9.4890E-06 seconds\n", + " Total time elapsed = 1.4059E+01 seconds\n", + " Calculation Rate (inactive) = 22702.0 neutrons/second\n", + " Calculation Rate (active) = 7982.70 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1663,6 +1663,7 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "language": "python", diff --git a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb index 125340af7c..dfab3b2bef 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb @@ -425,7 +425,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -529,7 +529,7 @@ "mgxs_lib.domain_type = \"material\"\n", "\n", "# Specify the cell domains over which to compute multi-group cross sections\n", - "mgxs_lib.domains = geometry.get_all_materials()" + "mgxs_lib.domains = geometry.get_all_materials().values()" ] }, { @@ -571,7 +571,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/mgxs/library.py:426: RuntimeWarning: The P0 correction will be ignored since the scattering order 0 is greater than zero\n", + "/home/romano/openmc/openmc/mgxs/library.py:412: RuntimeWarning: The P0 correction will be ignored since the scattering order 0 is greater than zero\n", " warn(msg, RuntimeWarning)\n" ] } @@ -727,9 +727,9 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | 6e3f6bf8b11cb3f6f171f1c351ddcaf85dd515ec\n", - " Date/Time | 2017-02-11 14:12:04\n", - " OpenMP Threads | 8\n", + " Git SHA1 | 7ca46e809ce01fe7857ae36072822a1718f01aaf\n", + " Date/Time | 2017-02-23 09:39:10\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -739,12 +739,12 @@ " Reading geometry XML file...\n", " Reading materials XML file...\n", " Reading cross sections XML file...\n", - " Reading U235 from /opt/xsdata/nndc/U235.h5\n", - " Reading U238 from /opt/xsdata/nndc/U238.h5\n", - " Reading O16 from /opt/xsdata/nndc/O16.h5\n", - " Reading Zr90 from /opt/xsdata/nndc/Zr90.h5\n", - " Reading H1 from /opt/xsdata/nndc/H1.h5\n", - " Reading B10 from /opt/xsdata/nndc/B10.h5\n", + " Reading U235 from /home/romano/openmc/scripts/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/scripts/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/romano/openmc/scripts/nndc_hdf5/O16.h5\n", + " Reading Zr90 from /home/romano/openmc/scripts/nndc_hdf5/Zr90.h5\n", + " Reading H1 from /home/romano/openmc/scripts/nndc_hdf5/H1.h5\n", + " Reading B10 from /home/romano/openmc/scripts/nndc_hdf5/B10.h5\n", " Maximum neutron transport energy: 2.00000E+07 eV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -756,56 +756,56 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 1.05201 \n", - " 2/1 1.02017 \n", - " 3/1 1.02398 \n", - " 4/1 1.02677 \n", - " 5/1 1.01070 \n", - " 6/1 1.02964 \n", - " 7/1 1.02163 \n", - " 8/1 1.04524 \n", - " 9/1 1.00773 \n", - " 10/1 1.01536 \n", - " 11/1 1.02992 \n", - " 12/1 1.03248 1.03120 +/- 0.00128\n", - " 13/1 0.99044 1.01761 +/- 0.01361\n", - " 14/1 1.01484 1.01692 +/- 0.00965\n", - " 15/1 1.01491 1.01652 +/- 0.00748\n", - " 16/1 1.03809 1.02011 +/- 0.00709\n", - " 17/1 1.02536 1.02086 +/- 0.00604\n", - " 18/1 1.03663 1.02283 +/- 0.00559\n", - " 19/1 1.03902 1.02463 +/- 0.00525\n", - " 20/1 1.01557 1.02373 +/- 0.00478\n", - " 21/1 1.01286 1.02274 +/- 0.00443\n", - " 22/1 1.01392 1.02200 +/- 0.00411\n", - " 23/1 1.04439 1.02372 +/- 0.00416\n", - " 24/1 1.04034 1.02491 +/- 0.00403\n", - " 25/1 0.99433 1.02287 +/- 0.00427\n", - " 26/1 1.02720 1.02314 +/- 0.00400\n", - " 27/1 1.03545 1.02387 +/- 0.00383\n", - " 28/1 1.03853 1.02468 +/- 0.00370\n", - " 29/1 1.02735 1.02482 +/- 0.00350\n", - " 30/1 1.02429 1.02480 +/- 0.00332\n", - " 31/1 1.02901 1.02500 +/- 0.00317\n", - " 32/1 1.03296 1.02536 +/- 0.00304\n", - " 33/1 1.03605 1.02582 +/- 0.00294\n", - " 34/1 1.04247 1.02652 +/- 0.00290\n", - " 35/1 1.02088 1.02629 +/- 0.00279\n", - " 36/1 1.03017 1.02644 +/- 0.00269\n", - " 37/1 1.03216 1.02665 +/- 0.00259\n", - " 38/1 1.01459 1.02622 +/- 0.00254\n", - " 39/1 1.03706 1.02659 +/- 0.00248\n", - " 40/1 1.01383 1.02617 +/- 0.00243\n", - " 41/1 0.99028 1.02501 +/- 0.00262\n", - " 42/1 1.02969 1.02516 +/- 0.00254\n", - " 43/1 1.02097 1.02503 +/- 0.00247\n", - " 44/1 1.02650 1.02507 +/- 0.00239\n", - " 45/1 1.03939 1.02548 +/- 0.00236\n", - " 46/1 1.00974 1.02505 +/- 0.00233\n", - " 47/1 1.02563 1.02506 +/- 0.00227\n", - " 48/1 1.00377 1.02450 +/- 0.00228\n", - " 49/1 0.99082 1.02364 +/- 0.00238\n", - " 50/1 1.00805 1.02325 +/- 0.00235\n", + " 1/1 1.05169 \n", + " 2/1 1.02178 \n", + " 3/1 1.02778 \n", + " 4/1 1.01814 \n", + " 5/1 1.02993 \n", + " 6/1 1.05836 \n", + " 7/1 1.00011 \n", + " 8/1 1.04961 \n", + " 9/1 1.00908 \n", + " 10/1 1.00134 \n", + " 11/1 1.04275 \n", + " 12/1 1.04456 1.04366 +/- 0.00090\n", + " 13/1 1.00699 1.03143 +/- 0.01224\n", + " 14/1 1.05509 1.03735 +/- 0.01048\n", + " 15/1 1.01645 1.03317 +/- 0.00913\n", + " 16/1 1.02813 1.03233 +/- 0.00750\n", + " 17/1 1.03686 1.03298 +/- 0.00637\n", + " 18/1 1.04389 1.03434 +/- 0.00569\n", + " 19/1 1.01404 1.03208 +/- 0.00550\n", + " 20/1 1.01838 1.03071 +/- 0.00511\n", + " 21/1 1.02745 1.03042 +/- 0.00463\n", + " 22/1 1.03013 1.03039 +/- 0.00422\n", + " 23/1 1.02808 1.03022 +/- 0.00389\n", + " 24/1 1.04615 1.03135 +/- 0.00378\n", + " 25/1 1.03395 1.03153 +/- 0.00352\n", + " 26/1 1.05256 1.03284 +/- 0.00355\n", + " 27/1 1.03201 1.03279 +/- 0.00333\n", + " 28/1 1.00136 1.03105 +/- 0.00359\n", + " 29/1 1.01409 1.03015 +/- 0.00351\n", + " 30/1 1.01159 1.02923 +/- 0.00346\n", + " 31/1 1.02533 1.02904 +/- 0.00330\n", + " 32/1 1.04169 1.02962 +/- 0.00320\n", + " 33/1 1.02904 1.02959 +/- 0.00305\n", + " 34/1 1.04991 1.03044 +/- 0.00304\n", + " 35/1 1.03223 1.03051 +/- 0.00292\n", + " 36/1 1.02835 1.03043 +/- 0.00281\n", + " 37/1 1.02690 1.03029 +/- 0.00270\n", + " 38/1 1.02993 1.03028 +/- 0.00261\n", + " 39/1 1.03601 1.03048 +/- 0.00252\n", + " 40/1 1.04026 1.03081 +/- 0.00246\n", + " 41/1 1.00972 1.03013 +/- 0.00247\n", + " 42/1 1.04266 1.03052 +/- 0.00243\n", + " 43/1 1.01825 1.03015 +/- 0.00238\n", + " 44/1 1.05496 1.03087 +/- 0.00242\n", + " 45/1 1.01621 1.03046 +/- 0.00239\n", + " 46/1 1.04001 1.03072 +/- 0.00234\n", + " 47/1 1.04887 1.03121 +/- 0.00233\n", + " 48/1 1.02937 1.03116 +/- 0.00226\n", + " 49/1 1.01104 1.03065 +/- 0.00226\n", + " 50/1 1.03586 1.03078 +/- 0.00221\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -815,27 +815,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.6381E-01 seconds\n", - " Reading cross sections = 2.7394E-01 seconds\n", - " Total time in simulation = 8.2977E+00 seconds\n", - " Time in transport only = 8.2033E+00 seconds\n", - " Time in inactive batches = 1.0881E+00 seconds\n", - " Time in active batches = 7.2096E+00 seconds\n", - " Time synchronizing fission bank = 5.2924E-03 seconds\n", - " Sampling source sites = 3.6536E-03 seconds\n", - " SEND/RECV source sites = 1.6013E-03 seconds\n", - " Time accumulating tallies = 1.1932E-04 seconds\n", - " Total time for finalization = 3.3830E-06 seconds\n", - " Total time elapsed = 8.6802E+00 seconds\n", - " Calculation Rate (inactive) = 45950.7 neutrons/second\n", - " Calculation Rate (active) = 27740.7 neutrons/second\n", + " Total time for initialization = 4.2488E-01 seconds\n", + " Reading cross sections = 3.1421E-01 seconds\n", + " Total time in simulation = 1.7708E+01 seconds\n", + " Time in transport only = 1.7283E+01 seconds\n", + " Time in inactive batches = 1.7937E+00 seconds\n", + " Time in active batches = 1.5915E+01 seconds\n", + " Time synchronizing fission bank = 5.8977E-03 seconds\n", + " Sampling source sites = 3.9998E-03 seconds\n", + " SEND/RECV source sites = 1.8525E-03 seconds\n", + " Time accumulating tallies = 1.4703E-04 seconds\n", + " Total time for finalization = 4.6920E-06 seconds\n", + " Total time elapsed = 1.8150E+01 seconds\n", + " Calculation Rate (inactive) = 27874.7 neutrons/second\n", + " Calculation Rate (active) = 12567.0 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02354 +/- 0.00215\n", - " k-effective (Track-length) = 1.02325 +/- 0.00235\n", - " k-effective (Absorption) = 1.02582 +/- 0.00193\n", - " Combined k-effective = 1.02474 +/- 0.00151\n", + " k-effective (Collision) = 1.02955 +/- 0.00250\n", + " k-effective (Track-length) = 1.03078 +/- 0.00221\n", + " k-effective (Absorption) = 1.02896 +/- 0.00244\n", + " Combined k-effective = 1.03019 +/- 0.00179\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -971,11 +971,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1084,9 +1084,9 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1094,9 +1094,9 @@ }, { "data": { - "image/png": "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\n2zkpAAAAAElFTkSuQmCC\n", + "image/png": "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\nmBVZSy0AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1104,9 +1104,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1187,9 +1187,9 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | 6e3f6bf8b11cb3f6f171f1c351ddcaf85dd515ec\n", - " Date/Time | 2017-02-11 14:12:19\n", - " OpenMP Threads | 8\n", + " Git SHA1 | 7ca46e809ce01fe7857ae36072822a1718f01aaf\n", + " Date/Time | 2017-02-23 09:39:37\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -1213,56 +1213,56 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 0.98551 \n", - " 2/1 1.05279 \n", - " 3/1 1.03429 \n", - " 4/1 1.01472 \n", - " 5/1 1.01149 \n", - " 6/1 1.07167 \n", - " 7/1 1.00534 \n", - " 8/1 1.02138 \n", - " 9/1 1.03005 \n", - " 10/1 0.99297 \n", - " 11/1 1.00323 \n", - " 12/1 1.00757 1.00540 +/- 0.00217\n", - " 13/1 1.02578 1.01219 +/- 0.00691\n", - " 14/1 1.01920 1.01395 +/- 0.00519\n", - " 15/1 1.02700 1.01656 +/- 0.00479\n", - " 16/1 1.02370 1.01775 +/- 0.00409\n", - " 17/1 1.00321 1.01567 +/- 0.00403\n", - " 18/1 1.01318 1.01536 +/- 0.00351\n", - " 19/1 1.02439 1.01636 +/- 0.00325\n", - " 20/1 1.03004 1.01773 +/- 0.00321\n", - " 21/1 1.01840 1.01779 +/- 0.00291\n", - " 22/1 1.00581 1.01679 +/- 0.00284\n", - " 23/1 1.01457 1.01662 +/- 0.00261\n", - " 24/1 1.03033 1.01760 +/- 0.00261\n", - " 25/1 1.00450 1.01673 +/- 0.00258\n", - " 26/1 1.03680 1.01798 +/- 0.00272\n", - " 27/1 1.02786 1.01856 +/- 0.00262\n", - " 28/1 1.01150 1.01817 +/- 0.00250\n", - " 29/1 0.99850 1.01714 +/- 0.00258\n", - " 30/1 1.02729 1.01764 +/- 0.00250\n", - " 31/1 1.02587 1.01803 +/- 0.00241\n", - " 32/1 1.01423 1.01786 +/- 0.00231\n", - " 33/1 1.05449 1.01945 +/- 0.00272\n", - " 34/1 0.99908 1.01861 +/- 0.00274\n", - " 35/1 1.02441 1.01884 +/- 0.00264\n", - " 36/1 1.01844 1.01882 +/- 0.00253\n", - " 37/1 1.03198 1.01931 +/- 0.00249\n", - " 38/1 1.05078 1.02043 +/- 0.00265\n", - " 39/1 1.01134 1.02012 +/- 0.00257\n", - " 40/1 1.01423 1.01992 +/- 0.00249\n", - " 41/1 1.03987 1.02057 +/- 0.00250\n", - " 42/1 1.05441 1.02162 +/- 0.00264\n", - " 43/1 1.02068 1.02160 +/- 0.00256\n", - " 44/1 1.06387 1.02284 +/- 0.00277\n", - " 45/1 1.04844 1.02357 +/- 0.00279\n", - " 46/1 1.01967 1.02346 +/- 0.00272\n", - " 47/1 1.01830 1.02332 +/- 0.00264\n", - " 48/1 1.00888 1.02294 +/- 0.00260\n", - " 49/1 1.03033 1.02313 +/- 0.00254\n", - " 50/1 1.02732 1.02324 +/- 0.00248\n", + " 1/1 1.00368 \n", + " 2/1 0.99772 \n", + " 3/1 1.04317 \n", + " 4/1 1.02487 \n", + " 5/1 1.01766 \n", + " 6/1 1.03964 \n", + " 7/1 1.02340 \n", + " 8/1 1.02634 \n", + " 9/1 1.03388 \n", + " 10/1 1.02952 \n", + " 11/1 1.01872 \n", + " 12/1 1.02315 1.02093 +/- 0.00222\n", + " 13/1 1.02926 1.02371 +/- 0.00306\n", + " 14/1 1.01288 1.02100 +/- 0.00346\n", + " 15/1 1.04072 1.02494 +/- 0.00477\n", + " 16/1 1.01872 1.02391 +/- 0.00403\n", + " 17/1 1.00295 1.02091 +/- 0.00454\n", + " 18/1 1.02724 1.02170 +/- 0.00401\n", + " 19/1 1.01843 1.02134 +/- 0.00355\n", + " 20/1 1.02340 1.02155 +/- 0.00318\n", + " 21/1 1.03938 1.02317 +/- 0.00331\n", + " 22/1 1.00397 1.02157 +/- 0.00342\n", + " 23/1 1.03516 1.02261 +/- 0.00331\n", + " 24/1 1.03595 1.02357 +/- 0.00321\n", + " 25/1 1.03557 1.02437 +/- 0.00309\n", + " 26/1 1.03415 1.02498 +/- 0.00296\n", + " 27/1 1.02624 1.02505 +/- 0.00278\n", + " 28/1 1.02469 1.02503 +/- 0.00262\n", + " 29/1 1.00769 1.02412 +/- 0.00264\n", + " 30/1 1.02584 1.02420 +/- 0.00251\n", + " 31/1 0.99119 1.02263 +/- 0.00286\n", + " 32/1 1.00246 1.02172 +/- 0.00287\n", + " 33/1 1.00718 1.02108 +/- 0.00282\n", + " 34/1 1.01662 1.02090 +/- 0.00270\n", + " 35/1 1.01834 1.02080 +/- 0.00260\n", + " 36/1 1.04397 1.02169 +/- 0.00265\n", + " 37/1 1.01419 1.02141 +/- 0.00256\n", + " 38/1 1.02268 1.02145 +/- 0.00247\n", + " 39/1 1.04256 1.02218 +/- 0.00249\n", + " 40/1 1.03746 1.02269 +/- 0.00246\n", + " 41/1 1.02199 1.02267 +/- 0.00238\n", + " 42/1 1.03030 1.02291 +/- 0.00232\n", + " 43/1 1.00489 1.02236 +/- 0.00231\n", + " 44/1 1.03025 1.02259 +/- 0.00225\n", + " 45/1 1.05954 1.02365 +/- 0.00243\n", + " 46/1 1.03444 1.02395 +/- 0.00238\n", + " 47/1 1.00532 1.02345 +/- 0.00237\n", + " 48/1 1.03364 1.02371 +/- 0.00232\n", + " 49/1 1.02660 1.02379 +/- 0.00226\n", + " 50/1 1.04569 1.02434 +/- 0.00227\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -1272,27 +1272,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.6247E-02 seconds\n", - " Reading cross sections = 2.9810E-03 seconds\n", - " Total time in simulation = 7.6874E+00 seconds\n", - " Time in transport only = 7.5290E+00 seconds\n", - " Time in inactive batches = 5.9831E-01 seconds\n", - " Time in active batches = 7.0890E+00 seconds\n", - " Time synchronizing fission bank = 5.0012E-03 seconds\n", - " Sampling source sites = 3.4413E-03 seconds\n", - " SEND/RECV source sites = 1.4835E-03 seconds\n", - " Time accumulating tallies = 1.1537E-04 seconds\n", - " Total time for finalization = 3.0480E-06 seconds\n", - " Total time elapsed = 7.7461E+00 seconds\n", - " Calculation Rate (inactive) = 83568.1 neutrons/second\n", - " Calculation Rate (active) = 28212.6 neutrons/second\n", + " Total time for initialization = 2.6345E-02 seconds\n", + " Reading cross sections = 3.9616E-03 seconds\n", + " Total time in simulation = 1.6005E+01 seconds\n", + " Time in transport only = 1.5841E+01 seconds\n", + " Time in inactive batches = 1.3158E+00 seconds\n", + " Time in active batches = 1.4689E+01 seconds\n", + " Time synchronizing fission bank = 6.9577E-03 seconds\n", + " Sampling source sites = 4.4024E-03 seconds\n", + " SEND/RECV source sites = 2.4544E-03 seconds\n", + " Time accumulating tallies = 1.4749E-04 seconds\n", + " Total time for finalization = 3.7060E-06 seconds\n", + " Total time elapsed = 1.6053E+01 seconds\n", + " Calculation Rate (inactive) = 37998.4 neutrons/second\n", + " Calculation Rate (active) = 13615.9 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02169 +/- 0.00234\n", - " k-effective (Track-length) = 1.02324 +/- 0.00248\n", - " k-effective (Absorption) = 1.02565 +/- 0.00155\n", - " Combined k-effective = 1.02525 +/- 0.00163\n", + " k-effective (Collision) = 1.02412 +/- 0.00199\n", + " k-effective (Track-length) = 1.02434 +/- 0.00227\n", + " k-effective (Absorption) = 1.02703 +/- 0.00143\n", + " Combined k-effective = 1.02632 +/- 0.00142\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -1373,9 +1373,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Continuous-Energy keff = 1.024739\n", - "Multi-Group keff = 1.025255\n", - "bias [pcm]: -51.5\n" + "Continuous-Energy keff = 1.030194\n", + "Multi-Group keff = 1.026316\n", + "bias [pcm]: 387.9\n" ] } ], @@ -1472,7 +1472,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 41, @@ -1481,9 +1481,9 @@ }, { "data": { - "image/png": "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\nA2gShaIjcDJaAAAAAElFTkSuQmCC\n", + "image/png": "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\nQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1518,8 +1518,9 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" }, @@ -1533,7 +1534,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/openmc/geometry.py b/openmc/geometry.py index 5f651af2f3..a272eec0a7 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -208,13 +208,16 @@ class Geometry(object): return material_cells def get_all_material_universes(self): - """Return all universes having at least one non-fill cell + """Return all universes having at least one material-filled cell. + + This method can be used to find universes that have at least one cell + that is filled with a material or is void. Returns ------- collections.OrderedDict Dictionary mapping universe IDs to :class:`openmc.Universe` - instances with non-fill cells + instances with at least one material-filled cell """ material_universes = OrderedDict() diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 6b0bc39138..13fbe5e87c 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -3,7 +3,7 @@ import os import copy import pickle from numbers import Integral -from collections import OrderedDict +from collections import OrderedDict, Iterable from warnings import warn from six import string_types @@ -315,16 +315,16 @@ class Library(object): # User specified a list of material, cell or universe domains else: if self.domain_type == 'material': - cv.check_iterable_type('domain', domains, openmc.Material) + cv.check_type('domain', domains, Iterable, openmc.Material) all_domains = self.geometry.get_all_materials().values() elif self.domain_type in ['cell', 'distribcell']: - cv.check_iterable_type('domain', domains, openmc.Cell) + cv.check_type('domain', domains, Iterable, openmc.Cell) all_domains = self.geometry.get_all_material_cells().values() elif self.domain_type == 'universe': - cv.check_iterable_type('domain', domains, openmc.Universe) + cv.check_type('domain', domains, Iterable, openmc.Universe) all_domains = self.geometry.get_all_universes().values() elif self.domain_type == 'mesh': - cv.check_iterable_type('domain', domains, openmc.Mesh) + cv.check_type('domain', domains, Iterable, openmc.Mesh) # The mesh and geometry are independent, so set all_domains # to the input domains @@ -339,7 +339,7 @@ class Library(object): raise ValueError('Domain "{}" could not be found in the ' 'geometry.'.format(domain)) - self._domains = domains + self._domains = list(domains) @energy_groups.setter def energy_groups(self, energy_groups):