mirror of
https://github.com/Unidata/netcdf-c.git
synced 2025-03-01 17:06:03 +08:00
Merge branch 'master' into ejh_h5_par
This commit is contained in:
commit
07ce91a137
@ -15,6 +15,7 @@ This file contains a high-level description of this package's evolution. Release
|
||||
* [Enhancement] Enable use of compact storage option for small vars in netCDF/HDF5 files. See [https://github.com/Unidata/netcdf-c/issues/1570].
|
||||
* [Enhancement] Updated benchmarking program bm_file.c to better handle very large files. See [https://github.com/Unidata/netcdf-c/issues/1555].
|
||||
* [Bug Fix] Fixed user setting of MPI launcher for parallel I/O HDF5 test in h5_test. See [https://github.com/Unidata/netcdf-c/issues/1626].
|
||||
* [Bug Fix] Fixed problem of growing memory when netCDF-4 files were opened and closed. See [https://github.com/Unidata/netcdf-c/issues/1575 and https://github.com/Unidata/netcdf-c/issues/1571].
|
||||
* [Enhancement] Increased size of maximum allowed name in HDF4 files to NC_MAX_NAME. See [https://github.com/Unidata/netcdf-c/issues/1631].
|
||||
|
||||
## 4.7.3 - November 20, 2019
|
||||
|
@ -582,6 +582,17 @@ close_vars(NC_GRP_INFO_T *grp)
|
||||
}
|
||||
}
|
||||
|
||||
/* Free the HDF5 typeids. */
|
||||
if (var->type_info->rc == 1)
|
||||
{
|
||||
if (((NC_HDF5_TYPE_INFO_T *)(var->type_info->format_type_info))->hdf_typeid &&
|
||||
H5Tclose(((NC_HDF5_TYPE_INFO_T *)(var->type_info->format_type_info))->hdf_typeid) < 0)
|
||||
return NC_EHDFERR;
|
||||
if (((NC_HDF5_TYPE_INFO_T *)(var->type_info->format_type_info))->native_hdf_typeid &&
|
||||
H5Tclose(((NC_HDF5_TYPE_INFO_T *)(var->type_info->format_type_info))->native_hdf_typeid) < 0)
|
||||
return NC_EHDFERR;
|
||||
}
|
||||
|
||||
/* Delete any HDF5 dimscale objid information. */
|
||||
if (hdf5_var->dimscale_hdf5_objids)
|
||||
free(hdf5_var->dimscale_hdf5_objids);
|
||||
|
@ -17,10 +17,10 @@ TEST_EXTENSIONS = .sh
|
||||
AM_LDFLAGS += ${top_builddir}/liblib/libnetcdf.la
|
||||
LDADD = ${top_builddir}/liblib/libnetcdf.la
|
||||
|
||||
check_PROGRAMS = tst_create_files bm_file tst_chunks3 tst_ar4 \
|
||||
tst_ar4_3d tst_ar4_4d bm_many_objs tst_h_many_atts bm_many_atts \
|
||||
tst_files2 tst_files3 tst_mem tst_knmi bm_netcdf4_recs tst_wrf_reads \
|
||||
tst_attsperf bigmeta openbigmeta tst_bm_rando
|
||||
check_PROGRAMS = tst_create_files bm_file tst_chunks3 tst_ar4 \
|
||||
tst_ar4_3d tst_ar4_4d bm_many_objs tst_h_many_atts bm_many_atts \
|
||||
tst_files2 tst_files3 tst_mem tst_mem1 tst_knmi bm_netcdf4_recs \
|
||||
tst_wrf_reads tst_attsperf bigmeta openbigmeta tst_bm_rando
|
||||
|
||||
bm_file_SOURCES = bm_file.c tst_utils.c
|
||||
bm_netcdf4_recs_SOURCES = bm_netcdf4_recs.c tst_utils.c
|
||||
@ -35,9 +35,9 @@ tst_knmi_SOURCES = tst_knmi.c tst_utils.c
|
||||
tst_wrf_reads_SOURCES = tst_wrf_reads.c tst_utils.c
|
||||
tst_bm_rando_SOURCES = tst_bm_rando.c tst_utils.c
|
||||
|
||||
TESTS = tst_ar4_3d tst_create_files tst_files3 tst_mem run_knmi_bm.sh \
|
||||
tst_wrf_reads tst_attsperf perftest.sh run_tst_chunks.sh \
|
||||
run_bm_elena.sh tst_bm_rando
|
||||
TESTS = tst_ar4_3d tst_create_files tst_files3 tst_mem tst_mem1 \
|
||||
run_knmi_bm.sh tst_wrf_reads tst_attsperf perftest.sh \
|
||||
run_tst_chunks.sh run_bm_elena.sh tst_bm_rando
|
||||
|
||||
run_bm_elena.log: tst_create_files.log
|
||||
|
||||
|
54
nc_perf/tst_mem1.c
Normal file
54
nc_perf/tst_mem1.c
Normal file
@ -0,0 +1,54 @@
|
||||
/* This is part of the netCDF package. Copyright 2020 University
|
||||
Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
|
||||
conditions of use.
|
||||
|
||||
Test internal netcdf-4 file code for memory leaks. This test was
|
||||
suggest by Jeff Whitaker. See
|
||||
https://github.com/Unidata/netcdf-c/issues/1575.
|
||||
|
||||
Ed Hartnett 2/9/20
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <nc_tests.h>
|
||||
#include <err_macros.h>
|
||||
#include <sys/resource.h>
|
||||
|
||||
#define FILE_NAME "tst_mem1.nc"
|
||||
#define NUM_FILE_OPENS 10000
|
||||
|
||||
int main()
|
||||
{
|
||||
int ncid, varid, idx;
|
||||
struct rusage r_usage;
|
||||
|
||||
printf("\n*** Testing netcdf-4 memory use.\n");
|
||||
printf("*** testing mem use opening/closing file...");
|
||||
{
|
||||
long my_rss = 0;
|
||||
|
||||
if (nc_create(FILE_NAME, NC_CLOBBER | NC_NETCDF4, &ncid)) ERR;
|
||||
/* if (nc_create(FILE_NAME, NC_CLOBBER, &ncid)) ERR; */
|
||||
if (nc_def_var(ncid, "dummy", NC_DOUBLE, 0, NULL, &varid)) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
|
||||
for (idx = 0; idx < NUM_FILE_OPENS; idx++)
|
||||
{
|
||||
if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
getrusage(RUSAGE_SELF, &r_usage);
|
||||
/* if (!(idx % 100)) */
|
||||
/* printf("Memory usage: %ld kilobytes\n",r_usage.ru_maxrss); */
|
||||
|
||||
/* Memory usage goes up in the first couple of opens, but
|
||||
* should then remain steady. Check that it does not
|
||||
* change after the first 10 iterations. */
|
||||
if (!my_rss || idx < 10)
|
||||
my_rss = r_usage.ru_maxrss;
|
||||
else
|
||||
if (my_rss != r_usage.ru_maxrss) ERR;
|
||||
};
|
||||
}
|
||||
SUMMARIZE_ERR;
|
||||
FINAL_RESULTS;
|
||||
}
|
@ -1,10 +1,10 @@
|
||||
/* This is part of the netCDF package.
|
||||
Copyright 2018 University Corporation for Atmospheric Research/Unidata
|
||||
Copyright 2020 University Corporation for Atmospheric Research/Unidata
|
||||
See COPYRIGHT file for conditions of use.
|
||||
|
||||
Test netcdf-4 variables with unlimited dimensions.
|
||||
|
||||
$Id: tst_unlim_vars.c,v 1.9 2010/05/25 13:53:04 ed Exp $
|
||||
Ed Hartnett
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
@ -19,137 +19,251 @@
|
||||
#define LON_LEN 3
|
||||
#define TIME_NAME "time"
|
||||
#define NUM_TIMESTEPS 4
|
||||
#define NDIMS 3
|
||||
#define NDIM3 3
|
||||
#define NDIM2 2
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int ncid, sfc_tempid;
|
||||
float data_out[NUM_TIMESTEPS][LAT_LEN][LON_LEN], data_in[NUM_TIMESTEPS][LAT_LEN][LON_LEN];
|
||||
int lat, lon, time;
|
||||
int dimids[NDIMS];
|
||||
nc_type xtype_in;
|
||||
int ndims_in, dimids_in[10], natts_in, nvars_in, unlimdimid_in;
|
||||
size_t len_in;
|
||||
char name_in[NC_MAX_NAME+1];
|
||||
size_t start[NDIMS], count[NDIMS];
|
||||
int d;
|
||||
printf("\n*** Testing netcdf-4 variables with unlimited dimensions.\n");
|
||||
printf("*** Testing file with one var, one unlim dim...");
|
||||
{
|
||||
int ncid, sfc_tempid;
|
||||
float data_out[NUM_TIMESTEPS][LAT_LEN][LON_LEN], data_in[NUM_TIMESTEPS][LAT_LEN][LON_LEN];
|
||||
int lat, lon, time;
|
||||
int dimids[NDIM3];
|
||||
nc_type xtype_in;
|
||||
int ndims_in, dimids_in[10], natts_in, nvars_in, unlimdimid_in;
|
||||
size_t len_in;
|
||||
char name_in[NC_MAX_NAME+1];
|
||||
size_t start[NDIM3], count[NDIM3];
|
||||
int d;
|
||||
|
||||
/* Set up phony data. */
|
||||
for (time = 0; time < NUM_TIMESTEPS; time++)
|
||||
for (lat = 0; lat < LAT_LEN; lat++)
|
||||
for (lon = 0; lon < LON_LEN; lon++)
|
||||
data_out[time][lat][lon] = 25.5 + lat + lon + time;
|
||||
|
||||
printf("\n*** Testing netcdf-4 variable with unlimited dimensions.\n");
|
||||
printf("*** Testing file with one var, one unlim dim...");
|
||||
/* Set up phony data. */
|
||||
for (time = 0; time < NUM_TIMESTEPS; time++)
|
||||
for (lat = 0; lat < LAT_LEN; lat++)
|
||||
for (lon = 0; lon < LON_LEN; lon++)
|
||||
data_out[time][lat][lon] = 25.5 + lat + lon + time;
|
||||
|
||||
/* Create a file with a 3D surface temp variable. */
|
||||
if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
|
||||
/* Create a file with a 3D surface temp variable. */
|
||||
if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
|
||||
|
||||
/* Create three dims, one unlimited. */
|
||||
if (nc_def_dim(ncid, TIME_NAME, NC_UNLIMITED, &dimids[0])) ERR;
|
||||
if (nc_def_dim(ncid, LAT_NAME, LAT_LEN, &dimids[1])) ERR;
|
||||
if (nc_def_dim(ncid, LON_NAME, LON_LEN, &dimids[2])) ERR;
|
||||
/* Create three dims, one unlimited. */
|
||||
if (nc_def_dim(ncid, TIME_NAME, NC_UNLIMITED, &dimids[0])) ERR;
|
||||
if (nc_def_dim(ncid, LAT_NAME, LAT_LEN, &dimids[1])) ERR;
|
||||
if (nc_def_dim(ncid, LON_NAME, LON_LEN, &dimids[2])) ERR;
|
||||
|
||||
/* Define a var. */
|
||||
for (d = 0; d < NDIMS; d++)
|
||||
dimids[d] = d;
|
||||
if (nc_def_var(ncid, SFC_TEMP_NAME, NC_FLOAT, NDIMS, dimids, &sfc_tempid)) ERR;
|
||||
/* Define a var. */
|
||||
for (d = 0; d < NDIM3; d++)
|
||||
dimids[d] = d;
|
||||
if (nc_def_var(ncid, SFC_TEMP_NAME, NC_FLOAT, NDIM3, dimids, &sfc_tempid)) ERR;
|
||||
|
||||
/* Check some metadata. */
|
||||
if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
|
||||
if (ndims_in != 3 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
|
||||
if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, dimids_in,
|
||||
&natts_in)) ERR;
|
||||
if (strcmp(name_in, SFC_TEMP_NAME) || xtype_in != NC_FLOAT ||
|
||||
ndims_in != 3 || natts_in != 0) ERR;
|
||||
for (d = 0; d < NDIMS; d++)
|
||||
if (dimids_in[d] != dimids[d]) ERR;
|
||||
if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
|
||||
if (len_in != 0 || strcmp(name_in, TIME_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
|
||||
if (len_in != LAT_LEN || strcmp(name_in, LAT_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
|
||||
if (len_in != LON_LEN || strcmp(name_in, LON_NAME)) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
/* Check some metadata. */
|
||||
if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
|
||||
if (ndims_in != 3 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
|
||||
if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, dimids_in,
|
||||
&natts_in)) ERR;
|
||||
if (strcmp(name_in, SFC_TEMP_NAME) || xtype_in != NC_FLOAT ||
|
||||
ndims_in != 3 || natts_in != 0) ERR;
|
||||
for (d = 0; d < NDIM3; d++)
|
||||
if (dimids_in[d] != dimids[d]) ERR;
|
||||
if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
|
||||
if (len_in != 0 || strcmp(name_in, TIME_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
|
||||
if (len_in != LAT_LEN || strcmp(name_in, LAT_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
|
||||
if (len_in != LON_LEN || strcmp(name_in, LON_NAME)) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
|
||||
if (nc_open(FILE_NAME, 0, &ncid)) ERR;
|
||||
if (nc_open(FILE_NAME, 0, &ncid)) ERR;
|
||||
|
||||
/* Check metadata. */
|
||||
if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
|
||||
if (ndims_in != 3 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
|
||||
if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, dimids_in,
|
||||
&natts_in)) ERR;
|
||||
if (strcmp(name_in, SFC_TEMP_NAME) || xtype_in != NC_FLOAT ||
|
||||
ndims_in != 3 || natts_in != 0) ERR;
|
||||
for (d = 0; d < NDIMS; d++)
|
||||
if (dimids_in[d] != dimids[d]) ERR;
|
||||
if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
|
||||
if (len_in != 0 || strcmp(name_in, TIME_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
|
||||
if (len_in != LAT_LEN || strcmp(name_in, LAT_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
|
||||
if (len_in != LON_LEN || strcmp(name_in, LON_NAME)) ERR;
|
||||
/* Check metadata. */
|
||||
if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
|
||||
if (ndims_in != 3 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
|
||||
if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, dimids_in,
|
||||
&natts_in)) ERR;
|
||||
if (strcmp(name_in, SFC_TEMP_NAME) || xtype_in != NC_FLOAT ||
|
||||
ndims_in != 3 || natts_in != 0) ERR;
|
||||
for (d = 0; d < NDIM3; d++)
|
||||
if (dimids_in[d] != dimids[d]) ERR;
|
||||
if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
|
||||
if (len_in != 0 || strcmp(name_in, TIME_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
|
||||
if (len_in != LAT_LEN || strcmp(name_in, LAT_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
|
||||
if (len_in != LON_LEN || strcmp(name_in, LON_NAME)) ERR;
|
||||
|
||||
if (nc_close(ncid)) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
|
||||
if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
|
||||
if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
|
||||
|
||||
/* Check metadata. */
|
||||
if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
|
||||
if (ndims_in != 3 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
|
||||
if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, dimids_in,
|
||||
&natts_in)) ERR;
|
||||
if (strcmp(name_in, SFC_TEMP_NAME) || xtype_in != NC_FLOAT ||
|
||||
ndims_in != 3 || natts_in != 0) ERR;
|
||||
for (d = 0; d < NDIMS; d++)
|
||||
if (dimids_in[d] != dimids[d]) ERR;
|
||||
if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
|
||||
if (len_in != 0 || strcmp(name_in, TIME_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
|
||||
if (len_in != LAT_LEN || strcmp(name_in, LAT_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
|
||||
if (len_in != LON_LEN || strcmp(name_in, LON_NAME)) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
/* Check metadata. */
|
||||
if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
|
||||
if (ndims_in != 3 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
|
||||
if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, dimids_in,
|
||||
&natts_in)) ERR;
|
||||
if (strcmp(name_in, SFC_TEMP_NAME) || xtype_in != NC_FLOAT ||
|
||||
ndims_in != 3 || natts_in != 0) ERR;
|
||||
for (d = 0; d < NDIM3; d++)
|
||||
if (dimids_in[d] != dimids[d]) ERR;
|
||||
if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
|
||||
if (len_in != 0 || strcmp(name_in, TIME_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
|
||||
if (len_in != LAT_LEN || strcmp(name_in, LAT_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
|
||||
if (len_in != LON_LEN || strcmp(name_in, LON_NAME)) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
|
||||
/* Write some data to the var.*/
|
||||
if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
|
||||
for (d = 0; d < NDIMS; d++)
|
||||
start[d] = 0;
|
||||
count[0] = NUM_TIMESTEPS;
|
||||
count[1] = LAT_LEN;
|
||||
count[2] = LON_LEN;
|
||||
if (nc_put_vara_float(ncid, 0, start, count, (float *)data_out)) ERR;
|
||||
/* Write some data to the var.*/
|
||||
if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
|
||||
for (d = 0; d < NDIM3; d++)
|
||||
start[d] = 0;
|
||||
count[0] = NUM_TIMESTEPS;
|
||||
count[1] = LAT_LEN;
|
||||
count[2] = LON_LEN;
|
||||
if (nc_put_vara_float(ncid, 0, start, count, (float *)data_out)) ERR;
|
||||
|
||||
/* Check metadata. */
|
||||
if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
|
||||
if (ndims_in != 3 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
|
||||
if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, dimids_in,
|
||||
&natts_in)) ERR;
|
||||
if (strcmp(name_in, SFC_TEMP_NAME) || xtype_in != NC_FLOAT ||
|
||||
ndims_in != 3 || natts_in != 0) ERR;
|
||||
for (d = 0; d < NDIMS; d++)
|
||||
if (dimids_in[d] != dimids[d]) ERR;
|
||||
if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
|
||||
if (len_in != NUM_TIMESTEPS || strcmp(name_in, TIME_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
|
||||
if (len_in != LAT_LEN || strcmp(name_in, LAT_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
|
||||
if (len_in != LON_LEN || strcmp(name_in, LON_NAME)) ERR;
|
||||
/* Check metadata. */
|
||||
if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
|
||||
if (ndims_in != 3 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
|
||||
if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, dimids_in,
|
||||
&natts_in)) ERR;
|
||||
if (strcmp(name_in, SFC_TEMP_NAME) || xtype_in != NC_FLOAT ||
|
||||
ndims_in != 3 || natts_in != 0) ERR;
|
||||
for (d = 0; d < NDIM3; d++)
|
||||
if (dimids_in[d] != dimids[d]) ERR;
|
||||
if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
|
||||
if (len_in != NUM_TIMESTEPS || strcmp(name_in, TIME_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
|
||||
if (len_in != LAT_LEN || strcmp(name_in, LAT_NAME)) ERR;
|
||||
if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
|
||||
if (len_in != LON_LEN || strcmp(name_in, LON_NAME)) ERR;
|
||||
|
||||
if (nc_close(ncid)) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
|
||||
if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
|
||||
if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
|
||||
|
||||
/* Check data. */
|
||||
if (nc_get_vara_float(ncid, 0, start, count, (float *)data_in)) ERR;
|
||||
for (time = 0; time < NUM_TIMESTEPS; time++)
|
||||
for (lat = 0; lat < LAT_LEN; lat++)
|
||||
for (lon = 0; lon < LON_LEN; lon++)
|
||||
if (data_in[time][lat][lon] != data_out[time][lat][lon]) ERR;
|
||||
/* Check data. */
|
||||
if (nc_get_vara_float(ncid, 0, start, count, (float *)data_in)) ERR;
|
||||
for (time = 0; time < NUM_TIMESTEPS; time++)
|
||||
for (lat = 0; lat < LAT_LEN; lat++)
|
||||
for (lon = 0; lon < LON_LEN; lon++)
|
||||
if (data_in[time][lat][lon] != data_out[time][lat][lon]) ERR;
|
||||
|
||||
if (nc_close(ncid)) ERR;
|
||||
SUMMARIZE_ERR;
|
||||
FINAL_RESULTS;
|
||||
if (nc_close(ncid)) ERR;
|
||||
}
|
||||
SUMMARIZE_ERR;
|
||||
printf("*** Testing netcdf-4 variable 2 unlimited dimensions...");
|
||||
{
|
||||
#define DIM0_NAME "Speed"
|
||||
#define DIM1_NAME "Height"
|
||||
#define VAR_NAME "Superman"
|
||||
#define VAR1_NAME "Black_Widow"
|
||||
int ncid, varid, varid1, dimid[NDIM2];
|
||||
int data = TEST_VAL_42;
|
||||
int data_in;
|
||||
size_t index[NDIM2] = {1, 1};
|
||||
char name_in[NC_MAX_NAME + 1];
|
||||
size_t len_in;
|
||||
|
||||
/* Create a file with 2 unlimited dims. */
|
||||
if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
|
||||
if (nc_def_dim(ncid, DIM0_NAME, NC_UNLIMITED, &dimid[0])) ERR;
|
||||
if (nc_def_dim(ncid, DIM1_NAME, NC_UNLIMITED, &dimid[1])) ERR;
|
||||
if (nc_def_var(ncid, VAR_NAME, NC_INT, NDIM2, dimid, &varid)) ERR;
|
||||
if (nc_def_var(ncid, VAR1_NAME, NC_INT, NDIM2, dimid, &varid1)) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
|
||||
/* Check the file. */
|
||||
if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
|
||||
if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
|
||||
if (strcmp(name_in, DIM0_NAME) || len_in != 0) ERR;
|
||||
if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
|
||||
if (strcmp(name_in, DIM1_NAME) || len_in != 0) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
|
||||
/* Reopen the file and add data. */
|
||||
if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
|
||||
if (nc_put_var1_int(ncid, 0, index, &data)) ERR;
|
||||
if (nc_inq_dim(ncid, 0, NULL, &len_in)) ERR;
|
||||
if (len_in != 2) ERR;
|
||||
if (nc_inq_dim(ncid, 1, NULL, &len_in)) ERR;
|
||||
if (len_in != 2) ERR;
|
||||
if (nc_get_var1_int(ncid, 0, index, &data_in)) ERR;
|
||||
if (data_in != data) ERR;
|
||||
if (nc_get_var1_int(ncid, 1, index, &data_in)) ERR;
|
||||
if (data_in != NC_FILL_INT) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
|
||||
}
|
||||
SUMMARIZE_ERR;
|
||||
printf("*** Testing netcdf-4 variable 3 unlimited dimensions...");
|
||||
{
|
||||
#define D3_DIM0_NAME "Gadgets"
|
||||
#define D3_DIM1_NAME "Brains"
|
||||
#define D3_DIM2_NAME "Money"
|
||||
#define D3_VAR_NAME "Batman"
|
||||
#define D3_VAR1_NAME "Aquaman"
|
||||
int ncid, varid, dimid[NDIM3];
|
||||
int data = TEST_VAL_42;
|
||||
int data_in;
|
||||
size_t start[NDIM3] = {1, 1, 1}, count[NDIM3] = {1, 1, 1};
|
||||
size_t index[NDIM3] = {0, 0, 1};
|
||||
char name_in[NC_MAX_NAME + 1];
|
||||
size_t len_in;
|
||||
|
||||
/* Create a file with 2 unlimited dims. */
|
||||
if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
|
||||
if (nc_def_dim(ncid, D3_DIM0_NAME, NC_UNLIMITED, &dimid[0])) ERR;
|
||||
if (nc_def_dim(ncid, D3_DIM1_NAME, NC_UNLIMITED, &dimid[1])) ERR;
|
||||
if (nc_def_dim(ncid, D3_DIM2_NAME, NC_UNLIMITED, &dimid[2])) ERR;
|
||||
if (nc_def_var(ncid, D3_VAR_NAME, NC_INT, NDIM3, dimid, &varid)) ERR;
|
||||
if (nc_def_var(ncid, D3_VAR1_NAME, NC_INT, NDIM3, dimid, &varid)) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
|
||||
/* Check the file. */
|
||||
if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
|
||||
if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
|
||||
if (strcmp(name_in, D3_DIM0_NAME) || len_in != 0) ERR;
|
||||
if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
|
||||
if (strcmp(name_in, D3_DIM1_NAME) || len_in != 0) ERR;
|
||||
if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
|
||||
if (strcmp(name_in, D3_DIM2_NAME) || len_in != 0) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
|
||||
/* Reopen the file and add data. */
|
||||
if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
|
||||
if (nc_put_vara_int(ncid, 0, start, count, &data)) ERR;
|
||||
if (nc_put_var1_int(ncid, 1, index, &data)) ERR;
|
||||
if (nc_inq_dim(ncid, 0, NULL, &len_in)) ERR;
|
||||
if (len_in != 2) ERR;
|
||||
if (nc_inq_dim(ncid, 1, NULL, &len_in)) ERR;
|
||||
if (len_in != 2) ERR;
|
||||
if (nc_inq_dim(ncid, 2, NULL, &len_in)) ERR;
|
||||
if (len_in != 2) ERR;
|
||||
if (nc_get_vara_int(ncid, 0, start, count, &data_in)) ERR;
|
||||
if (data_in != data) ERR;
|
||||
if (nc_get_vara_int(ncid, 1, start, count, &data_in)) ERR;
|
||||
if (data_in != NC_FILL_INT) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
|
||||
/* Reopen file and check again. */
|
||||
if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
|
||||
if (nc_inq_dim(ncid, 0, NULL, &len_in)) ERR;
|
||||
if (len_in != 2) ERR;
|
||||
if (nc_inq_dim(ncid, 1, NULL, &len_in)) ERR;
|
||||
if (len_in != 2) ERR;
|
||||
if (nc_inq_dim(ncid, 2, NULL, &len_in)) ERR;
|
||||
if (len_in != 2) ERR;
|
||||
if (nc_get_vara_int(ncid, 0, start, count, &data_in)) ERR;
|
||||
if (data_in != data) ERR;
|
||||
if (nc_get_vara_int(ncid, 1, start, count, &data_in)) ERR;
|
||||
if (data_in != NC_FILL_INT) ERR;
|
||||
if (nc_get_var1_int(ncid, 1, index, &data_in)) ERR;
|
||||
if (data_in != data) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
}
|
||||
SUMMARIZE_ERR;
|
||||
FINAL_RESULTS;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user