subroutine assign_unique_ele_ids(lat) use bmad use sim_utils implicit none type(lat_struct) lat type(ele_struct), pointer :: ele character(40), allocatable :: unique_names(:) integer, allocatable :: tally(:), running_tally(:) integer :: new_un_size = 1, ix_match, ix allocate(unique_names(1), tally(1)) ! find repeated elements: loop1: do ix = 0, lat%n_ele_max ele => lat%ele(ix) if (ix > 0) then call match_word(trim(ele%name),unique_names,ix_match,can_abbreviate=.false.) else unique_names(1) = ele%name tally(1) = 1 cycle loop1 endif if (ix_match .eq. 0) then new_un_size = size(unique_names)+1 call re_allocate(unique_names, new_un_size) call re_allocate(tally, new_un_size) unique_names(new_un_size) = ele%name tally(new_un_size) = 1 else ! name found in existing list tally(ix_match) = tally(ix_match) + 1 endif enddo loop1 ! now assign unique IDs for repeated elements: allocate(running_tally(size(tally))) running_tally(:) = 0 loop2: do ix = 0, lat%n_ele_max ele => lat%ele(ix) call match_word(trim(ele%name),unique_names,ix_match,can_abbreviate=.false.) running_tally(ix_match) = running_tally(ix_match) + 1 if (tally(ix_match) .eq. 1) then ele%ix_pointer = 0 else ele%ix_pointer = running_tally(ix_match) endif enddo loop2 end subroutine assign_unique_ele_ids