test_resource_copy.c 6.65 KB
Newer Older
1
2
3
4
5
#if defined (HAVE_CONFIG_H)
#include "config.h"
#endif

#include <stdio.h>
6
#include <string.h>
7
8

#include "cdi.h"
9
#include "cdi_uuid.h"
10
#include "dmemory.h"
11
#include "error.h"
12
13
#include "resource_handle.h"
#include "resource_unpack.h"
14
15
16
17

#ifdef MPI_MARSHALLING
#include <mpi.h>
#include "cdipio.h"
18
#include "pio_serialize.h"
19
#include "pio_util.h"
20
21
22
#else
typedef int MPI_Comm;
#endif
23
24

enum {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
25
  DOUBLE_PRECISION = CDI_DATATYPE_FLT64,
26
27
28
29
30
  nlon             = 12,
  nlat             = 6,
  nlev             = 5,
  ntsteps          = 3 };

31
32
33
static double lons[nlon] = {0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330};
static double lats[nlat] = {-75, -45, -15, 15, 45, 75};
static double levs[nlev] = {101300, 92500, 85000, 50000, 20000};
34

35
static int defineGrid (void)
36
37
38
39
40
41
42
{
  int mask_vec[nlon*nlat];
  const int * mp = &mask_vec[0];
  double area_vec[nlon*nlat];
  const double * ap = &area_vec[0];
  int i;

43
  int gridID = gridCreate(GRID_LONLAT, nlon*nlat);
44
45
46
47
48
49
50
51
52
53
54
55
56
  gridDefXsize(gridID, nlon);
  gridDefYsize(gridID, nlat);
  gridDefXvals(gridID, lons);
  gridDefYvals(gridID, lats);
  gridDefNvertex ( gridID, 1 );
  gridDefXbounds ( gridID, lons );
  gridDefYbounds ( gridID, lats );
  for ( i = 0; i < nlon*nlat; i++ )
    mask_vec[i] = i % 2 ;
  gridDefMaskGME ( gridID, mp );
  for ( i = 0; i < nlon*nlat; i++ )
    mask_vec[i] = 1;
  gridDefMask ( gridID, mp );
57
58
59
60
61
62
63
64

  cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, "myXname");
  cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, "myYname");
  cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, "myXlongname");
  cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, "myYlongname");
  cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, "myXunits");
  cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, "myYunits");

Uwe Schulzweida's avatar
Uwe Schulzweida committed
65
  gridDefDatatype ( gridID, DOUBLE_PRECISION );
66
  gridDefTrunc ( gridID, 1 );
67
  gridDefParamGME ( gridID, 2, 3, 4, 5 );
68
69
70
71
72

  cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, 6);
  cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, 7);
  cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, "myReference");

73
74
75
76
77
  for ( i = 0; i < nlon*nlat; i++ )
    area_vec[i] = 0.1 * i;
  gridDefArea ( gridID, ap );
  for ( i = 0; i < nlon*nlat; i++ )
    mask_vec[i] = i;
78
  gridDefReducedPoints ( gridID, nlon*nlat, mp );
79
  gridDefComplexPacking ( gridID, 1 );
80
81
  {
    unsigned char uuid[CDI_UUID_SIZE];
82
    cdiCreateUUID(uuid);
83
84
    gridDefUUID(gridID, uuid);
  }
85
86
87
88

  return gridID;
}

89
static int defineZaxis (void)
90
91
92
{
  double vct[3] = { 3.0, 3.3, 3.6 };

93
  int zaxisID = zaxisCreate(ZAXIS_PRESSURE, nlev);
94
95
  zaxisDefLevels(zaxisID, levs);
  zaxisDefLevel ( zaxisID, 2, 8507.3 );
96
97
98
99
100

  cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, "myName");
  cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, "myLongname");
  cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "myUnits");

Uwe Schulzweida's avatar
Uwe Schulzweida committed
101
  zaxisDefDatatype ( zaxisID, DOUBLE_PRECISION );
102
  cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, 1);
103
104
105
106
  zaxisDefVct ( zaxisID, 3, vct );
  zaxisDefLbounds ( zaxisID, &levs[0] );
  zaxisDefUbounds ( zaxisID, &levs[0] );
  zaxisDefWeights ( zaxisID, &levs[0] );
107
108
  {
    unsigned char uuid[CDI_UUID_SIZE];
109
    cdiCreateUUID(uuid);
110
111
    zaxisDefUUID(zaxisID, uuid);
  }
112
113
114
115

  return zaxisID;
}

116
static int defineTaxis (void)
117
{
118
  int taxisID =  taxisCreate(TAXIS_ABSOLUTE);
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133

  taxisDefType  ( taxisID, 0 );
  taxisDefVdate ( taxisID, 1 );
  taxisDefVtime ( taxisID, 2 );
  taxisDefRdate ( taxisID, 3 );
  taxisDefRtime ( taxisID, 4 );
  taxisDefVdateBounds ( taxisID, 5, 6 );
  taxisDefVtimeBounds ( taxisID, 7, 8 );
  taxisDefCalendar ( taxisID, 1 );
  taxisDefTunit ( taxisID, 1 );
  taxisDefNumavg ( taxisID, 1 );

  return taxisID;
}

