mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-28 06:05:58 -04:00
Merge pull request #925 from smharper/filter_id_bug
Make sure autogenerated filter IDs are unique
This commit is contained in:
commit
39a02887d1
4 changed files with 31 additions and 7 deletions
|
|
@ -51,6 +51,7 @@ module openmc_api
|
|||
public :: openmc_get_cell_index
|
||||
public :: openmc_get_keff
|
||||
public :: openmc_get_filter_index
|
||||
public :: openmc_get_filter_next_id
|
||||
public :: openmc_get_material_index
|
||||
public :: openmc_get_nuclide_index
|
||||
public :: openmc_get_tally_index
|
||||
|
|
|
|||
|
|
@ -261,7 +261,8 @@ contains
|
|||
integer :: i_filt_start, i_filt_end
|
||||
integer(C_INT32_T), allocatable :: filter_indices(:)
|
||||
integer(C_INT) :: err
|
||||
integer :: i_filt ! index in filters array
|
||||
integer :: i_filt ! index in filters array
|
||||
integer :: filt_id
|
||||
integer :: iarray3(3) ! temp integer array
|
||||
real(8) :: rarray3(3) ! temp double array
|
||||
real(C_DOUBLE), allocatable :: energies(:)
|
||||
|
|
@ -381,14 +382,16 @@ contains
|
|||
! Set up mesh filter
|
||||
i_filt = i_filt_start
|
||||
err = openmc_filter_set_type(i_filt, C_CHAR_'mesh' // C_NULL_CHAR)
|
||||
err = openmc_filter_set_id(i_filt, i_filt)
|
||||
call openmc_get_filter_next_id(filt_id)
|
||||
err = openmc_filter_set_id(i_filt, filt_id)
|
||||
err = openmc_mesh_filter_set_mesh(i_filt, i_start)
|
||||
|
||||
if (energy_filters) then
|
||||
! Read and set incoming energy mesh filter
|
||||
i_filt = i_filt + 1
|
||||
err = openmc_filter_set_type(i_filt, C_CHAR_'energy' // C_NULL_CHAR)
|
||||
err = openmc_filter_set_id(i_filt, i_filt)
|
||||
call openmc_get_filter_next_id(filt_id)
|
||||
err = openmc_filter_set_id(i_filt, filt_id)
|
||||
|
||||
! Get energies and set bins
|
||||
ng = node_word_count(node_mesh, "energy")
|
||||
|
|
@ -399,7 +402,8 @@ contains
|
|||
! Read and set outgoing energy mesh filter
|
||||
i_filt = i_filt + 1
|
||||
err = openmc_filter_set_type(i_filt, C_CHAR_'energyout' // C_NULL_CHAR)
|
||||
err = openmc_filter_set_id(i_filt, i_filt)
|
||||
call openmc_get_filter_next_id(filt_id)
|
||||
err = openmc_filter_set_id(i_filt, filt_id)
|
||||
err = openmc_energy_filter_set_bins(i_filt, ng, energies)
|
||||
end if
|
||||
|
||||
|
|
@ -407,7 +411,8 @@ contains
|
|||
! tallies use this filter and we need to change the dimension
|
||||
i_filt = i_filt + 1
|
||||
err = openmc_filter_set_type(i_filt, C_CHAR_'mesh' // C_NULL_CHAR)
|
||||
err = openmc_filter_set_id(i_filt, i_filt)
|
||||
call openmc_get_filter_next_id(filt_id)
|
||||
err = openmc_filter_set_id(i_filt, filt_id)
|
||||
err = openmc_mesh_filter_set_mesh(i_filt, i_start)
|
||||
|
||||
! We need to increase the dimension by one since we also need
|
||||
|
|
|
|||
|
|
@ -3146,7 +3146,9 @@ contains
|
|||
filters(i_filt_start) % obj % n_bins = product(m % dimension + 1)
|
||||
|
||||
! Set ID
|
||||
err = openmc_filter_set_id(i_filt_start, i_filt_start)
|
||||
call openmc_get_filter_next_id(filter_id)
|
||||
err = openmc_filter_set_id(i_filt_start, filter_id)
|
||||
|
||||
|
||||
! Add surface filter
|
||||
allocate(SurfaceFilter :: filters(i_filt_end) % obj)
|
||||
|
|
@ -3167,7 +3169,8 @@ contains
|
|||
filt % current = .true.
|
||||
|
||||
! Set ID
|
||||
err = openmc_filter_set_id(i_filt_end, i_filt_end)
|
||||
call openmc_get_filter_next_id(filter_id)
|
||||
err = openmc_filter_set_id(i_filt_end, filter_id)
|
||||
end select
|
||||
|
||||
! Copy filter indices to resized array
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ module tally_filter_header
|
|||
public :: openmc_filter_get_id
|
||||
public :: openmc_filter_set_id
|
||||
public :: openmc_get_filter_index
|
||||
public :: openmc_get_filter_next_id
|
||||
|
||||
!===============================================================================
|
||||
! TALLYFILTERMATCH stores every valid bin and weight for a filter
|
||||
|
|
@ -122,6 +123,10 @@ module tally_filter_header
|
|||
! Dictionary that maps user IDs to indices in 'filters'
|
||||
type(DictIntInt), public :: filter_dict
|
||||
|
||||
! The largest filter ID that has been specified in the system. This is useful
|
||||
! in case the code needs to find an ID for a new filter.
|
||||
integer :: largest_filter_id
|
||||
|
||||
contains
|
||||
|
||||
!===============================================================================
|
||||
|
|
@ -140,6 +145,7 @@ contains
|
|||
n_filters = 0
|
||||
if (allocated(filters)) deallocate(filters)
|
||||
call filter_dict % clear()
|
||||
largest_filter_id = 0
|
||||
end subroutine free_memory_tally_filter
|
||||
|
||||
!===============================================================================
|
||||
|
|
@ -205,6 +211,7 @@ contains
|
|||
if (allocated(filters(index) % obj)) then
|
||||
filters(index) % obj % id = id
|
||||
call filter_dict % set(id, index)
|
||||
if (id > largest_filter_id) largest_filter_id = id
|
||||
|
||||
err = 0
|
||||
else
|
||||
|
|
@ -238,4 +245,12 @@ contains
|
|||
end if
|
||||
end function openmc_get_filter_index
|
||||
|
||||
|
||||
subroutine openmc_get_filter_next_id(id) bind(C)
|
||||
! Returns an ID number that has not been used by any other filters.
|
||||
integer(C_INT32_T), intent(out) :: id
|
||||
|
||||
id = largest_filter_id + 1
|
||||
end subroutine openmc_get_filter_next_id
|
||||
|
||||
end module tally_filter_header
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue