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