File: cdi_copy.c

package info (click to toggle)
cdo 2.6.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 49,836 kB
  • sloc: cpp: 185,271; ansic: 95,766; sh: 7,192; f90: 6,147; makefile: 1,977; ruby: 1,078; csh: 1,028; python: 995; fortran: 319; pascal: 219; perl: 9
file content (70 lines) | stat: -rw-r--r-- 1,615 bytes parent folder | download | duplicates (3)
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;
}