module createhelixmod { # Create helix filter lags and mis use helix use cartesian contains function createhelix( nd, center, gap, na) result( aa) { type( filter) :: aa # needed by helicon. integer, dimension(:), intent(in) :: nd, na # data and filter axes integer, dimension(:), intent(in) :: center # normally (na1/2,na2/2,...,1) integer, dimension(:), intent(in) :: gap # normally ( 0, 0, 0,...,0) integer, dimension( size( nd)) :: ii # cartesian indexes integer :: na123, ia, ndim, nh, lag0a,lag0d integer, dimension(:), allocatable:: lag nh= 0; na123 = product( na); ndim = size( nd) allocate( lag( na123 ) ) # filter cube size call cart2line ( na, center, lag0a) # lag0a = index pointing to the "1.0" do ia = 1+lag0a, na123 { # ia is fortran linear index. call line2cart( na, ia, ii) # ii(ia) is fortran array indices. if( any( ii <= gap)) next # ignore some locations nh = nh + 1 # got another live one. call cart2line( nd, ii, lag(nh)) # get its fortran linear index } call cart2line( nd, center, lag0d) # lag0d is center shift for nd_cube call allocatehelix( aa, nh) # nh becomes size of filter on helix. aa%lag = lag(1:nh) - lag0d; # lag = fortran_linear_index - center aa%flt = 0.0; deallocate( lag) } }