cdm/src/main/java/ucar/nc2/ft/point/standard/plug/CFpointObs.java
private TableConfig makeMultidimInner(NetcdfDataset ds, TableConfig parentTable, Dimension obsDim, EncodingInfo info, Formatter errlog) throws IOException {
    Dimension parentDim = ds.findDimension(parentTable.dimName);

    Table.Type obsTableType = (parentTable.structureType == TableConfig.StructureType.PsuedoStructure) ? Table.Type.MultidimInnerPsuedo : Table.Type.MultidimInner;
    // if (info.time.isMemberOfStructure()) obsTableType = Table.Type.Structure;

    TableConfig obsTable = new TableConfig(obsTableType, obsDim.getShortName());

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

    // divide up the variables between the parent and the obs
    List<String> obsVars;
    List<Variable> vars = ds.getVariables();
    List<String> parentVars = new ArrayList<>(vars.size());
    obsVars = new ArrayList<>(vars.size());
    for (Variable orgV : vars) {
      if (orgV instanceof Structure) continue;

      Dimension dim0 = orgV.getDimension(0);
      if ((dim0 != null) && dim0.equals(parentDim)) {
        if ((orgV.getRank() == 1) || ((orgV.getRank() == 2) && orgV.getDataType() == DataType.CHAR)) {
          parentVars.add(orgV.getShortName());
        } else {
          Dimension dim1 = orgV.getDimension(1);
          if ((dim1 != null) && dim1.equals(obsDim))
            obsVars.add(orgV.getShortName());
        }
      }
    }
    parentTable.vars = parentVars;
    // parentTable.vars = parentTable.isPsuedoStructure ? parentVars : null; // restrict to these if psuedoStruct

    obsTable.structureType = parentTable.structureType;
    obsTable.outerName = parentDim.getShortName();
    obsTable.innerName = obsDim.getShortName();
    obsTable.dimName = (parentTable.structureType == TableConfig.StructureType.PsuedoStructure) ? obsTable.outerName : obsTable.innerName;
    obsTable.structName = obsDim.getShortName();
    obsTable.vars = obsVars;

    return obsTable;
  }
private TableConfig makeMultidimInner(NetcdfDataset ds, TableConfig parentTable, Dimension obsDim, EncodingInfo info, Formatter errlog) throws IOException {
    Dimension parentDim = ds.findDimension(parentTable.dimName);

    Table.Type obsTableType = (parentTable.structureType == TableConfig.StructureType.PsuedoStructure) ? Table.Type.MultidimInnerPsuedo : Table.Type.MultidimInner;
    // if (info.time.isMemberOfStructure()) obsTableType = Table.Type.Structure;

    TableConfig obsTable = new TableConfig(obsTableType, obsDim.getShortName());

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

    // divide up the variables between the parent and the obs
    List<String> obsVars;
    List<Variable> vars = ds.getVariables();
    List<String> parentVars = new ArrayList<>(vars.size());
    obsVars = new ArrayList<>(vars.size());
    for (Variable orgV : vars) {
      if (orgV instanceof Structure) continue;

      Dimension dim0 = orgV.getDimension(0);
      if ((dim0 != null) && dim0.equals(parentDim)) {
        if ((orgV.getRank() == 1) || ((orgV.getRank() == 2) && orgV.getDataType() == DataType.CHAR)) {
          parentVars.add(orgV.getShortName());
        } else {
          Dimension dim1 = orgV.getDimension(1);
          if ((dim1 != null) && dim1.equals(obsDim))
            obsVars.add(orgV.getShortName());
        }
      }
    }
    parentTable.vars = parentVars;
    // parentTable.vars = parentTable.isPsuedoStructure ? parentVars : null; // restrict to these if psuedoStruct

    obsTable.structureType = parentTable.structureType;
    obsTable.outerName = parentDim.getShortName();
    obsTable.innerName = obsDim.getShortName();
    obsTable.dimName = (parentTable.structureType == TableConfig.StructureType.PsuedoStructure) ? obsTable.outerName : obsTable.innerName;
    obsTable.structName = obsDim.getShortName();
    obsTable.vars = obsVars;

    return obsTable;
  }
private TableConfig makeMultidimInner ( NetcdfDataset ds , TableConfig parentTable , Dimension obsDim , EncodingInfo info , Formatter errlog ) throws IOException { Dimension parentDim = ds . findDimension ( parentTable . dimName ) ; Table . Type obsTableType = ( parentTable . structureType == TableConfig . StructureType . PsuedoStructure ) ? Table . Type . MultidimInnerPsuedo : Table . Type . MultidimInner ; // if (info.time.isMemberOfStructure()) obsTableType = Table.Type.Structure;
 TableConfig obsTable = new TableConfig ( obsTableType , obsDim . getShortName ( ) ) ; obsTable . lat = matchAxisTypeAndDimension ( ds , AxisType . Lat , parentDim , obsDim ) ; obsTable . lon = matchAxisTypeAndDimension ( ds , AxisType . Lon , parentDim , obsDim ) ; obsTable . elev = matchAxisTypeAndDimension ( ds , AxisType . Height , parentDim , obsDim ) ; if ( obsTable . elev == null ) obsTable . elev = matchAxisTypeAndDimension ( ds , AxisType . Pressure , parentDim , obsDim ) ; if ( obsTable . elev == null ) obsTable . elev = matchAxisTypeAndDimension ( ds , AxisType . GeoZ , parentDim , obsDim ) ; obsTable . time = matchAxisTypeAndDimension ( ds , AxisType . Time , parentDim , obsDim ) ; // divide up the variables between the parent and the obs
 List < String > obsVars ; List < Variable > vars = ds . getVariables ( ) ; List < String > parentVars = new ArrayList <> ( vars . size ( ) ) ; obsVars = new ArrayList <> ( vars . size ( ) ) ; for ( Variable orgV : vars ) { if ( orgV instanceof Structure ) continue ; Dimension dim0 = orgV . getDimension ( 0 ) ; if ( ( dim0 != null ) && dim0 . equals ( parentDim ) ) { if ( ( orgV . getRank ( ) == 1 ) || ( ( orgV . getRank ( ) == 2 ) && orgV . getDataType ( ) == DataType . CHAR ) ) { parentVars . add ( orgV . getShortName ( ) ) ; } else { Dimension dim1 = orgV . getDimension ( 1 ) ; if ( ( dim1 != null ) && dim1 . equals ( obsDim ) ) obsVars . add ( orgV . getShortName ( ) ) ; } } } parentTable . vars = parentVars ; // parentTable.vars = parentTable.isPsuedoStructure ? parentVars : null; // restrict to these if psuedoStruct
 obsTable . structureType = parentTable . structureType ; obsTable . outerName = parentDim . getShortName ( ) ; obsTable . innerName = obsDim . getShortName ( ) ; obsTable . dimName = ( parentTable . structureType == TableConfig . StructureType . PsuedoStructure ) ? obsTable . outerName : obsTable . innerName ; obsTable . structName = obsDim . getShortName ( ) ; obsTable . vars = obsVars ; return obsTable ; }
the inner table of Structure(outer, inner) and middle table of Structure(outer, middle, inner)
the inner table of Structure ( outer inner ) and middle table of Structure ( outer middle inner )