134
static void defineStream ( int streamID, int vlistID )
135
136
137
138
139
140
141
{
  streamDefByteorder ( streamID, 1 );
  streamDefCompType  ( streamID, 2 );
  streamDefCompLevel ( streamID, 3 );
  streamDefVlist(streamID, vlistID);
}

142
143
144
145
struct idPair {
  int id1, id2;
};

146
static struct idPair defineVlist ( int gridID, int zaxisID, int taxisID )
147
148
149
150
151
{
  int vlistID = CDI_UNDEFID;
  int zaxisID2 = zaxisCreate(ZAXIS_SURFACE, 1);

  vlistID = vlistCreate();
152
153
  int varID1 = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARIABLE);
  int varID2 = vlistDefVar(vlistID, gridID, zaxisID2, TIME_VARIABLE);
154
155
156
  vlistDefVarName(vlistID, varID1, "varname1");
  {
    int globfac[] = { 23, 42 };
157
    cdiDefAttInt(vlistID, varID1, "seer's globule factors", CDI_DATATYPE_INT16, 2, globfac);
158
159
  }
  vlistDefVarName(vlistID, varID2, "varname2");
160
  cdiDefAttTxt(vlistID, varID2, "txt demo", 6, "banana");
161
  vlistDefTaxis(vlistID, taxisID);
Thomas Jahns's avatar
Thomas Jahns committed
162
163
164
  int vlistID2 = vlistCreate();
  vlistDefVar(vlistID2, gridID, zaxisID, TIME_VARIABLE);
  vlistCopy(vlistID2, vlistID);
165
  return (struct idPair){ vlistID, vlistID2 };
166
167
}

168
static int defineInstitute ()
169
{
170
  int instID = institutDef( 0, 0,"MYINSTITUTE", "myInstitute");
171
172
173
  return instID;
}

174
static int defineModel ( int instID )
175
{
176
  int modelID = modelDef(instID, 0, "resource_copy");
177
178
179
  return modelID;
}

180
181
static int destNamespace;

182
static int modelRun(MPI_Comm comm)
183
184
{
  char * recvBuffer, * sendBuffer;
185
  int bufferSize;
186

187
#ifdef MPI_MARSHALLING
188
  cdiPioSerializeSetMPI();
189
#endif
190

191
192
193
194
  int gridID  = defineGrid      ();
  int zaxisID = defineZaxis     ();
  int taxisID = defineTaxis     ();
  int instID  = defineInstitute ();
Thomas Jahns's avatar
Thomas Jahns committed
195
  defineModel(instID);
196
197
198
199
200
201
202
203

  struct idPair temp = defineVlist(gridID, zaxisID, taxisID);
  int vlistID = temp.id1;
  int streamID = streamOpenWrite("example.grb", CDI_FILETYPE_GRB);
  if ( streamID < 0 ) xabort ( "Could not open file" );
  defineStream ( streamID, vlistID );
  vlistDestroy(temp.id1);
  vlistDestroy(temp.id2);
204

205
  reshPackBufferCreate ( &sendBuffer, &bufferSize, &comm );
206
  recvBuffer = (char *)malloc((size_t)bufferSize);
207
#ifdef MPI_MARSHALLING
208
209
210
  xmpi(MPI_Sendrecv(sendBuffer, bufferSize, MPI_PACKED, 0, 0,
                    recvBuffer, bufferSize, MPI_PACKED, 0, 0,
                    MPI_COMM_SELF, MPI_STATUS_IGNORE));
211
#else
212
  memcpy(recvBuffer, sendBuffer, (size_t)bufferSize);
213
214
#endif
  namespaceSetActive(destNamespace);
215
  reshUnpackResources(recvBuffer, bufferSize, &comm);
216
217
  free(recvBuffer);
  reshPackBufferDestroy(&sendBuffer);
218

219
  int differ = reshListCompare ( 0, 1 );
220

221
  namespaceSetActive(0);
222
  streamClose(streamID);
223
  return differ;
224
225
226
227
}

int main (int argc, char *argv[])
{
228
  int exitCode = 77;
229
230
  MPI_Comm commModel;
#ifdef MPI_MARSHALLING
231
  MPI_Init(&argc, &argv);
232
233
  commModel = MPI_COMM_WORLD;
#else
234
  (void)argc; (void)argv;
235
236
237
  commModel = 0;
#endif
  destNamespace = namespaceNew();
238

239
  exitCode = modelRun(commModel);
240

241
#ifdef MPI_MARSHALLING
242
  xmpi(MPI_Finalize());
243
244
#endif

245
  return exitCode;
246
247
248
249
250
251
252
253
254
255
256
}

/*
 * Local Variables:
 * c-file-style: "Java"
 * c-basic-offset: 2
 * indent-tabs-mode: nil
 * show-trailing-whitespace: t
 * require-trailing-newline: t
 * End:
 */