cdm/src/main/java/ucar/nc2/ft/point/standard/plug/CFpointObs.java
private TableConfig makeMultidimInner3D(NetcdfDataset ds, TableConfig outerTable, TableConfig middleTable, Dimension innerDim, Formatter errlog) throws IOException {
    Dimension outerDim = ds.findDimension(outerTable.dimName);
    Dimension middleDim = ds.findDimension(middleTable.innerName);

    Table.Type obsTableType = (outerTable.structureType == TableConfig.StructureType.PsuedoStructure) ? Table.Type.MultidimInnerPsuedo3D : Table.Type.MultidimInner3D;
    TableConfig obsTable = new TableConfig(obsTableType, innerDim.getShortName());
    obsTable.structureType = TableConfig.StructureType.PsuedoStructure2D;
    obsTable.dimName = outerTable.dimName;
    obsTable.outerName = middleTable.innerName;
    obsTable.innerName = innerDim.getShortName();
    obsTable.structName = innerDim.getShortName();

    obsTable.lat = matchAxisTypeAndDimension(ds, AxisType.Lat, outerDim, middleDim, innerDim);
    obsTable.lon = matchAxisTypeAndDimension(ds, AxisType.Lon, outerDim, middleDim, innerDim);
    obsTable.elev = matchAxisTypeAndDimension(ds, AxisType.Height, outerDim, middleDim, innerDim);
    if (obsTable.elev == null) obsTable.elev = matchAxisTypeAndDimension(ds, AxisType.Pressure, middleDim, innerDim);
    if (obsTable.elev == null) obsTable.elev = matchAxisTypeAndDimension(ds, AxisType.GeoZ, middleDim, innerDim);
    obsTable.time = matchAxisTypeAndDimension(ds, AxisType.Time, outerDim, middleDim, innerDim);

    // divide up the variables between the 3 tables
    List<Variable> vars = ds.getVariables();
    List<String> outerVars = new ArrayList<>(vars.size());
    List<String> middleVars = new ArrayList<>(vars.size());
    List<String> innerVars = new ArrayList<>(vars.size());
    for (Variable orgV : vars) {
      if (orgV instanceof Structure) continue;

      if ((orgV.getRank() == 1) || ((orgV.getRank() == 2) && orgV.getDataType() == DataType.CHAR)) {
        if (outerDim.equals(orgV.getDimension(0)))
          outerVars.add(orgV.getShortName());

      } else if (orgV.getRank() == 2) {
        if (outerDim.equals(orgV.getDimension(0)) && middleDim.equals(orgV.getDimension(1)))
          middleVars.add(orgV.getShortName());

      } else if (orgV.getRank() == 3) {
        if (outerDim.equals(orgV.getDimension(0)) && middleDim.equals(orgV.getDimension(1)) && innerDim.equals(orgV.getDimension(2)))
          innerVars.add(orgV.getShortName());
      }
    }
    outerTable.vars = outerVars;
    middleTable.vars = middleVars;
    obsTable.vars = innerVars;

    return obsTable;
  }
private TableConfig makeMultidimInner3D(NetcdfDataset ds, TableConfig outerTable, TableConfig middleTable, Dimension innerDim, Formatter errlog) throws IOException {
    Dimension outerDim = ds.findDimension(outerTable.dimName);
    Dimension middleDim = ds.findDimension(middleTable.innerName);

    Table.Type obsTableType = (outerTable.structureType == TableConfig.StructureType.PsuedoStructure) ? Table.Type.MultidimInnerPsuedo3D : Table.Type.MultidimInner3D;
    TableConfig obsTable = new TableConfig(obsTableType, innerDim.getShortName());
    obsTable.structureType = TableConfig.StructureType.PsuedoStructure2D;
    obsTable.dimName = outerTable.dimName;
    obsTable.outerName = middleTable.innerName;
    obsTable.innerName = innerDim.getShortName();
    obsTable.structName = innerDim.getShortName();

    obsTable.lat = matchAxisTypeAndDimension(ds, AxisType.Lat, outerDim, middleDim, innerDim);
    obsTable.lon = matchAxisTypeAndDimension(ds, AxisType.Lon, outerDim, middleDim, innerDim);
    obsTable.elev = matchAxisTypeAndDimension(ds, AxisType.Height, outerDim, middleDim, innerDim);
    if (obsTable.elev == null) obsTable.elev = matchAxisTypeAndDimension(ds, AxisType.Pressure, middleDim, innerDim);
    if (obsTable.elev == null) obsTable.elev = matchAxisTypeAndDimension(ds, AxisType.GeoZ, middleDim, innerDim);
    obsTable.time = matchAxisTypeAndDimension(ds, AxisType.Time, outerDim, middleDim, innerDim);

    // divide up the variables between the 3 tables
    List<Variable> vars = ds.getVariables();
    List<String> outerVars = new ArrayList<>(vars.size());
    List<String> middleVars = new ArrayList<>(vars.size());
    List<String> innerVars = new ArrayList<>(vars.size());
    for (Variable orgV : vars) {
      if (orgV instanceof Structure) continue;

      if ((orgV.getRank() == 1) || ((orgV.getRank() == 2) && orgV.getDataType() == DataType.CHAR)) {
        if (outerDim.equals(orgV.getDimension(0)))
          outerVars.add(orgV.getShortName());

      } else if (orgV.getRank() == 2) {
        if (outerDim.equals(orgV.getDimension(0)) && middleDim.equals(orgV.getDimension(1)))
          middleVars.add(orgV.getShortName());

      } else if (orgV.getRank() == 3) {
        if (outerDim.equals(orgV.getDimension(0)) && middleDim.equals(orgV.getDimension(1)) && innerDim.equals(orgV.getDimension(2)))
          innerVars.add(orgV.getShortName());
      }
    }
    outerTable.vars = outerVars;
    middleTable.vars = middleVars;
    obsTable.vars = innerVars;

    return obsTable;
  }
