mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-27 21:55:41 -04:00
Make sure autogenerated filter IDs are unique
This commit is contained in:
parent
c16b8898b6
commit
27b1e7d228
5 changed files with 41 additions and 7 deletions
|
|
@ -45,6 +45,8 @@ _dll.openmc_filter_set_type.errcheck = _error_handler
|
|||
_dll.openmc_get_filter_index.argtypes = [c_int32, POINTER(c_int32)]
|
||||
_dll.openmc_get_filter_index.restype = c_int
|
||||
_dll.openmc_get_filter_index.errcheck = _error_handler
|
||||
_dll.openmc_get_free_filter_id.argtypes = [POINTER(c_int32)]
|
||||
_dll.openmc_get_free_filter_id.restype = None
|
||||
_dll.openmc_material_filter_get_bins.argtypes = [
|
||||
c_int32, POINTER(POINTER(c_int32)), POINTER(c_int32)]
|
||||
_dll.openmc_material_filter_get_bins.restype = c_int
|
||||
|
|
@ -253,4 +255,12 @@ class _FilterMapping(Mapping):
|
|||
def __repr__(self):
|
||||
return repr(dict(self))
|
||||
|
||||
|
||||
filters = _FilterMapping()
|
||||
|
||||
|
||||
def get_free_filter_id():
|
||||
"""Returns an ID number that has not been used by any other filters."""
|
||||
id_ = c_int32()
|
||||
_dll.openmc_get_free_filter_id(id_)
|
||||
return id_.value
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ module openmc_api
|
|||
public :: openmc_get_cell_index
|
||||
public :: openmc_get_keff
|
||||
public :: openmc_get_filter_index
|
||||
public :: openmc_get_free_filter_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_free_filter_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_free_filter_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_free_filter_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_free_filter_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_free_filter_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_free_filter_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_free_filter_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_free_filter_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_free_filter_id
|
||||
|
||||
end module tally_filter_header
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue