cdm/src/main/java/ucar/nc2/dt/grid/GridCoordinate2D.java
public boolean findCoordElementNoForce(double wantLat, double wantLon, int[] rectIndex) {
    findBounds();
    if (wantLat < latMinMax.min) return false;
    if (wantLat > latMinMax.max) return false;
    if (wantLon < lonMinMax.min) return false;
    if (wantLon > lonMinMax.max) return false;

    double gradientLat = (latMinMax.max - latMinMax.min) / nrows;
    double gradientLon = (lonMinMax.max - lonMinMax.min) / ncols;

    double diffLat = wantLat - latMinMax.min;
    double diffLon = wantLon - lonMinMax.min;

    // initial guess
    rectIndex[0] = (int) Math.round(diffLat / gradientLat);  // row
    rectIndex[1] =(int) Math.round(diffLon / gradientLon);  // col

    int count = 0;
    while (true) {
      count++;
      if (debug) System.out.printf("%nIteration %d %n", count);
      if (contains(wantLat, wantLon, rectIndex))
        return true;

      if (!jump2(wantLat, wantLon, rectIndex)) return false;

      // bouncing around
      if (count > 10) {
        // last ditch attempt
        return incr(wantLat, wantLon, rectIndex);
        //if (!ok)
        //  log.error("findCoordElement didnt converge lat,lon = "+wantLat+" "+ wantLon);
        //return ok;
      }
    }
  }
public boolean findCoordElementNoForce(double wantLat, double wantLon, int[] rectIndex) {
    findBounds();
    if (wantLat < latMinMax.min) return false;
    if (wantLat > latMinMax.max) return false;
    if (wantLon < lonMinMax.min) return false;
    if (wantLon > lonMinMax.max) return false;

    double gradientLat = (latMinMax.max - latMinMax.min) / nrows;
    double gradientLon = (lonMinMax.max - lonMinMax.min) / ncols;

    double diffLat = wantLat - latMinMax.min;
    double diffLon = wantLon - lonMinMax.min;

    // initial guess
    rectIndex[0] = (int) Math.round(diffLat / gradientLat);  // row
    rectIndex[1] =(int) Math.round(diffLon / gradientLon);  // col

    int count = 0;
    while (true) {
      count++;
      if (debug) System.out.printf("%nIteration %d %n", count);
      if (contains(wantLat, wantLon, rectIndex))
        return true;

      if (!jump2(wantLat, wantLon, rectIndex)) return false;

      // bouncing around
      if (count > 10) {
        // last ditch attempt
        return incr(wantLat, wantLon, rectIndex);
        //if (!ok)
        //  log.error("findCoordElement didnt converge lat,lon = "+wantLat+" "+ wantLon);
        //return ok;
      }
    }
  }
public boolean findCoordElementNoForce ( double wantLat , double wantLon , int [ ] rectIndex ) { findBounds ( ) ; if ( wantLat < latMinMax . min ) return false ; if ( wantLat > latMinMax . max ) return false ; if ( wantLon < lonMinMax . min ) return false ; if ( wantLon > lonMinMax . max ) return false ; double gradientLat = ( latMinMax . max - latMinMax . min ) / nrows ; double gradientLon = ( lonMinMax . max - lonMinMax . min ) / ncols ; double diffLat = wantLat - latMinMax . min ; double diffLon = wantLon - lonMinMax . min ; // initial guess
 rectIndex [ 0 ] = ( int ) Math . round ( diffLat / gradientLat ) ; // row
 rectIndex [ 1 ] = ( int ) Math . round ( diffLon / gradientLon ) ; // col
 int count = 0 ; while ( true ) { count ++ ; if ( debug ) System . out . printf ( "%nIteration %d %n" , count ) ; if ( contains ( wantLat , wantLon , rectIndex ) ) return true ; if ( ! jump2 ( wantLat , wantLon , rectIndex ) ) return false ; // bouncing around
 if ( count > 10 ) { // last ditch attempt
 return incr ( wantLat , wantLon , rectIndex ) ; //if (!ok)
 //  log.error("findCoordElement didnt converge lat,lon = "+wantLat+" "+ wantLon);
 //return ok;
 } } }
Find the best index for the given lat,lon point.
@param wantLat   lat of point
@param wantLon   lon of point
@param rectIndex return (row,col) index, or best guess here. may not be null

@return false if not in the grid.
Find the best index for the given lat lon point . @param wantLat lat of point @param wantLon lon of point @param rectIndex return ( row col ) index or best guess here . may not be null