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