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