/* Structure { int LAT[0]; ... int LAT[149]; } IMAGE_LAT_ARRAY(3600); type = Layout(8); type= 2 (chunked) storageSize = (1,600) dataSize=0 dataAddress=2548046 */ @Test public void testReadOneAtATime() throws java.io.IOException, InvalidRangeException { try (NetcdfFile ncfile = TestH5.openH5("IASI/IASI.h5")) { Variable dset = ncfile.findVariable("U-MARF/EPS/IASI_xxx_1C/DATA/IMAGE_LAT_ARRAY"); assert (null != dset); assert (dset.getDataType() == DataType.STRUCTURE); assert (dset.getRank() == 1); assert (dset.getSize() == 3600); Dimension d = dset.getDimension(0); assert (d.getLength() == 3600); Structure s = (Structure) dset; // read last one - chunked StructureData sd = s.readStructure(3599); assert sd.getScalarInt("LAT[0]") == 70862722; assert sd.getScalarInt("LAT[149]") == 85302263; // read one at a time for (int i = 3590; i < d.getLength(); i++) { s.readStructure(i); System.out.println(" read structure " + i); } } System.out.println("*** testReadIASI ok"); }
private double copyVarData(NetcdfFileWriteable ncfile, Structure recordStruct) throws IOException, InvalidRangeException { int nrecs = (int) recordStruct.getSize(); int sdataSize = recordStruct.getElementSize(); double total = 0; double totalRecordBytes = 0; for (int count = 0; count < nrecs; count++) { StructureData recordData = recordStruct.readStructure(count); for (StructureMembers.Member m : recordData.getMembers()) { if (m.getDataType() == DataType.STRUCTURE) { int countLevel = 0; ArrayStructure seq1 = recordData.getArrayStructure(m); StructureDataIterator iter = seq1.getStructureDataIterator(); try { while (iter.hasNext()) { StructureData seqData = iter.next(); for (StructureMembers.Member seqm : seqData.getMembers()) { Array data = seqData.getArray(seqm); int[] shape = data.getShape(); int[] newShape = new int[data.getRank() + 2]; newShape[0] = 1; newShape[1] = 1; for (int i = 0; i < data.getRank(); i++) newShape[i + 1] = shape[i]; int[] origin = new int[data.getRank() + 2]; origin[0] = count; origin[1] = countLevel; String mname = seqm.getName() + "-" + m.getName(); if (debug && (count == 0) && (countLevel == 0)) System.out.println("write to = " + mname); ncfile.write(mname, origin, data.reshape(newShape)); } countLevel++; } } finally { iter.finish(); } } else { Array data = recordData.getArray(m); int[] shape = data.getShape(); int[] newShape = new int[data.getRank() + 1]; newShape[0] = 1; for (int i = 0; i < data.getRank(); i++) newShape[i + 1] = shape[i]; int[] origin = new int[data.getRank() + 1]; origin[0] = count; if (debug && (count == 0)) System.out.println("write to = " + m.getName()); ncfile.write(m.getName(), origin, data.reshape(newShape)); } } totalRecordBytes += sdataSize; } total += totalRecordBytes; totalRecordBytes /= 1000 * 1000; if (debug) System.out.println( "write record var; total = " + totalRecordBytes + " Mbytes # recs=" + nrecs); return total; }