test_resource_copy.c 6.97 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 "create_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
90
91
92
  {
    unsigned char uuid[CDI_UUID_SIZE];
    create_uuid(uuid);
    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
116
117
118
  {
    unsigned char uuid[CDI_UUID_SIZE];
    create_uuid(uuid);
    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
221
222
  {
    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 );
    vlistDestroy(temp.id2);
  }
223

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

  differ = reshListCompare ( 0, 1 );

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

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

258
  exitCode = modelRun(commModel);
259

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

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

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