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