mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-28 22:26:08 -04:00
Write moment orders as an array of strings in statepoint files
This commit is contained in:
parent
fe0f94c814
commit
4bf34de6f7
4 changed files with 27 additions and 79 deletions
|
|
@ -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*)
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue