1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
#include <stdio.h>
#include <stdlib.h>
#include "cdi.h"
int
main(void)
{
// Open the input dataset
int streamID1 = streamOpenRead("example.nc");
if (streamID1 < 0)
{
fprintf(stderr, "%s\n", cdiStringError(streamID1));
return 1;
}
// Get the variable list of the dataset
int vlistID1 = streamInqVlist(streamID1);
int numVars = vlistNvars(vlistID1);
int varDataSize = 0;
double *varData = NULL;
for (int varID = 0; varID < numVars; ++varID)
{
int varSize = vlistInqVarSize(vlistID1, varID);
varDataSize = varSize > varDataSize ? varSize : varDataSize;
}
varData = malloc((size_t) varDataSize * sizeof(double));
if (!varData)
{
perror("cannot allocate temporary copying buffer");
return EXIT_FAILURE;
}
// Open the output dataset (GRIB format)
int streamID2 = streamOpenWrite("example.grb", CDI_FILETYPE_GRB);
if (streamID2 < 0)
{
fprintf(stderr, "%s\n", cdiStringError(streamID2));
return EXIT_FAILURE;
}
int vlistID2 = vlistDuplicate(vlistID1);
streamDefVlist(streamID2, vlistID2);
// Loop over the input time steps
int tsID = 0;
while (streamInqTimestep(streamID1, tsID))
{
// Define the output time step
streamDefTimestep(streamID2, tsID);
for (int varID = 0; varID < numVars; ++varID)
{
SizeType numMissVals;
// Read var
streamReadVar(streamID1, varID, varData, &numMissVals);
// Write var
streamWriteVar(streamID2, varID, varData, numMissVals);
}
++tsID;
}
// Close the streams
streamClose(streamID1);
streamClose(streamID2);
return EXIT_SUCCESS;
}
|