1 #if defined (HAVE_CONFIG_H)
2 #include "config.h"
3 #endif
4
5 #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 #include "resource_handle.h"
13 #include "resource_unpack.h"
14
15 #ifdef MPI_MARSHALLING
16 #include <mpi.h>
17 #include "cdipio.h"
18 #include "pio_serialize.h"
19 #include "pio_util.h"
20 #else
21 typedef int MPI_Comm;
22 #endif
23
24 enum {
25 DOUBLE_PRECISION = CDI_DATATYPE_FLT64,
26 nlon = 12,
27 nlat = 6,
28 nlev = 5,
29 ntsteps = 3 };
30
31 static double lons[nlon] = {0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330};
32 static double lats[nlat] = {-75, -45, -15, 15, 45, 75};
33 static double levs[nlev] = {101300, 92500, 85000, 50000, 20000};
34
defineGrid(void)35 static int defineGrid (void)
36 {
37 int mask_vec[nlon*nlat];
38 const int * mp = &mask_vec[0];
39 double area_vec[nlon*nlat];
40 const double * ap = &area_vec[0];
41 int i;
42
43 int gridID = gridCreate(GRID_LONLAT, nlon*nlat);
44 gridDefXsize(gridID, nlon);
45 gridDefYsize(gridID, nlat);
46 gridDefXvals(gridID, lons);
47 gridDefYvals(gridID, lats);
48 gridDefNvertex ( gridID, 1 );
49 gridDefXbounds ( gridID, lons );
50 gridDefYbounds ( gridID, lats );
51 for ( i = 0; i < nlon*nlat; i++ )
52 mask_vec[i] = i % 2 ;
53 gridDefMaskGME ( gridID, mp );
54 for ( i = 0; i < nlon*nlat; i++ )
55 mask_vec[i] = 1;
56 gridDefMask ( gridID, mp );
57
58 cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, "myXname");
59 cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, "myYname");
60 cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, "myXlongname");
61 cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, "myYlongname");
62 cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, "myXunits");
63 cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, "myYunits");
64
65 gridDefDatatype ( gridID, DOUBLE_PRECISION );
66 gridDefTrunc ( gridID, 1 );
67 gridDefParamGME ( gridID, 2, 3, 4, 5 );
68
69 cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, 6);
70 cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, 7);
71 cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, "myReference");
72
73 for ( i = 0; i < nlon*nlat; i++ )
74 area_vec[i] = 0.1 * i;
75 gridDefArea ( gridID, ap );
76 for ( i = 0; i < nlon*nlat; i++ )
77 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 gridDefUUID(gridID, uuid);
84 }
85
86 return gridID;
87 }
88
defineZaxis(void)89 static int defineZaxis (void)
90 {
91 double vct[3] = { 3.0, 3.3, 3.6 };
92
93 int zaxisID = zaxisCreate(ZAXIS_PRESSURE, nlev);
94 zaxisDefLevels(zaxisID, levs);
95 zaxisDefLevel ( zaxisID, 2, 8507.3 );
96
97 cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, "myName");
98 cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, "myLongname");
99 cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "myUnits");
100
101 zaxisDefDatatype ( zaxisID, DOUBLE_PRECISION );
102 cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, 1);
103 zaxisDefVct ( zaxisID, 3, vct );
104 zaxisDefLbounds ( zaxisID, &levs[0] );
105 zaxisDefUbounds ( zaxisID, &levs[0] );
106 zaxisDefWeights ( zaxisID, &levs[0] );
107 {
108 unsigned char uuid[CDI_UUID_SIZE];
109 cdiCreateUUID(uuid);
110 cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, CDI_UUID_SIZE);
111 }
112
113 return zaxisID;
114 }
115
defineTaxis(void)116 static int defineTaxis (void)
117 {
118 int taxisID = taxisCreate(TAXIS_ABSOLUTE);
119
120 taxisDefType ( taxisID, 0 );
121 taxisDefVdate ( taxisID, 1 );
122 taxisDefVtime ( taxisID, 2 );
123 taxisDefRdate ( taxisID, 3 );
124 taxisDefRtime ( taxisID, 4 );
125 taxisDefVdateBounds ( taxisID, 5, 6 );
126 taxisDefVtimeBounds ( taxisID, 7, 8 );
127 taxisDefCalendar ( taxisID, 1 );
128 taxisDefTunit ( taxisID, 1 );
129 taxisDefNumavg ( taxisID, 1 );
130
131 return taxisID;
132 }
133
defineStream(int streamID,int vlistID)134 static void defineStream ( int streamID, int vlistID )
135 {
136 streamDefByteorder ( streamID, 1 );
137 streamDefCompType ( streamID, 2 );
138 streamDefCompLevel ( streamID, 3 );
139 streamDefVlist(streamID, vlistID);
140 }
141
142 struct idPair {
143 int id1, id2;
144 };
145
defineVlist(int gridID,int zaxisID,int taxisID)146 static struct idPair defineVlist ( int gridID, int zaxisID, int taxisID )
147 {
148 int vlistID = CDI_UNDEFID;
149 int zaxisID2 = zaxisCreate(ZAXIS_SURFACE, 1);
150
151 vlistID = vlistCreate();
152 int varID1 = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARIABLE);
153 int varID2 = vlistDefVar(vlistID, gridID, zaxisID2, TIME_VARIABLE);
154 vlistDefVarName(vlistID, varID1, "varname1");
155 {
156 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);
162 int vlistID2 = vlistCreate();
163 vlistDefVar(vlistID2, gridID, zaxisID, TIME_VARIABLE);
164 vlistCopy(vlistID2, vlistID);
165 return (struct idPair){ vlistID, vlistID2 };
166 }
167
defineInstitute()168 static int defineInstitute ()
169 {
170 int instID = institutDef( 0, 0,"MYINSTITUTE", "myInstitute");
171 return instID;
172 }
173
defineModel(int instID)174 static int defineModel ( int instID )
175 {
176 int modelID = modelDef(instID, 0, "resource_copy");
177 return modelID;
178 }
179
180 static int destNamespace;
181
modelRun(MPI_Comm comm)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 int gridID = defineGrid ();
192 int zaxisID = defineZaxis ();
193 int taxisID = defineTaxis ();
194 int instID = defineInstitute ();
195 defineModel(instID);
196
197 struct idPair temp = defineVlist(gridID, zaxisID, taxisID);
198 int vlistID = temp.id1;
199 int streamID = streamOpenWrite("example.grb", CDI_FILETYPE_GRB);
200 if ( streamID < 0 ) xabort ( "Could not open file" );
201 defineStream ( streamID, vlistID );
202 vlistDestroy(temp.id1);
203 vlistDestroy(temp.id2);
204
205 reshPackBufferCreate ( &sendBuffer, &bufferSize, &comm );
206 recvBuffer = (char *)malloc((size_t)bufferSize);
207 #ifdef MPI_MARSHALLING
208 xmpi(MPI_Sendrecv(sendBuffer, bufferSize, MPI_PACKED, 0, 0,
209 recvBuffer, bufferSize, MPI_PACKED, 0, 0,
210 MPI_COMM_SELF, MPI_STATUS_IGNORE));
211 #else
212 memcpy(recvBuffer, sendBuffer, (size_t)bufferSize);
213 #endif
214 namespaceSetActive(destNamespace);
215 reshUnpackResources(recvBuffer, bufferSize, &comm);
216 free(recvBuffer);
217 reshPackBufferDestroy(&sendBuffer);
218
219 int differ = reshListCompare ( 0, 1 );
220
221 namespaceSetActive(0);
222 streamClose(streamID);
223 return differ;
224 }
225
main(int argc,char * argv[])226 int main (int argc, char *argv[])
227 {
228 int exitCode = 77;
229 MPI_Comm commModel;
230 #ifdef MPI_MARSHALLING
231 MPI_Init(&argc, &argv);
232 commModel = MPI_COMM_WORLD;
233 #else
234 (void)argc; (void)argv;
235 commModel = 0;
236 #endif
237 destNamespace = namespaceNew();
238
239 exitCode = modelRun(commModel);
240
241 #ifdef MPI_MARSHALLING
242 xmpi(MPI_Finalize());
243 #endif
244
245 return exitCode;
246 }
247
248 /*
249 * Local Variables:
250 * c-file-style: "Java"
251 * c-basic-offset: 2
252 * indent-tabs-mode: nil
253 * show-trailing-whitespace: t
254 * require-trailing-newline: t
255 * End:
256 */
257