cdm/src/main/java/ucar/nc2/Variable.java
public Variable section(Section subsection) throws InvalidRangeException {

    subsection = Section.fill(subsection, shape);

    // create a copy of this variable with a proxy reader
    Variable sectionV = copy(); // subclasses must override
    sectionV.setProxyReader(new SectionReader(this, subsection));
    sectionV.shape = subsection.getShape();
    sectionV.createNewCache(); // dont share the cache
    sectionV.setCaching(false); // dont cache

    // replace dimensions if needed !! LOOK not shared
    sectionV.dimensions = new ArrayList<>();
    for (int i = 0; i < getRank(); i++) {
      Dimension oldD = getDimension(i);
      Dimension newD = (oldD.getLength() == sectionV.shape[i]) ? oldD : new Dimension(oldD.getShortName(), sectionV.shape[i], false);
      newD.setUnlimited(oldD.isUnlimited());
      sectionV.dimensions.add(newD);
    }
    sectionV.resetShape();
    return sectionV;
  }
public Variable section(Section subsection) throws InvalidRangeException {

    subsection = Section.fill(subsection, shape);

    // create a copy of this variable with a proxy reader
    Variable sectionV = copy(); // subclasses must override
    sectionV.setProxyReader(new SectionReader(this, subsection));
    sectionV.shape = subsection.getShape();
    sectionV.createNewCache(); // dont share the cache
    sectionV.setCaching(false); // dont cache

    // replace dimensions if needed !! LOOK not shared
    sectionV.dimensions = new ArrayList<>();
    for (int i = 0; i < getRank(); i++) {
      Dimension oldD = getDimension(i);
      Dimension newD = (oldD.getLength() == sectionV.shape[i]) ? oldD : new Dimension(oldD.getShortName(), sectionV.shape[i], false);
      newD.setUnlimited(oldD.isUnlimited());
      sectionV.dimensions.add(newD);
    }
    sectionV.resetShape();
    return sectionV;
  }
public Variable section ( Section subsection ) throws InvalidRangeException { subsection = Section . fill ( subsection , shape ) ; // create a copy of this variable with a proxy reader Variable sectionV = copy ( ) ; // subclasses must override sectionV . setProxyReader ( new SectionReader ( this , subsection ) ) ; sectionV . shape = subsection . getShape ( ) ; sectionV . createNewCache ( ) ; // dont share the cache sectionV . setCaching ( false ) ; // dont cache // replace dimensions if needed !! LOOK not shared sectionV . dimensions = new ArrayList <> ( ) ; for ( int i = 0 ; i < getRank ( ) ; i ++ ) { Dimension oldD = getDimension ( i ) ; Dimension newD = ( oldD . getLength ( ) == sectionV . shape [ i ] ) ? oldD : new Dimension ( oldD . getShortName ( ) , sectionV . shape [ i ] , false ) ; newD . setUnlimited ( oldD . isUnlimited ( ) ) ; sectionV . dimensions . add ( newD ) ; } sectionV . resetShape ( ) ; return sectionV ; }
Create a new Variable that is a logical subsection of this Variable.
No data is read until a read method is called on it.

@param subsection Section of this variable.
Each Range in the section corresponds to a Dimension, and specifies the section of data to read in that Dimension.
A Range object may be null, which means use the entire dimension.
@return a new Variable which is a logical section of this Variable.
@throws InvalidRangeException if section not compatible with shape
Create a new Variable that is a logical subsection of this Variable . No data is read until a read method is called on it .