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)
  }
}
