test_resource_copy.c 7 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
25
26
27
28
29
30

enum {
  DOUBLE_PRECISION = 8,
  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
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
{
  int gridID = CDI_UNDEFID;
  int mask_vec[nlon*nlat];
  const int * mp = &mask_vec[0];
  double area_vec[nlon*nlat];
  const double * ap = &area_vec[0];
  int i;

  gridID = gridCreate(GRID_LONLAT, nlon*nlat);
  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 );
  gridDefXname ( gridID, "myXname" );
  gridDefXlongname ( gridID, "myXlongname" );
  gridDefXunits ( gridID, "myXunits" );
  gridDefYname ( gridID, "myYname" );
  gridDefYlongname ( gridID, "myYlongname" );
  gridDefYunits ( gridID, "myYunits" );
  gridDefPrec ( gridID, DOUBLE_PRECISION );
  gridDefXpole ( gridID, 90.0 );
  gridDefYpole ( gridID, 180.0 );
  gridDefAngle ( gridID, 360.0 );
  gridDefTrunc ( gridID, 1 );
  gridDefGMEnd ( gridID, 2 );
  gridDefGMEni ( gridID, 3 );
  gridDefGMEni2 ( gridID, 4 );
  gridDefGMEni3 ( gridID, 5 );
  gridDefNumber ( gridID, 6 );
  gridDefPosition ( gridID, 7 );
  gridDefReference ( gridID, "myReference" );
/* gridDefLCC ( gridID, double originLon, double originLat,  */
/*         double lonParY, double lat1, double lat2, double xinc, double yinc, int projflag, int scanflag); */
/* gridDefLcc2 ( gridID, double earth_radius, double lon_0,  */
/*          double lat_0, double lat_1,double lat_2);*/
/* gridDefLaea ( gridID, double earth_radius, double lon_0, double lat_0); */
  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;
  gridDefRowlon ( gridID, nlon*nlat, mp );
  gridDefComplexPacking ( gridID, 1 );
88
89
  {
    unsigned char uuid[CDI_UUID_SIZE];
90
    cdiCreateUUID(uuid);
91
92
    gridDefUUID(gridID, uuid);
  }
93
94
95
96

  return gridID;
}

97
static int defineZaxis (void)
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
{
  int zaxisID = CDI_UNDEFID;
  double vct[3] = { 3.0, 3.3, 3.6 };

  zaxisID = zaxisCreate(ZAXIS_PRESSURE, nlev);
  zaxisDefLevels(zaxisID, levs);
  zaxisDefLevel ( zaxisID, 2, 8507.3 );
  zaxisDefName ( zaxisID, "myName" );
  zaxisDefLongname ( zaxisID, "myLongname" );
  zaxisDefUnits ( zaxisID, "myUnits" );
  zaxisDefPrec ( zaxisID, DOUBLE_PRECISION );
  zaxisDefLtype ( zaxisID, 1 );
  zaxisDefVct ( zaxisID, 3, vct );
  zaxisDefLbounds ( zaxisID, &levs[0] );
  zaxisDefUbounds ( zaxisID, &levs[0] );
  zaxisDefWeights ( zaxisID, &levs[0] );
114
115
  {
    unsigned char uuid[CDI_UUID_SIZE];
116
    cdiCreateUUID(uuid);
117
118
    zaxisDefUUID(zaxisID, uuid);
  }
119
120
121
122

  return zaxisID;
}

123
static int defineTaxis (void)
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
{
  int taxisID = CDI_UNDEFID;

  taxisID = taxisCreate(TAXIS_ABSOLUTE);

  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;
}

143
static void defineStream ( int streamID, int vlistID )
144
145
146
147
148
149
150
{
  streamDefByteorder ( streamID, 1 );
  streamDefCompType  ( streamID, 2 );
  streamDefCompLevel ( streamID, 3 );
  streamDefVlist(streamID, vlistID);
}

151
152
153
154
struct idPair {
  int id1, id2;
};