private TableConfig makeMultidimInner3D ( NetcdfDataset ds , TableConfig outerTable , TableConfig middleTable , Dimension innerDim , Formatter errlog ) throws IOException { Dimension outerDim = ds . findDimension ( outerTable . dimName ) ; Dimension middleDim = ds . findDimension ( middleTable . innerName ) ; Table . Type obsTableType = ( outerTable . structureType == TableConfig . StructureType . PsuedoStructure ) ? Table . Type . MultidimInnerPsuedo3D : Table . Type . MultidimInner3D ; TableConfig obsTable = new TableConfig ( obsTableType , innerDim . getShortName ( ) ) ; obsTable . structureType = TableConfig . StructureType . PsuedoStructure2D ; obsTable . dimName = outerTable . dimName ; obsTable . outerName = middleTable . innerName ; obsTable . innerName = innerDim . getShortName ( ) ; obsTable . structName = innerDim . getShortName ( ) ; obsTable . lat = matchAxisTypeAndDimension ( ds , AxisType . Lat , outerDim , middleDim , innerDim ) ; obsTable . lon = matchAxisTypeAndDimension ( ds , AxisType . Lon , outerDim , middleDim , innerDim ) ; obsTable . elev = matchAxisTypeAndDimension ( ds , AxisType . Height , outerDim , middleDim , innerDim ) ; if ( obsTable . elev == null ) obsTable . elev = matchAxisTypeAndDimension ( ds , AxisType . Pressure , middleDim , innerDim ) ; if ( obsTable . elev == null ) obsTable . elev = matchAxisTypeAndDimension ( ds , AxisType . GeoZ , middleDim , innerDim ) ; obsTable . time = matchAxisTypeAndDimension ( ds , AxisType . Time , outerDim , middleDim , innerDim ) ; // divide up the variables between the 3 tables
 List < Variable > vars = ds . getVariables ( ) ; List < String > outerVars = new ArrayList <> ( vars . size ( ) ) ; List < String > middleVars = new ArrayList <> ( vars . size ( ) ) ; List < String > innerVars = new ArrayList <> ( vars . size ( ) ) ; for ( Variable orgV : vars ) { if ( orgV instanceof Structure ) continue ; if ( ( orgV . getRank ( ) == 1 ) || ( ( orgV . getRank ( ) == 2 ) && orgV . getDataType ( ) == DataType . CHAR ) ) { if ( outerDim . equals ( orgV . getDimension ( 0 ) ) ) outerVars . add ( orgV . getShortName ( ) ) ; } else if ( orgV . getRank ( ) == 2 ) { if ( outerDim . equals ( orgV . getDimension ( 0 ) ) && middleDim . equals ( orgV . getDimension ( 1 ) ) ) middleVars . add ( orgV . getShortName ( ) ) ; } else if ( orgV . getRank ( ) == 3 ) { if ( outerDim . equals ( orgV . getDimension ( 0 ) ) && middleDim . equals ( orgV . getDimension ( 1 ) ) && innerDim . equals ( orgV . getDimension ( 2 ) ) ) innerVars . add ( orgV . getShortName ( ) ) ; } } outerTable . vars = outerVars ; middleTable . vars = middleVars ; obsTable . vars = innerVars ; return obsTable ; }
the inner table of Structure(outer, middle, inner)
the inner table of Structure ( outer middle inner )