
module box {         # Convert helix filter to hypercube: cube(na(1),na(2),...)
use helix
use cartesian
contains
  subroutine boxn( nd, center, na, aa, cube) {
    integer, dimension (:), intent( in)  :: nd, center, na    # (ndim)
    type( filter),          intent( in)  :: aa
    real,    dimension( :), intent( out) :: cube 
    integer, dimension( size( nd))       :: ii
    integer                              :: j, lag0a, lag0d, id, ia
    cube = 0.;                          # cube=0
    call cart2line( na, center, lag0a)  # locate the 1.0 in the na_cube.
    cube( lag0a) = 1.                   # place it.
    call cart2line( nd, center, lag0d)  # locate the 1.0 in the nd_cube.
    do j = 1, size( aa%lag) {		# inspect the entire helix
       id = aa%lag( j) + lag0d		# index = helix_lag + center_d
       call line2cart( nd, id, ii)	# ii(id) = cartesian indices
       call cart2line( na,     ii, ia)	# ia(ii) = linear index in aa
       cube( ia) = aa%flt( j)		# copy the filter coefficient
       }
    }
}
