如何使用ncml中的可变长度变量创建netCDF-4文件?

时间:2016-06-29 14:47:12

标签: java dataset netcdf scientific-computing ncml

我试图编写一个带有可变长度变量的netCDF-4文件。

理想情况下,我使用过ncgen实用程序,但它不支持 ncml 输入。因此,我使用netCDF-java lib 4.6.6。以下没有可变长度变量的ncml会生成一个可行的netCDF-4文件:

java -Xmx1g -classpath ~/dump/netcdfAll-4.6.6.jar ucar.nc2.dataset.NetcdfDataset -in test.ncml -out test.nc4 -netcdf4

这是相应的ncml / xml:

<?xml version="1.0" encoding="UTF-8"?>
<netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://what.no">
  <group name="data">
    <dimension name="number_packets" length="6"/>
    <variable name="packet_time_utc" shape="number_packets" type="double">
    </variable>
  </group>
</netcdf>

如果我在ncml中添加另一个无限维,则会发生故障

<?xml version="1.0" encoding="UTF-8"?>
<netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://what.no">
  <group name="data">
    <dimension name="number_packets" length="6" isVariableLength="true" isShared="false"/>
    <variable name="packet_time_utc" shape="number_packets" type="double">
    </variable>
  </group>
</netcdf>

根据ncml schema,维度的定义是正确的。 错误消息 NetCDF:找不到变量

NetcdfDatataset read from test-vlen.ncml write to test-Vlen.nc4 java.io.IOException: -49: NetCDF: Variable not found
        at ucar.nc2.jni.netcdf.Nc4Iosp.writeData(Nc4Iosp.java:2835)
        at ucar.nc2.jni.netcdf.Nc4Iosp.writeData(Nc4Iosp.java:2789)
        at ucar.nc2.NetcdfFileWriter.write(NetcdfFileWriter.java:954)
        at ucar.nc2.NetcdfFileWriter.write(NetcdfFileWriter.java:938)
        at ucar.nc2.FileWriter2.copyAll(FileWriter2.java:431)
        at ucar.nc2.FileWriter2.copyVarData(FileWriter2.java:384)
        at ucar.nc2.FileWriter2.write(FileWriter2.java:199)
        at ucar.nc2.dataset.NetcdfDataset.main(NetcdfDataset.java:1888)
Exception in thread "main" java.io.IOException: -101: NetCDF: HDF error
        at ucar.nc2.jni.netcdf.Nc4Iosp.close(Nc4Iosp.java:289)
        at ucar.nc2.NetcdfFileWriter.abort(NetcdfFileWriter.java:1032)
        at ucar.nc2.FileWriter2.write(FileWriter2.java:207)
        at ucar.nc2.dataset.NetcdfDataset.main(NetcdfDataset.java:1888)

按照建议here指定length="*"会导致不同的NumberFormatException错误。

我使用的是最新版本:

  • HDF 1.8.17
  • netcdf C 4.4.0
  • netCDF-java lib 4.6.6

错误是关于无法找到变量(FileWrite想要复制所有变量)。但是,我一直试图找到错误的起源。

2 个答案:

答案 0 :(得分:0)

我用netCDF-java lib 分支5.0.0 重现了这个;提交 0cc266d ,但错误更清楚一点:

用你的第二个例子:

java.lang.IllegalArgumentException: Dimensions added to a group must be shared.

删除isShared="false"

java.lang.IllegalArgumentException: variable length dimension cannot be shared or unlimited

在我看来,目前还没有支持。

答案 1 :(得分:0)

不幸的是,这不是我们在NetCDF-Java中支持的。我在GitHub上提出了一个问题。