module lolace { # find Local PEF on interlaced data use createhelixmod use bound use pef use cartesian use patch contains subroutine lolace_pef( wall, npatch, nwall, nwind, jump, center, gap, na, aa) { type( filter), dimension (:) :: aa integer, intent( in) :: jump integer, dimension(:), pointer :: npatch, nwall, nwind integer, dimension(:), intent (in) :: center, gap, na real, dimension(:), intent( in) :: wall # input data real, dimension(:), pointer :: windata integer, dimension(:), pointer :: savelags # holding place integer, dimension( size( na)) :: ii integer :: ih, nh, lag0, lag, ip, stat, np aa (1) = createhelix( nwind, center, gap, na) np = product (npatch); nh = size( aa(1)%lag) savelags => aa(1)%lag allocate( aa(1)%lag( nh)) # interlaced helix call cart2line( na, center, lag0) do ih = 1, nh { # Sweep thru filter. call line2cart( na, ih+lag0, ii) ii = ii - center; ii(1) = ii(1)*jump # Interlace on 1-axis. call cart2line( nwind, ii+1, lag) aa(1)%lag( ih) = lag - 1 } call boundn( nwind, nwind, (/ na(1)*jump, na(2:) /), aa (1)) # Define mis allocate( windata( product( nwind))) # a patch call patch_init( npatch, nwall, nwind) do ip = 1, np { # do all patches if (ip > 1) { allocate (aa(ip)%flt (nh)); aa(ip)%flt = 0. aa(ip)%lag => aa(1)%lag aa(ip)%mis => aa(1)%mis } stat = patch_lop( .false., .false., wall, windata) # get a patch call find_pef( windata, aa(ip), niter=nh) # find PEF call patch_close() } deallocate (aa(1)%lag); do ip = 1, np { aa(ip)%lag => savelags} deallocate( windata) } }