diff --git a/docs/source/usersguide/output/statepoint.rst b/docs/source/usersguide/output/statepoint.rst index b17bdca024..7d07670952 100644 --- a/docs/source/usersguide/output/statepoint.rst +++ b/docs/source/usersguide/output/statepoint.rst @@ -29,11 +29,11 @@ The current revision of the statepoint file format is 13. Release version number for OpenMC -**/time_stamp** (*char[19]*) +**/time_stamp** (*char[]*) Date and time the state point was written. -**/path** (*char[255]*) +**/path** (*char[]*) Absolute path to directory containing input files. @@ -228,17 +228,15 @@ if (run_mode == MODE_EIGENVALUE) Values of specified scoring bins (e.g. SCORE_FLUX). - **/tallies/tally i/n_user_score_bins** + **/tallies/tally i/n_user_score_bins** (*int*) Number of scoring bins without accounting for those added by expansions, e.g. scatter-PN. - *do J = 1, total number of moments* + **/tallies/tally i/moment_orders** (*char[][]*) - **/tallies/tally i/moments/orderJ** (*char[8]*) - - Tallying moment order for Legendre and spherical - harmonic tally expansions (*e.g.*, 'P2', 'Y1,2', etc.). + Tallying moment orders for Legendre and spherical harmonic tally + expansions (*e.g.*, 'P2', 'Y1,2', etc.). **/source_present** (*int*) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 986d624f90..c0003ad523 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -161,7 +161,7 @@ class StatePoint(object): # Read statepoint revision self._revision = self._f['revision'].value - if self._revision != 13: + if self._revision != 14: raise Exception('Statepoint Revision is not consistent.') # Read OpenMC version @@ -393,27 +393,18 @@ class StatePoint(object): filter.stride *= tally.filters[j].num_bins # Read scattering moment order strings (e.g., P3, Y-1,2, etc.) - moments = [] - subbase = '{0}{1}/moments/'.format(base, tally_key) - - # Extract the moment order string for each score - for k in range(len(scores)): - moment = self._f['{0}order{1}'.format( - subbase, k+1)].value.decode() - - # Remove extra whitespace - moment.replace(" ", "") - moments.append(moment) + moments = self._f['{0}{1}/moment_orders'.format( + base, tally_key)].value # Add the scores to the Tally for j, score in enumerate(scores): # If this is a scattering moment, insert the scattering order if '-n' in score: - score = score.replace('-n', '-' + str(moments[j])) + score = score.replace('-n', '-' + moments[j].decode()) elif '-pn' in score: - score = score.replace('-pn', '-' + str(moments[j])) + score = score.replace('-pn', '-' + moments[j].decode()) elif '-yn' in score: - score = score.replace('-yn', '-' + str(moments[j])) + score = score.replace('-yn', '-' + moments[j].decode()) tally.add_score(score) diff --git a/src/constants.F90 b/src/constants.F90 index 5eba50f6df..6be1326a87 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -11,7 +11,7 @@ module constants integer, parameter :: VERSION_RELEASE = 0 ! Revision numbers for binary files - integer, parameter :: REVISION_STATEPOINT = 13 + integer, parameter :: REVISION_STATEPOINT = 14 integer, parameter :: REVISION_PARTICLE_RESTART = 1 integer, parameter :: REVISION_TRACK = 1 diff --git a/src/state_point.F90 b/src/state_point.F90 index 691d0567ec..bf43a1e83f 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -49,8 +49,8 @@ contains integer(HID_T) :: cmfd_group integer(HID_T) :: tallies_group, tally_group integer(HID_T) :: meshes_group, mesh_group - integer(HID_T) :: filter_group, moments_group - character(8) :: moment_name ! name of moment (e.g, P3) + integer(HID_T) :: filter_group + character(8), allocatable :: moment_names(:) ! names of moments (e.g, P3) character(MAX_FILE_LEN) :: filename type(StructuredMesh), pointer :: meshp type(TallyObject), pointer :: tally @@ -257,40 +257,36 @@ contains call write_dataset(tally_group, "n_user_score_bins", tally%n_user_score_bins) ! Write explicit moment order strings for each score bin - moments_group = create_group(tally_group, "moments") k = 1 + allocate(moment_names(tally%n_score_bins)) MOMENT_LOOP: do j = 1, tally%n_user_score_bins select case(tally%score_bins(k)) case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N) - moment_name = 'P' // trim(to_str(tally%moment_order(k))) - call write_dataset(moments_group, "order" // trim(to_str(k)), moment_name) + moment_names(k) = 'P' // trim(to_str(tally%moment_order(k))) k = k + 1 case (SCORE_SCATTER_PN, SCORE_NU_SCATTER_PN) do n_order = 0, tally%moment_order(k) - moment_name = 'P' // trim(to_str(n_order)) - call write_dataset(moments_group, "order" // trim(to_str(k)), moment_name) + moment_names(k) = 'P' // trim(to_str(n_order)) k = k + 1 end do case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, & - SCORE_TOTAL_YN) + SCORE_TOTAL_YN) do n_order = 0, tally%moment_order(k) do nm_order = -n_order, n_order - moment_name = 'Y' // trim(to_str(n_order)) // ',' // & + moment_names(k) = 'Y' // trim(to_str(n_order)) // ',' // & trim(to_str(nm_order)) - call write_dataset(moments_group, "order" // & - trim(to_str(k)), moment_name) - k = k + 1 + k = k + 1 end do end do case default - moment_name = '' - call write_dataset(moments_group, "order" // trim(to_str(k)), & - moment_name) + moment_names(k) = '' k = k + 1 end select end do MOMENT_LOOP - call close_group(moments_group) + call write_dataset(tally_group, "moment_orders", moment_names) + deallocate(moment_names) + call close_group(tally_group) end do TALLY_METADATA @@ -582,11 +578,9 @@ contains subroutine load_state_point() - integer :: i, j, k + integer :: i, j integer :: int_array(3) integer :: curr_key - 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, allocatable :: temp_array(:) @@ -594,12 +588,11 @@ contains integer(HID_T) :: cmfd_group integer(HID_T) :: tallies_group, tally_group integer(HID_T) :: meshes_group, mesh_group - integer(HID_T) :: filter_group, moments_group + integer(HID_T) :: filter_group real(8) :: real_array(3) logical :: source_present character(MAX_FILE_LEN) :: path_temp character(19) :: current_time - character(8) :: moment_name ! name of moment (e.g, P3, Y-1,1) type(StructuredMesh), pointer :: meshp type(TallyObject), pointer :: tally @@ -800,41 +793,7 @@ contains call read_dataset(tally_group, "score_bins", tally%score_bins) call read_dataset(tally_group, "n_user_score_bins", tally%n_user_score_bins) - ! Read explicit moment order strings for each score bin - k = 1 - moments_group = open_group(tally_group, "moments") - MOMENT_LOOP: do j = 1, tally%n_user_score_bins - select case(tally%score_bins(k)) - case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N) - call read_dataset(moments_group, "order" // trim(to_str(k)), & - moment_name) - k = k + 1 - case (SCORE_SCATTER_PN, SCORE_NU_SCATTER_PN) - do n_order = 0, tally%moment_order(k) - call read_dataset(moments_group, "order" // trim(to_str(k)), & - moment_name) - k = k + 1 - end do - case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, & - SCORE_TOTAL_YN) - do n_order = 0, tally%moment_order(k) - do nm_order = -n_order, n_order - call read_dataset(moments_group, "order" // trim(to_str(k)), & - moment_name) - k = k + 1 - end do - end do - case default - call read_dataset(moments_group, "order" // trim(to_str(k)), & - moment_name) - k = k + 1 - end select - - end do MOMENT_LOOP - - call close_group(moments_group) call close_group(tally_group) - end do TALLY_METADATA ! Check to make sure source bank is present