Exemplo n.º 1
0
void df_acos ( int *iret )
/************************************************************************
 * df_acos								*
 *									*
 * This subroutine computes the arc cosine of a scalar grid:		*
 *									*
 *     ACOS (S)								*
 *									*
 * where S is in radians.						*
 *									*
 * df_acos ( iret )							*
 *									*
 * Output parameters:							*
 *	*iret		int		Return code			*
 *					As for DG_GETS			*
 **									*
 * Log:									*
 * M. Goodman/RDS	11/85						*
 * W. Skillman/GSFC	 5/88	Added new stack subroutines		*
 * G. Huffman/GSC	 9/88	Error messages				*
 * K. Brill/GSC		 8/89   Subsetting				*
 * K. Brill/GSC		10/89   Subsetting				*
 * T. Lee/GSC		 4/96   Single dimension for dgg		*
 * K. Tyle/GSC           5/96   Moved IGDPT outside do-loop             *
 * K. Brill/HPC		 1/02	CALL DG_SSUB and DG_ESUB		*
 * K. Brill/HPC		11/02	Eliminate use of the SUBA logical array	*
 * R. Tian/SAIC         10/05   Recoded from Fortran			*
 ************************************************************************/
{
    int num1, num, kxd, kyd, ksub1, ksub2, fidx, cidx, zero, ier;
    float *gnum1, *gnum, dg1;
/*----------------------------------------------------------------------*/
    *iret = 0;
    zero = 0;

    dg_ssub ( iret );

    /*
     * Get the grid from the stack.
     */
    dg_gets ( &num1, iret );
    if ( *iret != 0 ) return;

    /*
     * Get a new grid.
     */
    dg_nxts ( &num, iret );
    if ( *iret != 0 ) return;

    /*
     * Grid number to grid.
     */
    dg_getg ( &num1, &gnum1, &kxd, &kyd, &ksub1, &ksub2, iret );
    dg_getg ( &num,  &gnum,  &kxd, &kyd, &ksub1, &ksub2, iret );

    /*
     * Compute the arc cosine.
     */
    for ( fidx = ksub1; fidx <= ksub2; fidx++ ) {
        cidx = fidx - 1;
        dg1 = gnum1[cidx];
	if ( ( dg1 < -1. ) || ( dg1 > 1. ) ) {
	    gnum[cidx] = RMISSD;
	} else {
	    gnum[cidx] = acos ( dg1 );
	}
    }

    /*
     * Get a name of the form 'ACOS'//S and update header;
     * update stack.
     */
    dg_updh ( "ACOS", &num, &num1, &zero, iret );
    dg_puts ( &num, iret );
    dg_esub ( &num, &zero,&zero, &zero, &ier );
    if ( ier != 0 ) *iret = ier;

    return;
}
Exemplo n.º 2
0
void df_sub ( int *iret )
/************************************************************************
 * df_sub								*
 *									*
 * This subroutine subtracts two scalar grids:				*
 *									*
 *     SUB (S1, S2) = S1 - S2						*
 *									*
 * df_sub ( iret )							*
 *									*
 * Output parameters:							*
 *	*iret		int		Return code			*
 *					As for DG_GETS			*
 **									*
 * Log:									*
 * M. desJardins/GSFC	10/85						*
 * M. desJardins/GSFC	 5/88	Added new stack subroutines		*
 * G. Huffman/GSC	 9/88	Error messages				*
 * K. Brill/GSC		 8/89   Subsetting				*
 * K. Brill/GSC		10/89   Subsetting				*
 * T. Lee/GSC		 4/96	Single dimension for dgg		*
 * K. Tyle/GSC           5/96   Moved IGDPT outside do-loop             *
 * K. Brill/HPC		 1/02	CALL DG_SSUB and DG_ESUB		*
 * K. Brill/HPC		11/02	Eliminate use of the SUBA logical array	*
 * R. Tian/SAIC		11/05	Recoded from Fortran			*
 ************************************************************************/
{
    int num1, num2, num, kxd, kyd, ksub1, ksub2, i, im1, ier, zero;
    float *gnum1, *gnum2, *gnum, dg1, dg2;
/*----------------------------------------------------------------------*/
    *iret = 0;
    zero = 0;

    dg_ssub ( iret );

    /*
     * Get two grids from the stack.
     */
    dg_gets ( &num1, iret );
    if ( *iret != 0 ) return;
    dg_gets ( &num2, iret );
    if ( *iret != 0 ) return;

    /*
     * Get a new grid number and subtract the grids.
     */
    dg_nxts ( &num, iret );
    if ( *iret != 0 ) return;

    /*
     * Grid number to grid.
     */
    dg_getg ( &num1, &gnum1, &kxd, &kyd, &ksub1, &ksub2, iret );
    dg_getg ( &num2, &gnum2, &kxd, &kyd, &ksub1, &ksub2, iret );
    dg_getg ( &num,  &gnum,  &kxd, &kyd, &ksub1, &ksub2, iret );

    for ( i = ksub1; i <= ksub2; i++ ) {
        im1 = i - 1;
	dg1 = gnum1[im1];
	dg2 = gnum2[im1];
	if ( ERMISS ( dg1 ) || ERMISS ( dg2 ) ) {
	    gnum[im1] = RMISSD;
	} else {
	    gnum[im1] = dg1 - dg2;
	}
    }

    /*
     * Make a name of the form 'SUB'//S1//S2 and update header;
     * update stack.
     */
    dg_updh ( "SUB", &num, &num1, &num2, iret );
    dg_puts ( &num, iret );
    dg_esub ( &num, &zero, &zero, &zero, &ier );
    if ( ier != 0 ) *iret = ier;

    return;
}
Exemplo n.º 3
0
void df_hilo  ( const int *hi, const int *lo, int *iret )
/************************************************************************
 * df_hilo								*
 *									*
 * This subroutine finds the relative extrema over a grid.		*
 *									*
 * df_hilo ( hi, lo, iret )						*
 *									*
 * Input parameters:							*
 *	*hi		const int	Flag for finding highs		*
 *	*lo		const int	Flag for finding lows		*
 *									*
 * Output parameters:							*
 *	*iret		int		Return code			*
 *					As for DG_GETS			*
 **									*
 * Log:									*
 * K. Brill/NMC          5/93   					*
 * D. Keiser/GSC	 7/95	Changed DC_HILO to DG_HILO		*
 * D. Keiser/GSC	10/95	Add call to write error message after 	*
 *				call to DG_HILO				*
 * T. Lee/GSC		 4/96   Single dimension for dgg		*
 * K. Tyle/GSC           5/96   Moved IGDPT outside do-loop             *
 * T. Piper/GSC		11/98	Updated prolog				*
 * K. Brill/HPC		 1/02	CALL DG_SSUB and DG_ESUB		*
 * K. Brill/HPC		11/02	Eliminate use of the SUBA logical array	*
 * R. Tian/SAIC		11/05	Recoded from Fortran			*
 ************************************************************************/
{
    int num1, num2, no, nx, kxd, kyd, kxyd, ksub1, ksub2;
    int krad, nmax, nmin, ixmx, iymx, ivmx, ixmn, iymn, ivmn, intflg,
        nummx, nummn, ii, i, j, nxi,nxj, nxv, index, ier, ier2, izero;
    float *gnum1, *gnum2, *gno, *gnx, fzero;
    char namout[5];
/*----------------------------------------------------------------------*/
    *iret = 0;
    izero = 0;
    fzero = 0.0;

    dg_ssub ( iret );
    strcpy ( namout, "HILO" );

    /*
     * Get the grid to be searched from the stack.
     */
    dg_gets ( &num1, iret );
    if ( *iret != 0 ) return;
    dg_getg ( &num1, &gnum1, &kxd, &kyd, &ksub1, &ksub2, iret );

    /*
     * Get the radius value.
     */
    dg_gets ( &num2, iret );
    if ( *iret != 0 ) return;
    dg_getg ( &num2, &gnum2, &kxd, &kyd, &ksub1, &ksub2, iret );
    krad = G_NINT ( gnum2[0] );

    /*
     * Get a new grid number for the output highs and lows.
     */
    dg_nxts ( &no, iret );
    if ( *iret != 0 ) return;
    dg_getg ( &no, &gno, &kxd, &kyd, &ksub1, &ksub2, iret );

    kxyd = kxd * kyd;
    nmax = kxyd / 6;
    nmin = nmax;

    /*
     * Store the HILO information in the NX grid.
     */
    dg_nxts ( &nx, iret );
    if ( *iret != 0 ) return;
    dg_getg ( &nx, &gnx, &kxd, &kyd, &ksub1, &ksub2, iret );

    ixmx = 1;
    iymx = 1 + nmax;
    ivmx = iymx + nmax;
    ixmn = ivmx + nmin;
    iymn = ixmn + nmin;
    ivmn = iymn + nmin;
    if ( *hi == G_FALSE ) nmax = 0;
    if ( *lo == G_FALSE ) nmin = 0;

    intflg = G_FALSE;
    dg_hilo ( gnum1, &kxd, &kyd, &krad, &intflg, &nmax, &nmin, 
        &fzero, &fzero, &fzero, &fzero,
	&nummx, &gnx[ixmx-1], &gnx[iymx-1], &gnx[ivmx-1],
	&nummn, &gnx[ixmn-1], &gnx[iymn-1], &gnx[ivmn-1], iret );
    if ( *iret < 0 )  return;

    /*
     * Write out error message regarding internal buffers in DG_HILO.
     */
    if ( *iret != 0 ) {
        er_wmsg ( "DG", iret, " ", &ier2, strlen("DG"), strlen(" ") );
    }

    /*
     * Set all grid values to missing.
     */
    for ( ii = ksub1; ii <= ksub2; ii++ ) {
        gno[ii-1] = RMISSD;
    }

    if ( *hi == G_TRUE ) {
        if ( *lo == G_FALSE ) strcpy ( namout, "HIGH" );

	/*
	 * Put the maxima on the grid.
	 */
	for ( ii = 1, nxi = ixmx-1, nxj = iymx-1, nxv = ivmx-1; 
	      ii <= nummx; 
	      ii++, nxi++, nxj++, nxv++ ) {
    	    i = G_NINT ( gnx[nxi] );
    	    j = G_NINT ( gnx[nxj] );
    	    index = ( j - 1 ) * kxd + i;
    	    gno[index-1] = gnx[nxv];
        }
    }

    if ( *lo == G_TRUE ) {
        if ( *hi == G_FALSE ) strcpy ( namout, "LOWS" );

	/*
	 *Put the minima on the grid.
	 */
        for ( ii = 1, nxi = ixmn-1, nxj = iymn-1, nxv = ivmn-1;
	      ii <= nummn;
	      ii++, nxi++, nxj++, nxv++ ) {
    	    i = G_NINT ( gnx[nxi] );
    	    j = G_NINT ( gnx[nxj] );
    	    index = ( j - 1 ) * kxd + i;
    	    gno[index-1] = gnx[nxv];
        }
    }

    /*
     * Get a name of the form NAMOUT //S and update header;
     * update stack.
     */
    dg_updh ( namout, &no, &num1, &izero, iret );
    dg_puts ( &no, iret );
    dg_esub ( &no, &izero, &izero, &izero, &ier );
    if ( ier != 0 ) *iret = ier;

    return;
}
Exemplo n.º 4
0
void dg_temp ( const char *time1, const char *time2, const int *level1,
               const int *level2, const int *ivcord, const char *parm,
	       int *num, int *iret )
