xref: /phasta/AcuStat/src/new_interface.c (revision 8746ab438bbda91291f8cdd62b94f8385f2d26f1) !
159599516SKenneth E. Jansen /* This file provides interface functions for 'partial ' random
259599516SKenneth E. Jansen    access into the PHASTA input files
359599516SKenneth E. Jansen 
459599516SKenneth E. Jansen    Anil Karanam March 2001 */
559599516SKenneth E. Jansen 
659599516SKenneth E. Jansen #include <stdio.h>
759599516SKenneth E. Jansen #include <string.h>
859599516SKenneth E. Jansen #include <ctype.h>
959599516SKenneth E. Jansen #include <stdlib.h>
1059599516SKenneth E. Jansen #include <time.h>
1159599516SKenneth E. Jansen #include <math.h>
1259599516SKenneth E. Jansen #include <mpi.h>
1359599516SKenneth E. Jansen #include "phastaIO.h"
1459599516SKenneth E. Jansen #include <FCMangle.h>
1559599516SKenneth E. Jansen #include "new_interfaceAcuStat.h"
1659599516SKenneth E. Jansen 
1759599516SKenneth E. Jansen //MR CHANGE
1859599516SKenneth E. Jansen #include "commonAcuStat_c.h"
1959599516SKenneth E. Jansen //MR CHANGE END
2059599516SKenneth E. Jansen 
2159599516SKenneth E. Jansen #ifdef intel
2259599516SKenneth E. Jansen #include <winsock2.h>
2359599516SKenneth E. Jansen #else
2459599516SKenneth E. Jansen #include <unistd.h>
2559599516SKenneth E. Jansen #include <strings.h>
2659599516SKenneth E. Jansen #endif
2759599516SKenneth E. Jansen 
2859599516SKenneth E. Jansen 
2959599516SKenneth E. Jansen void
Write_AcuStat(int * pid,int * stepstart,int * stepend,int * steptot,int * nshg,int * numVars,double * array1)3059599516SKenneth E. Jansen Write_AcuStat(  int* pid,
3159599516SKenneth E. Jansen                 int* stepstart,
3259599516SKenneth E. Jansen                 int* stepend,
3359599516SKenneth E. Jansen                 int* steptot,
3459599516SKenneth E. Jansen                 int* nshg,
3559599516SKenneth E. Jansen                 int* numVars,
3659599516SKenneth E. Jansen                 double* array1 ) {
3759599516SKenneth E. Jansen 
3859599516SKenneth E. Jansen     char fname[255];
3959599516SKenneth E. Jansen     char rfile[60];
4059599516SKenneth E. Jansen     char existingfile[30], linkfile[30];
4159599516SKenneth E. Jansen     int irstou;
4259599516SKenneth E. Jansen     int magic_number = 362436;
4359599516SKenneth E. Jansen     int* mptr = &magic_number;
4459599516SKenneth E. Jansen     double version=0.0;
4559599516SKenneth E. Jansen     int isize, nitems;
4659599516SKenneth E. Jansen     int iarray[10];
4759599516SKenneth E. Jansen     int nfiles;
4859599516SKenneth E. Jansen     int nfields;
4959599516SKenneth E. Jansen     int numparts;
5059599516SKenneth E. Jansen     int irank;
5159599516SKenneth E. Jansen     int nprocs;
5259599516SKenneth E. Jansen 
5359599516SKenneth E. Jansen 
5459599516SKenneth E. Jansen     irank = *pid;
5559599516SKenneth E. Jansen 
5659599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
5759599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles; //We use the same number of files as before
5859599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart; // >=4
5959599516SKenneth E. Jansen     numparts = workfc.numpe;
6059599516SKenneth E. Jansen     nprocs= workfc.numpe;
6159599516SKenneth E. Jansen 
6259599516SKenneth E. Jansen     int nppf = numparts/nfiles;
6359599516SKenneth E. Jansen     int GPID;
6459599516SKenneth E. Jansen 
6559599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
6659599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
6759599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
6859599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
6959599516SKenneth E. Jansen 
7059599516SKenneth E. Jansen     int descriptor;
7159599516SKenneth E. Jansen     char filename[255],path[255],fieldtag_s[255];
7259599516SKenneth E. Jansen     bzero((void*)filename,255);
7359599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
7459599516SKenneth E. Jansen 
7559599516SKenneth E. Jansen     //sprintf(filename,"restartAcuStat-dat.%d.%d",*stepend,((int)(irank/(nprocs/nfiles))+1));
7659599516SKenneth E. Jansen     sprintf(filename,"restartAcuStat.%d.%d.%d.%d",*stepstart,*stepend,*steptot,((int)(irank/(nprocs/nfiles))+1));
7759599516SKenneth E. Jansen     if (*pid==0) {
7859599516SKenneth E. Jansen 	    printf("Filename is %s \n",filename);
7959599516SKenneth E. Jansen     }
8059599516SKenneth E. Jansen 
8159599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write");
8259599516SKenneth E. Jansen     openfile(filename, "write", &f_descriptor);
8359599516SKenneth E. Jansen 
8459599516SKenneth E. Jansen     field_flag=0;
8559599516SKenneth E. Jansen     // solution
8659599516SKenneth E. Jansen     int i;
8759599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
8859599516SKenneth E. Jansen 	    // GPID : global part id, corresponds to rank ...
8959599516SKenneth E. Jansen 	    // e.g : (in this example)
9059599516SKenneth E. Jansen 	    // proc 0 : 1--4
9159599516SKenneth E. Jansen 	    // proc 1 : 5--8 ...
9259599516SKenneth E. Jansen 	    GPID = startpart + i;
9359599516SKenneth E. Jansen 
9459599516SKenneth E. Jansen 	    // Write solution field ...
9559599516SKenneth E. Jansen 	    sprintf(fieldtag_s,"solution@%d",GPID);
9659599516SKenneth E. Jansen 
9759599516SKenneth E. Jansen 	    isize = (*nshg)*(*numVars);
9859599516SKenneth E. Jansen 	    nitems = 3;
9959599516SKenneth E. Jansen 	    iarray[ 0 ] = (*nshg);
10059599516SKenneth E. Jansen 	    iarray[ 1 ] = (*numVars);
10159599516SKenneth E. Jansen 	    iarray[ 2 ] = (*stepend);
10259599516SKenneth E. Jansen 	    writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
10359599516SKenneth E. Jansen 	    writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
10459599516SKenneth E. Jansen     }
10559599516SKenneth E. Jansen     field_flag++;
10659599516SKenneth E. Jansen 
10759599516SKenneth E. Jansen     if (field_flag==nfields){
10859599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
10959599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
11059599516SKenneth E. Jansen       printf("file closed\n");
11159599516SKenneth E. Jansen       if (*pid==0) {
11259599516SKenneth E. Jansen         printf("\n");
11359599516SKenneth E. Jansen       }
11459599516SKenneth E. Jansen     }
11559599516SKenneth E. Jansen 
11659599516SKenneth E. Jansen     return;
11759599516SKenneth E. Jansen }
11859599516SKenneth E. Jansen 
11959599516SKenneth E. Jansen 
12059599516SKenneth E. Jansen 
12159599516SKenneth E. Jansen void
Write_AcuStat2(int * pid,int * stepstart,int * stepend,int * steptot,int * nshg,int * numVars,int * ndoferrors,int * ndofybar,double * array1,double * array2,double * array3,double * array4)12259599516SKenneth E. Jansen Write_AcuStat2(  int* pid,
12359599516SKenneth E. Jansen                 int* stepstart,
12459599516SKenneth E. Jansen                 int* stepend,
12559599516SKenneth E. Jansen                 int* steptot,
12659599516SKenneth E. Jansen                 int* nshg,
12759599516SKenneth E. Jansen                 int* numVars,
12859599516SKenneth E. Jansen                 int* ndoferrors,
12959599516SKenneth E. Jansen                 int* ndofybar,
13059599516SKenneth E. Jansen                 double* array1,
13159599516SKenneth E. Jansen                 double* array2,
13259599516SKenneth E. Jansen                 double* array3,
13359599516SKenneth E. Jansen                 double* array4 ) {
13459599516SKenneth E. Jansen 
13559599516SKenneth E. Jansen     char fname[255];
13659599516SKenneth E. Jansen     char rfile[60];
13759599516SKenneth E. Jansen     char existingfile[30], linkfile[30];
13859599516SKenneth E. Jansen     int irstou;
13959599516SKenneth E. Jansen     int magic_number = 362436;
14059599516SKenneth E. Jansen     int* mptr = &magic_number;
14159599516SKenneth E. Jansen     double version=0.0;
14259599516SKenneth E. Jansen     int isize, nitems;
14359599516SKenneth E. Jansen     int iarray[10];
14459599516SKenneth E. Jansen     int nfiles;
14559599516SKenneth E. Jansen     int nfields;
14659599516SKenneth E. Jansen     int numparts;
14759599516SKenneth E. Jansen     int irank;
14859599516SKenneth E. Jansen     int nprocs;
14959599516SKenneth E. Jansen 
15059599516SKenneth E. Jansen 
15159599516SKenneth E. Jansen     irank = *pid;
15259599516SKenneth E. Jansen 
15359599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
15459599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles; //We use the same number of files as before
15559599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart; // >=4
15659599516SKenneth E. Jansen     numparts = workfc.numpe;
15759599516SKenneth E. Jansen     nprocs= workfc.numpe;
15859599516SKenneth E. Jansen 
15959599516SKenneth E. Jansen     int nppf = numparts/nfiles;
16059599516SKenneth E. Jansen     int GPID;
16159599516SKenneth E. Jansen 
16259599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
16359599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
16459599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
16559599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
16659599516SKenneth E. Jansen 
16759599516SKenneth E. Jansen     int descriptor;
16859599516SKenneth E. Jansen     char filename[255],fieldtag_s[255];
16959599516SKenneth E. Jansen     bzero((void*)filename,255);
17059599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
17159599516SKenneth E. Jansen 
17259599516SKenneth E. Jansen     sprintf(filename,"restartAcuStat.%d.%d.%d.%d",*stepstart,*stepend,*steptot,((int)(irank/(nprocs/nfiles))+1));
17359599516SKenneth E. Jansen     if (*pid==0) {
17459599516SKenneth E. Jansen 	    printf("Filename is %s \n",filename);
17559599516SKenneth E. Jansen     }
17659599516SKenneth E. Jansen 
17759599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write");
17859599516SKenneth E. Jansen     openfile(filename, "write", &f_descriptor);
17959599516SKenneth E. Jansen 
18059599516SKenneth E. Jansen     field_flag=0;
18159599516SKenneth E. Jansen     // solution
18259599516SKenneth E. Jansen     int i;
18359599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
18459599516SKenneth E. Jansen 	    // GPID : global part id, corresponds to rank ...
18559599516SKenneth E. Jansen 	    // e.g : (in this example)
18659599516SKenneth E. Jansen 	    // proc 0 : 1--4
18759599516SKenneth E. Jansen 	    // proc 1 : 5--8 ...
18859599516SKenneth E. Jansen 	    GPID = startpart + i;
18959599516SKenneth E. Jansen 
19059599516SKenneth E. Jansen 	    // Write solution field ...
19159599516SKenneth E. Jansen 	    sprintf(fieldtag_s,"solution@%d",GPID);
19259599516SKenneth E. Jansen 
19359599516SKenneth E. Jansen 	    isize = (*nshg)*(*numVars);
19459599516SKenneth E. Jansen 	    nitems = 3;
19559599516SKenneth E. Jansen 	    iarray[ 0 ] = (*nshg);
19659599516SKenneth E. Jansen 	    iarray[ 1 ] = (*numVars);
19759599516SKenneth E. Jansen 	    iarray[ 2 ] = (*stepend);
19859599516SKenneth E. Jansen 	    writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
19959599516SKenneth E. Jansen 	    writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
20059599516SKenneth E. Jansen     }
20159599516SKenneth E. Jansen     field_flag++;
20259599516SKenneth E. Jansen 
20359599516SKenneth E. Jansen     // dwal
20459599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
20559599516SKenneth E. Jansen 	    // GPID : global part id, corresponds to rank ...
20659599516SKenneth E. Jansen 	    // e.g : (in this example)
20759599516SKenneth E. Jansen 	    // proc 0 : 1--4
20859599516SKenneth E. Jansen 	    // proc 1 : 5--8 ...
20959599516SKenneth E. Jansen 	    GPID = startpart + i;
21059599516SKenneth E. Jansen 
21159599516SKenneth E. Jansen 	    // Write solution field ...
21259599516SKenneth E. Jansen 	    sprintf(fieldtag_s,"dwal@%d",GPID);
21359599516SKenneth E. Jansen 
21459599516SKenneth E. Jansen 	    isize = (*nshg)*1;
21559599516SKenneth E. Jansen 	    nitems = 3;
21659599516SKenneth E. Jansen 	    iarray[ 0 ] = (*nshg);
21759599516SKenneth E. Jansen 	    iarray[ 1 ] = 1;
21859599516SKenneth E. Jansen 	    iarray[ 2 ] = (*stepend);
21959599516SKenneth E. Jansen 	    writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
22059599516SKenneth E. Jansen 	    writedatablock( &f_descriptor, fieldtag_s, (void*)(array2), &isize, "double", phasta_iotype );
22159599516SKenneth E. Jansen     }
22259599516SKenneth E. Jansen     field_flag++;
22359599516SKenneth E. Jansen 
22459599516SKenneth E. Jansen     // errors
22559599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
22659599516SKenneth E. Jansen 	    // GPID : global part id, corresponds to rank ...
22759599516SKenneth E. Jansen 	    // e.g : (in this example)
22859599516SKenneth E. Jansen 	    // proc 0 : 1--4
22959599516SKenneth E. Jansen 	    // proc 1 : 5--8 ...
23059599516SKenneth E. Jansen 	    GPID = startpart + i;
23159599516SKenneth E. Jansen 
23259599516SKenneth E. Jansen 	    // Write solution field ...
23359599516SKenneth E. Jansen 	    sprintf(fieldtag_s,"errors@%d",GPID);
23459599516SKenneth E. Jansen 
23559599516SKenneth E. Jansen 	    isize = (*nshg)*(*ndoferrors);
23659599516SKenneth E. Jansen 	    nitems = 3;
23759599516SKenneth E. Jansen 	    iarray[ 0 ] = (*nshg);
23859599516SKenneth E. Jansen 	    iarray[ 1 ] = (*ndoferrors);
23959599516SKenneth E. Jansen 	    iarray[ 2 ] = (*stepend);
24059599516SKenneth E. Jansen 	    writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
24159599516SKenneth E. Jansen 	    writedatablock( &f_descriptor, fieldtag_s, (void*)(array3), &isize, "double", phasta_iotype );
24259599516SKenneth E. Jansen     }
24359599516SKenneth E. Jansen     field_flag++;
24459599516SKenneth E. Jansen 
24559599516SKenneth E. Jansen     // ybar
24659599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
24759599516SKenneth E. Jansen 	    // GPID : global part id, corresponds to rank ...
24859599516SKenneth E. Jansen 	    // e.g : (in this example)
24959599516SKenneth E. Jansen 	    // proc 0 : 1--4
25059599516SKenneth E. Jansen 	    // proc 1 : 5--8 ...
25159599516SKenneth E. Jansen 	    GPID = startpart + i;
25259599516SKenneth E. Jansen 
25359599516SKenneth E. Jansen 	    // Write solution field ...
25459599516SKenneth E. Jansen 	    sprintf(fieldtag_s,"ybar@%d",GPID);
25559599516SKenneth E. Jansen 
25659599516SKenneth E. Jansen 	    isize = (*nshg)*(*ndofybar);
25759599516SKenneth E. Jansen 	    nitems = 3;
25859599516SKenneth E. Jansen 	    iarray[ 0 ] = (*nshg);
25959599516SKenneth E. Jansen 	    iarray[ 1 ] = (*ndofybar);
26059599516SKenneth E. Jansen 	    iarray[ 2 ] = (*stepend);
26159599516SKenneth E. Jansen 	    writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
26259599516SKenneth E. Jansen 	    writedatablock( &f_descriptor, fieldtag_s, (void*)(array4), &isize, "double", phasta_iotype );
26359599516SKenneth E. Jansen     }
26459599516SKenneth E. Jansen     field_flag++;
26559599516SKenneth E. Jansen 
26659599516SKenneth E. Jansen 
26759599516SKenneth E. Jansen     if (field_flag==nfields){
26859599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
26959599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
27059599516SKenneth E. Jansen       printf("file closed\n");
27159599516SKenneth E. Jansen       if (*pid==0) {
27259599516SKenneth E. Jansen         printf("\n");
27359599516SKenneth E. Jansen       }
27459599516SKenneth E. Jansen     }
27559599516SKenneth E. Jansen 
27659599516SKenneth E. Jansen 
27759599516SKenneth E. Jansen     return;
27859599516SKenneth E. Jansen }
27959599516SKenneth E. Jansen 
28059599516SKenneth E. Jansen void
Write_Ybar(int * pid,int * stepstart,int * stepend,int * steptot,int * nshg,int * numVars,double * array1)28159599516SKenneth E. Jansen Write_Ybar(     int* pid,
28259599516SKenneth E. Jansen                 int* stepstart,
28359599516SKenneth E. Jansen                 int* stepend,
28459599516SKenneth E. Jansen                 int* steptot,
28559599516SKenneth E. Jansen                 int* nshg,
28659599516SKenneth E. Jansen                 int* numVars,
28759599516SKenneth E. Jansen                 double* array1) {
28859599516SKenneth E. Jansen 
28959599516SKenneth E. Jansen     char fname[255];
29059599516SKenneth E. Jansen     char rfile[60];
29159599516SKenneth E. Jansen     char existingfile[30], linkfile[30];
29259599516SKenneth E. Jansen     int irstou;
29359599516SKenneth E. Jansen     int magic_number = 362436;
29459599516SKenneth E. Jansen     int* mptr = &magic_number;
29559599516SKenneth E. Jansen     double version=0.0;
29659599516SKenneth E. Jansen     int isize, nitems;
29759599516SKenneth E. Jansen     int iarray[10];
29859599516SKenneth E. Jansen 
29959599516SKenneth E. Jansen     int nfiles;
30059599516SKenneth E. Jansen     int nfields;
30159599516SKenneth E. Jansen     int numparts;
30259599516SKenneth E. Jansen     int irank;
30359599516SKenneth E. Jansen     int nprocs;
30459599516SKenneth E. Jansen 
30559599516SKenneth E. Jansen     //  First, count the number of fields to write and store the result in
30659599516SKenneth E. Jansen     //countfieldstowriterestart();
30759599516SKenneth E. Jansen 
30859599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
30959599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
31059599516SKenneth E. Jansen     //nfields = outpar.nsynciofieldswriterestart;
31159599516SKenneth E. Jansen     nfields=1;
31259599516SKenneth E. Jansen     numparts = workfc.numpe;
31359599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
31459599516SKenneth E. Jansen     nprocs = workfc.numpe;
31559599516SKenneth E. Jansen     int nppf = numparts/nfiles;
31659599516SKenneth E. Jansen     int GPID;
31759599516SKenneth E. Jansen 
31859599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
31959599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
32059599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
32159599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
32259599516SKenneth E. Jansen 
32359599516SKenneth E. Jansen     int descriptor;
32459599516SKenneth E. Jansen     char filename[255],fieldtag_s[255];
32559599516SKenneth E. Jansen     bzero((void*)filename,255);
32659599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
32759599516SKenneth E. Jansen 
32859599516SKenneth E. Jansen //    sprintf(filename,"ybar.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1));
32959599516SKenneth E. Jansen     sprintf(filename,"restartAcuStat.%d.%d.%d.%d",*stepstart,*stepend,*steptot,((int)(irank/(nprocs/nfiles))+1));
33059599516SKenneth E. Jansen 
33159599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write");
33259599516SKenneth E. Jansen 
33359599516SKenneth E. Jansen     if (*pid==0) {
33459599516SKenneth E. Jansen       printf("Filename is %s \n",filename);
33559599516SKenneth E. Jansen     }
33659599516SKenneth E. Jansen 
33759599516SKenneth E. Jansen     openfile(filename, "write", &f_descriptor);
33859599516SKenneth E. Jansen 
33959599516SKenneth E. Jansen     field_flag=0;
34059599516SKenneth E. Jansen 
34159599516SKenneth E. Jansen      int i;
34259599516SKenneth E. Jansen      for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
34359599516SKenneth E. Jansen      // GPID : global part id, corresponds to rank ...
34459599516SKenneth E. Jansen         // e.g : (in this example)
34559599516SKenneth E. Jansen         // proc 0 : 1--4
34659599516SKenneth E. Jansen         // proc 1 : 5--8 ...
34759599516SKenneth E. Jansen         GPID = startpart + i;
34859599516SKenneth E. Jansen 
34959599516SKenneth E. Jansen         // Write ybar field ...
35059599516SKenneth E. Jansen         sprintf(fieldtag_s,"ybar@%d",GPID);
35159599516SKenneth E. Jansen 
35259599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
35359599516SKenneth E. Jansen         nitems = 3;
35459599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
35559599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
35659599516SKenneth E. Jansen         iarray[ 2 ] = (*stepend);
35759599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
35859599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
35959599516SKenneth E. Jansen     }
36059599516SKenneth E. Jansen     field_flag++;
36159599516SKenneth E. Jansen 
36259599516SKenneth E. Jansen     if (field_flag==nfields){
36359599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
36459599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
36559599516SKenneth E. Jansen       if (*pid==0) {
36659599516SKenneth E. Jansen         printf("\n");
36759599516SKenneth E. Jansen       }
36859599516SKenneth E. Jansen     }
36959599516SKenneth E. Jansen }
37059599516SKenneth E. Jansen 
37159599516SKenneth E. Jansen void
Write_Restart(int * pid,int * stepno,int * nshg,int * numVars,double * array1,double * array2)37259599516SKenneth E. Jansen Write_Restart(  int* pid,
37359599516SKenneth E. Jansen                 int* stepno,
37459599516SKenneth E. Jansen                 int* nshg,
37559599516SKenneth E. Jansen                 int* numVars,
37659599516SKenneth E. Jansen                 double* array1,
37759599516SKenneth E. Jansen                 double* array2 ) {
37859599516SKenneth E. Jansen 
37959599516SKenneth E. Jansen     char fname[255];
38059599516SKenneth E. Jansen     char rfile[60];
38159599516SKenneth E. Jansen     char existingfile[30], linkfile[30];
38259599516SKenneth E. Jansen     int irstou;
38359599516SKenneth E. Jansen     int magic_number = 362436;
38459599516SKenneth E. Jansen     int* mptr = &magic_number;
38559599516SKenneth E. Jansen     double version=0.0;
38659599516SKenneth E. Jansen     int isize, nitems;
38759599516SKenneth E. Jansen     int iarray[10];
38859599516SKenneth E. Jansen     int nfiles;
38959599516SKenneth E. Jansen     int nfields;
39059599516SKenneth E. Jansen     int numparts;
39159599516SKenneth E. Jansen     int irank;
39259599516SKenneth E. Jansen     int nprocs;
39359599516SKenneth E. Jansen 
39459599516SKenneth E. Jansen     //  First, count the number of fields to write and store the result in
39559599516SKenneth E. Jansen     //countfieldstowriterestart();
39659599516SKenneth E. Jansen 
39759599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
39859599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
39959599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
40059599516SKenneth E. Jansen     numparts = workfc.numpe;
40159599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
40259599516SKenneth E. Jansen     nprocs = workfc.numpe;
40359599516SKenneth E. Jansen     int nppf = numparts/nfiles;
40459599516SKenneth E. Jansen     int GPID;
40559599516SKenneth E. Jansen 
40659599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
40759599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
40859599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
40959599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
41059599516SKenneth E. Jansen 
41159599516SKenneth E. Jansen     int descriptor;
41259599516SKenneth E. Jansen     char filename[255],fieldtag_s[255];
41359599516SKenneth E. Jansen     bzero((void*)filename,255);
41459599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
41559599516SKenneth E. Jansen 
41659599516SKenneth E. Jansen     sprintf(filename,"restart-dat.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1));
41759599516SKenneth E. Jansen 
41859599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write");
41959599516SKenneth E. Jansen 
42059599516SKenneth E. Jansen     if (*pid==0) {
42159599516SKenneth E. Jansen       printf("Filename is %s \n",filename);
42259599516SKenneth E. Jansen     }
42359599516SKenneth E. Jansen 
42459599516SKenneth E. Jansen     openfile(filename, "write", &f_descriptor);
42559599516SKenneth E. Jansen 
42659599516SKenneth E. Jansen     field_flag=0;
42759599516SKenneth E. Jansen 
42859599516SKenneth E. Jansen      int i;
42959599516SKenneth E. Jansen      for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
43059599516SKenneth E. Jansen      // GPID : global part id, corresponds to rank ...
43159599516SKenneth E. Jansen         // e.g : (in this example)
43259599516SKenneth E. Jansen         // proc 0 : 1--4
43359599516SKenneth E. Jansen         // proc 1 : 5--8 ...
43459599516SKenneth E. Jansen         GPID = startpart + i;
43559599516SKenneth E. Jansen 
43659599516SKenneth E. Jansen         // Write solution field ...
43759599516SKenneth E. Jansen         sprintf(fieldtag_s,"solution@%d",GPID);
43859599516SKenneth E. Jansen 
43959599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
44059599516SKenneth E. Jansen         nitems = 3;
44159599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
44259599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
44359599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
44459599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
44559599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
44659599516SKenneth E. Jansen      }
44759599516SKenneth E. Jansen      field_flag++;
44859599516SKenneth E. Jansen 
44959599516SKenneth E. Jansen      for ( i = 0; i < nppp; i++) {
45059599516SKenneth E. Jansen 
45159599516SKenneth E. Jansen         // GPID : global part id, corresponds to rank ...
45259599516SKenneth E. Jansen         // e.g : (in this example)
45359599516SKenneth E. Jansen         // proc 0 : 1--4
45459599516SKenneth E. Jansen         // proc 1 : 5--8 ...
45559599516SKenneth E. Jansen         GPID = startpart + i;
45659599516SKenneth E. Jansen 
45759599516SKenneth E. Jansen         // Write solution field ...
45859599516SKenneth E. Jansen         sprintf(fieldtag_s,"time derivative of solution@%d",GPID);
45959599516SKenneth E. Jansen 
46059599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
46159599516SKenneth E. Jansen         nitems = 3;
46259599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
46359599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
46459599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
46559599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
46659599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array2), &isize, "double", phasta_iotype );
46759599516SKenneth E. Jansen      }
46859599516SKenneth E. Jansen      field_flag++;
46959599516SKenneth E. Jansen 
47059599516SKenneth E. Jansen      if (field_flag==nfields){
47159599516SKenneth E. Jansen        closefile(&f_descriptor, "write");
47259599516SKenneth E. Jansen        finalizephmpiio(&f_descriptor);
47359599516SKenneth E. Jansen        if (*pid==0) {
47459599516SKenneth E. Jansen          printf("\n");
47559599516SKenneth E. Jansen        }
47659599516SKenneth E. Jansen      }
47759599516SKenneth E. Jansen }
47859599516SKenneth E. Jansen 
47959599516SKenneth E. Jansen 
48059599516SKenneth E. Jansen void
Write_Error(int * pid,int * stepno,int * nshg,int * numVars,double * array1)48159599516SKenneth E. Jansen Write_Error(  int* pid,
48259599516SKenneth E. Jansen               int* stepno,
48359599516SKenneth E. Jansen               int* nshg,
48459599516SKenneth E. Jansen               int* numVars,
48559599516SKenneth E. Jansen               double* array1 ) {
48659599516SKenneth E. Jansen 
48759599516SKenneth E. Jansen 
48859599516SKenneth E. Jansen     char fname[255];
48959599516SKenneth E. Jansen     char rfile[60];
49059599516SKenneth E. Jansen     int irstou;
49159599516SKenneth E. Jansen     int magic_number = 362436;
49259599516SKenneth E. Jansen     int* mptr = &magic_number;
49359599516SKenneth E. Jansen     double version=0.0;
49459599516SKenneth E. Jansen     int isize, nitems;
49559599516SKenneth E. Jansen     int iarray[10];
49659599516SKenneth E. Jansen 
49759599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
49859599516SKenneth E. Jansen 
49959599516SKenneth E. Jansen     int nfiles;
50059599516SKenneth E. Jansen     int nfields;
50159599516SKenneth E. Jansen     int numparts;
50259599516SKenneth E. Jansen     int irank;
50359599516SKenneth E. Jansen     int nprocs;
50459599516SKenneth E. Jansen 
50559599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
50659599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
50759599516SKenneth E. Jansen     numparts = workfc.numpe;
50859599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
50959599516SKenneth E. Jansen     nprocs = workfc.numpe;
51059599516SKenneth E. Jansen 
51159599516SKenneth E. Jansen     int nppf = numparts/nfiles;
51259599516SKenneth E. Jansen     int GPID;
51359599516SKenneth E. Jansen 
51459599516SKenneth E. Jansen     // Calculate number of parts each  proc deal with and where it start and end ...
51559599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
51659599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
51759599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
51859599516SKenneth E. Jansen 
51959599516SKenneth E. Jansen     field_flag++;
52059599516SKenneth E. Jansen 
52159599516SKenneth E. Jansen     char fieldtag[255];
52259599516SKenneth E. Jansen 
52359599516SKenneth E. Jansen     int i;
52459599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++  ) {
52559599516SKenneth E. Jansen         GPID = startpart + i;
52659599516SKenneth E. Jansen         sprintf(fieldtag,"errors@%d",GPID);
52759599516SKenneth E. Jansen 
52859599516SKenneth E. Jansen         if(*pid==0) {
52959599516SKenneth E. Jansen           printf("\n");
53059599516SKenneth E. Jansen           printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldtag);
53159599516SKenneth E. Jansen         }
53259599516SKenneth E. Jansen 
53359599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
53459599516SKenneth E. Jansen         nitems = 3;
53559599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
53659599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
53759599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
53859599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
53959599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag, (void*)array1, &isize, "double", phasta_iotype );
54059599516SKenneth E. Jansen     }
54159599516SKenneth E. Jansen 
54259599516SKenneth E. Jansen     if (field_flag==nfields){
54359599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
54459599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
54559599516SKenneth E. Jansen       if (*pid==0) {
54659599516SKenneth E. Jansen         printf("Last field %d '%s' finished! \n",nfields, fieldtag);
54759599516SKenneth E. Jansen         printf("\n");
54859599516SKenneth E. Jansen       }
54959599516SKenneth E. Jansen     }
55059599516SKenneth E. Jansen 
55159599516SKenneth E. Jansen }
55259599516SKenneth E. Jansen 
55359599516SKenneth E. Jansen void
Write_Displ(int * pid,int * stepno,int * nshg,int * numVars,double * array1)55459599516SKenneth E. Jansen Write_Displ(  int* pid,
55559599516SKenneth E. Jansen               int* stepno,
55659599516SKenneth E. Jansen               int* nshg,
55759599516SKenneth E. Jansen               int* numVars,
55859599516SKenneth E. Jansen               double* array1 ) { //TO BE UPDATED FOR SYNCIO
55959599516SKenneth E. Jansen 
56059599516SKenneth E. Jansen 
56159599516SKenneth E. Jansen     char fname[255];
56259599516SKenneth E. Jansen     char rfile[60];
56359599516SKenneth E. Jansen     int irstou;
56459599516SKenneth E. Jansen     int magic_number = 362436;
56559599516SKenneth E. Jansen     int* mptr = &magic_number;
56659599516SKenneth E. Jansen     time_t timenow = time ( &timenow);
56759599516SKenneth E. Jansen     double version=0.0;
56859599516SKenneth E. Jansen     int isize, nitems;
56959599516SKenneth E. Jansen     int iarray[10];
57059599516SKenneth E. Jansen 
57159599516SKenneth E. Jansen     sprintf(rfile,"restart.%d.%d",*stepno,*pid+1);
57259599516SKenneth E. Jansen     openfile(rfile,"append", &irstou);
57359599516SKenneth E. Jansen 
57459599516SKenneth E. Jansen     isize = (*nshg)*(*numVars);
57559599516SKenneth E. Jansen     nitems = 3;
57659599516SKenneth E. Jansen     iarray[ 0 ] = (*nshg);
57759599516SKenneth E. Jansen     iarray[ 1 ] = (*numVars);
57859599516SKenneth E. Jansen     iarray[ 2 ] = (*stepno);
57959599516SKenneth E. Jansen     writeheader( &irstou, "displacement", (void*)iarray, &nitems, &isize, "double", phasta_iotype );
58059599516SKenneth E. Jansen     writedatablock( &irstou, "displacement", (void*)(array1), &isize, "double", phasta_iotype );
58159599516SKenneth E. Jansen 
58259599516SKenneth E. Jansen     closefile( &irstou, "append" );
58359599516SKenneth E. Jansen }
58459599516SKenneth E. Jansen 
58559599516SKenneth E. Jansen void
Write_Field(int * pid,char * filemode,char * fieldtag,int * tagsize,void * array,char * arraytype,int * nshg,int * numvars,int * stepno)58659599516SKenneth E. Jansen Write_Field(  int *pid,
58759599516SKenneth E. Jansen               char* filemode,
58859599516SKenneth E. Jansen               char* fieldtag,
58959599516SKenneth E. Jansen               int* tagsize,
59059599516SKenneth E. Jansen               void* array,
59159599516SKenneth E. Jansen               char* arraytype,
59259599516SKenneth E. Jansen               int* nshg,
59359599516SKenneth E. Jansen               int* numvars,
59459599516SKenneth E. Jansen               int* stepno) {
59559599516SKenneth E. Jansen 
59659599516SKenneth E. Jansen     //printf("Rank is %d, field is %s, tagsize is %d, nshg is %d, numvars is %d\n",*pid,fieldtag,*tagsize,*nshg,*numvars);
59759599516SKenneth E. Jansen 
59859599516SKenneth E. Jansen     char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char));
59959599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
60059599516SKenneth E. Jansen     fieldlabel[*tagsize] = '\0';
60159599516SKenneth E. Jansen 
60259599516SKenneth E. Jansen     int irstou;
60359599516SKenneth E. Jansen     int magic_number = 362436;
60459599516SKenneth E. Jansen     int* mptr = &magic_number;
60559599516SKenneth E. Jansen     double version=0.0;
60659599516SKenneth E. Jansen     int isize, nitems;
60759599516SKenneth E. Jansen     int iarray[10];
60859599516SKenneth E. Jansen 
60959599516SKenneth E. Jansen     char fmode[10];
61059599516SKenneth E. Jansen     if(!strncmp(filemode,"w",1))
61159599516SKenneth E. Jansen       strcpy(fmode,"write");
61259599516SKenneth E. Jansen     else // default is append
61359599516SKenneth E. Jansen       strcpy(fmode,"append");
61459599516SKenneth E. Jansen 
61559599516SKenneth E. Jansen     char datatype[10];
61659599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
61759599516SKenneth E. Jansen       strcpy(datatype,"int");
61859599516SKenneth E. Jansen     else // default is double
61959599516SKenneth E. Jansen       strcpy(datatype,"double");
62059599516SKenneth E. Jansen 
62159599516SKenneth E. Jansen //   Old posix format
62259599516SKenneth E. Jansen /*     openfile_(rfile, fmode, &irstou);
62359599516SKenneth E. Jansen 
62459599516SKenneth E. Jansen      nitems = 3; // assuming field will write 3 items in iarray
62559599516SKenneth E. Jansen      iarray[ 0 ] = (*nshg);
62659599516SKenneth E. Jansen      iarray[ 1 ] = (*numvars);
62759599516SKenneth E. Jansen      iarray[ 2 ] = (*stepno);
62859599516SKenneth E. Jansen 
62959599516SKenneth E. Jansen      isize = (*nshg)*(*numvars);
63059599516SKenneth E. Jansen      writeheader_( &irstou, fieldlabel, (void*)iarray, &nitems, &isize, datatype, phasta_iotype );
63159599516SKenneth E. Jansen 
63259599516SKenneth E. Jansen      nitems = (*nshg)*(*numvars);
63359599516SKenneth E. Jansen      writedatablock_( &irstou, fieldlabel, array, &nitems, datatype, phasta_iotype );
63459599516SKenneth E. Jansen      closefile_( &irstou, fmode);
63559599516SKenneth E. Jansen */
63659599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
63759599516SKenneth E. Jansen 
63859599516SKenneth E. Jansen     int nfiles;
63959599516SKenneth E. Jansen     int nfields;
64059599516SKenneth E. Jansen     int numparts;
64159599516SKenneth E. Jansen     int irank;
64259599516SKenneth E. Jansen     int nprocs;
64359599516SKenneth E. Jansen 
64459599516SKenneth E. Jansen //    unsigned long long timer_start;
64559599516SKenneth E. Jansen //    unsigned long long timer_end;
64659599516SKenneth E. Jansen //    double time_span;
64759599516SKenneth E. Jansen 
64859599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
64959599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
65059599516SKenneth E. Jansen     numparts = workfc.numpe;
65159599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
65259599516SKenneth E. Jansen     nprocs = workfc.numpe;
65359599516SKenneth E. Jansen 
65459599516SKenneth E. Jansen     int nppf = numparts/nfiles;
65559599516SKenneth E. Jansen     int GPID;
65659599516SKenneth E. Jansen 
65759599516SKenneth E. Jansen     // Calculate number of parts each  proc deal with and where it start and end ...
65859599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
65959599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
66059599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
66159599516SKenneth E. Jansen 
66259599516SKenneth E. Jansen     char fieldtag_s[255];
66359599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
66459599516SKenneth E. Jansen 
66559599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
66659599516SKenneth E. Jansen 
66759599516SKenneth E. Jansen     field_flag++;
66859599516SKenneth E. Jansen     if(*pid==0) {
66959599516SKenneth E. Jansen       printf("\n");
67059599516SKenneth E. Jansen       printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel);
67159599516SKenneth E. Jansen     }
67259599516SKenneth E. Jansen 
67359599516SKenneth E. Jansen     int i;
67459599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++  ) {
67559599516SKenneth E. Jansen         GPID = startpart + i;
67659599516SKenneth E. Jansen 
67759599516SKenneth E. Jansen         // Write solution field ...
67859599516SKenneth E. Jansen         sprintf(fieldtag_s,"%s@%d",fieldlabel,GPID);
67959599516SKenneth E. Jansen 
68059599516SKenneth E. Jansen         isize = (*nshg)*(*numvars);
68159599516SKenneth E. Jansen         nitems = 3;
68259599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
68359599516SKenneth E. Jansen         iarray[ 1 ] = (*numvars);
68459599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
68559599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, datatype, phasta_iotype);
68659599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, array, &isize, datatype, phasta_iotype );
68759599516SKenneth E. Jansen     }
68859599516SKenneth E. Jansen 
68959599516SKenneth E. Jansen     if (field_flag==nfields){
69059599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
69159599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
69259599516SKenneth E. Jansen       if (*pid==0) {
69359599516SKenneth E. Jansen         printf("Last field %d '%s' finished! \n",nfields, fieldtag);
69459599516SKenneth E. Jansen         printf("\n");
69559599516SKenneth E. Jansen       }
69659599516SKenneth E. Jansen     }
69759599516SKenneth E. Jansen 
69859599516SKenneth E. Jansen     free(fieldlabel);
69959599516SKenneth E. Jansen }
70059599516SKenneth E. Jansen 
70159599516SKenneth 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)70259599516SKenneth E. Jansen Write_PhAvg(  int* pid,
70359599516SKenneth E. Jansen               char* filemode,
70459599516SKenneth E. Jansen               char* fieldtag,
70559599516SKenneth E. Jansen               int* tagsize,
70659599516SKenneth E. Jansen               int* iphase,
70759599516SKenneth E. Jansen               void* array,
70859599516SKenneth E. Jansen               char* arraytype,
70959599516SKenneth E. Jansen               int* nshg,
71059599516SKenneth E. Jansen               int* numvars,
71159599516SKenneth E. Jansen               int* stepno) {
71259599516SKenneth E. Jansen 
71359599516SKenneth E. Jansen     char rfile[32];
71459599516SKenneth E. Jansen     // assuming restart_phase_avg_<sn>.<iphase>.<pid+1>
71559599516SKenneth E. Jansen     sprintf(rfile,"restart_phase_avg_%d.%d.%d",*stepno,*iphase,*pid+1);
71659599516SKenneth E. Jansen 
71759599516SKenneth E. Jansen     char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char));
71859599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
71959599516SKenneth E. Jansen     fieldlabel[*tagsize] = '\0';
72059599516SKenneth E. Jansen 
72159599516SKenneth E. Jansen     int irstou;
72259599516SKenneth E. Jansen     int isize, nitems;
72359599516SKenneth E. Jansen     int iarray[10];
72459599516SKenneth E. Jansen 
72559599516SKenneth E. Jansen     char fmode[10];
72659599516SKenneth E. Jansen     if(!strncmp(filemode,"w",1))
72759599516SKenneth E. Jansen       strcpy(fmode,"write");
72859599516SKenneth E. Jansen     else // default is append
72959599516SKenneth E. Jansen       strcpy(fmode,"append");
73059599516SKenneth E. Jansen 
73159599516SKenneth E. Jansen     char datatype[10];
73259599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
73359599516SKenneth E. Jansen       strcpy(datatype,"int");
73459599516SKenneth E. Jansen     else // default is double
73559599516SKenneth E. Jansen       strcpy(datatype,"double");
73659599516SKenneth E. Jansen 
73759599516SKenneth E. Jansen     openfile(rfile, fmode, &irstou);
73859599516SKenneth E. Jansen 
73959599516SKenneth E. Jansen     if(!strcmp(fmode,"write")) {
74059599516SKenneth E. Jansen       // may be create a routine for 'top' portion under write mode
74159599516SKenneth E. Jansen       int magic_number = 362436;
74259599516SKenneth E. Jansen       int* mptr = &magic_number;
74359599516SKenneth E. Jansen       time_t timenow = time ( &timenow);
74459599516SKenneth E. Jansen       double version=0.0;
74559599516SKenneth E. Jansen 
74659599516SKenneth E. Jansen       /* writing the top ascii header for the restart file */
74759599516SKenneth E. Jansen 
74859599516SKenneth E. Jansen       writestring( &irstou,"# PHASTA Input File Version 2.0\n");
74959599516SKenneth E. Jansen       writestring( &irstou,
75059599516SKenneth E. Jansen                     "# format \"keyphrase : sizeofnextblock usual headers\"\n");
75159599516SKenneth E. Jansen 
75259599516SKenneth E. Jansen       char fname[255];
75359599516SKenneth E. Jansen       bzero( (void*)fname, 255 );
75459599516SKenneth E. Jansen       sprintf(fname,"# Output generated by phasta version (NOT YET CURRENT): %lf \n", version);
75559599516SKenneth E. Jansen       writestring( &irstou, fname );
75659599516SKenneth E. Jansen 
75759599516SKenneth E. Jansen       bzero( (void*)fname, 255 );
75859599516SKenneth E. Jansen       gethostname(fname,255);
75959599516SKenneth E. Jansen       writestring( &irstou,"# This result was produced on: ");
76059599516SKenneth E. Jansen       writestring( &irstou, fname );
76159599516SKenneth E. Jansen       writestring( &irstou,"\n");
76259599516SKenneth E. Jansen 
76359599516SKenneth E. Jansen       bzero( (void*)fname, 255 );
76459599516SKenneth E. Jansen       sprintf(fname,"# %s\n", ctime( &timenow ));
76559599516SKenneth E. Jansen       writestring( &irstou, fname );
76659599516SKenneth E. Jansen 
76759599516SKenneth E. Jansen       isize = 1;
76859599516SKenneth E. Jansen       nitems = 1;
76959599516SKenneth E. Jansen       iarray[ 0 ] = 1;
77059599516SKenneth E. Jansen       writeheader( &irstou, "byteorder magic number ",
77159599516SKenneth E. Jansen                     (void*)iarray, &nitems, &isize, "integer", phasta_iotype );
77259599516SKenneth E. Jansen       writedatablock( &irstou, "byteorder magic number ",
77359599516SKenneth E. Jansen                        (void*)mptr, &isize, "integer", phasta_iotype );
77459599516SKenneth E. Jansen     }
77559599516SKenneth E. Jansen 
77659599516SKenneth E. Jansen     isize = (*nshg)*(*numvars);
77759599516SKenneth E. Jansen     nitems = 3; // assuming field will write 3 items in iarray
77859599516SKenneth E. Jansen     iarray[ 0 ] = (*nshg);
77959599516SKenneth E. Jansen     iarray[ 1 ] = (*numvars);
78059599516SKenneth E. Jansen     iarray[ 2 ] = (*stepno);
78159599516SKenneth E. Jansen     writeheader( &irstou, fieldlabel, (void*)iarray, &nitems, &isize, datatype, phasta_iotype );
78259599516SKenneth E. Jansen     writedatablock( &irstou, fieldlabel, array, &isize, datatype, phasta_iotype );
78359599516SKenneth E. Jansen 
78459599516SKenneth E. Jansen     closefile( &irstou, fmode);
78559599516SKenneth E. Jansen 
78659599516SKenneth E. Jansen     free(fieldlabel);
78759599516SKenneth E. Jansen }
78859599516SKenneth E. Jansen 
78959599516SKenneth 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)79059599516SKenneth E. Jansen Write_PhAvg2( int* pid,
79159599516SKenneth E. Jansen               char* filemode,
79259599516SKenneth E. Jansen               char* fieldtag,
79359599516SKenneth E. Jansen               int* tagsize,
79459599516SKenneth E. Jansen               int* iphase,
79559599516SKenneth E. Jansen               int* nphasesincycle,
79659599516SKenneth E. Jansen               void* array,
79759599516SKenneth E. Jansen               char* arraytype,
79859599516SKenneth E. Jansen               int* nshg,
79959599516SKenneth E. Jansen               int* numvars,
80059599516SKenneth E. Jansen               int* stepno) {
80159599516SKenneth E. Jansen 
802*3de22adcSCameron Smith     int addtagsize=0; // phase number is added to the name of the field
80359599516SKenneth E. Jansen     if(*iphase<10)
80459599516SKenneth E. Jansen       addtagsize=1;
80559599516SKenneth E. Jansen     else if(*iphase<100)
80659599516SKenneth E. Jansen       addtagsize=2;
80759599516SKenneth E. Jansen     else if(*iphase<1000)
80859599516SKenneth E. Jansen       addtagsize=3;
80959599516SKenneth E. Jansen 
81059599516SKenneth E. Jansen     int tagsize2;
81159599516SKenneth E. Jansen     tagsize2=*tagsize+addtagsize;
81259599516SKenneth E. Jansen 
81359599516SKenneth E. Jansen     char *fieldlabel = (char *)malloc((tagsize2+1)*sizeof(char));
81459599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
81559599516SKenneth E. Jansen     fieldlabel[tagsize2] = '\0';
81659599516SKenneth E. Jansen 
81759599516SKenneth E. Jansen     char straddtagsize[10];
81859599516SKenneth E. Jansen     sprintf(straddtagsize,"%d",*iphase);
81959599516SKenneth E. Jansen 
82059599516SKenneth E. Jansen     if(*iphase<10) {
82159599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[0];
82259599516SKenneth E. Jansen     }
82359599516SKenneth E. Jansen     else if(*iphase<100) {
82459599516SKenneth E. Jansen       fieldlabel[tagsize2-2]=straddtagsize[0];
82559599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[1];
82659599516SKenneth E. Jansen     }
82759599516SKenneth E. Jansen     else if(*iphase<1000) {
82859599516SKenneth E. Jansen       fieldlabel[tagsize2-3]=straddtagsize[0];
82959599516SKenneth E. Jansen       fieldlabel[tagsize2-2]=straddtagsize[1];
83059599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[2];
83159599516SKenneth E. Jansen     }
83259599516SKenneth E. Jansen 
83359599516SKenneth E. Jansen     int irstou;
83459599516SKenneth E. Jansen     int magic_number = 362436;
83559599516SKenneth E. Jansen     int* mptr = &magic_number;
83659599516SKenneth E. Jansen     double version=0.0;
83759599516SKenneth E. Jansen     int isize, nitems;
83859599516SKenneth E. Jansen     int iarray[10];
83959599516SKenneth E. Jansen 
84059599516SKenneth E. Jansen     char fmode[10];
84159599516SKenneth E. Jansen     if(!strncmp(filemode,"w",1))
84259599516SKenneth E. Jansen       strcpy(fmode,"write");
84359599516SKenneth E. Jansen     else // default is append
84459599516SKenneth E. Jansen       strcpy(fmode,"append");
84559599516SKenneth E. Jansen 
84659599516SKenneth E. Jansen     char datatype[10];
84759599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
84859599516SKenneth E. Jansen       strcpy(datatype,"int");
84959599516SKenneth E. Jansen     else // default is double
85059599516SKenneth E. Jansen       strcpy(datatype,"double");
85159599516SKenneth E. Jansen 
85259599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
85359599516SKenneth E. Jansen 
85459599516SKenneth E. Jansen     int nfiles;
85559599516SKenneth E. Jansen     int nfields;
85659599516SKenneth E. Jansen     int numparts;
85759599516SKenneth E. Jansen     int irank;
85859599516SKenneth E. Jansen     int nprocs;
85959599516SKenneth E. Jansen 
86059599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
86159599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
86259599516SKenneth E. Jansen     numparts = workfc.numpe;
86359599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
86459599516SKenneth E. Jansen     nprocs = workfc.numpe;
86559599516SKenneth E. Jansen 
86659599516SKenneth E. Jansen     int nppf = numparts/nfiles;
86759599516SKenneth E. Jansen     int GPID;
86859599516SKenneth E. Jansen 
86959599516SKenneth E. Jansen     // Calculate number of parts each  proc deal with and where it start and end ...
87059599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
87159599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
87259599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
87359599516SKenneth E. Jansen 
87459599516SKenneth E. Jansen     char fieldtag_s[255];
87559599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
87659599516SKenneth E. Jansen 
87759599516SKenneth E. Jansen     field_flag++;
87859599516SKenneth E. Jansen     if(*pid==0) {
87959599516SKenneth E. Jansen       printf("\n");
88059599516SKenneth E. Jansen       printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel);
88159599516SKenneth E. Jansen     }
88259599516SKenneth E. Jansen 
88359599516SKenneth E. Jansen     int i;
88459599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++  ) {
88559599516SKenneth E. Jansen         GPID = startpart + i;
88659599516SKenneth E. Jansen 
88759599516SKenneth E. Jansen         // Write solution field ...
88859599516SKenneth E. Jansen         sprintf(fieldtag_s,"%s@%d",fieldlabel,GPID);
88959599516SKenneth E. Jansen 
89059599516SKenneth E. Jansen         isize = (*nshg)*(*numvars);
89159599516SKenneth E. Jansen         nitems = 3;
89259599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
89359599516SKenneth E. Jansen         iarray[ 1 ] = (*numvars);
89459599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
89559599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
89659599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, array, &isize, "double", phasta_iotype );
89759599516SKenneth E. Jansen     }
89859599516SKenneth E. Jansen 
89959599516SKenneth E. Jansen     if (field_flag==nfields){
90059599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
90159599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
90259599516SKenneth E. Jansen       if (*pid==0) {
90359599516SKenneth E. Jansen         printf("\n");
90459599516SKenneth E. Jansen       }
90559599516SKenneth E. Jansen     }
90659599516SKenneth E. Jansen 
90759599516SKenneth E. Jansen     free(fieldlabel);
90859599516SKenneth E. Jansen }
90959599516SKenneth E. Jansen 
91059599516SKenneth E. Jansen 
91159599516SKenneth E. Jansen void
Write_d2wall(int * pid,int * numnp,double * array1)91259599516SKenneth E. Jansen Write_d2wall(   int* pid,
91359599516SKenneth E. Jansen                 int* numnp,
91459599516SKenneth E. Jansen                 double* array1 ) {
91559599516SKenneth E. Jansen 
91659599516SKenneth E. Jansen     int isize, nitems;
91759599516SKenneth E. Jansen     int iarray[10];
91859599516SKenneth E. Jansen 
91959599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
92059599516SKenneth E. Jansen 
92159599516SKenneth E. Jansen     int nfiles;
92259599516SKenneth E. Jansen     int nfields;
92359599516SKenneth E. Jansen     int numparts;
92459599516SKenneth E. Jansen     int irank;
92559599516SKenneth E. Jansen     int nprocs;
92659599516SKenneth E. Jansen 
92759599516SKenneth E. Jansen     //  First, count the number of fields to write and store the result in
92859599516SKenneth E. Jansen     //countfieldstowriterestart();
92959599516SKenneth E. Jansen 
93059599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
93159599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
93259599516SKenneth E. Jansen     nfields = 1; //outpar.nsynciofieldswriterestart;  // Only the distance to the walls in d2wall
93359599516SKenneth E. Jansen     numparts = workfc.numpe;
93459599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
93559599516SKenneth E. Jansen     nprocs = workfc.numpe;
93659599516SKenneth E. Jansen     int nppf = numparts/nfiles;
93759599516SKenneth E. Jansen     int GPID;
93859599516SKenneth E. Jansen 
93959599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
94059599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
94159599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
94259599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
94359599516SKenneth E. Jansen 
94459599516SKenneth E. Jansen     int descriptor;
94559599516SKenneth E. Jansen     char filename[255],fieldtag_s[255];
94659599516SKenneth E. Jansen     bzero((void*)filename,255);
94759599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
94859599516SKenneth E. Jansen 
94959599516SKenneth E. Jansen     sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1));
95059599516SKenneth E. Jansen 
95159599516SKenneth E. Jansen     if (irank==0) {
95259599516SKenneth E. Jansen       printf("Filename is %s \n",filename);
95359599516SKenneth E. Jansen     }
95459599516SKenneth E. Jansen 
95559599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write");
95659599516SKenneth E. Jansen 
95759599516SKenneth E. Jansen     openfile(filename, "write", &f_descriptor);
95859599516SKenneth E. Jansen 
95959599516SKenneth E. Jansen     field_flag=0;
96059599516SKenneth E. Jansen 
96159599516SKenneth E. Jansen      int i;
96259599516SKenneth E. Jansen      for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
96359599516SKenneth E. Jansen      // GPID : global part id, corresponds to rank ...
96459599516SKenneth E. Jansen         // e.g : (in this example)
96559599516SKenneth E. Jansen         // proc 0 : 1--4
96659599516SKenneth E. Jansen         // proc 1 : 5--8 ...
96759599516SKenneth E. Jansen         GPID = startpart + i;
96859599516SKenneth E. Jansen 
96959599516SKenneth E. Jansen         // Write solution field ...
97059599516SKenneth E. Jansen         sprintf(fieldtag_s,"d2wall@%d",GPID);
97159599516SKenneth E. Jansen 
97259599516SKenneth E. Jansen         isize = (*numnp);
97359599516SKenneth E. Jansen         nitems = 2;
97459599516SKenneth E. Jansen         iarray[ 0 ] = (*numnp);
97559599516SKenneth E. Jansen         iarray[ 1 ] = 1; //numVars = 1
97659599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
97759599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
97859599516SKenneth E. Jansen     }
97959599516SKenneth E. Jansen     field_flag++;
98059599516SKenneth E. Jansen 
98159599516SKenneth E. Jansen     if (field_flag==nfields){
98259599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
98359599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
98459599516SKenneth E. Jansen       if (irank==0) {
98559599516SKenneth E. Jansen         printf("\n");
98659599516SKenneth E. Jansen       }
98759599516SKenneth E. Jansen     }
98859599516SKenneth E. Jansen }
98959599516SKenneth E. Jansen 
990