module bound ! mark helix filter outputs where input is off data. use cartesian use helicon use regrid implicit none contains subroutine boundn ( nold, nd, na, aa) integer, dimension( :), intent( in) :: nold, nd, na ! (ndim) type( filter) :: aa integer, dimension( size( nd)) :: nb, ii real, dimension( :), allocatable :: xx, yy integer :: iy, my, ib, mb, stat nb = nd + 2*na mb = product( nb) ! nb is a bigger space to pad into. allocate( xx( mb), yy( mb)) ! two large spaces, equal size xx = 0. ! zeros do ib = 1, mb ! surround the zeros with many ones call line2cart( nb, ib, ii) ! ii( ib) if ( any( ii <= na .or. ii > nb-na)) then xx( ib) = 1. end if end do call helicon_init( aa) ! give aa pointer to helicon.lop call regridn( nold, nb, aa) aa%flt = 1. ! put all 1's in filter stat = helicon_lop( .false., .false., xx, yy) ! apply filter call regridn( nb, nd, aa) aa%flt = 0. ! remake filter for orig data. my = product( nd) allocate( aa%mis( my)) ! attach missing designation to y_filter do iy = 1, my ! map from unpadded to padded space call line2cart( nd, iy, ii ) call cart2line( nb, ii+na, ib ) ! ib( iy) aa%mis( iy) = ( yy( ib) > 0.) ! true where inputs missing end do deallocate( xx, yy) end subroutine end module