155
static struct idPair defineVlist ( int gridID, int zaxisID, int taxisID )
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
{
  int vlistID = CDI_UNDEFID;
  int zaxisID2 = zaxisCreate(ZAXIS_SURFACE, 1);
  int varID1, varID2;

  vlistID = vlistCreate();
  varID1 = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARIABLE);
  varID2 = vlistDefVar(vlistID, gridID, zaxisID2, TIME_VARIABLE);
  vlistDefVarName(vlistID, varID1, "varname1");
  {
    int globfac[] = { 23, 42 };
    vlistDefAttInt(vlistID, varID1, "seer's globule factors", DATATYPE_INT16,
                   2, globfac);
  }
  vlistDefVarName(vlistID, varID2, "varname2");
  vlistDefAttTxt(vlistID, varID2, "txt demo", 6, "banana");
  vlistDefTaxis(vlistID, taxisID);
Thomas Jahns's avatar
Thomas Jahns committed
173
174
175
  int vlistID2 = vlistCreate();
  vlistDefVar(vlistID2, gridID, zaxisID, TIME_VARIABLE);
  vlistCopy(vlistID2, vlistID);
176
  return (struct idPair){ vlistID, vlistID2 };
177
178
}

179
static int defineInstitute ()
180
181
182
183
184
185
186
187
{
  int instID = CDI_UNDEFID;

  instID = institutDef( 0, 0,"MYINSTITUTE", "myInstitute");

  return instID;
}

188
static int defineModel ( int instID )
189
190
191
{
  int modelID = CDI_UNDEFID;

Thomas Jahns's avatar
Thomas Jahns committed
192
  modelID = modelDef(instID, 0, "resource_copy");
193
194
195
196

  return modelID;
}

197
198
static int destNamespace;

199
static int modelRun(MPI_Comm comm)
200
{
Thomas Jahns's avatar
Thomas Jahns committed
201
  int gridID, zaxisID, taxisID, instID, vlistID, streamID;
202
203
204
205

  char * recvBuffer, * sendBuffer;
  int bufferSize, differ;

206
#ifdef MPI_MARSHALLING
207
  cdiPioSerializeSetMPI();
208
#endif
209
210
211
212
213

  gridID  = defineGrid      ();
  zaxisID = defineZaxis     ();
  taxisID = defineTaxis     ();
  instID  = defineInstitute ();
Thomas Jahns's avatar
Thomas Jahns committed
214
  defineModel(instID);
215
216
217
218
219
220
  {
    struct idPair temp = defineVlist(gridID, zaxisID, taxisID);
    vlistID = temp.id1;
    streamID = streamOpenWrite("example.grb", FILETYPE_GRB);
    if ( streamID < 0 ) xabort ( "Could not open file" );
    defineStream ( streamID, vlistID );
221
    vlistDestroy(temp.id1);
222
223
    vlistDestroy(temp.id2);
  }
224

225
  reshPackBufferCreate ( &sendBuffer, &bufferSize, &comm );
226
  recvBuffer = (char *)malloc((size_t)bufferSize);
227
#ifdef MPI_MARSHALLING
228
229
230
  xmpi(MPI_Sendrecv(sendBuffer, bufferSize, MPI_PACKED, 0, 0,
                    recvBuffer, bufferSize, MPI_PACKED, 0, 0,
                    MPI_COMM_SELF, MPI_STATUS_IGNORE));
231
#else
232
  memcpy(recvBuffer, sendBuffer, (size_t)bufferSize);
233
234
#endif
  namespaceSetActive(destNamespace);
235
  reshUnpackResources(recvBuffer, bufferSize, &comm);
236
237
  free(recvBuffer);
  reshPackBufferDestroy(&sendBuffer);
238
239
240

  differ = reshListCompare ( 0, 1 );

241
  namespaceSetActive(0);
242
  streamClose(streamID);
243
  return differ;
244
245
246
247
}

int main (int argc, char *argv[])
{
248
  int exitCode = 77;
249
250
  MPI_Comm commModel;
#ifdef MPI_MARSHALLING
251
  MPI_Init(&argc, &argv);
252
253
  commModel = MPI_COMM_WORLD;
#else
254
  (void)argc; (void)argv;
255
256
257
  commModel = 0;
#endif
  destNamespace = namespaceNew();
258

259
  exitCode = modelRun(commModel);
260

261
#ifdef MPI_MARSHALLING
262
  xmpi(MPI_Finalize());
263
264
#endif

265
  return exitCode;
266
267
268
269
270
271
272
273
274
275
276
}

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