# OAA_LIB-ao_lib Library Help

This page was created by the IDL library routine `mk_html_help`. For more information on this routine, refer to the IDL Online Help Navigator or type:

         ? mk_html_help

at the IDL command line prompt.

Last modified: Tue May 15 16:15:49 2007.

# List of Routines

- CHOLESKY
- CN2
- CN2_MOMENTUM
- CN2_SETTING
- D0_PAR
- FRIED_PAR
- ISO_ANGLE
- JACOBI_POL
- KOLM_COVAR
- KOLM_MCOVAR
- LLLCCD_OUT
- LLLCCD_PROB
- MAKE_ORTO_MODES
- RANDOMN_COVAR
- VON_COVAR
- ZERN
- ZERN_DEGREE
- ZERN_FT
- ZERN_FT_POLAR
- ZERN_INDEX
- ZERN_JPOLAR
- ZERN_JRADIAL
- ZERN_ORDER

# Routine Descriptions

## CHOLESKY

[Next Routine] [List of Routines]

     NAME:
           CHOLESKY

     PURPOSE:
           This procedure makes the cholesky decomposition of
           a positive defined simetric matrix.

     CATEGORY:
           Linear Algebra.

     CALLING SEQUENCE:

           CHOLESKY, L

     INPUTS:
           L:      squared matrix. Matrix to decompose. It is supposed simmetric
                   (transpose(L) = L), so only diagonal and upper triangle is
    				accessed as input.
                   See input of CHOLDC procedure.

     KEYWORDS:
           DOUBLE: if set forces the computation in double precision

     OUTPUTS:
           Matrix. This procedure overwrite on L the lower triangular Cholesky
    		factor of the input matrix, so that L ## TRANSPOSE(L) is the original
    		simmetric matrix.

     EXAMPLE:
           Cholesky decompsition of a 2 dimensional simmetric matrix:

           C = [[1.2, 0.3], [0.3, -2.3]]
           L = CHOLESKY(C)
           PRINT, C - (L ## TRANSPOSE(L))

     MODIFICATION HISTORY:
           Written by:     A. Riccardi; April, 1995

(See ao_lib\cholesky.pro)

## CN2

[Previous Routine] [Next Routine] [List of Routines]

        CN2

        Result = CN2(Z)

        return structure constant value (in m^(-2/3)) at height z (in m) from
        the pupil of imaging system.

(See ao_lib\cn2.pro)

## CN2_MOMENTUM

[Previous Routine] [Next Routine] [List of Routines]

        CN2_MOMENTUM

        Result = CN2_MOMENTUM(Z)

        return CN2(Z)*Z^(Order)

        where Order is set by COMMON BLOCK:
            common cn2_momentum, order

(See ao_lib\cn2_momentum.pro)

## CN2_SETTING

[Previous Routine] [Next Routine] [List of Routines]

        CN2_SETTING

        CN2_SETTING, Which_profile

            Which_profile: string, scalar. String containing the funcion
                           name returning the Cn^2 profile. Three functions
                           are pre-defined:
                           "hv27" - Hufnagel-Valley 27 from Sandler et al., JOSAA,11,925(1994)
                           "hvbl" - adapted from Beckers, ARAA,31,13(1993)
                           "mhv"  - Modified Hufnagel-Valley from Parenti and Sasiela,
                                    JOSA,11,288(1994)
                           See below for definition of a user-defined function

        KEYWORDS:

            ALTITUDE:      float, scalar. Site height above sea-level.
                           If not defined, it is set to 0.0.

            ELEVATION:     float, scalar. Height above ground-level of
                           pupil of imaging system. Only for turbulence
                           profiles with surface layers. If not defined,
                           it is set to 0.0.

            R0:            float, scalar. If defined, the profile is
                           rescaled to give R0 as Fried Prameter at
                           wavelength specified by WAVELENGTH keyword.

            WAVELENGTH:    float, scalar. Wavelegth in meters (see R0).
                           If undefined it is set to 0.55e-6m (V band).

            NORMALIZE:     if set rescale turbulence profile to give a
                           normalized turbulence profile (integral=1).

            VERBOSE:       if set print turbulence profile infos.

     USER-DEFINED Cn^2 PROFILE FUNCTION

     function FUNC, z, cn2_settings
                            ; zsl: height from the sea-level
        zsl = z+cn2_settings.altitude+cn2_settings.elevation
                            ; zg: height from the ground
        zg = z+cn2_settings.elevation
        cn2=....            ; usually a function of zsl (free atmosphere),
                            ; zg (boundary layer) and z (dome seeing)
        return, cn2_settings.scale_f*cn2 ; multiply to scale_f to allow r0 scaling
     end

     where z is a vector of height values from the pupil of the optical system in [m]
     and cn2 contains the the structure constant Cn^2 in [m^(-2/3)] at the corresponding
     heights. The structure cn2_settings is defined as follows:
       cn2_settings.name:       string containing the name of the function of the active Cn^2 profile
       cn2_settings.scale_f:    float. Scaling factor to match the requested r0
       cn2_settings.altitude:   float. Height of the ground with respect to the sea level
       cn2_settings.elevation:  float. Elevation of the pupil with respect to the ground level.
                                It is useful when a boundary layer is defined.
       cn2_settings.max_height: float. Maximum height from the sea level of the profile. Above it
                                the Cn^2 profile is considered to be 0.
     Those fields are to be considered as read-only. The user cannot modified the cn2_setting structure
     inside the function. The structure is initialized by the cn2_setting function.

(See ao_lib\cn2_setting.pro)

## D0_PAR

[Previous Routine] [Next Routine] [List of Routines]

     D0_PAR

       This function computes the d0 parameter for a laser
       focused at height h [m] at the wavelength wl [m].
       The formula used for d0 is from Tyler.
       Use cn2_setting procedure before use this function
       to set the cn2 profile.

     d0 = d0_par(h, wl, EPS=epsm, MIN_ALT=min_alt, MAX_ALT=max_alt)

     HISTORY

     Written by A. Riccardi (AR)
     Osservatorio Astrofisico di Arcetri, ITALY
     riccardi@arcetri.astro.it
     Please, send me a message if you modify this code.

     14 Mar 2002, AR
      *QROMO is used instead of QROMB for the numerical
       integration giving d0.
      *The max height of the cn2 profile definition is
       now read from the cn2_block common structure.

(See ao_lib\d0_par.pro)

## FRIED_PAR

[Previous Routine] [Next Routine] [List of Routines]

        FRIED_PAR

        Result = FRIED_PARAM(Wl)

        returns Fried Parameter r_O (in m) at wavelength Wl (in m).
        It uses CN2(Z) turbulence profile.

(See ao_lib\fried_par.pro)

## ISO_ANGLE

[Previous Routine] [Next Routine] [List of Routines]

        ISO_ANGLE

        Return = ISO_ANGLE(Wl)

        return isoplanatic angle (in rad) for turbulence profile CN2 at
        wavelenth Wl (in m).

(See ao_lib\iso_angle.pro)

## JACOBI_POL

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           JACOBI_POL

     PURPOSE:
           JACOBI_POL returns the value of the Jacobi Polynomial
    		P_N(A,B,X) of degree N and parameters A and B in a vector X
    		of points. The Jacobi polynomials are
    		orthogonal over the interval (-1,+1) with the weight
    		function w(x)=(1-x)^a * (1+x)^b.
    		The computation of the polynomial P_N(A,B,X) use the
    		recurrence relation:

    			P_0(A,B,X) = 1
    			P_1(A,B,X) = (a+b+2)/2*X+(A-B)/2

    			for N >= 2:
    			C0 = 2*N*(A+B+N)*(A+B+2*N-2)
    			C1 = (2*N+A+B-2)*(2*N+A+B-1)*(2*N+A+B)*X+
    				 +(A^2-B^2)*(2*N+A+B-1)
    			C2 = 2*(N+A-1)*(2*N+A+B)*(N+B-1)

    			C0*P_N(A,B,X) = C1*P_(N-1)(A,B,X)-C2*P_(N-2)(A,B,X)

     CALLING SEQUENCE:
           Result = JACOBI_POL(N, A, B, X [, JPol1, JPol2])

     INPUTS:
           N:      scalar of type integer or long. N >= 0.
           A:		scalar of type float or double. A > -1.
           B:      scalar of type float or double. B > -1.
           X:      n-element vector of type float or double.

     OPTIONAL INPUTS:
           JPol1:  n-element vector of type float or double.
    				Jacobi polinomial P_(N-1)(A,B,X).
                   Not used as input if N <= 1.
           JPol2:  n-element vector of type float or double.
    				Jacobi polinomial P_(N-2)(A,B,X).
                   Not used as input if N <= 1.

           If JPol1 and JPol2 are given the calculation is faster
    		for N >= 2.

     OPTIONAL OUTPUT:
           JPol1:  n-element vector of type float or double.
    				Jacobi polinomial P_N(A,B,X).
           JPol2:  n-element vector of type float or double.
    				Jacobi polinomial P_(N-1)(A,B,X).
                   Not used as output if N = 0.
     REFERENCES:
    		Magnus, Oberhettinger, Soni "Formulas and Theorems
    			for the Special Function of Mathematical Physics", 1966,
    			Sec. 5.2.

     EXAMPLE:

     MODIFICATION HISTORY:
           Written by:     A. Riccardi; October, 1997.

(See ao_lib\jacobi_pol.pro)

## KOLM_COVAR

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           KOLM_COVAR

     PURPOSE:
           This function computes the covariance of Zernike polynomial
    		coefficients of the wavefront perturbations due to
    		Kolmogorov turbulence.

     CALLING SEQUENCE:

           Result = KOLM_COVAR(J1, J2)

     INPUTS:
           J1:     integer scalar. Inedex of Zernike polynomial. J1 >= 2
           J2:     integer scalar. Inedex of Zernike polynomial. J2 >= 2

     KEYWORD PARAMETERS:
           DOUBLE: if set, double precision covariance is returned.
    				Otherwise, single precision (float).

     OUTPUTS:
           This function returns OPD covariance  where a(J1) and
           a(J2) are J1-th and J2-th Zernike components of wave front
           perturbations due to Kolmogoroffian turbolence. Covariance is
           in (wavelength)^2*(D/r0)^(5/3) units, where D is the pupil
           diameter and r0 the Fried parameter.
           To have covariance of phase perurbations, use:

               4*pi^2*KOLM_COVAR(J1, J2) = <2*pi*a(J1) * 2*pi*aj(J2)>,

           it is in (D/r0)^(5/3) units.

     RESTRICTIONS:
           J1, J2 >= 2, because piston variance (J1=J2=1) diverges.

     BIBLIOGRAFY:
               Noll 1976, JOSA, 66, 207.
               Roddier 1990, Opt. Eng., 29, 1174.

     EXAMPLE:
           Computes the average spatial variance of phase perturbation on a
           circular pupil of diameter 1.5m due to first 15 Zernike polynomials.
           Suppose r0 = 15cm.

           scale = (150./15.)^(5./3.)
           var = 0.
           FOR i=2,15 DO var = var + KOLM_COVAR(i,i)
           var = (2 * !PI)^2 * scale * var

     MODIFICATION HISTORY:
           Written by:     A. Riccardi; April, 1995.
    						A. Riccardi; June, 1997. Recursive calculation
    							for the Gamma(n+alpha) (n int and alpha
    							floating point) to avoid overflow
    							in the Gamma Function for large n+alpha.

(See ao_lib\kolm_covar.pro)

## KOLM_MCOVAR

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           KOLM_MCOVAR

     PURPOSE:
           This function computes OPD covariance matrix of Zernike components of
           wavefront perturbations due to Kolmogorov turbulence.

     CALLING SEQUENCE:
           Result = KOLM_MCOVAR(Max_index)

     INPUTS:
           Max_index:  integer saclar. Maximum index of Zernike polynomial used.
                       Max_index >= 2.

     KEYWORD PARAMETERS:
           DOUBLE: if set, the result is double type. Float otherwise.

     OUTPUTS:
           Squared symmetric matrix with Max_index-1 elements per dimension.
           It is the covariance matrix for componets of Zernike polynomial with
           index from 2 to Max_index (see KOLM_COVAR).

               Result(i-2,j-2) =      where 2<=i,j<=Max_index

           OPD covariance matrix is in (wavelength)^2*(D/r0)^(5/3) units,
           where D is the pupil diameter and r0 the Fried parameter.
    		Return 0 if an error occurred.

     RESTRICTIONS:
           Covariances with Zernike index i=1 or j=1 is not computed
           because piston (j=i=1) Kolmogoroffian variance diverges.
           That's why Max_index >= 2.

     PROCEDURE:
           See: KOLM_COVAR

     EXAMPLE:
           Computes Covariance matrix for first 15 Zernike inexes and print
           variance due to Zernike sferical aberration:

           C = KOLM_MCOVAR(15)
           PRINT, C(11-2, 11-2)

     MODIFICATION HISTORY:
           Written by:     A. Riccardi; April, 1995.

(See ao_lib\kolm_mcovar.pro)

## LLLCCD_OUT

[Previous Routine] [Next Routine] [List of Routines]

     prob = lllccd_out(input_phe, r, m[, SEED=seed])

     input_phe: integer matrix: detected photo-electrons before amplification
     g        : float scalar: amplification gain. g=m^r where r is the number of
                amplification registers and m is the multiplication factor per
                register (m>=1, tipically m=1.01)

     SEED:  seed to be used in randomn call. On output it contains the seed returned
            by the randomn call.

     MODIFICATION HISTORY:
     21 March 2003. Written by A. Riccardi, INAF-OAA, Italy
                    riccardi@arcetri.astro.it
     22 March 2003. by AR: output converted to long and offset=input added
                    It takes into account the detected

(See ao_lib\lllccd_out.pro)

## LLLCCD_PROB

[Previous Routine] [Next Routine] [List of Routines]

     prob = lllccd_prob(x, n, g)

     probability function to obtain x extra-electrons in the avalange when
     n photo-electrons are detected, with gain g. g=m^r where r is the
     number of amplification registers and m is the multiplication factor of
     each register (m>=1.0, m=1.01 tipically).

     n must be integer. if n>170 or (n-1)*log(x/g)

     EXAMPLE:

     probability P(0<=x<1) with n=1 and g=1.01^519

     P=lllccd_prob(0.5, 1, 1.01^519)

     MODIFICATION HISTORY:

     22 March 2003: written by A. Riccardi, INAF-OAA, Italy
                    riccardi@arcetri.astro.it

(See ao_lib\lllccd_prob.pro)

## MAKE_ORTO_MODES

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           MAKE_ORTO_MODES

     PURPOSE:
           This function returns a orthogonal base matrix from the input matrix.

     CATEGORY:
           Linear Algebra.

     CALLING SEQUENCE:

           RESULT = MAKE_ORTO_MODES(INP_MATR)

     INPUTS:
           INP_MATR: the influence  matrix,M,used to compute the new base orthogonal, B, matrix through
                     the transformation B=M##Q, and  imposed the orthogonal property transpose(B)##B=I.

     OUTPUTS:
           The orthogonal base matrix, B.

     EXAMPLE:
     MODIFICATION HISTORY:
           Written by:     S. Esposito.
           9 March 2006, modified by D.Zanotti(DZ)
           Deleted the automatic transposition of the matrix when an error of input occurred.
           Updated some line codes.

(See ao_lib\make_orto_modes.pro)

## RANDOMN_COVAR

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           RANDOMN_COVAR

     PURPOSE:
           This function returns a sample of zero mean jointly
           gaussian random variables by the Cholesky decomposition
           of their covariance matrix.

     CATEGORY:
           Statistics.

     CALLING SEQUENCE:

           Result = RANDOMN_COVAR(L,R)

     INPUTS:
           L:      squared matrix. Cholesky factor of covariance
                   matrix from CHOLESKY function. The covariance
                   matrix C is:
                       C = transpose(L)#L

     OPTIONAL INPUTS:
           R:      integer or long scalar. Number of realizations.
                   If not defined one realization is returned.

     KEYWORD PARAMETERS:
           SEED:   long type variable. Random generation seed.
                   See RANDOMU function.

     OUTPUTS:
           Vector. This function returns a sample of zero mean jointly
           gaussian random variables with statistics from L.
           If L is double type matrix, double vector is
           returned. Otherwise float.

                   Return = L ## RANDOMN(seed,r,n)

           where n is the dimension of L.

     OPTIONAL OUTPUTS:
           If SEED variable is specified, it is updated. See RANDOMU function.

     TROUBLES:
           Even if double type L is used, RANDOMN returns
           a float type vector that is converted to double type one.

     EXAMPLE:
           Create a plot of probability density function of the sum
           of two jointly gaussian variables with M mean and C covariance.

           C = [[1.2, 0.3], [0.3, 2.3]]
           M = [12.1, 25.7]
           L = CHOLESKY(C)
           seed = 1L
           A = fltarr(500, /NOZERO)
           FOR i=0,499 DO A(i) = TOTAL(RANDOMN_COVAR(L, SEED=seed) + M)
           HISTOGRAM(A)

     MODIFICATION HISTORY:
           Written by:     A. Riccardi; April, 1995

(See ao_lib\randomn_covar.pro)

## VON_COVAR

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           VON_COVAR

     PURPOSE:
           This function computes covariance of zernike components of
           wave front perturbations due to Von-Karmann turbolence.

     CATEGORY:
           Optics.

     CALLING SEQUENCE:

           Result = VON_COVAR(J1, J2, L0)

     INPUTS:
           J1:     integer scalar. Inedex of Zernike polynomial. J1 >= 1
           J2:     integer scalar. Inedex of Zernike polynomial. J2 >= 1
    		L0:		float or double. Outer-scale value in pupil diameter
    				units.

     KEYWORD PARAMETERS:
           DOUBLE: if set, forces double type covariance. Float therwise.
    		EPS:	float or double scalar. relative precision of computation.
    				If undefined EPS=1.e-7.

     OUTPUTS:
           This function returns covariance  where a(J1) and
           a(J2) are J1-th and J2-th Zernike components of wave front
           perturbations due to Von-Karman turbolence. Covariance is
           in (wave-length)^2*(D/r0)^(5/3) units, where D is the pupil
           diameter and r0 the Fried parameter (r0 for Kolmogoroffian
    		turbolence).
           To have covariance of phase perurbations, use:

               4*pi^2*VON_COVAR(J1, J2) = <2*pi*a(J1) * 2*pi*aj(J2)>,

           it is in (D/r0)^(5/3) units.

     PROCEDURE:
           See:
               Winker D. M., 1991, JOSA, 8, 1569.
               Takato N. and Yamaguchi I., 1995, JOSA, 12, 958

     EXAMPLE:
           Computes the average spatial variance of phase perturbation on a
           circular pupil of diameter 1.5m dues to first 15 Zernike aberrations.
           Suppose r0 = 15cm, L0=40m

           scale = (150./15.)^(5./3.)
    		L0norm= (40./1.5)
           var = 0.
           FOR i=2,15 DO var = var + VON_COVAR(i,i,L0norm)
           var = 4 * !PI * var * scale
           Strhel_Ratio = EXP(-var)

     MODIFICATION HISTORY:
           Written by:     A. Riccardi; July, 1995.

(See ao_lib\von_covar.pro)

## ZERN

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           ZERN

     PURPOSE:
           The ZERN function returns the value of J-th Zernike polynomial
           in the points of coordinates X,Y. The output is of the same type
    		as the X and Y vectors. The function convert X,Y
    		coordinates in polar coordinates and call ZERN_JPOLAR function.

     CALLING SEQUENCE:
           Result = ZERN(J, X, Y)

     INPUTS:
           J:      scalar of type integer or long. Index of the polynomial,
    				J >= 1.
           X:      n-element vector of type float or double. X coordinates.
           Y:		n-element vector of type float or double. Y coordinates.

     MODIFICATION HISTORY:
           Written by:    A. Riccardi; March, 1995.

(See ao_lib\zern.pro)

## ZERN_DEGREE

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           ZERN_DEGREE

     PURPOSE:
           ZERN_DEGREE calculates the radial degree n and azimuthal
           frequency m of Zernike polynomial of index j.

     CATEGORY:
           Optics.

     CALLING SEQUENCE:

           ZERN_DEGREE, J, N, M

     MODIFICATION HISTORY:
           Written by:     A. Riccardi; March, 1995.

(See ao_lib\zern_degree.pro)

## ZERN_FT

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           ZERN_FT

     PURPOSE:
           ZERN_FT returns the value of j-th Zernike polynomial
           fourier transform in a point of frequency fx,fy.
           (We use Noll formulation of Zernike polynomials)

     CATEGORY:
           Special polynomial

     CALLING SEQUENCE:

           Result = ZERN_FT(J, Fx, Fy)

     INPUTS:
           J:      index of the polynomial, integer J >= 1
           Fx:     frequency to evaluate
           Fy:

     OUTPUTS:
           ZERN_FT returns the value of j-th Zernike polynomial
           fourier transform in the point of requency Fx,Fy.
           On error return 0.

     EXAMPLE:
           Evaluate Zernike x coma fourier transform in fx,fy. Enter:

               Result = ZERN_FT(8, fx, fy)

     MODIFICATION HISTORY:
           Written by:     A. Riccardi; March, 1995.

(See ao_lib\zern_ft.pro)

## ZERN_FT_POLAR

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           ZERN_FT_POLAR

     PURPOSE:
           ZERN_FT_POLAR returns the value of j-th Zernike polynomial
           fourier transform in a frequency of polar coordinates k,phi.
           (We use Noll formulation of Zernike polynomials)

     CATEGORY:
           Special polynomial

     CALLING SEQUENCE:

           Result = ZERN_FT_POLAR(J, K, Phi)

     INPUTS:
           J:      index of the polynomial, integer J >= 1
           K:      frequency to evaluate (polar coord.)
           Phi:

     OUTPUTS:
           ZERN_FT_POLAR returns the value of j-th Zernike polynomial
           fourier tranform in the frequency of polar coordinates k, phi.
           On error return 0.

     EXAMPLE:
           Evaluate Zernike x coma fourier transform in kappa, phi. Enter:

                Result = ZERN_FT_POLAR(8, kappa, phi)

     MODIFICATION HISTORY:
           Written by:     A. Riccardi; March, 1995.

(See ao_lib\zern_ft_polar.pro)

## ZERN_INDEX

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           ZERN_INDEX

     PURPOSE:
           ZERN_INDEX calculates the index of a zernike polynomial
           from radial degree N and azimuthal frequency M. If M is not
           zero there are two possible index value, even and odd, with
           index_1=j and index_2=j+1. In this case (M is not 0)
           Zernike_index returns the minor value (j).

     CATEGORY:
           Special polynomial.

     CALLING SEQUENCE:

           Result = ZERN_INDEX(N, M)

     INPUTS:
           N:  radial degree. Integer, N>=0.
           M:  azimuthal frequency. Integer, 0<=M<=N and N-M even

     MODIFICATION HISTORY:
           Written by:     A. Riccardi; April, 1995.

(See ao_lib\zern_index.pro)

## ZERN_JPOLAR

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           ZERN_JPOLAR

     PURPOSE:
           ZERN_JPOLAR returns the value of j-th Zernike polynomial
           in a point of polar coordinates r,theta.
           (We use Noll formulation of Zernike polynomials)

     CATEGORY:
           Special polynomial

     CALLING SEQUENCE:

           Result = ZERN_JPOLAR(J, R, Theta)

     INPUTS:
           J:      index of the polynomial, integer J >= 1
           R:      point to evaluate (polar coord.)
           Theta:

     OUTPUTS:
           ZERN_POLAR returns the value of j-th Zernike polynomial
           in the point of polar coordinates r, theta.
           If r>1 then return 0. On error return 0.

     EXAMPLE:
           Evaluate Zernike x coma in rho, theta. Enter:

                Result = ZERN_JPOLAR(8, rho, theta)

     MODIFICATION HISTORY:
           Written by:     A. Riccardi; March, 1995.

(See ao_lib\zern_jpolar.pro)

## ZERN_JRADIAL

[Previous Routine] [Next Routine] [List of Routines]

     NAME:
           ZERN_JRADIAL

     PURPOSE:
           ZERN_JRADIAL returns the value of the radial portion R(N,M,Rho)
    		of the Zernike polynomial of radial degree N and azimuthal
    		frequency M in a vector R of radial points.
    		The radial Zernike polynomial is defined in the range (0,1)
    		and is computed as:

    			R(N,M,Rho) = Rho^M * P_[(N-M)/2](0,M,2*Rho^2-1)

    		where P_k(a,b,x) is the Jacobi Polynomial of degree k (see
    		JACOBI_POL)

     CALLING SEQUENCE:
           Result = ZERNKE_JRADIAL(N, M, Rho [, Jpol1, JPol2])

     INPUTS:
           N:      scalar of type integer or long. N >= 0.
           M:      scalar of type integer or long. 0 <= M <= N and M-N even.
           Rho:    n_elements vector of type float or double.

     OPTIONAL INPUTS:
    		JPol1:	n_elements vector of type float or double.
    				Jacobi polinomial P_[(N-M)/2-1](0,M,2*Rho^2-1).
    				Not used as input if (N-M)/2 <= 1.
    		JPol2:	n_elements vector of type float or double.
    				Jacobi polinomial P_[(N-M)/2-2](0,M,2*Rho^2-1).
    				with k=(N-M)/2-2. Not used if (N-M)/2-2 <= 1.
    				Not used as input if (N-M)/2 <= 1.

    		If JPol1 and JPol2 are given the calculation is faster
    		for (N-M)/2 >= 2.

     OPTIONAL OUTPUTS:
    		JPol1:  n-element vector of type float or double.
    				Jacobi polinomial P_[(N-M)/2](0,M,2*Rho^2-1).
    				Not used as input if N <= 1.
    		JPol2:  n-element vector of type float or double.
    				Jacobi polinomial P_[(N-M)/2-1](0,M,2*Rho^2-1).
                   Not used as output if N = 0.

     REFERENCES:
           Magnus, Oberhettinger, Soni "Formulas and Theorems
               for the Special Function of Mathematical Physics", 1966,
               Sec. 5.2.
    		Born, Wolf, "Optics"
    		Noll 1976, JOSA, 66, 207.

     MODIFICATION HISTORY:
           Written by:     A. Riccardi; October, 1997.

(See ao_lib\zern_jradial.pro)

## ZERN_ORDER

[Previous Routine] [List of Routines]

       Result = ZERN_ORDER(Nmax)

       returns a vector of Zernike polynomial indexes from 2 to
       ZERNIKE_INXDEX(Nmax,Nmax) ordered by azimuthal frequency
       (see Roddier 90, Opt. Eng., 29, 1174). Nmax must be >=1

(See ao_lib\zern_order.pro)