Viewing contents of file '../idllib/contrib/meron/abgrad.pro'
Function Abgrad, arr, delta

;+
; NAME:
;	ABGRAD
; VERSION:
;	3.0
; PURPOSE:
;	Calculates the absolute value of the gradient of a function represented
;	as an array of values.  Works for 1-7 dimensions.
; CATEGORY:
;	Array Manipulation.
; CALLING SEQUENCE:
;	Result = ABGRAD( ARR [, DELTA])
; INPUTS:
;    ARR
;	Array, numeric, number of dimensions can be 1 through 7.
; OPTIONAL INPUT PARAMETERS:
;    DELTA
;	Size of step used to calculate the numeric derivatives.  The approx.
;	partial derivative in the i-th direction is calculated as
;	    (ARR(...,I + DELTA,...) - ARR(...,I - DELTA,...))/(2*DELTA).
;	The default value of DELTA is 1l.  If provided, it is rounded to a long
;	integer on input.
; KEYWORD PARAMETERS:
;	None.
; OUTPUTS:
;	Returns the absolute value of the gradient as an array of the same size
;	and type as ARR.  If ARR is not an array, returns 0.
; OPTIONAL OUTPUT PARAMETERS:
;	None.
; COMMON BLOCKS:
;	None.
; SIDE EFFECTS:
;	None.
; RESTRICTIONS:
;	Due to current limitations of the MAKE_ARRAY system routine, 8 
;	dimensions are not allowed.
; PROCEDURE:
;	Creates an 7-dimensional array, with dummy leading dimensions, 
;	containing the original array.  Generates the differences using the
;	SHIFT system routine and strips the dummy dimensions at the end.
;	Uses the functions DEFAULT and FPU_FIX from MIDL.
; MODIFICATION HISTORY:
;	Created 15-NOV-1991 by Mati Meron.
;	Modified 30-AUG-1998 by Mati Meron.  Underflow filtering added.
;-

    ndmx = 7
    idel = abs(Default(delta,1l,/dtype))
    siz = size(arr)
    ndm = siz(0)
    if ndm eq 0 then begin
	message, 'Not an Array!', /continue
	return, 0
    endif else if ndm lt ndmx then siz = [ndmx,replicate(1,ndmx-ndm),siz(1:*)]
    res = make_array(size = siz)
    tarr = make_array(size = siz) + arr

    a = intarr(ndmx)
    for i = ndmx - ndm, ndmx - 1 do begin
	a(i) = idel
	b = - a
	if 2*idel mod siz(i+1) ne 0 then res = res + $
	abs(shift(tarr,a(0),a(1),a(2),a(3),a(4),a(5),a(6)) - $
	shift(tarr,b(0),b(1),b(2),b(3),b(4),b(5),b(6)))^2
	a(i) = 0
    endfor

    res = Fpu_fix(res)
    return, sqrt(reform(res,siz(ndmx-ndm+1:ndmx)))/(2.*idel)
end