cdm/src/main/java/ucar/nc2/ft2/coverage/CoordAxisHelper.java
@Nonnull
  CoverageCoordAxisBuilder subsetByIndex(Range range) throws InvalidRangeException {
    int ncoords = range.length();
    if (range.last() >= axis.getNcoords())
      throw new InvalidRangeException("range.last() >= axis.getNcoords()");

    double resolution = 0.0;

    int count2 = 0;
    double[] values = axis.getValues();  // will be null for regular
    double[] subsetValues = null;
    switch (axis.getSpacing()) {
      case regularInterval:
      case regularPoint:
        resolution = range.stride() * axis.getResolution();
        break;

      case irregularPoint:
        subsetValues = new double[ncoords];
        for (int i : range)
          subsetValues[count2++] = values[i];
        break;

      case contiguousInterval:
        subsetValues = new double[ncoords + 1];            // need npts+1
        for (int i : range)
          subsetValues[count2++] = values[i];
        subsetValues[count2] = values[range.last() + 1];
        break;

      case discontiguousInterval:
        subsetValues = new double[2 * ncoords];            // need 2*npts
        for (int i : range) {
          subsetValues[count2++] = values[2 * i];
          subsetValues[count2++] = values[2 * i + 1];
        }
        break;
    }

    // subset(int ncoords, double start, double end, double[] values)
    CoverageCoordAxisBuilder builder = new CoverageCoordAxisBuilder(axis);
    builder.subset(ncoords, axis.getCoordMidpoint(range.first()), axis.getCoordMidpoint(range.last()), resolution, subsetValues);
    builder.setRange(range);
    return builder;
  }
@Nonnull
  CoverageCoordAxisBuilder subsetByIndex(Range range) throws InvalidRangeException {
    int ncoords = range.length();
    if (range.last() >= axis.getNcoords())
      throw new InvalidRangeException("range.last() >= axis.getNcoords()");

    double resolution = 0.0;

    int count2 = 0;
    double[] values = axis.getValues();  // will be null for regular
    double[] subsetValues = null;
    switch (axis.getSpacing()) {
      case regularInterval:
      case regularPoint:
        resolution = range.stride() * axis.getResolution();
        break;

      case irregularPoint:
        subsetValues = new double[ncoords];
        for (int i : range)
          subsetValues[count2++] = values[i];
        break;

      case contiguousInterval:
        subsetValues = new double[ncoords + 1];            // need npts+1
        for (int i : range)
          subsetValues[count2++] = values[i];
        subsetValues[count2] = values[range.last() + 1];
        break;

      case discontiguousInterval:
        subsetValues = new double[2 * ncoords];            // need 2*npts
        for (int i : range) {
          subsetValues[count2++] = values[2 * i];
          subsetValues[count2++] = values[2 * i + 1];
        }
        break;
    }

    // subset(int ncoords, double start, double end, double[] values)
    CoverageCoordAxisBuilder builder = new CoverageCoordAxisBuilder(axis);
    builder.subset(ncoords, axis.getCoordMidpoint(range.first()), axis.getCoordMidpoint(range.last()), resolution, subsetValues);
    builder.setRange(range);
    return builder;
  }
@ Nonnull CoverageCoordAxisBuilder subsetByIndex ( Range range ) throws InvalidRangeException { int ncoords = range . length ( ) ; if ( range . last ( ) >= axis . getNcoords ( ) ) throw new InvalidRangeException ( "range.last() >= axis.getNcoords()" ) ; double resolution = 0.0 ; int count2 = 0 ; double [ ] values = axis . getValues ( ) ; // will be null for regular double [ ] subsetValues = null ; switch ( axis . getSpacing ( ) ) { case regularInterval : case regularPoint : resolution = range . stride ( ) * axis . getResolution ( ) ; break ; case irregularPoint : subsetValues = new double [ ncoords ] ; for ( int i : range ) subsetValues [ count2 ++ ] = values [ i ] ; break ; case contiguousInterval : subsetValues = new double [ ncoords + 1 ] ; // need npts+1 for ( int i : range ) subsetValues [ count2 ++ ] = values [ i ] ; subsetValues [ count2 ] = values [ range . last ( ) + 1 ] ; break ; case discontiguousInterval : subsetValues = new double [ 2 * ncoords ] ; // need 2*npts for ( int i : range ) { subsetValues [ count2 ++ ] = values [ 2 * i ] ; subsetValues [ count2 ++ ] = values [ 2 * i + 1 ] ; } break ; } // subset(int ncoords, double start, double end, double[] values) CoverageCoordAxisBuilder builder = new CoverageCoordAxisBuilder ( axis ) ; builder . subset ( ncoords , axis . getCoordMidpoint ( range . first ( ) ) , axis . getCoordMidpoint ( range . last ( ) ) , resolution , subsetValues ) ; builder . setRange ( range ) ; return builder ; }
Range must be contained in this range
Range must be contained in this range