/************************************************************************
 * dg_temp								*
 *									*
 * This subroutine checks for alternate ways to compute temperature.	*
 * The grid will be found in the grid location pointed to by NUM.  If 	*
 * NUM = 0 on input, the next grid location will be used and returned.	*
 * If NUM > 0, the grid will be found at NUM.				*
 *									*
 * dg_temp ( time1, time2, level1, level2, ivcord, parm, num, iret )	*
 *									*
 * Input parameters:							*
 *      *time1          const char      Date/time                       *
 *      *time2          const char      Date/time                       *
 *      *level1         const int       Level                           *
 *      *level2         const int       Level                           *
 *      *ivcord         const int       Vertical coordinate             *
 *      *parm           const char      Parameter name                  *
 *									*
 * Input and output parameters:						*
 *	*num		int		Location of grid		*
 *									*
 * Output parameters:							*
 *	*iret		int		Return code			*
 *					  0 = normal return		*
 *					 -7 = grid cannot be found	*
 *					 -8 = grid is the wrong size	*
 **									*
 * Log:									*
 * M. desJardins/GSFC	 2/90						*
 * K. Brill/NMC          9/90	Fix to get DWPC label on rtrn		*
 * J. Whistler/SSAI	 5/91	Added DG_MXNT to find MIXR		*
 * K. Brill/NMC		12/91	Reset SCALE for DWPC from MIXR or MIXS	*
 * M. desJardins/NMC	 3/92	Reorganize; eliminate DWPx here		*
 * M. desJardins/NMC	 3/93	Update file number			*
 * T. Lee/GSC		 4/96	Single dimension for dgg		*
 * K. Brill/HPC		11/02	Eliminate use of the SUBA logical array	*
 * R. Tian/SAIC		 2/06	Recoded from Fortran			*
 ************************************************************************/
{
    char ppp[5], ptmp[5];
    int np, nm, lenp, ier;
/*----------------------------------------------------------------------*/
    *iret = -7;

    /*
     * Check that the input string length is 4.
     */
    cst_lstr ( (char *)parm, &lenp, &ier );
    if ( lenp != 4 ) return;

    /*
     * Check that this is temperature.
     */
    if ( ( strcmp ( parm, "TEMP" ) == 0 ) ||
         ( strcmp ( parm, "TMPC" ) == 0 ) ||
	 ( strcmp ( parm, "TMPK" ) == 0 ) ||
	 ( strcmp ( parm, "TMPF" ) == 0 ) ) {
	strcpy ( ppp, parm );
    } else {
	return;
    }

    /*
     * Check file for grid stored in K, C or F.
     */
    dg_gtmp ( time1, time2, level1, level2, ivcord, ppp, num, iret );
    if ( *iret == 0 ) return;

    /*
     * Try alternate methods for temperature.
     * Compute temperature from THTA and PRES.
     */
    strcpy ( ptmp, "THTA" );
    dg_gtmp ( time1, time2, level1, level2, ivcord, ptmp, num, iret );
    if ( *iret == 0 ) {
	strcpy ( ptmp, "PRES" );
	dg_nxts ( &np, &ier );
	dg_vcrd ( time1, time2, level1, level2, ivcord, ptmp, &np, iret );
	if ( *iret == 0 ) {
	    pd_tmpk ( _dggrid.dgg[np-1].grid, _dggrid.dgg[(*num)-1].grid,
	        &_dgfile.kxyd, _dggrid.dgg[(*num)-1].grid, &ier );
	    dg_cdeg ( "TMPK", parm, num, iret );
	}
	dg_frig ( &np, &ier );
    }

    /*
     * Compute temperature from MIXS and PRES.
     */
    if ( *iret != 0 ) {
	strcpy ( ptmp, "MIXS" );
	dg_nxts ( &nm, &ier );
	dg_mxnt ( time1, time2, level1, level2, ivcord, ptmp, &nm, iret );
	if ( *iret == 0 ) {
	    strcpy ( ptmp, "PRES" );
	    dg_vcrd ( time1, time2, level1, level2, ivcord, ptmp, num, iret );
	    if ( *iret == 0 ) {
		pd_dwpt ( _dggrid.dgg[nm-1].grid, _dggrid.dgg[(*num)-1].grid,
		    &_dgfile.kxyd, _dggrid.dgg[(*num)-1].grid, &ier );
		dg_cdeg ( "TMPC", parm, num, iret );
	    }
	}
	dg_frig ( &nm, &ier );
    }

    /*
     * Exit if the temperature was not found.
     */
    if ( *iret != 0 ) return;

    /*
     * Put correct name in label.
     */
    dg_upsg ( time1, time2, level1, level2, ivcord, &_dgfile.idlun,
              parm, num, &ier );

    return;
}
Exemplo n.º 5
0
void df_sm9s ( int *iret )
/************************************************************************
 * df_sm9s								*
 *									*
 * This subroutine uses a 9 point smoother to smooth a scalar grid.	*
 *									*
 * df_sm9s ( iret )							*
 *									*
 * Output parameters:							*
 *	*iret		int		Return code			*
 *					As for DG_GETS			*
 **									*
 * Log:									*
 * C.L. Shie/SSAI	12/93	Modified from DF_SM5S			*
 * T. Lee/GSC		 4/96	Single dimension for dgg		*
 * K. Tyle/GSC           5/96   Moved IGDPT outside do-loop; rearranged *
 * K. Brill/HPC		 1/02	CALL DG_SSUB and DG_ESUB		*
 * R. Tian/SAIC		11/05	Recoded from Fortran			*
 ************************************************************************/
{
    int ni, no, jgymin, jgymax, jgxmin, jgxmax, kxd, kyd, ksub1, ksub2;
    int i, j, ii, ip1, im1, jp1, jm1, imjm, ipjm, imjp, ipjp, ier, zero;
    float *gni, *gno, dsum, wsum, wt, wtc, wt4;
    float dip1, dim1, djp1, djm1, dimjm, dipjm, dimjp, dipjp;
/*----------------------------------------------------------------------*/
    *iret = 0;
    zero = 0;

    dg_ssub ( iret );

    /*
     * Set filter weight for Diamond points weight
     */
    wt = 2.0;

    /*
     * Corner points weight
     */
    wtc = 1.0;

    /*
     * Center point weight
     */
    wt4 = 4.0;

    /*
     * Get the grid number.
     */
    dg_gets ( &ni, iret );
    if ( *iret != 0 ) return;

    /*
     * Get a new grid number and do the smoothing.
     */
    dg_nxts ( &no, iret );
    if ( *iret != 0 ) return;

    /*
     * Grid number to grid.
     */
    dg_getg ( &ni, &gni, &kxd, &kyd, &ksub1, &ksub2, iret );
    dg_getg ( &no, &gno, &kxd, &kyd, &ksub1, &ksub2, iret );

    /*
     * Apply nine-point variable smoother over subset grid. 
     */
    dg_qbnd ( &jgxmin, &jgxmax, &jgymin, &jgymax, iret );
    for ( j = jgymin; j <= jgymax; j++ ) {
	for ( i = jgxmin; i <= jgxmax; i++ ) {
	    ii = ( j - 1 ) * kxd + i;
	    if ( ERMISS ( gni[ii-1] ) ) {
		/*
		 * Check for missing data.
		 */
		gno[ii-1] = RMISSD;
	    } else {
		ip1 = ii + 1;
		if ( i+1 > jgxmax ) {
		    dip1 = RMISSD;
		} else {
		    dip1 = gni[ip1-1];
		}

		im1 = ii - 1;
		if ( i-1 < jgxmin ) {
		    dim1 = RMISSD;
		} else {
		    dim1 = gni[im1-1];
		}

		jp1 = ii + kxd;
		if ( j+1 > jgymax ) {
		    djp1 = RMISSD;
		} else {
		    djp1 = gni[jp1-1];
		}

		jm1 = ii - kxd;
		if ( j-1 < jgymin ) {
		    djm1 = RMISSD;
		} else {
		    djm1 = gni[jm1-1];
		}

		imjm = jm1 - 1;
		if ( ( j-1 < jgymin ) || ( i-1 < jgxmin ) ) {
		    dimjm = RMISSD;
		} else {
		    dimjm = gni[imjm-1];
		}

		ipjm = jm1 + 1;
		if ( ( j-1 < jgymin ) || ( i+1 > jgxmax ) ) {
		    dipjm = RMISSD;
		} else {
		    dipjm = gni[ipjm-1];
		}

		imjp = jp1 - 1;
		if ( ( j+1 > jgymax ) || ( i-1 < jgxmin ) ) {
		    dimjp = RMISSD;
		} else {
		    dimjp = gni[imjp-1];
		}

		ipjp = jp1 + 1;
		if ( ( j+1 > jgymax ) || ( i+1 > jgxmax ) ) {
		    dipjp = RMISSD;
		} else {
		    dipjp = gni[ipjp-1];
		}

		dsum = gni[ii-1] * wt4;
		wsum = wt4;
		if ( ! ERMISS ( dip1 ) ) {
		    dsum += dip1 * wt;
		    wsum += wt;
		} else {
		    dsum += gni[ii-1] * wt;
		    wsum += wt;
		}

		if ( ! ERMISS ( dim1 ) ) {
		    dsum += dim1 * wt;
		    wsum += wt;
		} else {
		    dsum += gni[ii-1] * wt;
		    wsum += wt;
		}

		if ( ! ERMISS ( djp1 ) ) {
		    dsum += djp1 * wt;
		    wsum += wt;
		} else {
		    dsum += gni[ii-1] * wt;
		    wsum += wt;
		}

		if ( ! ERMISS ( djm1 ) ) {
		    dsum += djm1 * wt;
		    wsum += wt;
		} else {
		    dsum += gni[ii-1] * wt;
		    wsum += wt;
		}

		if ( ! ERMISS ( dimjm ) ) {
		    dsum += dimjm * wtc;
		    wsum += wtc;
		} else {
		    dsum += gni[ii-1] * wtc;
		    wsum += wtc;
		}

		if ( ! ERMISS ( dipjm ) ) {
		    dsum += dipjm * wtc;
		    wsum += wtc;
		} else {
		    dsum += gni[ii-1] * wtc;
		    wsum += wtc;
		}

		if ( ! ERMISS ( dimjp ) ) {
		    dsum += dimjp * wtc;
		    wsum += wtc;
		} else {
		    dsum += gni[ii-1] * wtc;
		    wsum += wtc;
		}

		if ( ! ERMISS ( dipjp ) ) {
		    dsum += dipjp * wtc;
		    wsum += wtc;
		} else {
		    dsum += gni[ii-1] * wtc;
		    wsum += wtc;
		}

		gno[ii-1] = dsum/wsum ;
	    }
	}
    }

    /*
     * Make a name of the form 'SM9'//S and update header;
     * update stack.
     */
    dg_updh ( "SM9", &no, &ni, &zero, iret );
    dg_puts ( &no, iret );
    dg_esub ( &no, &zero, &zero, &zero, &ier );
    if ( ier != 0 ) *iret = ier;

    return;
}
Exemplo n.º 6
0
void df_nmin ( int *iret )
/************************************************************************
 * df_nmin								*
 *									*
 * This subroutine computes NMIN (S,ROI), the neigborhood minimum	*
 * value of a scalar field (S) within some radius of influence    	*
 * (ROI; meters). Masking could be used [e.g., SGT(S1,S2)] to subset *
 * and filter the grid beforehand to allow for faster processing.      	*
 *									*
 * df_nmin ( iret )							*
 *									*
 * Output parameters:							*
 *	*iret		int		Return code			*
 *					As for DG_GETS			*
 **									*
 * Log:									*
 * C. Melick/SPC	06/12						*
 * C. Melick/SPC        08/13   Correction to gnumn for missing data    *
 ************************************************************************/
{
    int num1, num2, num3, num, kxd, kyd, ksub1, ksub2, zero, indx, ier;
    int ixmscl, iymscl, jgymin, jgymax, jgxmin, jgxmax, idglat, idglon;
    int row, col, ibeg, iend, jbeg, jend, ibox, jbox, boxindx, nval;
    float  gddx, gddy, gdspdx, gdspdy, radius;
    float *gnum1, *gnumn, *gkxms, *gkyms, *gnumroi, *glat, *glon, *dist;   
/*----------------------------------------------------------------------*/
    *iret = 0;
    zero = 0;

    dg_ssub ( iret );

    /*
     * Compute map scale factors.
     */
    dg_mscl ( iret );
    if ( *iret != 0 ) return;

    /*
     * Query DGCMN.CMN idglat/idglon.
    */
     
    nval = 1;
    dg_iget ( "IDGLAT", &nval, &idglat, iret );
    if ( *iret != 0 ) return;
    dg_iget ( "IDGLON", &nval, &idglon, iret );
    if ( *iret != 0 ) return;

    /*
     * Get the grids from the stack.
     */
    dg_gets ( &num1, iret );
    if ( *iret != 0 ) return;
    dg_gets ( &num2, iret );
    if ( *iret != 0 ) return;

    /*
     * Get a new grid number.
     */
    dg_nxts ( &num3, iret );
    if ( *iret != 0 ) return; 
    dg_nxts ( &num, iret );
    if ( *iret != 0 ) return;

    dg_qmsl ( &ixmscl, &iymscl, &gddx, &gddy, &ier );
    dg_qbnd ( &jgxmin, &jgxmax, &jgymin, &jgymax, &ier );   
    dg_getg ( &num1, &gnum1, &kxd, &kyd, &ksub1, &ksub2, &ier );
    dg_getg ( &num,  &gnumn,  &kxd, &kyd, &ksub1, &ksub2, &ier );
    dg_getg ( &ixmscl, &gkxms, &kxd, &kyd, &ksub1, &ksub2, &ier );
    dg_getg ( &iymscl, &gkyms, &kxd, &kyd, &ksub1, &ksub2, &ier );
    dg_getg ( &num2, &gnumroi, &kxd, &kyd, &ksub1, &ksub2, &ier );
    dg_getg ( &idglat, &glat, &kxd, &kyd, &ksub1, &ksub2, &ier );
    dg_getg ( &idglon, &glon, &kxd, &kyd, &ksub1, &ksub2, &ier ); 
    dg_getg ( &num3, &dist, &kxd, &kyd, &ksub1, &ksub2, &ier ); 

    radius = gnumroi[0];

    /*  QC check on lower and upper bounds of radius of influence.  */

    if ( radius < 0 ) {
         radius = 0.0;
         printf ("\n WARNING : RADIUS value less than zero.  "
                 "Resetting to zero.\n");
    }

    if ( radius > 0.5*gddx*(float)(kxd)) {
         radius = 0.5*gddx*(float)(kxd);
         printf ("\n WARNING : RADIUS value too high.  "
                 "Resetting to half the distance in X (%f meters).\n",radius);
    }

    /*
     * Loop over all grid points to initialize output grid.
     */
    for ( row = jgymin; row <= jgymax; row++ ) {
	for ( col = jgxmin; col <= jgxmax; col++ ) {
            indx=(row-1)*kxd+(col-1);
            if ( ERMISS ( gnum1[indx] ) ) {
		gnumn[indx] = RMISSD;
            } else {
                gnumn[indx] = gnum1[indx];
            }
        }
    }

    /*
     * Loop over all grid points to determine neighborhood minimum for each grid point.
     */

    for ( row = jgymin; row <= jgymax; row++ ) {
       for ( col = jgxmin; col <= jgxmax; col++ ) {
         indx=(row-1)*kxd+(col-1);
         if ( ! ERMISS ( gnum1[indx] ) ) {
                gdspdx= gddx / gkxms[indx];
                gdspdy= gddy / gkyms[indx];
    
       /*  Constructing box for each grid point */
                ibeg = col- G_NINT(radius / gdspdx);
                iend = col+ G_NINT(radius / gdspdx);
                jbeg = row- G_NINT(radius / gdspdy);
                jend = row+ G_NINT(radius / gdspdy);
                if (ibeg < jgxmin) {
                   ibeg = jgxmin;
                }
                if (iend > jgxmax) {
                   iend = jgxmax;
                }
                if (jbeg < jgymin) {
                   jbeg = jgymin;
                }
                if (jend > jgymax) {
                   jend = jgymax;
                }
                for ( ibox = ibeg; ibox <= iend; ibox++ ) {
                    for ( jbox = jbeg; jbox <= jend; jbox++ ) {
                        boxindx=(jbox-1)*kxd+(ibox-1);
                        if ((glat[indx] == glat[boxindx]) && (glon[indx] == glon[boxindx])) {
                            dist[boxindx]=0.0;
                        } else {
        /* Great Circle Distance calculation */
                            dist[boxindx] = acos(sin(glat[boxindx])*sin(glat[indx]) + cos(glat[boxindx])*cos(glat[indx])*cos((glon[boxindx])-(glon[indx])));
                            dist[boxindx] = RADIUS * dist[boxindx];
                        }
/* Check minimum value if neighboring point is defined and within radius of influence. */
                        if ( (dist[boxindx] <= radius) && (! ERMISS ( gnum1[boxindx] ) ) ) { 
                           if ( gnum1[boxindx] < gnumn[indx] ) {  
                                gnumn[indx] = gnum1[boxindx];
                           }
                        }  
                    }
                }
                for ( ibox = ibeg; ibox <= iend; ibox++ ) {
                    for ( jbox = jbeg; jbox <= jend; jbox++ ) {
                        boxindx=(jbox-1)*kxd+(ibox-1);
        /* Spreading the response around to surrounding undefined values */
                        if ( ERMISS ( gnum1[boxindx] ) ) {
                           if (dist[boxindx] <= radius) {
                             if ( ERMISS ( gnumn[boxindx] ) ) {
                          /*  gnumn[boxindx] = gnumn[indx];  */
                                 gnumn[boxindx] = gnum1[indx]; 
                             } else if ( gnum1[indx] < gnumn[boxindx] ) {
                                 gnumn[boxindx] = gnum1[indx];
                             }
                           }
                        }
                    }
                }  
          }
       }
    } 

    /*
     * Make a name of the form 'NMIN'//S and update header;
     * update stack.
     */
    dg_updh ( "NMIN", &num, &num1, &num2, iret );
    dg_puts ( &num, iret );
    dg_esub ( &num, &zero, &zero, &zero, &ier );
    if ( ier != 0 ) *iret = ier;

    return;
}