xref: /phasta/M2NFixBnd/src/new_interface.c (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen /* This file provides interface functions for 'partial ' random
2*59599516SKenneth E. Jansen    access into the PHASTA input files
3*59599516SKenneth E. Jansen 
4*59599516SKenneth E. Jansen    Anil Karanam March 2001 */
5*59599516SKenneth E. Jansen 
6*59599516SKenneth E. Jansen #include <stdio.h>
7*59599516SKenneth E. Jansen #include <string.h>
8*59599516SKenneth E. Jansen #include <ctype.h>
9*59599516SKenneth E. Jansen #include <stdlib.h>
10*59599516SKenneth E. Jansen #include <time.h>
11*59599516SKenneth E. Jansen #include <math.h>
12*59599516SKenneth E. Jansen #include <mpi.h>
13*59599516SKenneth E. Jansen #include "phastaIO.h"
14*59599516SKenneth E. Jansen #include <FCMangle.h>
15*59599516SKenneth E. Jansen #include "new_interfaceM2NFixBnd.h"
16*59599516SKenneth E. Jansen 
17*59599516SKenneth E. Jansen //MR CHANGE
18*59599516SKenneth E. Jansen #include "commonM2NFixBnd_c.h"
19*59599516SKenneth E. Jansen //MR CHANGE END
20*59599516SKenneth E. Jansen 
21*59599516SKenneth E. Jansen #ifdef intel
22*59599516SKenneth E. Jansen #include <winsock2.h>
23*59599516SKenneth E. Jansen #else
24*59599516SKenneth E. Jansen #include <unistd.h>
25*59599516SKenneth E. Jansen #include <strings.h>
26*59599516SKenneth E. Jansen #endif
27*59599516SKenneth E. Jansen 
28*59599516SKenneth E. Jansen 
29*59599516SKenneth E. Jansen void
30*59599516SKenneth E. Jansen Write_M2NFixBnd(int* pid,
31*59599516SKenneth E. Jansen                 int* stepno,
32*59599516SKenneth E. Jansen                 int* nshg,
33*59599516SKenneth E. Jansen                 int* numVars,
34*59599516SKenneth E. Jansen                 int* ndofybar,
35*59599516SKenneth E. Jansen                 int* ndoferrors,
36*59599516SKenneth E. Jansen                 double* array1,
37*59599516SKenneth E. Jansen                 double* array2,
38*59599516SKenneth E. Jansen                 double* array3,
39*59599516SKenneth E. Jansen                 double* array4 ) {
40*59599516SKenneth E. Jansen 
41*59599516SKenneth E. Jansen     char fname[255];
42*59599516SKenneth E. Jansen     char rfile[60];
43*59599516SKenneth E. Jansen     char existingfile[30], linkfile[30];
44*59599516SKenneth E. Jansen     int irstou;
45*59599516SKenneth E. Jansen     int magic_number = 362436;
46*59599516SKenneth E. Jansen     int* mptr = &magic_number;
47*59599516SKenneth E. Jansen     double version=0.0;
48*59599516SKenneth E. Jansen     int isize, nitems;
49*59599516SKenneth E. Jansen     int iarray[10];
50*59599516SKenneth E. Jansen     int nfiles;
51*59599516SKenneth E. Jansen     int nfields;
52*59599516SKenneth E. Jansen     int numparts;
53*59599516SKenneth E. Jansen     int irank;
54*59599516SKenneth E. Jansen     int nprocs;
55*59599516SKenneth E. Jansen 
56*59599516SKenneth E. Jansen 
57*59599516SKenneth E. Jansen     irank = *pid;
58*59599516SKenneth E. Jansen 
59*59599516SKenneth E. Jansen       //  Retrieve and compute the parameters required for SyncIO
60*59599516SKenneth E. Jansen       nfiles = outpar.nsynciofiles; //We use the same number of files as before
61*59599516SKenneth E. Jansen       nfields = 4;
62*59599516SKenneth E. Jansen       numparts = workfc.numpe;
63*59599516SKenneth E. Jansen       nprocs= workfc.numpe;
64*59599516SKenneth E. Jansen 
65*59599516SKenneth E. Jansen       int nppf = numparts/nfiles;
66*59599516SKenneth E. Jansen       int GPID;
67*59599516SKenneth E. Jansen 
68*59599516SKenneth E. Jansen       // Calculate number of parts each proc deal with and where it start and end ...
69*59599516SKenneth E. Jansen       int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
70*59599516SKenneth E. Jansen       int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
71*59599516SKenneth E. Jansen       int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
72*59599516SKenneth E. Jansen 
73*59599516SKenneth E. Jansen       int descriptor;
74*59599516SKenneth E. Jansen       char filename[255],fieldtag_s[255];
75*59599516SKenneth E. Jansen       bzero((void*)filename,255);
76*59599516SKenneth E. Jansen       bzero((void*)fieldtag_s,255);
77*59599516SKenneth E. Jansen 
78*59599516SKenneth E. Jansen       sprintf(filename,"restartRed-dat.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1));
79*59599516SKenneth E. Jansen       if (*pid==0) {
80*59599516SKenneth E. Jansen         printf("Filename is %s \n",filename);
81*59599516SKenneth E. Jansen       }
82*59599516SKenneth E. Jansen 
83*59599516SKenneth E. Jansen       initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write");
84*59599516SKenneth E. Jansen       openfile(filename, "write", &f_descriptor);
85*59599516SKenneth E. Jansen 
86*59599516SKenneth E. Jansen       // solution
87*59599516SKenneth E. Jansen       int i;
88*59599516SKenneth E. Jansen       for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
89*59599516SKenneth E. Jansen       // GPID : global part id, corresponds to rank ...
90*59599516SKenneth E. Jansen         // e.g : (in this example)
91*59599516SKenneth E. Jansen         // proc 0 : 1--4
92*59599516SKenneth E. Jansen         // proc 1 : 5--8 ...
93*59599516SKenneth E. Jansen         GPID = startpart + i;
94*59599516SKenneth E. Jansen 
95*59599516SKenneth E. Jansen         // Write solution field ...
96*59599516SKenneth E. Jansen         sprintf(fieldtag_s,"solution@%d",GPID);
97*59599516SKenneth E. Jansen 
98*59599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
99*59599516SKenneth E. Jansen         nitems = 3;
100*59599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
101*59599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
102*59599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
103*59599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
104*59599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
105*59599516SKenneth E. Jansen       }
106*59599516SKenneth E. Jansen 
107*59599516SKenneth E. Jansen       // ybar
108*59599516SKenneth E. Jansen       for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
109*59599516SKenneth E. Jansen       // GPID : global part id, corresponds to rank ...
110*59599516SKenneth E. Jansen         // e.g : (in this example)
111*59599516SKenneth E. Jansen         // proc 0 : 1--4
112*59599516SKenneth E. Jansen         // proc 1 : 5--8 ...
113*59599516SKenneth E. Jansen         GPID = startpart + i;
114*59599516SKenneth E. Jansen 
115*59599516SKenneth E. Jansen         // Write solution field ...
116*59599516SKenneth E. Jansen         sprintf(fieldtag_s,"ybar@%d",GPID);
117*59599516SKenneth E. Jansen 
118*59599516SKenneth E. Jansen         isize = (*nshg)*(*ndofybar);
119*59599516SKenneth E. Jansen         nitems = 3;
120*59599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
121*59599516SKenneth E. Jansen         iarray[ 1 ] = (*ndofybar);
122*59599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
123*59599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
124*59599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array2), &isize, "double", phasta_iotype );
125*59599516SKenneth E. Jansen       }
126*59599516SKenneth E. Jansen 
127*59599516SKenneth E. Jansen       // errors
128*59599516SKenneth E. Jansen       for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
129*59599516SKenneth E. Jansen       // GPID : global part id, corresponds to rank ...
130*59599516SKenneth E. Jansen         // e.g : (in this example)
131*59599516SKenneth E. Jansen         // proc 0 : 1--4
132*59599516SKenneth E. Jansen         // proc 1 : 5--8 ...
133*59599516SKenneth E. Jansen         GPID = startpart + i;
134*59599516SKenneth E. Jansen 
135*59599516SKenneth E. Jansen         // Write solution field ...
136*59599516SKenneth E. Jansen         sprintf(fieldtag_s,"errors@%d",GPID);
137*59599516SKenneth E. Jansen 
138*59599516SKenneth E. Jansen         isize = (*nshg)*(*ndoferrors);
139*59599516SKenneth E. Jansen         nitems = 3;
140*59599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
141*59599516SKenneth E. Jansen         iarray[ 1 ] = (*ndoferrors);
142*59599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
143*59599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
144*59599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array3), &isize, "double", phasta_iotype );
145*59599516SKenneth E. Jansen       }
146*59599516SKenneth E. Jansen 
147*59599516SKenneth E. Jansen       // dwal
148*59599516SKenneth E. Jansen       for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
149*59599516SKenneth E. Jansen       // GPID : global part id, corresponds to rank ...
150*59599516SKenneth E. Jansen         // e.g : (in this example)
151*59599516SKenneth E. Jansen         // proc 0 : 1--4
152*59599516SKenneth E. Jansen         // proc 1 : 5--8 ...
153*59599516SKenneth E. Jansen         GPID = startpart + i;
154*59599516SKenneth E. Jansen 
155*59599516SKenneth E. Jansen         // Write solution field ...
156*59599516SKenneth E. Jansen         sprintf(fieldtag_s,"dwal@%d",GPID);
157*59599516SKenneth E. Jansen 
158*59599516SKenneth E. Jansen         isize = (*nshg)*1;
159*59599516SKenneth E. Jansen         nitems = 3;
160*59599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
161*59599516SKenneth E. Jansen         iarray[ 1 ] = 1;
162*59599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
163*59599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
164*59599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array4), &isize, "double", phasta_iotype );
165*59599516SKenneth E. Jansen       }
166*59599516SKenneth E. Jansen 
167*59599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
168*59599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
169*59599516SKenneth E. Jansen 
170*59599516SKenneth E. Jansen       return;
171*59599516SKenneth E. Jansen }
172*59599516SKenneth E. Jansen 
173*59599516SKenneth E. Jansen void
174*59599516SKenneth E. Jansen Write_M2NFixBnd_SolOnly(int* pid,
175*59599516SKenneth E. Jansen                        int* stepno,
176*59599516SKenneth E. Jansen                        int* nshg,
177*59599516SKenneth E. Jansen                        int* numVars,
178*59599516SKenneth E. Jansen                        double* array1 ) {
179*59599516SKenneth E. Jansen 
180*59599516SKenneth E. Jansen     char fname[255];
181*59599516SKenneth E. Jansen     char rfile[60];
182*59599516SKenneth E. Jansen     char existingfile[30], linkfile[30];
183*59599516SKenneth E. Jansen     int irstou;
184*59599516SKenneth E. Jansen     int magic_number = 362436;
185*59599516SKenneth E. Jansen     int* mptr = &magic_number;
186*59599516SKenneth E. Jansen     double version=0.0;
187*59599516SKenneth E. Jansen     int isize, nitems;
188*59599516SKenneth E. Jansen     int iarray[10];
189*59599516SKenneth E. Jansen     int nfiles;
190*59599516SKenneth E. Jansen     int nfields;
191*59599516SKenneth E. Jansen     int numparts;
192*59599516SKenneth E. Jansen     int irank;
193*59599516SKenneth E. Jansen     int nprocs;
194*59599516SKenneth E. Jansen 
195*59599516SKenneth E. Jansen     //  First, count the number of fields to write and store the result in
196*59599516SKenneth E. Jansen     //countfieldstowriterestart();
197*59599516SKenneth E. Jansen 
198*59599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
199*59599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
200*59599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
201*59599516SKenneth E. Jansen     numparts = workfc.numpe;
202*59599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
203*59599516SKenneth E. Jansen     nprocs = workfc.numpe;
204*59599516SKenneth E. Jansen     int nppf = numparts/nfiles;
205*59599516SKenneth E. Jansen     int GPID;
206*59599516SKenneth E. Jansen 
207*59599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
208*59599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
209*59599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
210*59599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
211*59599516SKenneth E. Jansen 
212*59599516SKenneth E. Jansen     int descriptor;
213*59599516SKenneth E. Jansen     char filename[255],fieldtag_s[255];
214*59599516SKenneth E. Jansen     bzero((void*)filename,255);
215*59599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
216*59599516SKenneth E. Jansen 
217*59599516SKenneth E. Jansen     sprintf(filename,"restartRed-dat.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1));
218*59599516SKenneth E. Jansen 
219*59599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write");
220*59599516SKenneth E. Jansen 
221*59599516SKenneth E. Jansen     if (*pid==0) {
222*59599516SKenneth E. Jansen       printf("Filename is %s \n",filename);
223*59599516SKenneth E. Jansen     }
224*59599516SKenneth E. Jansen 
225*59599516SKenneth E. Jansen     openfile(filename, "write", &f_descriptor);
226*59599516SKenneth E. Jansen 
227*59599516SKenneth E. Jansen     field_flag=0;
228*59599516SKenneth E. Jansen 
229*59599516SKenneth E. Jansen      int i;
230*59599516SKenneth E. Jansen      for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
231*59599516SKenneth E. Jansen      // GPID : global part id, corresponds to rank ...
232*59599516SKenneth E. Jansen         // e.g : (in this example)
233*59599516SKenneth E. Jansen         // proc 0 : 1--4
234*59599516SKenneth E. Jansen         // proc 1 : 5--8 ...
235*59599516SKenneth E. Jansen         GPID = startpart + i;
236*59599516SKenneth E. Jansen 
237*59599516SKenneth E. Jansen         // Write solution field ...
238*59599516SKenneth E. Jansen         sprintf(fieldtag_s,"solution@%d",GPID);
239*59599516SKenneth E. Jansen 
240*59599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
241*59599516SKenneth E. Jansen         nitems = 3;
242*59599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
243*59599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
244*59599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
245*59599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
246*59599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
247*59599516SKenneth E. Jansen 
248*59599516SKenneth E. Jansen     }
249*59599516SKenneth E. Jansen     field_flag++;
250*59599516SKenneth E. Jansen 
251*59599516SKenneth E. Jansen     if (field_flag==nfields){
252*59599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
253*59599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
254*59599516SKenneth E. Jansen       if (*pid==0) {
255*59599516SKenneth E. Jansen         printf("\n");
256*59599516SKenneth E. Jansen       }
257*59599516SKenneth E. Jansen     }
258*59599516SKenneth E. Jansen }
259*59599516SKenneth E. Jansen 
260*59599516SKenneth E. Jansen 
261*59599516SKenneth E. Jansen 
262*59599516SKenneth E. Jansen void
263*59599516SKenneth E. Jansen Write_Restart(  int* pid,
264*59599516SKenneth E. Jansen                 int* stepno,
265*59599516SKenneth E. Jansen                 int* nshg,
266*59599516SKenneth E. Jansen                 int* numVars,
267*59599516SKenneth E. Jansen                 double* array1,
268*59599516SKenneth E. Jansen                 double* array2 ) {
269*59599516SKenneth E. Jansen 
270*59599516SKenneth E. Jansen     char fname[255];
271*59599516SKenneth E. Jansen     char rfile[60];
272*59599516SKenneth E. Jansen     char existingfile[30], linkfile[30];
273*59599516SKenneth E. Jansen     int irstou;
274*59599516SKenneth E. Jansen     int magic_number = 362436;
275*59599516SKenneth E. Jansen     int* mptr = &magic_number;
276*59599516SKenneth E. Jansen     double version=0.0;
277*59599516SKenneth E. Jansen     int isize, nitems;
278*59599516SKenneth E. Jansen     int iarray[10];
279*59599516SKenneth E. Jansen     int nfiles;
280*59599516SKenneth E. Jansen     int nfields;
281*59599516SKenneth E. Jansen     int numparts;
282*59599516SKenneth E. Jansen     int irank;
283*59599516SKenneth E. Jansen     int nprocs;
284*59599516SKenneth E. Jansen 
285*59599516SKenneth E. Jansen     //  First, count the number of fields to write and store the result in
286*59599516SKenneth E. Jansen     //countfieldstowriterestart();
287*59599516SKenneth E. Jansen 
288*59599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
289*59599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
290*59599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
291*59599516SKenneth E. Jansen     numparts = workfc.numpe;
292*59599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
293*59599516SKenneth E. Jansen     nprocs = workfc.numpe;
294*59599516SKenneth E. Jansen     int nppf = numparts/nfiles;
295*59599516SKenneth E. Jansen     int GPID;
296*59599516SKenneth E. Jansen 
297*59599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
298*59599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
299*59599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
300*59599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
301*59599516SKenneth E. Jansen 
302*59599516SKenneth E. Jansen     int descriptor;
303*59599516SKenneth E. Jansen     char filename[255],fieldtag_s[255];
304*59599516SKenneth E. Jansen     bzero((void*)filename,255);
305*59599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
306*59599516SKenneth E. Jansen 
307*59599516SKenneth E. Jansen     sprintf(filename,"restart-dat.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1));
308*59599516SKenneth E. Jansen 
309*59599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write");
310*59599516SKenneth E. Jansen 
311*59599516SKenneth E. Jansen     if (*pid==0) {
312*59599516SKenneth E. Jansen       printf("Filename is %s \n",filename);
313*59599516SKenneth E. Jansen     }
314*59599516SKenneth E. Jansen 
315*59599516SKenneth E. Jansen     openfile(filename, "write", &f_descriptor);
316*59599516SKenneth E. Jansen 
317*59599516SKenneth E. Jansen     field_flag=0;
318*59599516SKenneth E. Jansen 
319*59599516SKenneth E. Jansen      int i;
320*59599516SKenneth E. Jansen      for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
321*59599516SKenneth E. Jansen      // GPID : global part id, corresponds to rank ...
322*59599516SKenneth E. Jansen         // e.g : (in this example)
323*59599516SKenneth E. Jansen         // proc 0 : 1--4
324*59599516SKenneth E. Jansen         // proc 1 : 5--8 ...
325*59599516SKenneth E. Jansen         GPID = startpart + i;
326*59599516SKenneth E. Jansen 
327*59599516SKenneth E. Jansen         // Write solution field ...
328*59599516SKenneth E. Jansen         sprintf(fieldtag_s,"solution@%d",GPID);
329*59599516SKenneth E. Jansen 
330*59599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
331*59599516SKenneth E. Jansen         nitems = 3;
332*59599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
333*59599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
334*59599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
335*59599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
336*59599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
337*59599516SKenneth E. Jansen      }
338*59599516SKenneth E. Jansen      field_flag++;
339*59599516SKenneth E. Jansen 
340*59599516SKenneth E. Jansen      for ( i = 0; i < nppp; i++) {
341*59599516SKenneth E. Jansen 
342*59599516SKenneth E. Jansen         // GPID : global part id, corresponds to rank ...
343*59599516SKenneth E. Jansen         // e.g : (in this example)
344*59599516SKenneth E. Jansen         // proc 0 : 1--4
345*59599516SKenneth E. Jansen         // proc 1 : 5--8 ...
346*59599516SKenneth E. Jansen         GPID = startpart + i;
347*59599516SKenneth E. Jansen 
348*59599516SKenneth E. Jansen         // Write solution field ...
349*59599516SKenneth E. Jansen         sprintf(fieldtag_s,"time derivative of solution@%d",GPID);
350*59599516SKenneth E. Jansen 
351*59599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
352*59599516SKenneth E. Jansen         nitems = 3;
353*59599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
354*59599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
355*59599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
356*59599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
357*59599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array2), &isize, "double", phasta_iotype );
358*59599516SKenneth E. Jansen      }
359*59599516SKenneth E. Jansen      field_flag++;
360*59599516SKenneth E. Jansen 
361*59599516SKenneth E. Jansen      if (field_flag==nfields){
362*59599516SKenneth E. Jansen        closefile(&f_descriptor, "write");
363*59599516SKenneth E. Jansen        finalizephmpiio(&f_descriptor);
364*59599516SKenneth E. Jansen        if (*pid==0) {
365*59599516SKenneth E. Jansen          printf("\n");
366*59599516SKenneth E. Jansen        }
367*59599516SKenneth E. Jansen      }
368*59599516SKenneth E. Jansen }
369*59599516SKenneth E. Jansen 
370*59599516SKenneth E. Jansen 
371*59599516SKenneth E. Jansen void
372*59599516SKenneth E. Jansen Write_Error(  int* pid,
373*59599516SKenneth E. Jansen               int* stepno,
374*59599516SKenneth E. Jansen               int* nshg,
375*59599516SKenneth E. Jansen               int* numVars,
376*59599516SKenneth E. Jansen               double* array1 ) {
377*59599516SKenneth E. Jansen 
378*59599516SKenneth E. Jansen 
379*59599516SKenneth E. Jansen     char fname[255];
380*59599516SKenneth E. Jansen     char rfile[60];
381*59599516SKenneth E. Jansen     int irstou;
382*59599516SKenneth E. Jansen     int magic_number = 362436;
383*59599516SKenneth E. Jansen     int* mptr = &magic_number;
384*59599516SKenneth E. Jansen     double version=0.0;
385*59599516SKenneth E. Jansen     int isize, nitems;
386*59599516SKenneth E. Jansen     int iarray[10];
387*59599516SKenneth E. Jansen 
388*59599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
389*59599516SKenneth E. Jansen 
390*59599516SKenneth E. Jansen     int nfiles;
391*59599516SKenneth E. Jansen     int nfields;
392*59599516SKenneth E. Jansen     int numparts;
393*59599516SKenneth E. Jansen     int irank;
394*59599516SKenneth E. Jansen     int nprocs;
395*59599516SKenneth E. Jansen 
396*59599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
397*59599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
398*59599516SKenneth E. Jansen     numparts = workfc.numpe;
399*59599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
400*59599516SKenneth E. Jansen     nprocs = workfc.numpe;
401*59599516SKenneth E. Jansen 
402*59599516SKenneth E. Jansen     int nppf = numparts/nfiles;
403*59599516SKenneth E. Jansen     int GPID;
404*59599516SKenneth E. Jansen 
405*59599516SKenneth E. Jansen     // Calculate number of parts each  proc deal with and where it start and end ...
406*59599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
407*59599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
408*59599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
409*59599516SKenneth E. Jansen 
410*59599516SKenneth E. Jansen     field_flag++;
411*59599516SKenneth E. Jansen 
412*59599516SKenneth E. Jansen     char fieldtag[255];
413*59599516SKenneth E. Jansen 
414*59599516SKenneth E. Jansen     int i;
415*59599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++  ) {
416*59599516SKenneth E. Jansen         GPID = startpart + i;
417*59599516SKenneth E. Jansen         sprintf(fieldtag,"errors@%d",GPID);
418*59599516SKenneth E. Jansen 
419*59599516SKenneth E. Jansen         if(*pid==0) {
420*59599516SKenneth E. Jansen           printf("\n");
421*59599516SKenneth E. Jansen           printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldtag);
422*59599516SKenneth E. Jansen         }
423*59599516SKenneth E. Jansen 
424*59599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
425*59599516SKenneth E. Jansen         nitems = 3;
426*59599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
427*59599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
428*59599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
429*59599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
430*59599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag, (void*)array1, &isize, "double", phasta_iotype );
431*59599516SKenneth E. Jansen     }
432*59599516SKenneth E. Jansen 
433*59599516SKenneth E. Jansen     if (field_flag==nfields){
434*59599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
435*59599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
436*59599516SKenneth E. Jansen       if (*pid==0) {
437*59599516SKenneth E. Jansen         printf("Last field %d '%s' finished! \n",nfields, fieldtag);
438*59599516SKenneth E. Jansen         printf("\n");
439*59599516SKenneth E. Jansen       }
440*59599516SKenneth E. Jansen     }
441*59599516SKenneth E. Jansen 
442*59599516SKenneth E. Jansen }
443*59599516SKenneth E. Jansen 
444*59599516SKenneth E. Jansen void
445*59599516SKenneth E. Jansen Write_Displ(  int* pid,
446*59599516SKenneth E. Jansen               int* stepno,
447*59599516SKenneth E. Jansen               int* nshg,
448*59599516SKenneth E. Jansen               int* numVars,
449*59599516SKenneth E. Jansen               double* array1 ) { //TO BE UPDATED FOR SYNCIO
450*59599516SKenneth E. Jansen 
451*59599516SKenneth E. Jansen 
452*59599516SKenneth E. Jansen     char fname[255];
453*59599516SKenneth E. Jansen     char rfile[60];
454*59599516SKenneth E. Jansen     int irstou;
455*59599516SKenneth E. Jansen     int magic_number = 362436;
456*59599516SKenneth E. Jansen     int* mptr = &magic_number;
457*59599516SKenneth E. Jansen     time_t timenow = time ( &timenow);
458*59599516SKenneth E. Jansen     double version=0.0;
459*59599516SKenneth E. Jansen     int isize, nitems;
460*59599516SKenneth E. Jansen     int iarray[10];
461*59599516SKenneth E. Jansen 
462*59599516SKenneth E. Jansen     sprintf(rfile,"restart.%d.%d",*stepno,*pid+1);
463*59599516SKenneth E. Jansen     openfile(rfile,"append", &irstou);
464*59599516SKenneth E. Jansen 
465*59599516SKenneth E. Jansen     isize = (*nshg)*(*numVars);
466*59599516SKenneth E. Jansen     nitems = 3;
467*59599516SKenneth E. Jansen     iarray[ 0 ] = (*nshg);
468*59599516SKenneth E. Jansen     iarray[ 1 ] = (*numVars);
469*59599516SKenneth E. Jansen     iarray[ 2 ] = (*stepno);
470*59599516SKenneth E. Jansen     writeheader( &irstou, "displacement", (void*)iarray, &nitems, &isize, "double", phasta_iotype );
471*59599516SKenneth E. Jansen     writedatablock( &irstou, "displacement", (void*)(array1), &isize, "double", phasta_iotype );
472*59599516SKenneth E. Jansen 
473*59599516SKenneth E. Jansen     closefile( &irstou, "append" );
474*59599516SKenneth E. Jansen }
475*59599516SKenneth E. Jansen 
476*59599516SKenneth E. Jansen void
477*59599516SKenneth E. Jansen Write_Field(  int *pid,
478*59599516SKenneth E. Jansen               char* filemode,
479*59599516SKenneth E. Jansen               char* fieldtag,
480*59599516SKenneth E. Jansen               int* tagsize,
481*59599516SKenneth E. Jansen               void* array,
482*59599516SKenneth E. Jansen               char* arraytype,
483*59599516SKenneth E. Jansen               int* nshg,
484*59599516SKenneth E. Jansen               int* numvars,
485*59599516SKenneth E. Jansen               int* stepno) {
486*59599516SKenneth E. Jansen 
487*59599516SKenneth E. Jansen     //printf("Rank is %d, field is %s, tagsize is %d, nshg is %d, numvars is %d\n",*pid,fieldtag,*tagsize,*nshg,*numvars);
488*59599516SKenneth E. Jansen 
489*59599516SKenneth E. Jansen     char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char));
490*59599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
491*59599516SKenneth E. Jansen     fieldlabel[*tagsize] = '\0';
492*59599516SKenneth E. Jansen 
493*59599516SKenneth E. Jansen     int irstou;
494*59599516SKenneth E. Jansen     int magic_number = 362436;
495*59599516SKenneth E. Jansen     int* mptr = &magic_number;
496*59599516SKenneth E. Jansen     double version=0.0;
497*59599516SKenneth E. Jansen     int isize, nitems;
498*59599516SKenneth E. Jansen     int iarray[10];
499*59599516SKenneth E. Jansen 
500*59599516SKenneth E. Jansen     char fmode[10];
501*59599516SKenneth E. Jansen     if(!strncmp(filemode,"w",1))
502*59599516SKenneth E. Jansen       strcpy(fmode,"write");
503*59599516SKenneth E. Jansen     else // default is append
504*59599516SKenneth E. Jansen       strcpy(fmode,"append");
505*59599516SKenneth E. Jansen 
506*59599516SKenneth E. Jansen     char datatype[10];
507*59599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
508*59599516SKenneth E. Jansen       strcpy(datatype,"int");
509*59599516SKenneth E. Jansen     else // default is double
510*59599516SKenneth E. Jansen       strcpy(datatype,"double");
511*59599516SKenneth E. Jansen 
512*59599516SKenneth E. Jansen //   Old posix format
513*59599516SKenneth E. Jansen /*     openfile_(rfile, fmode, &irstou);
514*59599516SKenneth E. Jansen 
515*59599516SKenneth E. Jansen      nitems = 3; // assuming field will write 3 items in iarray
516*59599516SKenneth E. Jansen      iarray[ 0 ] = (*nshg);
517*59599516SKenneth E. Jansen      iarray[ 1 ] = (*numvars);
518*59599516SKenneth E. Jansen      iarray[ 2 ] = (*stepno);
519*59599516SKenneth E. Jansen 
520*59599516SKenneth E. Jansen      isize = (*nshg)*(*numvars);
521*59599516SKenneth E. Jansen      writeheader_( &irstou, fieldlabel, (void*)iarray, &nitems, &isize, datatype, phasta_iotype );
522*59599516SKenneth E. Jansen 
523*59599516SKenneth E. Jansen      nitems = (*nshg)*(*numvars);
524*59599516SKenneth E. Jansen      writedatablock_( &irstou, fieldlabel, array, &nitems, datatype, phasta_iotype );
525*59599516SKenneth E. Jansen      closefile_( &irstou, fmode);
526*59599516SKenneth E. Jansen */
527*59599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
528*59599516SKenneth E. Jansen 
529*59599516SKenneth E. Jansen     int nfiles;
530*59599516SKenneth E. Jansen     int nfields;
531*59599516SKenneth E. Jansen     int numparts;
532*59599516SKenneth E. Jansen     int irank;
533*59599516SKenneth E. Jansen     int nprocs;
534*59599516SKenneth E. Jansen 
535*59599516SKenneth E. Jansen //    unsigned long long timer_start;
536*59599516SKenneth E. Jansen //    unsigned long long timer_end;
537*59599516SKenneth E. Jansen //    double time_span;
538*59599516SKenneth E. Jansen 
539*59599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
540*59599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
541*59599516SKenneth E. Jansen     numparts = workfc.numpe;
542*59599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
543*59599516SKenneth E. Jansen     nprocs = workfc.numpe;
544*59599516SKenneth E. Jansen 
545*59599516SKenneth E. Jansen     int nppf = numparts/nfiles;
546*59599516SKenneth E. Jansen     int GPID;
547*59599516SKenneth E. Jansen 
548*59599516SKenneth E. Jansen     // Calculate number of parts each  proc deal with and where it start and end ...
549*59599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
550*59599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
551*59599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
552*59599516SKenneth E. Jansen 
553*59599516SKenneth E. Jansen     char fieldtag_s[255];
554*59599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
555*59599516SKenneth E. Jansen 
556*59599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
557*59599516SKenneth E. Jansen 
558*59599516SKenneth E. Jansen     field_flag++;
559*59599516SKenneth E. Jansen     if(*pid==0) {
560*59599516SKenneth E. Jansen       printf("\n");
561*59599516SKenneth E. Jansen       printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel);
562*59599516SKenneth E. Jansen     }
563*59599516SKenneth E. Jansen 
564*59599516SKenneth E. Jansen     int i;
565*59599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++  ) {
566*59599516SKenneth E. Jansen         GPID = startpart + i;
567*59599516SKenneth E. Jansen 
568*59599516SKenneth E. Jansen         // Write solution field ...
569*59599516SKenneth E. Jansen         sprintf(fieldtag_s,"%s@%d",fieldlabel,GPID);
570*59599516SKenneth E. Jansen 
571*59599516SKenneth E. Jansen         isize = (*nshg)*(*numvars);
572*59599516SKenneth E. Jansen         nitems = 3;
573*59599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
574*59599516SKenneth E. Jansen         iarray[ 1 ] = (*numvars);
575*59599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
576*59599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, datatype, phasta_iotype);
577*59599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, array, &isize, datatype, phasta_iotype );
578*59599516SKenneth E. Jansen     }
579*59599516SKenneth E. Jansen 
580*59599516SKenneth E. Jansen     if (field_flag==nfields){
581*59599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
582*59599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
583*59599516SKenneth E. Jansen       if (*pid==0) {
584*59599516SKenneth E. Jansen         printf("Last field %d '%s' finished! \n",nfields, fieldtag);
585*59599516SKenneth E. Jansen         printf("\n");
586*59599516SKenneth E. Jansen       }
587*59599516SKenneth E. Jansen     }
588*59599516SKenneth E. Jansen 
589*59599516SKenneth E. Jansen     free(fieldlabel);
590*59599516SKenneth E. Jansen }
591*59599516SKenneth E. Jansen 
592*59599516SKenneth E. Jansen void
593*59599516SKenneth E. Jansen Write_PhAvg(  int* pid,
594*59599516SKenneth E. Jansen               char* filemode,
595*59599516SKenneth E. Jansen               char* fieldtag,
596*59599516SKenneth E. Jansen               int* tagsize,
597*59599516SKenneth E. Jansen               int* iphase,
598*59599516SKenneth E. Jansen               void* array,
599*59599516SKenneth E. Jansen               char* arraytype,
600*59599516SKenneth E. Jansen               int* nshg,
601*59599516SKenneth E. Jansen               int* numvars,
602*59599516SKenneth E. Jansen               int* stepno) {
603*59599516SKenneth E. Jansen 
604*59599516SKenneth E. Jansen     char rfile[32];
605*59599516SKenneth E. Jansen     // assuming restart_phase_avg_<sn>.<iphase>.<pid+1>
606*59599516SKenneth E. Jansen     sprintf(rfile,"restart_phase_avg_%d.%d.%d",*stepno,*iphase,*pid+1);
607*59599516SKenneth E. Jansen 
608*59599516SKenneth E. Jansen     char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char));
609*59599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
610*59599516SKenneth E. Jansen     fieldlabel[*tagsize] = '\0';
611*59599516SKenneth E. Jansen 
612*59599516SKenneth E. Jansen     int irstou;
613*59599516SKenneth E. Jansen     int isize, nitems;
614*59599516SKenneth E. Jansen     int iarray[10];
615*59599516SKenneth E. Jansen 
616*59599516SKenneth E. Jansen     char fmode[10];
617*59599516SKenneth E. Jansen     if(!strncmp(filemode,"w",1))
618*59599516SKenneth E. Jansen       strcpy(fmode,"write");
619*59599516SKenneth E. Jansen     else // default is append
620*59599516SKenneth E. Jansen       strcpy(fmode,"append");
621*59599516SKenneth E. Jansen 
622*59599516SKenneth E. Jansen     char datatype[10];
623*59599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
624*59599516SKenneth E. Jansen       strcpy(datatype,"int");
625*59599516SKenneth E. Jansen     else // default is double
626*59599516SKenneth E. Jansen       strcpy(datatype,"double");
627*59599516SKenneth E. Jansen 
628*59599516SKenneth E. Jansen     openfile(rfile, fmode, &irstou);
629*59599516SKenneth E. Jansen 
630*59599516SKenneth E. Jansen     if(!strcmp(fmode,"write")) {
631*59599516SKenneth E. Jansen       // may be create a routine for 'top' portion under write mode
632*59599516SKenneth E. Jansen       int magic_number = 362436;
633*59599516SKenneth E. Jansen       int* mptr = &magic_number;
634*59599516SKenneth E. Jansen       time_t timenow = time ( &timenow);
635*59599516SKenneth E. Jansen       double version=0.0;
636*59599516SKenneth E. Jansen 
637*59599516SKenneth E. Jansen       /* writing the top ascii header for the restart file */
638*59599516SKenneth E. Jansen 
639*59599516SKenneth E. Jansen       writestring( &irstou,"# PHASTA Input File Version 2.0\n");
640*59599516SKenneth E. Jansen       writestring( &irstou,
641*59599516SKenneth E. Jansen                     "# format \"keyphrase : sizeofnextblock usual headers\"\n");
642*59599516SKenneth E. Jansen 
643*59599516SKenneth E. Jansen       char fname[255];
644*59599516SKenneth E. Jansen       bzero( (void*)fname, 255 );
645*59599516SKenneth E. Jansen       sprintf(fname,"# Output generated by phasta version (NOT YET CURRENT): %lf \n", version);
646*59599516SKenneth E. Jansen       writestring( &irstou, fname );
647*59599516SKenneth E. Jansen 
648*59599516SKenneth E. Jansen       bzero( (void*)fname, 255 );
649*59599516SKenneth E. Jansen       gethostname(fname,255);
650*59599516SKenneth E. Jansen       writestring( &irstou,"# This result was produced on: ");
651*59599516SKenneth E. Jansen       writestring( &irstou, fname );
652*59599516SKenneth E. Jansen       writestring( &irstou,"\n");
653*59599516SKenneth E. Jansen 
654*59599516SKenneth E. Jansen       bzero( (void*)fname, 255 );
655*59599516SKenneth E. Jansen       sprintf(fname,"# %s\n", ctime( &timenow ));
656*59599516SKenneth E. Jansen       writestring( &irstou, fname );
657*59599516SKenneth E. Jansen 
658*59599516SKenneth E. Jansen       isize = 1;
659*59599516SKenneth E. Jansen       nitems = 1;
660*59599516SKenneth E. Jansen       iarray[ 0 ] = 1;
661*59599516SKenneth E. Jansen       writeheader( &irstou, "byteorder magic number ",
662*59599516SKenneth E. Jansen                     (void*)iarray, &nitems, &isize, "integer", phasta_iotype );
663*59599516SKenneth E. Jansen       writedatablock( &irstou, "byteorder magic number ",
664*59599516SKenneth E. Jansen                        (void*)mptr, &isize, "integer", phasta_iotype );
665*59599516SKenneth E. Jansen     }
666*59599516SKenneth E. Jansen 
667*59599516SKenneth E. Jansen     isize = (*nshg)*(*numvars);
668*59599516SKenneth E. Jansen     nitems = 3; // assuming field will write 3 items in iarray
669*59599516SKenneth E. Jansen     iarray[ 0 ] = (*nshg);
670*59599516SKenneth E. Jansen     iarray[ 1 ] = (*numvars);
671*59599516SKenneth E. Jansen     iarray[ 2 ] = (*stepno);
672*59599516SKenneth E. Jansen     writeheader( &irstou, fieldlabel, (void*)iarray, &nitems, &isize, datatype, phasta_iotype );
673*59599516SKenneth E. Jansen     writedatablock( &irstou, fieldlabel, array, &isize, datatype, phasta_iotype );
674*59599516SKenneth E. Jansen 
675*59599516SKenneth E. Jansen     closefile( &irstou, fmode);
676*59599516SKenneth E. Jansen 
677*59599516SKenneth E. Jansen     free(fieldlabel);
678*59599516SKenneth E. Jansen }
679*59599516SKenneth E. Jansen 
680*59599516SKenneth E. Jansen void
681*59599516SKenneth E. Jansen Write_PhAvg2( int* pid,
682*59599516SKenneth E. Jansen               char* filemode,
683*59599516SKenneth E. Jansen               char* fieldtag,
684*59599516SKenneth E. Jansen               int* tagsize,
685*59599516SKenneth E. Jansen               int* iphase,
686*59599516SKenneth E. Jansen               int* nphasesincycle,
687*59599516SKenneth E. Jansen               void* array,
688*59599516SKenneth E. Jansen               char* arraytype,
689*59599516SKenneth E. Jansen               int* nshg,
690*59599516SKenneth E. Jansen               int* numvars,
691*59599516SKenneth E. Jansen               int* stepno) {
692*59599516SKenneth E. Jansen 
693*59599516SKenneth E. Jansen     int addtagsize; // phase number is added to the name of the field
694*59599516SKenneth E. Jansen     if(*iphase<10)
695*59599516SKenneth E. Jansen       addtagsize=1;
696*59599516SKenneth E. Jansen     else if(*iphase<100)
697*59599516SKenneth E. Jansen       addtagsize=2;
698*59599516SKenneth E. Jansen     else if(*iphase<1000)
699*59599516SKenneth E. Jansen       addtagsize=3;
700*59599516SKenneth E. Jansen 
701*59599516SKenneth E. Jansen     int tagsize2;
702*59599516SKenneth E. Jansen     tagsize2=*tagsize+addtagsize;
703*59599516SKenneth E. Jansen 
704*59599516SKenneth E. Jansen     char *fieldlabel = (char *)malloc((tagsize2+1)*sizeof(char));
705*59599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
706*59599516SKenneth E. Jansen     fieldlabel[tagsize2] = '\0';
707*59599516SKenneth E. Jansen 
708*59599516SKenneth E. Jansen     char straddtagsize[10];
709*59599516SKenneth E. Jansen     sprintf(straddtagsize,"%d",*iphase);
710*59599516SKenneth E. Jansen 
711*59599516SKenneth E. Jansen     if(*iphase<10) {
712*59599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[0];
713*59599516SKenneth E. Jansen     }
714*59599516SKenneth E. Jansen     else if(*iphase<100) {
715*59599516SKenneth E. Jansen       fieldlabel[tagsize2-2]=straddtagsize[0];
716*59599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[1];
717*59599516SKenneth E. Jansen     }
718*59599516SKenneth E. Jansen     else if(*iphase<1000) {
719*59599516SKenneth E. Jansen       fieldlabel[tagsize2-3]=straddtagsize[0];
720*59599516SKenneth E. Jansen       fieldlabel[tagsize2-2]=straddtagsize[1];
721*59599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[2];
722*59599516SKenneth E. Jansen     }
723*59599516SKenneth E. Jansen 
724*59599516SKenneth E. Jansen     int irstou;
725*59599516SKenneth E. Jansen     int magic_number = 362436;
726*59599516SKenneth E. Jansen     int* mptr = &magic_number;
727*59599516SKenneth E. Jansen     double version=0.0;
728*59599516SKenneth E. Jansen     int isize, nitems;
729*59599516SKenneth E. Jansen     int iarray[10];
730*59599516SKenneth E. Jansen 
731*59599516SKenneth E. Jansen     char fmode[10];
732*59599516SKenneth E. Jansen     if(!strncmp(filemode,"w",1))
733*59599516SKenneth E. Jansen       strcpy(fmode,"write");
734*59599516SKenneth E. Jansen     else // default is append
735*59599516SKenneth E. Jansen       strcpy(fmode,"append");
736*59599516SKenneth E. Jansen 
737*59599516SKenneth E. Jansen     char datatype[10];
738*59599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
739*59599516SKenneth E. Jansen       strcpy(datatype,"int");
740*59599516SKenneth E. Jansen     else // default is double
741*59599516SKenneth E. Jansen       strcpy(datatype,"double");
742*59599516SKenneth E. Jansen 
743*59599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
744*59599516SKenneth E. Jansen 
745*59599516SKenneth E. Jansen     int nfiles;
746*59599516SKenneth E. Jansen     int nfields;
747*59599516SKenneth E. Jansen     int numparts;
748*59599516SKenneth E. Jansen     int irank;
749*59599516SKenneth E. Jansen     int nprocs;
750*59599516SKenneth E. Jansen 
751*59599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
752*59599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
753*59599516SKenneth E. Jansen     numparts = workfc.numpe;
754*59599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
755*59599516SKenneth E. Jansen     nprocs = workfc.numpe;
756*59599516SKenneth E. Jansen 
757*59599516SKenneth E. Jansen     int nppf = numparts/nfiles;
758*59599516SKenneth E. Jansen     int GPID;
759*59599516SKenneth E. Jansen 
760*59599516SKenneth E. Jansen     // Calculate number of parts each  proc deal with and where it start and end ...
761*59599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
762*59599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
763*59599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
764*59599516SKenneth E. Jansen 
765*59599516SKenneth E. Jansen     char fieldtag_s[255];
766*59599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
767*59599516SKenneth E. Jansen 
768*59599516SKenneth E. Jansen     field_flag++;
769*59599516SKenneth E. Jansen     if(*pid==0) {
770*59599516SKenneth E. Jansen       printf("\n");
771*59599516SKenneth E. Jansen       printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel);
772*59599516SKenneth E. Jansen     }
773*59599516SKenneth E. Jansen 
774*59599516SKenneth E. Jansen     int i;
775*59599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++  ) {
776*59599516SKenneth E. Jansen         GPID = startpart + i;
777*59599516SKenneth E. Jansen 
778*59599516SKenneth E. Jansen         // Write solution field ...
779*59599516SKenneth E. Jansen         sprintf(fieldtag_s,"%s@%d",fieldlabel,GPID);
780*59599516SKenneth E. Jansen 
781*59599516SKenneth E. Jansen         isize = (*nshg)*(*numvars);
782*59599516SKenneth E. Jansen         nitems = 3;
783*59599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
784*59599516SKenneth E. Jansen         iarray[ 1 ] = (*numvars);
785*59599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
786*59599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
787*59599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, array, &isize, "double", phasta_iotype );
788*59599516SKenneth E. Jansen     }
789*59599516SKenneth E. Jansen 
790*59599516SKenneth E. Jansen     if (field_flag==nfields){
791*59599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
792*59599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
793*59599516SKenneth E. Jansen       if (*pid==0) {
794*59599516SKenneth E. Jansen         printf("\n");
795*59599516SKenneth E. Jansen       }
796*59599516SKenneth E. Jansen     }
797*59599516SKenneth E. Jansen 
798*59599516SKenneth E. Jansen     free(fieldlabel);
799*59599516SKenneth E. Jansen }
800*59599516SKenneth E. Jansen 
801*59599516SKenneth E. Jansen 
802*59599516SKenneth E. Jansen void
803*59599516SKenneth E. Jansen Write_d2wall(   int* pid,
804*59599516SKenneth E. Jansen                 int* numnp,
805*59599516SKenneth E. Jansen                 double* array1 ) {
806*59599516SKenneth E. Jansen 
807*59599516SKenneth E. Jansen     int isize, nitems;
808*59599516SKenneth E. Jansen     int iarray[10];
809*59599516SKenneth E. Jansen 
810*59599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
811*59599516SKenneth E. Jansen 
812*59599516SKenneth E. Jansen     int nfiles;
813*59599516SKenneth E. Jansen     int nfields;
814*59599516SKenneth E. Jansen     int numparts;
815*59599516SKenneth E. Jansen     int irank;
816*59599516SKenneth E. Jansen     int nprocs;
817*59599516SKenneth E. Jansen 
818*59599516SKenneth E. Jansen     //  First, count the number of fields to write and store the result in
819*59599516SKenneth E. Jansen     //countfieldstowriterestart();
820*59599516SKenneth E. Jansen 
821*59599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
822*59599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
823*59599516SKenneth E. Jansen     nfields = 1; //outpar.nsynciofieldswriterestart;  // Only the distance to the walls in d2wall
824*59599516SKenneth E. Jansen     numparts = workfc.numpe;
825*59599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
826*59599516SKenneth E. Jansen     nprocs = workfc.numpe;
827*59599516SKenneth E. Jansen     int nppf = numparts/nfiles;
828*59599516SKenneth E. Jansen     int GPID;
829*59599516SKenneth E. Jansen 
830*59599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
831*59599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
832*59599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
833*59599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
834*59599516SKenneth E. Jansen 
835*59599516SKenneth E. Jansen     int descriptor;
836*59599516SKenneth E. Jansen     char filename[255],fieldtag_s[255];
837*59599516SKenneth E. Jansen     bzero((void*)filename,255);
838*59599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
839*59599516SKenneth E. Jansen 
840*59599516SKenneth E. Jansen     sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1));
841*59599516SKenneth E. Jansen 
842*59599516SKenneth E. Jansen     if (irank==0) {
843*59599516SKenneth E. Jansen       printf("Filename is %s \n",filename);
844*59599516SKenneth E. Jansen     }
845*59599516SKenneth E. Jansen 
846*59599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write");
847*59599516SKenneth E. Jansen 
848*59599516SKenneth E. Jansen     openfile(filename, "write", &f_descriptor);
849*59599516SKenneth E. Jansen 
850*59599516SKenneth E. Jansen     field_flag=0;
851*59599516SKenneth E. Jansen 
852*59599516SKenneth E. Jansen      int i;
853*59599516SKenneth E. Jansen      for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
854*59599516SKenneth E. Jansen      // GPID : global part id, corresponds to rank ...
855*59599516SKenneth E. Jansen         // e.g : (in this example)
856*59599516SKenneth E. Jansen         // proc 0 : 1--4
857*59599516SKenneth E. Jansen         // proc 1 : 5--8 ...
858*59599516SKenneth E. Jansen         GPID = startpart + i;
859*59599516SKenneth E. Jansen 
860*59599516SKenneth E. Jansen         // Write solution field ...
861*59599516SKenneth E. Jansen         sprintf(fieldtag_s,"d2wall@%d",GPID);
862*59599516SKenneth E. Jansen 
863*59599516SKenneth E. Jansen         isize = (*numnp);
864*59599516SKenneth E. Jansen         nitems = 2;
865*59599516SKenneth E. Jansen         iarray[ 0 ] = (*numnp);
866*59599516SKenneth E. Jansen         iarray[ 1 ] = 1; //numVars = 1
867*59599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
868*59599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
869*59599516SKenneth E. Jansen      }
870*59599516SKenneth E. Jansen      field_flag++;
871*59599516SKenneth E. Jansen 
872*59599516SKenneth E. Jansen      if (field_flag==nfields){
873*59599516SKenneth E. Jansen        closefile(&f_descriptor, "write");
874*59599516SKenneth E. Jansen        finalizephmpiio(&f_descriptor);
875*59599516SKenneth E. Jansen        if (irank==0) {
876*59599516SKenneth E. Jansen          printf("\n");
877*59599516SKenneth E. Jansen        }
878*59599516SKenneth E. Jansen      }
879*59599516SKenneth E. Jansen }
880*59599516SKenneth E. Jansen 
881