xref: /phasta/phSolver/common/new_interface.c (revision 32eed1412d9a3e748fe578866226c6021c4817b2)
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 "rdtsc.h"
1559599516SKenneth E. Jansen #include <FCMangle.h>
1659599516SKenneth E. Jansen #include "new_interface.h"
1759599516SKenneth E. Jansen 
1859599516SKenneth E. Jansen //MR CHANGE
1959599516SKenneth E. Jansen #include "common_c.h"
2059599516SKenneth E. Jansen //MR CHANGE END
2159599516SKenneth E. Jansen 
2259599516SKenneth E. Jansen #ifdef intel
2359599516SKenneth E. Jansen #include <winsock2.h>
2459599516SKenneth E. Jansen #else
2559599516SKenneth E. Jansen #include <unistd.h>
2659599516SKenneth E. Jansen #include <strings.h>
2759599516SKenneth E. Jansen #endif
2859599516SKenneth E. Jansen 
2959599516SKenneth E. Jansen //extern double cpu_speed = 2600000000.0; //for Jaguar XT5
3059599516SKenneth E. Jansen //extern double cpu_speed = 2100000000.0;  //for Jaguar xt4
3159599516SKenneth E. Jansen //extern double cpu_speed =  850000000.0;  //for Intrepid
3259599516SKenneth E. Jansen 
3359599516SKenneth E. Jansen void igetMinMaxAvg(int *ivalue, double *stats, int *statRanks) {
3459599516SKenneth E. Jansen   int isThisRank;
3559599516SKenneth E. Jansen 
3659599516SKenneth E. Jansen   double *value = (double*)malloc(sizeof(double));
3759599516SKenneth E. Jansen   *value = 1.0*(*ivalue);
3859599516SKenneth E. Jansen 
3959599516SKenneth E. Jansen   rgetMinMaxAvg(value,stats,statRanks);
4059599516SKenneth E. Jansen 
4159599516SKenneth E. Jansen   /* MPI_Allreduce(value,&stats[0],1,MPI_DOUBLE,MPI_MIN,MPI_COMM_WORLD);
4259599516SKenneth E. Jansen   isThisRank=workfc.numpe+1;
4359599516SKenneth E. Jansen   if(*value==stats[0])
4459599516SKenneth E. Jansen     isThisRank=workfc.myrank;
4559599516SKenneth E. Jansen   MPI_Allreduce(&isThisRank,&statRanks[0],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
4659599516SKenneth E. Jansen 
4759599516SKenneth E. Jansen   MPI_Allreduce(value,&stats[1],1,MPI_DOUBLE,MPI_MAX,MPI_COMM_WORLD);
4859599516SKenneth E. Jansen   isThisRank=workfc.numpe+1;
4959599516SKenneth E. Jansen   if(*value==stats[1])
5059599516SKenneth E. Jansen     isThisRank=workfc.myrank;
5159599516SKenneth E. Jansen   MPI_Allreduce(&isThisRank,&statRanks[1],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
5259599516SKenneth E. Jansen 
5359599516SKenneth E. Jansen   MPI_Allreduce(value,&stats[2],1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
5459599516SKenneth E. Jansen   stats[2] /= workfc.numpe; */
5559599516SKenneth E. Jansen 
5659599516SKenneth E. Jansen   free(value);
5759599516SKenneth E. Jansen }
5859599516SKenneth E. Jansen 
5959599516SKenneth E. Jansen void rgetMinMaxAvg(double *value, double *stats, int *statRanks) {
6059599516SKenneth E. Jansen   int isThisRank;
6159599516SKenneth E. Jansen 
6259599516SKenneth E. Jansen   MPI_Allreduce(value,&stats[0],1,MPI_DOUBLE,MPI_MIN,MPI_COMM_WORLD);
6359599516SKenneth E. Jansen   isThisRank=workfc.numpe+1;
6459599516SKenneth E. Jansen   if(*value==stats[0])
6559599516SKenneth E. Jansen     isThisRank=workfc.myrank;
6659599516SKenneth E. Jansen   MPI_Allreduce(&isThisRank,&statRanks[0],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
6759599516SKenneth E. Jansen 
6859599516SKenneth E. Jansen   MPI_Allreduce(value,&stats[1],1,MPI_DOUBLE,MPI_MAX,MPI_COMM_WORLD);
6959599516SKenneth E. Jansen   isThisRank=workfc.numpe+1;
7059599516SKenneth E. Jansen   if(*value==stats[1])
7159599516SKenneth E. Jansen     isThisRank=workfc.myrank;
7259599516SKenneth E. Jansen   MPI_Allreduce(&isThisRank,&statRanks[1],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
7359599516SKenneth E. Jansen 
7459599516SKenneth E. Jansen   MPI_Allreduce(value,&stats[2],1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
7559599516SKenneth E. Jansen   stats[2] /= workfc.numpe;
7659599516SKenneth E. Jansen 
7759599516SKenneth E. Jansen   double sqValue = (*value)*(*value), sqValueAvg = 0.;
7859599516SKenneth E. Jansen   MPI_Allreduce(&sqValue,&sqValueAvg,1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
7959599516SKenneth E. Jansen   sqValueAvg /= workfc.numpe;
8059599516SKenneth E. Jansen   // stats[3] = sqValueAvg;
8159599516SKenneth E. Jansen 
8259599516SKenneth E. Jansen   stats[3] = sqrt(sqValueAvg-stats[2]*stats[2]);
8359599516SKenneth E. Jansen }
8459599516SKenneth E. Jansen 
8559599516SKenneth E. Jansen void print_mesh_stats(void) {
8659599516SKenneth E. Jansen   int statRanks[2];
8759599516SKenneth E. Jansen   double iStats[4], rStats[4];
8859599516SKenneth E. Jansen 
8959599516SKenneth E. Jansen   igetMinMaxAvg(&conpar.nshg,iStats,statRanks);
9059599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
9159599516SKenneth E. Jansen     printf("nshg    : min [%d,%d], max[%d,%d] and avg[.,%d] (rms=%d)\n",statRanks[0],(int)iStats[0],statRanks[1],(int)iStats[1],(int)iStats[2],(int)iStats[3]);
9259599516SKenneth E. Jansen   igetMinMaxAvg(&conpar.numel,iStats,statRanks);
9359599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
9459599516SKenneth E. Jansen     printf("numel   : min [%d,%d], max[%d,%d] and avg[.,%d] (rms=%d)\n",statRanks[0],(int)iStats[0],statRanks[1],(int)iStats[1],(int)iStats[2],(int)iStats[3]);
9559599516SKenneth E. Jansen   igetMinMaxAvg(&conpar.numelb,iStats,statRanks);
9659599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
9759599516SKenneth E. Jansen     printf("numelb  : min [%d,%d], max[%d,%d] and avg[.,%d] (rms=%d)\n",statRanks[0],(int)iStats[0],statRanks[1],(int)iStats[1],(int)iStats[2],(int)iStats[3]);
9859599516SKenneth E. Jansen   igetMinMaxAvg(&conpar.nnz_tot,iStats,statRanks);
9959599516SKenneth E. Jansen   if(workfc.myrank==workfc.master) {
10059599516SKenneth E. Jansen     printf("nnz_tot : min [%d,%d], max[%d,%d] and avg[.,%d] (rms=%d)\n",statRanks[0],(int)iStats[0],statRanks[1],(int)iStats[1],(int)iStats[2],(int)iStats[3]);
10159599516SKenneth E. Jansen     printf("\n");
10259599516SKenneth E. Jansen   }
10359599516SKenneth E. Jansen }
10459599516SKenneth E. Jansen 
10559599516SKenneth E. Jansen void print_mpi_stats(void) {
10659599516SKenneth E. Jansen   int statRanks[2];
10759599516SKenneth E. Jansen   double iStats[4], rStats[4];
10859599516SKenneth E. Jansen 
10959599516SKenneth E. Jansen // NS equations
11059599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iISend,iStats,statRanks);
11159599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
11259599516SKenneth E. Jansen     printf("iISend : min [%d,%d], max[%d,%d] and avg[.,%d] (rms=%d)\n",statRanks[0],(int)iStats[0],statRanks[1],(int)iStats[1],(int)iStats[2],(int)iStats[3]);
11359599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iIRecv,iStats,statRanks);
11459599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
11559599516SKenneth E. Jansen     printf("iIRecv : min [%d,%d], max[%d,%d] and avg[.,%d] (rms=%d)\n",statRanks[0],(int)iStats[0],statRanks[1],(int)iStats[1],(int)iStats[2],(int)iStats[3]);
11659599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iWaitAll,iStats,statRanks);
11759599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
11859599516SKenneth E. Jansen     printf("iWtAll : min [%d,%d], max[%d,%d] and avg[.,%d] (rms=%d)\n",statRanks[0],(int)iStats[0],statRanks[1],(int)iStats[1],(int)iStats[2],(int)iStats[3]);
11959599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iAllR,iStats,statRanks);
12059599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
12159599516SKenneth E. Jansen     printf("iAllR  : min [%d,%d], max[%d,%d] and avg[.,%d] (rms=%d)\n",statRanks[0],(int)iStats[0],statRanks[1],(int)iStats[1],(int)iStats[2],(int)iStats[3]);
12259599516SKenneth E. Jansen 
12359599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rISend,rStats,statRanks);
12459599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
12559599516SKenneth E. Jansen     printf("rISend : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
12659599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rIRecv,rStats,statRanks);
12759599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
12859599516SKenneth E. Jansen     printf("rIRecv : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
12959599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rWaitAll,rStats,statRanks);
13059599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
13159599516SKenneth E. Jansen     printf("rWtAll : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
13259599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rCommu,rStats,statRanks);
13359599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
13459599516SKenneth E. Jansen     printf("rCommu : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
13559599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rAllR,rStats,statRanks);
13659599516SKenneth E. Jansen   if(workfc.myrank==workfc.master) {
13759599516SKenneth E. Jansen     printf("rAllR  : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
13859599516SKenneth E. Jansen     printf("\n");
13959599516SKenneth E. Jansen   }
14059599516SKenneth E. Jansen // Scalars
14159599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iISendScal,iStats,statRanks);
14259599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
14359599516SKenneth E. Jansen     printf("iISendScal : min [%d,%d], max[%d,%d] and avg[.,%d] (rms=%d)\n",statRanks[0],(int)iStats[0],statRanks[1],(int)iStats[1],(int)iStats[2],(int)iStats[3]);
14459599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iIRecvScal,iStats,statRanks);
14559599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
14659599516SKenneth E. Jansen     printf("iIRecvScal : min [%d,%d], max[%d,%d] and avg[.,%d] (rms=%d)\n",statRanks[0],(int)iStats[0],statRanks[1],(int)iStats[1],(int)iStats[2],(int)iStats[3]);
14759599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iWaitAllScal,iStats,statRanks);
14859599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
14959599516SKenneth E. Jansen     printf("iWtAllScal : min [%d,%d], max[%d,%d] and avg[.,%d] (rms=%d)\n",statRanks[0],(int)iStats[0],statRanks[1],(int)iStats[1],(int)iStats[2],(int)iStats[3]);
15059599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iAllRScal,iStats,statRanks);
15159599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
15259599516SKenneth E. Jansen     printf("iAllRScal : min [%d,%d], max[%d,%d] and avg[.,%d] (rms=%d)\n",statRanks[0],(int)iStats[0],statRanks[1],(int)iStats[1],(int)iStats[2],(int)iStats[3]);
15359599516SKenneth E. Jansen 
15459599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rISendScal,rStats,statRanks);
15559599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
15659599516SKenneth E. Jansen     printf("rISendScal : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
15759599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rIRecvScal,rStats,statRanks);
15859599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
15959599516SKenneth E. Jansen     printf("rIRecvScal : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
16059599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rWaitAllScal,rStats,statRanks);
16159599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
16259599516SKenneth E. Jansen     printf("rWtAllScal : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
16359599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rCommuScal,rStats,statRanks);
16459599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
16559599516SKenneth E. Jansen     printf("rCommuScal : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
16659599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rAllRScal,rStats,statRanks);
16759599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
16859599516SKenneth E. Jansen     printf("rAllRScal  : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
16959599516SKenneth E. Jansen 
17059599516SKenneth E. Jansen 
17159599516SKenneth E. Jansen }
17259599516SKenneth E. Jansen 
17359599516SKenneth E. Jansen //void print_system_stats(double tcorecp[2]) {
17459599516SKenneth E. Jansen void print_system_stats(double *tcorecp, double *tcorecpscal) {
17559599516SKenneth E. Jansen   int statRanks[2];
17659599516SKenneth E. Jansen   double iStats[4], rStats[4];
17759599516SKenneth E. Jansen   double syst_assembly, syst_solve;
17859599516SKenneth E. Jansen 
17959599516SKenneth E. Jansen // NS equations
18059599516SKenneth E. Jansen   syst_assembly = tcorecp[0];
18159599516SKenneth E. Jansen   syst_solve = tcorecp[1];
18259599516SKenneth E. Jansen 
18359599516SKenneth E. Jansen   rgetMinMaxAvg(&syst_assembly,rStats,statRanks);
18459599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
18559599516SKenneth E. Jansen     printf("Elm. form. : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
18659599516SKenneth E. Jansen 
18759599516SKenneth E. Jansen   rgetMinMaxAvg(&syst_solve,rStats,statRanks);
18859599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
18959599516SKenneth E. Jansen     printf("Lin. alg. sol : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
19059599516SKenneth E. Jansen 
19159599516SKenneth E. Jansen // Scalars
19259599516SKenneth E. Jansen   syst_assembly = tcorecpscal[0];
19359599516SKenneth E. Jansen   syst_solve = tcorecpscal[1];
19459599516SKenneth E. Jansen 
19559599516SKenneth E. Jansen   rgetMinMaxAvg(&syst_assembly,rStats,statRanks);
19659599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
19759599516SKenneth E. Jansen     printf("Elm. form. Scal. : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
19859599516SKenneth E. Jansen 
19959599516SKenneth E. Jansen   rgetMinMaxAvg(&syst_solve,rStats,statRanks);
20059599516SKenneth E. Jansen   if(workfc.myrank==workfc.master) {
20159599516SKenneth E. Jansen     printf("Lin. alg. sol Scal. : min [%d,%2.5f], max[%d,%2.5f] and avg[.,%2.5f] (rms=%2.5f)\n",statRanks[0],rStats[0],statRanks[1],rStats[1],rStats[2],rStats[3]);
20259599516SKenneth E. Jansen     printf("\n");
20359599516SKenneth E. Jansen   }
20459599516SKenneth E. Jansen   //printf("rank %d - syst_assembly %f - syst_solve %f\n",workfc.myrank,syst_assembly,syst_solve);
20559599516SKenneth E. Jansen }
20659599516SKenneth E. Jansen 
20759599516SKenneth E. Jansen 
20859599516SKenneth E. Jansen 
20959599516SKenneth E. Jansen void countfieldstowriterestart()
21059599516SKenneth E. Jansen {
21159599516SKenneth E. Jansen   int nfields;
21259599516SKenneth E. Jansen 
21359599516SKenneth E. Jansen //     printf("TEST: %d %d %d %d %d\n",timdat.istep,timdat.itseq,inpdat.nstep[0],inpdat.nstep[1],timdat.lstep);
21459599516SKenneth E. Jansen 
21559599516SKenneth E. Jansen   nfields = 2; //solution, time derivatives
21659599516SKenneth E. Jansen 
21759599516SKenneth E. Jansen   if(outpar.ivort == 1){
21859599516SKenneth E. Jansen     nfields++; //vorticity
21959599516SKenneth E. Jansen   }
22059599516SKenneth E. Jansen 
22159599516SKenneth E. Jansen   if(abs(turbvar.itwmod) != 1 && outpar.iowflux == 1) {
22259599516SKenneth E. Jansen     nfields++; //instantaneous wss in bflux.f
22359599516SKenneth E. Jansen   }
22459599516SKenneth E. Jansen 
22559599516SKenneth E. Jansen //   if(ideformwall.eq.1) not handled yet
22659599516SKenneth E. Jansen 
227*32eed141SKenneth E. Jansen // KEJ says save all with this version
228*32eed141SKenneth E. Jansen // BEFORE we do animations, we will want to have a "saveall" frequency flag
229*32eed141SKenneth E. Jansen // if(timdat.istep == inpdat.nstep[timdat.itseq-1]){ //Last time step of the computation
23059599516SKenneth E. Jansen 
23159599516SKenneth E. Jansen     //projection vectors and pressure projection vectors (call saveLesRestart in itrdrv)
23259599516SKenneth E. Jansen     nfields = nfields +2;
23359599516SKenneth E. Jansen 
23459599516SKenneth E. Jansen     //if Print Error Indicators = true (call write_error in itrdrv)
23559599516SKenneth E. Jansen     if(turbvar.ierrcalc == 1){
23659599516SKenneth E. Jansen       nfields++;
23759599516SKenneth E. Jansen     }
23859599516SKenneth E. Jansen 
23959599516SKenneth E. Jansen     //if Print ybar = True (call write_field(myrank,'a','ybar',4,... in itrdrv)
24059599516SKenneth E. Jansen     if(outpar.ioybar == 1){
24159599516SKenneth E. Jansen       nfields++;  //ybar
24259599516SKenneth E. Jansen 
24359599516SKenneth E. Jansen       //phase average fields
24459599516SKenneth E. Jansen       if(outpar.nphasesincycle >0) {
24559599516SKenneth E. Jansen         nfields = nfields + outpar.nphasesincycle;
24659599516SKenneth E. Jansen       }
24759599516SKenneth E. Jansen 
24859599516SKenneth E. Jansen       if(abs(turbvar.itwmod) != 1 && outpar.iowflux == 1) {
24959599516SKenneth E. Jansen         nfields++; //wssbar
25059599516SKenneth E. Jansen       }
25159599516SKenneth E. Jansen 
25259599516SKenneth E. Jansen     }
25359599516SKenneth E. Jansen 
25459599516SKenneth E. Jansen     if(turbvari.irans < 0) {
25559599516SKenneth E. Jansen       nfields++; //dwal
25659599516SKenneth E. Jansen     }
25759599516SKenneth E. Jansen 
258*32eed141SKenneth E. Jansen //  }
25959599516SKenneth E. Jansen 
26059599516SKenneth E. Jansen   outpar.nsynciofieldswriterestart = nfields;
26159599516SKenneth E. Jansen 
26259599516SKenneth E. Jansen   if(workfc.myrank == 0) {
26359599516SKenneth E. Jansen     printf("Number of fields to write in restart files: %d\n", nfields);
26459599516SKenneth E. Jansen   }
26559599516SKenneth E. Jansen }
26659599516SKenneth E. Jansen 
26759599516SKenneth E. Jansen 
26859599516SKenneth E. Jansen void
26959599516SKenneth E. Jansen Write_Restart(  int* pid,
27059599516SKenneth E. Jansen                 int* stepno,
27159599516SKenneth E. Jansen                 int* nshg,
27259599516SKenneth E. Jansen                 int* numVars,
27359599516SKenneth E. Jansen                 double* array1,
27459599516SKenneth E. Jansen                 double* array2 ) {
27559599516SKenneth E. Jansen 
27659599516SKenneth E. Jansen     char fname[255];
27759599516SKenneth E. Jansen     char rfile[60];
27859599516SKenneth E. Jansen     char existingfile[30], linkfile[30];
27959599516SKenneth E. Jansen     int irstou;
28059599516SKenneth E. Jansen     int magic_number = 362436;
28159599516SKenneth E. Jansen     int* mptr = &magic_number;
28259599516SKenneth E. Jansen //    time_t timenow = time ( &timenow);
28359599516SKenneth E. Jansen     double version=0.0;
28459599516SKenneth E. Jansen     int isize, nitems;
28559599516SKenneth E. Jansen     int iarray[10];
28659599516SKenneth E. Jansen 
28759599516SKenneth E. Jansen     /*sprintf(rfile,"restart.%d.%d",*stepno,*pid+1);
28859599516SKenneth E. Jansen     openfile_(rfile,"write", &irstou);
28959599516SKenneth E. Jansen 
29059599516SKenneth E. Jansen     // writing the top ascii header for the restart file
29159599516SKenneth E. Jansen 
29259599516SKenneth E. Jansen     writestring_( &irstou,"# PHASTA Input File Version 2.0\n");
29359599516SKenneth E. Jansen     writestring_( &irstou,
29459599516SKenneth E. Jansen                   "# format \"keyphrase : sizeofnextblock usual headers\"\n");
29559599516SKenneth E. Jansen 
29659599516SKenneth E. Jansen     bzero( (void*)fname, 255 );
29759599516SKenneth E. Jansen     sprintf(fname,"# Output generated by phasta version (NOT YET CURRENT): %lf \n", version);
29859599516SKenneth E. Jansen     writestring_( &irstou, fname );
29959599516SKenneth E. Jansen 
30059599516SKenneth E. Jansen     bzero( (void*)fname, 255 );
30159599516SKenneth E. Jansen     gethostname(fname,255);
30259599516SKenneth E. Jansen     writestring_( &irstou,"# This result was produced on: ");
30359599516SKenneth E. Jansen     writestring_( &irstou, fname );
30459599516SKenneth E. Jansen     writestring_( &irstou,"\n");
30559599516SKenneth E. Jansen 
30659599516SKenneth E. Jansen     bzero( (void*)fname, 255 );
30759599516SKenneth E. Jansen     sprintf(fname,"# %s\n", ctime( &timenow ));
30859599516SKenneth E. Jansen     writestring_( &irstou, fname );
30959599516SKenneth E. Jansen 
31059599516SKenneth E. Jansen     isize = 1;
31159599516SKenneth E. Jansen     nitems = 1;
31259599516SKenneth E. Jansen     iarray[ 0 ] = 1;
31359599516SKenneth E. Jansen     writeheader_( &irstou, "byteorder magic number ",
31459599516SKenneth E. Jansen                   (void*)iarray, &nitems, &isize, "integer", phasta_iotype );
31559599516SKenneth E. Jansen 
31659599516SKenneth E. Jansen     nitems = 1;
31759599516SKenneth E. Jansen     writedatablock_( &irstou, "byteorder magic number ",
31859599516SKenneth E. Jansen                      (void*)mptr, &nitems, "integer", phasta_iotype );
31959599516SKenneth E. Jansen 
32059599516SKenneth E. Jansen 
32159599516SKenneth E. Jansen     bzero( (void*)fname, 255 );
32259599516SKenneth E. Jansen     sprintf(fname,"number of modes : < 0 > %d\n", *nshg);
32359599516SKenneth E. Jansen     writestring_( &irstou, fname );
32459599516SKenneth E. Jansen 
32559599516SKenneth E. Jansen     bzero( (void*)fname, 255 );
32659599516SKenneth E. Jansen     sprintf(fname,"number of variables : < 0 > %d\n", *numVars);
32759599516SKenneth E. Jansen     writestring_( &irstou, fname );
32859599516SKenneth E. Jansen 
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_( &irstou, "solution ",
33659599516SKenneth E. Jansen                   (void*)iarray, &nitems, &isize, "double", phasta_iotype );
33759599516SKenneth E. Jansen 
33859599516SKenneth E. Jansen 
33959599516SKenneth E. Jansen     nitems = (*nshg)*(*numVars);
34059599516SKenneth E. Jansen     writedatablock_( &irstou, "solution ",
34159599516SKenneth E. Jansen                      (void*)(array1), &nitems, "double", phasta_iotype );
34259599516SKenneth E. Jansen 
34359599516SKenneth E. Jansen 
34459599516SKenneth E. Jansen 
34559599516SKenneth E. Jansen     nitems = 3;
34659599516SKenneth E. Jansen     writeheader_( &irstou, "time derivative of solution ",
34759599516SKenneth E. Jansen                   (void*)iarray, &nitems, &isize, "double", phasta_iotype );
34859599516SKenneth E. Jansen 
34959599516SKenneth E. Jansen 
35059599516SKenneth E. Jansen     nitems = (*nshg)*(*numVars);
35159599516SKenneth E. Jansen     writedatablock_( &irstou, "time derivative of solution ",
35259599516SKenneth E. Jansen                      (void*)(array2), &nitems, "double", phasta_iotype );
35359599516SKenneth E. Jansen 
35459599516SKenneth E. Jansen 
35559599516SKenneth E. Jansen     closefile_( &irstou, "write" );
35659599516SKenneth E. Jansen     */
35759599516SKenneth E. Jansen     //MPI_Barrier(MPI_COMM_WORLD);
35859599516SKenneth E. Jansen 
35959599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
36059599516SKenneth E. Jansen 
36159599516SKenneth E. Jansen //MR CHANGE
36259599516SKenneth E. Jansen     int nfiles;
36359599516SKenneth E. Jansen     int nfields;
36459599516SKenneth E. Jansen     int numparts;
36559599516SKenneth E. Jansen     int irank;
36659599516SKenneth E. Jansen     int nprocs;
36759599516SKenneth E. Jansen 
36859599516SKenneth E. Jansen     //  First, count the number of fields to write and store the result in
36959599516SKenneth E. Jansen     countfieldstowriterestart();
37059599516SKenneth E. Jansen 
37159599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
37259599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
37359599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
37459599516SKenneth E. Jansen     numparts = workfc.numpe;
37559599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
37659599516SKenneth E. Jansen     nprocs = workfc.numpe;
37759599516SKenneth E. Jansen //MR CHANGE END
37859599516SKenneth E. Jansen     int nppf = numparts/nfiles;
37959599516SKenneth E. Jansen     int GPID;
38059599516SKenneth E. Jansen 
38159599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
38259599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
38359599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
38459599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
38559599516SKenneth E. Jansen 
38659599516SKenneth E. Jansen     int descriptor;
38759599516SKenneth E. Jansen     char filename[255],path[255],fieldtag_s[255];
38859599516SKenneth E. Jansen     bzero((void*)filename,255);
38959599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
39059599516SKenneth E. Jansen 
39159599516SKenneth E. Jansen     sprintf(filename,"restart-dat.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1));
39259599516SKenneth E. Jansen 
39359599516SKenneth E. Jansen //    unsigned long long timer_start;
39459599516SKenneth E. Jansen //    unsigned long long timer_end;
39559599516SKenneth E. Jansen //    double time_span;
39659599516SKenneth E. Jansen 
39759599516SKenneth E. Jansen //MR CHANGE
39859599516SKenneth E. Jansen //  Measure the time - Start the timer
39959599516SKenneth E. Jansen //    MPI_Barrier(MPI_COMM_WORLD);
40059599516SKenneth E. Jansen //    timer_start = rdtsc();
40159599516SKenneth E. Jansen //MR CHANGE END
40259599516SKenneth E. Jansen 
40359599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write");
40459599516SKenneth E. Jansen 
40559599516SKenneth E. Jansen //MR CHANGE
40659599516SKenneth E. Jansen //  Measure the time - End of timer
40759599516SKenneth E. Jansen //    timer_end = rdtsc();
40859599516SKenneth E. Jansen //    time_span=(double)((timer_end-timer_start)/cpu_speed);
40959599516SKenneth E. Jansen     if (*pid==0) {
41059599516SKenneth E. Jansen //      printf("\n*****************************\n");
41159599516SKenneth E. Jansen //      printf("Time: 'initphmpiio' of %s with %d fields and %d files is:    %f s\n",filename,nfields,nfiles,time_span);
41259599516SKenneth E. Jansen       printf("Filename is %s \n",filename);
41359599516SKenneth E. Jansen     }
41459599516SKenneth E. Jansen //MR CHANGE END
41559599516SKenneth E. Jansen 
41659599516SKenneth E. Jansen 
41759599516SKenneth E. Jansen //MR CHANGE
41859599516SKenneth E. Jansen //  Measure the time - Start the timer
41959599516SKenneth E. Jansen //    MPI_Barrier(MPI_COMM_WORLD);
42059599516SKenneth E. Jansen //    timer_start = rdtsc();
42159599516SKenneth E. Jansen //MR CHANGE END
42259599516SKenneth E. Jansen 
42359599516SKenneth E. Jansen     openfile(filename, "write", &f_descriptor);
42459599516SKenneth E. Jansen 
42559599516SKenneth E. Jansen //MR CHANGE
42659599516SKenneth E. Jansen //  Measure the time - End of timer
42759599516SKenneth E. Jansen //    MPI_Barrier(MPI_COMM_WORLD);
42859599516SKenneth E. Jansen //    timer_end = rdtsc();
42959599516SKenneth E. Jansen //    time_span=(double)((timer_end-timer_start)/cpu_speed);
43059599516SKenneth E. Jansen //    if (*pid==0) {
43159599516SKenneth E. Jansen //      printf("Time: 'openfile' of %s with %d fields and %d files is:    %f s\n",filename,nfields,nfiles,time_span);
43259599516SKenneth E. Jansen //      printf("*****************************\n");
43359599516SKenneth E. Jansen //    }
43459599516SKenneth E. Jansen //MR CHANGE END
43559599516SKenneth E. Jansen 
43659599516SKenneth E. Jansen     field_flag=0;
43759599516SKenneth E. Jansen 
43859599516SKenneth E. Jansen      int i;
43959599516SKenneth E. Jansen      for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
44059599516SKenneth E. Jansen      // GPID : global part id, corresponds to rank ...
44159599516SKenneth E. Jansen         // e.g : (in this example)
44259599516SKenneth E. Jansen         // proc 0 : 1--4
44359599516SKenneth E. Jansen         // proc 1 : 5--8 ...
44459599516SKenneth E. Jansen         GPID = startpart + i;
44559599516SKenneth E. Jansen 
44659599516SKenneth E. Jansen         // Write solution field ...
44759599516SKenneth E. Jansen         sprintf(fieldtag_s,"solution@%d",GPID);
44859599516SKenneth E. Jansen 
44959599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
45059599516SKenneth E. Jansen         nitems = 3;
45159599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
45259599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
45359599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
45459599516SKenneth E. Jansen 
45559599516SKenneth E. Jansen //MR CHANGE
45659599516SKenneth E. Jansen //  Measure the time - Start the timer
45759599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
45859599516SKenneth E. Jansen //        timer_start = rdtsc();
45959599516SKenneth E. Jansen //MR CHANGE END
46059599516SKenneth E. Jansen 
46159599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
46259599516SKenneth E. Jansen 
46359599516SKenneth E. Jansen //MR CHANGE
46459599516SKenneth E. Jansen //  Measure the time - End of timer
46559599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
46659599516SKenneth E. Jansen //        timer_end = rdtsc();
46759599516SKenneth E. Jansen //        time_span=(double)((timer_end-timer_start)/cpu_speed);
46859599516SKenneth E. Jansen //        if (*pid==0) {
46959599516SKenneth E. Jansen //          printf("\n*****************************\n");
47059599516SKenneth E. Jansen //          printf("Time: header for 'Solution':    %f s\n",time_span);
47159599516SKenneth E. Jansen //        }
47259599516SKenneth E. Jansen //MR CHANGE END
47359599516SKenneth E. Jansen 
47459599516SKenneth E. Jansen         nitems = (*nshg)*(*numVars);
47559599516SKenneth E. Jansen 
47659599516SKenneth E. Jansen //MR CHANGE
47759599516SKenneth E. Jansen //  Measure the time - Start the timer
47859599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
47959599516SKenneth E. Jansen //        timer_start = rdtsc();
48059599516SKenneth E. Jansen //MR CHANGE END
48159599516SKenneth E. Jansen 
48259599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
48359599516SKenneth E. Jansen 
48459599516SKenneth E. Jansen //MR CHANGE
48559599516SKenneth E. Jansen //  Measure the time - End of timer
48659599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
48759599516SKenneth E. Jansen //        timer_end = rdtsc();
48859599516SKenneth E. Jansen //        time_span=(double)((timer_end-timer_start)/cpu_speed);
48959599516SKenneth E. Jansen 
49059599516SKenneth E. Jansen //        int isizemin,isizemax,isizetot;
49159599516SKenneth E. Jansen //        double sizemin,sizemax,sizeavg,sizetot,rate;
49259599516SKenneth E. Jansen 
49359599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizemin,1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
49459599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizemax,1,MPI_INT,MPI_MAX,MPI_COMM_WORLD);
49559599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizetot,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD);
49659599516SKenneth E. Jansen 
49759599516SKenneth E. Jansen //        sizemin=(double)(8.0*isizemin/1024.0/1024.0);
49859599516SKenneth E. Jansen //        sizemax=(double)(8.0*isizemax/1024.0/1024.0);
49959599516SKenneth E. Jansen //        sizetot=(double)(8.0*isizetot/1024.0/1024.0);
50059599516SKenneth E. Jansen //        sizeavg=(double)(1.0*sizetot/workfc.numpe);
50159599516SKenneth E. Jansen //        rate=(double)(1.0*sizetot/time_span);
50259599516SKenneth E. Jansen 
50359599516SKenneth E. Jansen //        if (*pid==0) {
50459599516SKenneth E. Jansen //          printf("Time: block for 'Solution':    %f s\n",time_span);
50559599516SKenneth E. Jansen //          printf("Time: block:   Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB; Rate= %f MB/s; \n",sizemin,sizemax,sizeavg,sizetot,rate);
50659599516SKenneth E. Jansen 
50759599516SKenneth E. Jansen //        }
50859599516SKenneth E. Jansen //MR CHANGE END
50959599516SKenneth E. Jansen 
51059599516SKenneth E. Jansen     }
51159599516SKenneth E. Jansen     field_flag++;
51259599516SKenneth E. Jansen 
51359599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++) {
51459599516SKenneth E. Jansen 
51559599516SKenneth E. Jansen         // GPID : global part id, corresponds to rank ...
51659599516SKenneth E. Jansen         // e.g : (in this example)
51759599516SKenneth E. Jansen         // proc 0 : 1--4
51859599516SKenneth E. Jansen         // proc 1 : 5--8 ...
51959599516SKenneth E. Jansen         GPID = startpart + i;
52059599516SKenneth E. Jansen 
52159599516SKenneth E. Jansen         // Write solution field ...
52259599516SKenneth E. Jansen         sprintf(fieldtag_s,"time derivative of solution@%d",GPID);
52359599516SKenneth E. Jansen 
52459599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
52559599516SKenneth E. Jansen         nitems = 3;
52659599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
52759599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
52859599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
52959599516SKenneth E. Jansen 
53059599516SKenneth E. Jansen //MR CHANGE
53159599516SKenneth E. Jansen //  Measure the time - Start the timer
53259599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
53359599516SKenneth E. Jansen //        timer_start = rdtsc();
53459599516SKenneth E. Jansen //MR CHANGE END
53559599516SKenneth E. Jansen 
53659599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
53759599516SKenneth E. Jansen 
53859599516SKenneth E. Jansen //MR CHANGE
53959599516SKenneth E. Jansen //  Measure the time - End of timer
54059599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
54159599516SKenneth E. Jansen //        timer_end = rdtsc();
54259599516SKenneth E. Jansen //        time_span=(double)((timer_end-timer_start)/cpu_speed);
54359599516SKenneth E. Jansen //        if (*pid==0) {
54459599516SKenneth E. Jansen //          printf("Time: header for 'Time Derivative of solution':    %f s\n",time_span);
54559599516SKenneth E. Jansen //        }
54659599516SKenneth E. Jansen //MR CHANGE END
54759599516SKenneth E. Jansen 
54859599516SKenneth E. Jansen         nitems = (*nshg)*(*numVars);
54959599516SKenneth E. Jansen 
55059599516SKenneth E. Jansen //MR CHANGE
55159599516SKenneth E. Jansen //  Measure the time - Start the timer
55259599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
55359599516SKenneth E. Jansen //        timer_start = rdtsc();
55459599516SKenneth E. Jansen //MR CHANGE END
55559599516SKenneth E. Jansen 
55659599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array2), &isize, "double", phasta_iotype );
55759599516SKenneth E. Jansen 
55859599516SKenneth E. Jansen //MR CHANGE
55959599516SKenneth E. Jansen //  Measure the time - End of timer
56059599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
56159599516SKenneth E. Jansen //        timer_end = rdtsc();
56259599516SKenneth E. Jansen //        time_span=(double)((timer_end-timer_start)/cpu_speed);
56359599516SKenneth E. Jansen 
56459599516SKenneth E. Jansen //        int isizemin,isizemax,isizetot;
56559599516SKenneth E. Jansen //        double sizemin,sizemax,sizeavg,sizetot,rate;
56659599516SKenneth E. Jansen 
56759599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizemin,1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
56859599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizemax,1,MPI_INT,MPI_MAX,MPI_COMM_WORLD);
56959599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizetot,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD);
57059599516SKenneth E. Jansen 
57159599516SKenneth E. Jansen //        sizemin=(double)(8.0*isizemin/1024.0/1024.0);
57259599516SKenneth E. Jansen //        sizemax=(double)(8.0*isizemax/1024.0/1024.0);
57359599516SKenneth E. Jansen //        sizetot=(double)(8.0*isizetot/1024.0/1024.0);
57459599516SKenneth E. Jansen //        sizeavg=sizetot/workfc.numpe;
57559599516SKenneth E. Jansen //        rate=sizetot/time_span;
57659599516SKenneth E. Jansen 
57759599516SKenneth E. Jansen //        if (*pid==0) {
57859599516SKenneth E. Jansen //          printf("Time: block for 'Time Derivative of Solution':    %f s\n",time_span);
57959599516SKenneth E. Jansen //          printf("Time: block:   Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB; Rate= %f MB/s; \n",sizemin,sizemax,sizeavg,sizetot,rate);
58059599516SKenneth E. Jansen //          printf("*****************************\n");
58159599516SKenneth E. Jansen 
58259599516SKenneth E. Jansen //        }
58359599516SKenneth E. Jansen //MR CHANGE END
58459599516SKenneth E. Jansen 
58559599516SKenneth E. Jansen     }
58659599516SKenneth E. Jansen     field_flag++;
58759599516SKenneth E. Jansen 
58859599516SKenneth E. Jansen     if (field_flag==nfields){
58959599516SKenneth E. Jansen 
59059599516SKenneth E. Jansen //MR CHANGE
59159599516SKenneth E. Jansen //  Measure the time - Start the timer
59259599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
59359599516SKenneth E. Jansen //      timer_start = rdtsc();
59459599516SKenneth E. Jansen //MR CHANGE END
59559599516SKenneth E. Jansen 
59659599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
59759599516SKenneth E. Jansen 
59859599516SKenneth E. Jansen //MR CHANGE
59959599516SKenneth E. Jansen //    Measure the time - End of timer
60059599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
60159599516SKenneth E. Jansen //      timer_end = rdtsc();
60259599516SKenneth E. Jansen //      time_span=(double)((timer_end-timer_start)/cpu_speed);
60359599516SKenneth E. Jansen //      if (*pid==0) {
60459599516SKenneth E. Jansen //        printf("\n*****************************\n");
60559599516SKenneth E. Jansen //        printf("Time: 'closefile' is:    %f s\n",time_span);
60659599516SKenneth E. Jansen //      }
60759599516SKenneth E. Jansen //MR CHANGE END
60859599516SKenneth E. Jansen 
60959599516SKenneth E. Jansen //MR CHANGE
61059599516SKenneth E. Jansen //  Measure the time - Start the timer
61159599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
61259599516SKenneth E. Jansen //      timer_start = rdtsc();
61359599516SKenneth E. Jansen //MR CHANGE END
61459599516SKenneth E. Jansen 
61559599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
61659599516SKenneth E. Jansen 
61759599516SKenneth E. Jansen //MR CHANGE
61859599516SKenneth E. Jansen //    Measure the time - End of timer
61959599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
62059599516SKenneth E. Jansen //      timer_end = rdtsc();
62159599516SKenneth E. Jansen //      time_span=(double)((timer_end-timer_start)/cpu_speed);
62259599516SKenneth E. Jansen       if (*pid==0) {
62359599516SKenneth E. Jansen //        printf("Time: 'finalizephmpiio' is:    %f s\n",time_span);
62459599516SKenneth E. Jansen //        printf("Last field %d '%s' finished! \n",nfields, fieldtag_s);
62559599516SKenneth E. Jansen         printf("\n");
62659599516SKenneth E. Jansen //        printf("*****************************\n");
62759599516SKenneth E. Jansen       }
62859599516SKenneth E. Jansen     }
62959599516SKenneth E. Jansen //MR CHANGE END
63059599516SKenneth E. Jansen 
63159599516SKenneth E. Jansen 
63259599516SKenneth E. Jansen 
63359599516SKenneth E. Jansen     ///////////////////////////////////////////////////////////////////////////////////////////
63459599516SKenneth E. Jansen 
63559599516SKenneth E. Jansen     /* create a soft link of the restart we just wrote to restart.latest
63659599516SKenneth E. Jansen      this is the file the next run will always try to start from */
63759599516SKenneth E. Jansen 
63859599516SKenneth E. Jansen /*    sprintf( linkfile, "restart.latest.%d", *pid+1 );
63959599516SKenneth E. Jansen     unlink( linkfile );
64059599516SKenneth E. Jansen     sprintf( existingfile, "restart.%d.%d", *stepno, *pid+1 );
64159599516SKenneth E. Jansen     link( existingfile, linkfile );
64259599516SKenneth E. Jansen */
64359599516SKenneth E. Jansen }
64459599516SKenneth E. Jansen 
64559599516SKenneth E. Jansen void
64659599516SKenneth E. Jansen Write_Error(  int* pid,
64759599516SKenneth E. Jansen               int* stepno,
64859599516SKenneth E. Jansen               int* nshg,
64959599516SKenneth E. Jansen               int* numVars,
65059599516SKenneth E. Jansen               double* array1 ) {
65159599516SKenneth E. Jansen 
65259599516SKenneth E. Jansen 
65359599516SKenneth E. Jansen     char fname[255];
65459599516SKenneth E. Jansen     char rfile[60];
65559599516SKenneth E. Jansen     int irstou;
65659599516SKenneth E. Jansen     int magic_number = 362436;
65759599516SKenneth E. Jansen     int* mptr = &magic_number;
65859599516SKenneth E. Jansen     //printf("Time is commented\n");
65959599516SKenneth E. Jansen     //time_t timenow = time ( &timenow);
66059599516SKenneth E. Jansen     //printf("Yes\n");
66159599516SKenneth E. Jansen     double version=0.0;
66259599516SKenneth E. Jansen     int isize, nitems;
66359599516SKenneth E. Jansen     int iarray[10];
66459599516SKenneth E. Jansen 
66559599516SKenneth E. Jansen     /*sprintf(rfile,"restart.%d.%d",*stepno,*pid+1);
66659599516SKenneth E. Jansen     openfile_(rfile,"append", &irstou);
66759599516SKenneth E. Jansen 
66859599516SKenneth E. Jansen     isize = (*nshg)*(*numVars);
66959599516SKenneth E. Jansen     nitems = 3;
67059599516SKenneth E. Jansen     iarray[ 0 ] = (*nshg);
67159599516SKenneth E. Jansen     iarray[ 1 ] = (*numVars);
67259599516SKenneth E. Jansen     iarray[ 2 ] = (*stepno);
67359599516SKenneth E. Jansen     writeheader_( &irstou, "errors", (void*)iarray, &nitems, &isize, "double", phasta_iotype );
67459599516SKenneth E. Jansen 
67559599516SKenneth E. Jansen 
67659599516SKenneth E. Jansen     nitems = (*nshg)*(*numVars);
67759599516SKenneth E. Jansen     writedatablock_( &irstou, "errors ", (void*)(array1), &nitems, "double", phasta_iotype );
67859599516SKenneth E. Jansen 
67959599516SKenneth E. Jansen     closefile_( &irstou, "append" );*/
68059599516SKenneth E. Jansen 
68159599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
68259599516SKenneth E. Jansen 
68359599516SKenneth E. Jansen     int nfiles;
68459599516SKenneth E. Jansen     int nfields;
68559599516SKenneth E. Jansen     int numparts;
68659599516SKenneth E. Jansen     int irank;
68759599516SKenneth E. Jansen     int nprocs;
68859599516SKenneth E. Jansen 
68959599516SKenneth E. Jansen //    unsigned long long timer_start;
69059599516SKenneth E. Jansen //    unsigned long long timer_end;
69159599516SKenneth E. Jansen //    double time_span;
69259599516SKenneth E. Jansen 
69359599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
69459599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
69559599516SKenneth E. Jansen     numparts = workfc.numpe;
69659599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
69759599516SKenneth E. Jansen     nprocs = workfc.numpe;
69859599516SKenneth E. Jansen 
69959599516SKenneth E. Jansen     int nppf = numparts/nfiles;
70059599516SKenneth E. Jansen     int GPID;
70159599516SKenneth E. Jansen 
70259599516SKenneth E. Jansen     // Calculate number of parts each  proc deal with and where it start and end ...
70359599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
70459599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
70559599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
70659599516SKenneth E. Jansen 
70759599516SKenneth E. Jansen     field_flag++;
70859599516SKenneth E. Jansen 
70959599516SKenneth E. Jansen     char fieldtag[255];
71059599516SKenneth E. Jansen 
71159599516SKenneth E. Jansen     int i;
71259599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++  ) {
71359599516SKenneth E. Jansen         GPID = startpart + i;
71459599516SKenneth E. Jansen         sprintf(fieldtag,"errors@%d",GPID);
71559599516SKenneth E. Jansen 
71659599516SKenneth E. Jansen         if(*pid==0) {
71759599516SKenneth E. Jansen //          printf("\n*****************************\n");
71859599516SKenneth E. Jansen           printf("\n");
71959599516SKenneth E. Jansen           printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldtag);
72059599516SKenneth E. Jansen         }
72159599516SKenneth E. Jansen 
72259599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
72359599516SKenneth E. Jansen         nitems = 3;
72459599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
72559599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
72659599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
72759599516SKenneth E. Jansen 
72859599516SKenneth E. Jansen //MR CHANGE
72959599516SKenneth E. Jansen //  Measure the time - Start the timer
73059599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
73159599516SKenneth E. Jansen //        timer_start = rdtsc();
73259599516SKenneth E. Jansen //MR CHANGE END
73359599516SKenneth E. Jansen 
73459599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
73559599516SKenneth E. Jansen 
73659599516SKenneth E. Jansen //MR CHANGE
73759599516SKenneth E. Jansen //  Measure the time - End of timer
73859599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
73959599516SKenneth E. Jansen //        timer_end = rdtsc();
74059599516SKenneth E. Jansen //        time_span=(double)((timer_end-timer_start)/cpu_speed);
74159599516SKenneth E. Jansen //        if (*pid==0) {
74259599516SKenneth E. Jansen //          printf("Time: header for 'error':    %f s\n",time_span);
74359599516SKenneth E. Jansen //        }
74459599516SKenneth E. Jansen //MR CHANGE END
74559599516SKenneth E. Jansen 
74659599516SKenneth E. Jansen //MR CHANGE
74759599516SKenneth E. Jansen //  Measure the time - Start the timer
74859599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
74959599516SKenneth E. Jansen //        timer_start = rdtsc();
75059599516SKenneth E. Jansen //MR CHANGE END
75159599516SKenneth E. Jansen 
75259599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag, (void*)array1, &isize, "double", phasta_iotype );
75359599516SKenneth E. Jansen 
75459599516SKenneth E. Jansen //MR CHANGE
75559599516SKenneth E. Jansen //  Measure the time - End of timer
75659599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
75759599516SKenneth E. Jansen //        timer_end = rdtsc();
75859599516SKenneth E. Jansen //        time_span=(double)((timer_end-timer_start)/cpu_speed);
75959599516SKenneth E. Jansen 
76059599516SKenneth E. Jansen //        int isizemin,isizemax,isizetot;
76159599516SKenneth E. Jansen //        double sizemin,sizemax,sizeavg,sizetot,rate;
76259599516SKenneth E. Jansen 
76359599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizemin,1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
76459599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizemax,1,MPI_INT,MPI_MAX,MPI_COMM_WORLD);
76559599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizetot,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD);
76659599516SKenneth E. Jansen 
76759599516SKenneth E. Jansen //        sizemin=(double)(8.0*isizemin/1024.0/1024.0);
76859599516SKenneth E. Jansen //        sizemax=(double)(8.0*isizemax/1024.0/1024.0);
76959599516SKenneth E. Jansen //        sizetot=(double)(8.0*isizetot/1024.0/1024.0);
77059599516SKenneth E. Jansen //        sizeavg=sizetot/workfc.numpe;
77159599516SKenneth E. Jansen //        rate=sizetot/time_span;
77259599516SKenneth E. Jansen 
77359599516SKenneth E. Jansen //        if (*pid==0) {
77459599516SKenneth E. Jansen //          printf("Time: block for 'error':    %f s\n",time_span);
77559599516SKenneth E. Jansen //          printf("Time: block:   Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB; Rate= %f MB/s; \n",sizemin,sizemax,sizeavg,sizetot,rate);
77659599516SKenneth E. Jansen //          printf("*****************************\n");
77759599516SKenneth E. Jansen //        }
77859599516SKenneth E. Jansen //MR CHANGE END
77959599516SKenneth E. Jansen 
78059599516SKenneth E. Jansen     }
78159599516SKenneth E. Jansen 
78259599516SKenneth E. Jansen //     MPI_Barrier(MPI_COMM_WORLD);
78359599516SKenneth E. Jansen //     timer_end = rdtsc();
78459599516SKenneth E. Jansen //     time_span=(double)(timer_end-timer_start)/cpu_speed;
78559599516SKenneth E. Jansen 
78659599516SKenneth E. Jansen //     if (*pid==0) {
78759599516SKenneth E. Jansen //         printf("Field 'error' written in:     %f s\n",time_span);
78859599516SKenneth E. Jansen //         printf("Write field '%s' finished! \n",fieldtag);
78959599516SKenneth E. Jansen //     }
79059599516SKenneth E. Jansen 
79159599516SKenneth E. Jansen     if (field_flag==nfields){
79259599516SKenneth E. Jansen 
79359599516SKenneth E. Jansen //MR CHANGE
79459599516SKenneth E. Jansen //  Measure the time - Start the timer
79559599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
79659599516SKenneth E. Jansen //      timer_start = rdtsc();
79759599516SKenneth E. Jansen //MR CHANGE END
79859599516SKenneth E. Jansen 
79959599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
80059599516SKenneth E. Jansen 
80159599516SKenneth E. Jansen //MR CHANGE
80259599516SKenneth E. Jansen //    Measure the time - End of timer
80359599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
80459599516SKenneth E. Jansen //      timer_end = rdtsc();
80559599516SKenneth E. Jansen //      time_span=(double)((timer_end-timer_start)/cpu_speed);
80659599516SKenneth E. Jansen //      if (*pid==0) {
80759599516SKenneth E. Jansen //        printf("\n*****************************\n");
80859599516SKenneth E. Jansen //        printf("Time: 'closefile' is:    %f s\n",time_span);
80959599516SKenneth E. Jansen //      }
81059599516SKenneth E. Jansen //MR CHANGE END
81159599516SKenneth E. Jansen 
81259599516SKenneth E. Jansen //MR CHANGE
81359599516SKenneth E. Jansen //  Measure the time - Start the timer
81459599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
81559599516SKenneth E. Jansen //      timer_start = rdtsc();
81659599516SKenneth E. Jansen //MR CHANGE END
81759599516SKenneth E. Jansen 
81859599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
81959599516SKenneth E. Jansen 
82059599516SKenneth E. Jansen //MR CHANGE
82159599516SKenneth E. Jansen //    Measure the time - End of timer
82259599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
82359599516SKenneth E. Jansen //      timer_end = rdtsc();
82459599516SKenneth E. Jansen //      time_span=(double)((timer_end-timer_start)/cpu_speed);
82559599516SKenneth E. Jansen       if (*pid==0) {
82659599516SKenneth E. Jansen //        printf("Time: 'finalizephmpiio' is:    %f s\n",time_span);
82759599516SKenneth E. Jansen         printf("Last field %d '%s' finished! \n",nfields, fieldtag);
82859599516SKenneth E. Jansen         printf("\n");
82959599516SKenneth E. Jansen //        printf("*****************************\n");
83059599516SKenneth E. Jansen       }
83159599516SKenneth E. Jansen     }
83259599516SKenneth E. Jansen //MR CHANGE END
83359599516SKenneth E. Jansen 
83459599516SKenneth E. Jansen     ///////////////////////////////////////////////////////////////////////////////////////////
83559599516SKenneth E. Jansen 
83659599516SKenneth E. Jansen 
83759599516SKenneth E. Jansen }
83859599516SKenneth E. Jansen 
83959599516SKenneth E. Jansen 
84059599516SKenneth E. Jansen void
84159599516SKenneth E. Jansen Write_Displ(  int* pid,
84259599516SKenneth E. Jansen               int* stepno,
84359599516SKenneth E. Jansen               int* nshg,
84459599516SKenneth E. Jansen               int* numVars,
84559599516SKenneth E. Jansen               double* array1 ) {
84659599516SKenneth E. Jansen 
84759599516SKenneth E. Jansen 
84859599516SKenneth E. Jansen     char fname[255];
84959599516SKenneth E. Jansen     char rfile[60];
85059599516SKenneth E. Jansen     int irstou;
85159599516SKenneth E. Jansen     int magic_number = 362436;
85259599516SKenneth E. Jansen     int* mptr = &magic_number;
85359599516SKenneth E. Jansen     time_t timenow = time ( &timenow);
85459599516SKenneth E. Jansen     double version=0.0;
85559599516SKenneth E. Jansen     int isize, nitems;
85659599516SKenneth E. Jansen     int iarray[10];
85759599516SKenneth E. Jansen 
85859599516SKenneth E. Jansen     sprintf(rfile,"restart.%d.%d",*stepno,*pid+1);
85959599516SKenneth E. Jansen     openfile(rfile,"append", &irstou);
86059599516SKenneth E. Jansen 
86159599516SKenneth E. Jansen     isize = (*nshg)*(*numVars);
86259599516SKenneth E. Jansen     nitems = 3;
86359599516SKenneth E. Jansen     iarray[ 0 ] = (*nshg);
86459599516SKenneth E. Jansen     iarray[ 1 ] = (*numVars);
86559599516SKenneth E. Jansen     iarray[ 2 ] = (*stepno);
86659599516SKenneth E. Jansen     writeheader( &irstou, "displacement", (void*)iarray, &nitems, &isize, "double", phasta_iotype );
86759599516SKenneth E. Jansen 
86859599516SKenneth E. Jansen     nitems = (*nshg)*(*numVars);
86959599516SKenneth E. Jansen     writedatablock( &irstou, "displacement", (void*)(array1), &nitems, "double", phasta_iotype );
87059599516SKenneth E. Jansen 
87159599516SKenneth E. Jansen     closefile( &irstou, "append" );
87259599516SKenneth E. Jansen }
87359599516SKenneth E. Jansen 
87459599516SKenneth E. Jansen void
87559599516SKenneth E. Jansen Write_Field(  int *pid,
87659599516SKenneth E. Jansen               char* filemode,
87759599516SKenneth E. Jansen               char* fieldtag,
87859599516SKenneth E. Jansen               int* tagsize,
87959599516SKenneth E. Jansen               void* array,
88059599516SKenneth E. Jansen               char* arraytype,
88159599516SKenneth E. Jansen               int* nshg,
88259599516SKenneth E. Jansen               int* numvars,
88359599516SKenneth E. Jansen               int* stepno) {
88459599516SKenneth E. Jansen 
88559599516SKenneth E. Jansen     //printf("Rank is %d, field is %s, tagsize is %d, nshg is %d, numvars is %d\n",*pid,fieldtag,*tagsize,*nshg,*numvars);
88659599516SKenneth E. Jansen 
88759599516SKenneth E. Jansen //     char rfile[32];
88859599516SKenneth E. Jansen     // assuming restart.sn.(pid+1)
88959599516SKenneth E. Jansen //     sprintf(rfile,"restart.%d.%d",*stepno,*pid+1);
89059599516SKenneth E. Jansen 
89159599516SKenneth E. Jansen     char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char));
89259599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
89359599516SKenneth E. Jansen     fieldlabel[*tagsize] = '\0';
89459599516SKenneth E. Jansen 
89559599516SKenneth E. Jansen     int irstou;
89659599516SKenneth E. Jansen     int magic_number = 362436;
89759599516SKenneth E. Jansen     int* mptr = &magic_number;
89859599516SKenneth E. Jansen     double version=0.0;
89959599516SKenneth E. Jansen     int isize, nitems;
90059599516SKenneth E. Jansen     int iarray[10];
90159599516SKenneth E. Jansen 
90259599516SKenneth E. Jansen     char fmode[10];
90359599516SKenneth E. Jansen     if(!strncmp(filemode,"w",1))
90459599516SKenneth E. Jansen       strcpy(fmode,"write");
90559599516SKenneth E. Jansen     else // default is append
90659599516SKenneth E. Jansen       strcpy(fmode,"append");
90759599516SKenneth E. Jansen 
90859599516SKenneth E. Jansen     char datatype[10];
90959599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
91059599516SKenneth E. Jansen       strcpy(datatype,"int");
91159599516SKenneth E. Jansen     else // default is double
91259599516SKenneth E. Jansen       strcpy(datatype,"double");
91359599516SKenneth E. Jansen 
91459599516SKenneth E. Jansen /*     openfile_(rfile, fmode, &irstou);
91559599516SKenneth E. Jansen 
91659599516SKenneth E. Jansen      nitems = 3; // assuming field will write 3 items in iarray
91759599516SKenneth E. Jansen      iarray[ 0 ] = (*nshg);
91859599516SKenneth E. Jansen      iarray[ 1 ] = (*numvars);
91959599516SKenneth E. Jansen      iarray[ 2 ] = (*stepno);
92059599516SKenneth E. Jansen 
92159599516SKenneth E. Jansen      isize = (*nshg)*(*numvars);
92259599516SKenneth E. Jansen      writeheader_( &irstou, fieldlabel, (void*)iarray, &nitems, &isize, datatype, phasta_iotype );
92359599516SKenneth E. Jansen 
92459599516SKenneth E. Jansen      nitems = (*nshg)*(*numvars);
92559599516SKenneth E. Jansen      writedatablock_( &irstou, fieldlabel, array, &nitems, datatype, phasta_iotype );
92659599516SKenneth E. Jansen      closefile_( &irstou, fmode);
92759599516SKenneth E. Jansen */
92859599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
92959599516SKenneth E. Jansen 
93059599516SKenneth E. Jansen     int nfiles;
93159599516SKenneth E. Jansen     int nfields;
93259599516SKenneth E. Jansen     int numparts;
93359599516SKenneth E. Jansen     int irank;
93459599516SKenneth E. Jansen     int nprocs;
93559599516SKenneth E. Jansen 
93659599516SKenneth E. Jansen //    unsigned long long timer_start;
93759599516SKenneth E. Jansen //    unsigned long long timer_end;
93859599516SKenneth E. Jansen //    double time_span;
93959599516SKenneth E. Jansen 
94059599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
94159599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
94259599516SKenneth E. Jansen     numparts = workfc.numpe;
94359599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
94459599516SKenneth E. Jansen     nprocs = workfc.numpe;
94559599516SKenneth E. Jansen 
94659599516SKenneth E. Jansen     int nppf = numparts/nfiles;
94759599516SKenneth E. Jansen     int GPID;
94859599516SKenneth E. Jansen 
94959599516SKenneth E. Jansen     // Calculate number of parts each  proc deal with and where it start and end ...
95059599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
95159599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
95259599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
95359599516SKenneth E. Jansen 
95459599516SKenneth E. Jansen     char filename[255],path[255],fieldtag_s[255];
95559599516SKenneth E. Jansen     bzero((void*)filename,255);
95659599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
95759599516SKenneth E. Jansen 
95859599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
95959599516SKenneth E. Jansen 
96059599516SKenneth E. Jansen     field_flag++;
96159599516SKenneth E. Jansen     if(*pid==0) {
96259599516SKenneth E. Jansen //      printf("\n*****************************\n");
96359599516SKenneth E. Jansen       printf("\n");
96459599516SKenneth E. Jansen       printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel);
96559599516SKenneth E. Jansen     }
96659599516SKenneth E. Jansen 
96759599516SKenneth E. Jansen     sprintf(filename,"restart-dat.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1));
96859599516SKenneth E. Jansen 
96959599516SKenneth E. Jansen //     MPI_Barrier(MPI_COMM_WORLD);
97059599516SKenneth E. Jansen //     timer_start = rdtsc();
97159599516SKenneth E. Jansen 
97259599516SKenneth E. Jansen     int i;
97359599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++  ) {
97459599516SKenneth E. Jansen         GPID = startpart + i;
97559599516SKenneth E. Jansen 
97659599516SKenneth E. Jansen         // Write solution field ...
97759599516SKenneth E. Jansen         sprintf(fieldtag_s,"%s@%d",fieldlabel,GPID);
97859599516SKenneth E. Jansen 
97959599516SKenneth E. Jansen         isize = (*nshg)*(*numvars);
98059599516SKenneth E. Jansen         nitems = 3;
98159599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
98259599516SKenneth E. Jansen         iarray[ 1 ] = (*numvars);
98359599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
98459599516SKenneth E. Jansen 
98559599516SKenneth E. Jansen //MR CHANGE
98659599516SKenneth E. Jansen //  Measure the time - Start the timer
98759599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
98859599516SKenneth E. Jansen //        timer_start = rdtsc();
98959599516SKenneth E. Jansen //MR CHANGE END
99059599516SKenneth E. Jansen 
99159599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, datatype, phasta_iotype);
99259599516SKenneth E. Jansen 
99359599516SKenneth E. Jansen //MR CHANGE
99459599516SKenneth E. Jansen //  Measure the time - End of timer
99559599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
99659599516SKenneth E. Jansen //        timer_end = rdtsc();
99759599516SKenneth E. Jansen //        time_span=(double)((timer_end-timer_start)/cpu_speed);
99859599516SKenneth E. Jansen //        if (*pid==0) {
99959599516SKenneth E. Jansen //          printf("Time: header for '%s':    %f s\n",fieldtag_s,time_span);
100059599516SKenneth E. Jansen //        }
100159599516SKenneth E. Jansen //MR CHANGE END
100259599516SKenneth E. Jansen 
100359599516SKenneth E. Jansen         nitems = (*nshg)*(*numvars);
100459599516SKenneth E. Jansen 
100559599516SKenneth E. Jansen //MR CHANGE
100659599516SKenneth E. Jansen //  Measure the time - Start the timer
100759599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
100859599516SKenneth E. Jansen //        timer_start = rdtsc();
100959599516SKenneth E. Jansen //MR CHANGE END
101059599516SKenneth E. Jansen 
101159599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, array, &isize, datatype, phasta_iotype );
101259599516SKenneth E. Jansen 
101359599516SKenneth E. Jansen //MR CHANGE
101459599516SKenneth E. Jansen //  Measure the time - End of timer
101559599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
101659599516SKenneth E. Jansen //        timer_end = rdtsc();
101759599516SKenneth E. Jansen //        time_span=(double)((timer_end-timer_start)/cpu_speed);
101859599516SKenneth E. Jansen 
101959599516SKenneth E. Jansen //        int isizemin,isizemax,isizetot;
102059599516SKenneth E. Jansen //        double sizemin,sizemax,sizeavg,sizetot,rate;
102159599516SKenneth E. Jansen 
102259599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizemin,1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
102359599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizemax,1,MPI_INT,MPI_MAX,MPI_COMM_WORLD);
102459599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizetot,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD);
102559599516SKenneth E. Jansen 
102659599516SKenneth E. Jansen //        sizemin=(double)(8.0*isizemin/1024.0/1024.0);
102759599516SKenneth E. Jansen //        sizemax=(double)(8.0*isizemax/1024.0/1024.0);
102859599516SKenneth E. Jansen //        sizetot=(double)(8.0*isizetot/1024.0/1024.0);
102959599516SKenneth E. Jansen //        sizeavg=sizetot/workfc.numpe;
103059599516SKenneth E. Jansen //        rate=sizetot/time_span;
103159599516SKenneth E. Jansen 
103259599516SKenneth E. Jansen //        if (*pid==0) {
103359599516SKenneth E. Jansen //          printf("Time: block for '%s':    %f s\n",fieldtag_s,time_span);
103459599516SKenneth E. Jansen //          printf("Time: block:   Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB; Rate= %f MB/s; \n",sizemin,sizemax,sizeavg,sizetot,rate);
103559599516SKenneth E. Jansen //          printf("*****************************\n");
103659599516SKenneth E. Jansen //        }
103759599516SKenneth E. Jansen //MR CHANGE END
103859599516SKenneth E. Jansen 
103959599516SKenneth E. Jansen     }
104059599516SKenneth E. Jansen 
104159599516SKenneth E. Jansen //     MPI_Barrier(MPI_COMM_WORLD);
104259599516SKenneth E. Jansen //     timer_end = rdtsc();
104359599516SKenneth E. Jansen //     time_span=(double)(timer_end-timer_start)/cpu_speed;
104459599516SKenneth E. Jansen 
104559599516SKenneth E. Jansen //     if (*pid==0) {
104659599516SKenneth E. Jansen //         printf("Field '%s' written in:     %f s\n",fieldtag,time_span);
104759599516SKenneth E. Jansen //         printf("Write field '%s' finished! \n",fieldtag_s);
104859599516SKenneth E. Jansen //     }
104959599516SKenneth E. Jansen 
105059599516SKenneth E. Jansen //     if (field_flag==nfields){
105159599516SKenneth E. Jansen //       closefile_(&f_descriptor, "write");
105259599516SKenneth E. Jansen //       finalizephmpiio_(&f_descriptor);
105359599516SKenneth E. Jansen //       if(*pid==0) {
105459599516SKenneth E. Jansen //         printf("Last field %d '%s' finished! \n",nfields, fieldtag_s);
105559599516SKenneth E. Jansen //         printf("\n*****************************\n");
105659599516SKenneth E. Jansen //       }
105759599516SKenneth E. Jansen //     }
105859599516SKenneth E. Jansen 
105959599516SKenneth E. Jansen     if (field_flag==nfields){
106059599516SKenneth E. Jansen 
106159599516SKenneth E. Jansen //MR CHANGE
106259599516SKenneth E. Jansen //  Measure the time - Start the timer
106359599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
106459599516SKenneth E. Jansen //      timer_start = rdtsc();
106559599516SKenneth E. Jansen //MR CHANGE END
106659599516SKenneth E. Jansen 
106759599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
106859599516SKenneth E. Jansen 
106959599516SKenneth E. Jansen //MR CHANGE
107059599516SKenneth E. Jansen //    Measure the time - End of timer
107159599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
107259599516SKenneth E. Jansen //      timer_end = rdtsc();
107359599516SKenneth E. Jansen //      time_span=(double)((timer_end-timer_start)/cpu_speed);
107459599516SKenneth E. Jansen //      if (*pid==0) {
107559599516SKenneth E. Jansen //        printf("\n*****************************\n");
107659599516SKenneth E. Jansen //        printf("Time: 'closefile' is:    %f s\n",time_span);
107759599516SKenneth E. Jansen //      }
107859599516SKenneth E. Jansen //MR CHANGE END
107959599516SKenneth E. Jansen 
108059599516SKenneth E. Jansen //MR CHANGE
108159599516SKenneth E. Jansen //  Measure the time - Start the timer
108259599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
108359599516SKenneth E. Jansen //      timer_start = rdtsc();
108459599516SKenneth E. Jansen //MR CHANGE END
108559599516SKenneth E. Jansen 
108659599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
108759599516SKenneth E. Jansen 
108859599516SKenneth E. Jansen //MR CHANGE
108959599516SKenneth E. Jansen //    Measure the time - End of timer
109059599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
109159599516SKenneth E. Jansen //      timer_end = rdtsc();
109259599516SKenneth E. Jansen //      time_span=(double)((timer_end-timer_start)/cpu_speed);
109359599516SKenneth E. Jansen       if (*pid==0) {
109459599516SKenneth E. Jansen //        printf("Time: 'finalizephmpiio' is:    %f s\n",time_span);
109559599516SKenneth E. Jansen         printf("Last field %d '%s' finished! \n",nfields, fieldtag);
109659599516SKenneth E. Jansen         printf("\n");
109759599516SKenneth E. Jansen //        printf("*****************************\n");
109859599516SKenneth E. Jansen       }
109959599516SKenneth E. Jansen     }
110059599516SKenneth E. Jansen //MR CHANGE END
110159599516SKenneth E. Jansen 
110259599516SKenneth E. Jansen     ///////////////////////////////////////////////////////////////////////////////////////////
110359599516SKenneth E. Jansen 
110459599516SKenneth E. Jansen     free(fieldlabel);
110559599516SKenneth E. Jansen }
110659599516SKenneth E. Jansen 
110759599516SKenneth E. Jansen //MR CHANGE
110859599516SKenneth E. Jansen void
110959599516SKenneth E. Jansen Write_PhAvg(  int* pid,
111059599516SKenneth E. Jansen               char* filemode,
111159599516SKenneth E. Jansen               char* fieldtag,
111259599516SKenneth E. Jansen               int* tagsize,
111359599516SKenneth E. Jansen               int* iphase,
111459599516SKenneth E. Jansen               void* array,
111559599516SKenneth E. Jansen               char* arraytype,
111659599516SKenneth E. Jansen               int* nshg,
111759599516SKenneth E. Jansen               int* numvars,
111859599516SKenneth E. Jansen               int* stepno) {
111959599516SKenneth E. Jansen 
112059599516SKenneth E. Jansen     char rfile[32];
112159599516SKenneth E. Jansen     // assuming restart_phase_avg_<sn>.<iphase>.<pid+1>
112259599516SKenneth E. Jansen     sprintf(rfile,"restart_phase_avg_%d.%d.%d",*stepno,*iphase,*pid+1);
112359599516SKenneth E. Jansen 
112459599516SKenneth E. Jansen     char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char));
112559599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
112659599516SKenneth E. Jansen     fieldlabel[*tagsize] = '\0';
112759599516SKenneth E. Jansen 
112859599516SKenneth E. Jansen     int irstou;
112959599516SKenneth E. Jansen     int isize, nitems;
113059599516SKenneth E. Jansen     int iarray[10];
113159599516SKenneth E. Jansen 
113259599516SKenneth E. Jansen     char fmode[10];
113359599516SKenneth E. Jansen     if(!strncmp(filemode,"w",1))
113459599516SKenneth E. Jansen       strcpy(fmode,"write");
113559599516SKenneth E. Jansen     else // default is append
113659599516SKenneth E. Jansen       strcpy(fmode,"append");
113759599516SKenneth E. Jansen 
113859599516SKenneth E. Jansen     char datatype[10];
113959599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
114059599516SKenneth E. Jansen       strcpy(datatype,"int");
114159599516SKenneth E. Jansen     else // default is double
114259599516SKenneth E. Jansen       strcpy(datatype,"double");
114359599516SKenneth E. Jansen 
114459599516SKenneth E. Jansen     openfile(rfile, fmode, &irstou);
114559599516SKenneth E. Jansen 
114659599516SKenneth E. Jansen     if(!strcmp(fmode,"write")) {
114759599516SKenneth E. Jansen       // may be create a routine for 'top' portion under write mode
114859599516SKenneth E. Jansen       int magic_number = 362436;
114959599516SKenneth E. Jansen       int* mptr = &magic_number;
115059599516SKenneth E. Jansen       time_t timenow = time ( &timenow);
115159599516SKenneth E. Jansen       double version=0.0;
115259599516SKenneth E. Jansen 
115359599516SKenneth E. Jansen       /* writing the top ascii header for the restart file */
115459599516SKenneth E. Jansen 
115559599516SKenneth E. Jansen       writestring( &irstou,"# PHASTA Input File Version 2.0\n");
115659599516SKenneth E. Jansen       writestring( &irstou,
115759599516SKenneth E. Jansen                     "# format \"keyphrase : sizeofnextblock usual headers\"\n");
115859599516SKenneth E. Jansen 
115959599516SKenneth E. Jansen       char fname[255];
116059599516SKenneth E. Jansen       bzero( (void*)fname, 255 );
116159599516SKenneth E. Jansen       sprintf(fname,"# Output generated by phasta version (NOT YET CURRENT): %lf \n", version);
116259599516SKenneth E. Jansen       writestring( &irstou, fname );
116359599516SKenneth E. Jansen 
116459599516SKenneth E. Jansen       bzero( (void*)fname, 255 );
116559599516SKenneth E. Jansen       gethostname(fname,255);
116659599516SKenneth E. Jansen       writestring( &irstou,"# This result was produced on: ");
116759599516SKenneth E. Jansen       writestring( &irstou, fname );
116859599516SKenneth E. Jansen       writestring( &irstou,"\n");
116959599516SKenneth E. Jansen 
117059599516SKenneth E. Jansen       bzero( (void*)fname, 255 );
117159599516SKenneth E. Jansen       sprintf(fname,"# %s\n", ctime( &timenow ));
117259599516SKenneth E. Jansen       writestring( &irstou, fname );
117359599516SKenneth E. Jansen 
117459599516SKenneth E. Jansen       isize = 1;
117559599516SKenneth E. Jansen       nitems = 1;
117659599516SKenneth E. Jansen       iarray[ 0 ] = 1;
117759599516SKenneth E. Jansen       writeheader( &irstou, "byteorder magic number ",
117859599516SKenneth E. Jansen                     (void*)iarray, &nitems, &isize, "integer", phasta_iotype );
117959599516SKenneth E. Jansen       nitems = 1;
118059599516SKenneth E. Jansen       writedatablock( &irstou, "byteorder magic number ",
118159599516SKenneth E. Jansen                        (void*)mptr, &nitems, "integer", phasta_iotype );
118259599516SKenneth E. Jansen     }
118359599516SKenneth E. Jansen 
118459599516SKenneth E. Jansen     nitems = 3; // assuming field will write 3 items in iarray
118559599516SKenneth E. Jansen     iarray[ 0 ] = (*nshg);
118659599516SKenneth E. Jansen     iarray[ 1 ] = (*numvars);
118759599516SKenneth E. Jansen     iarray[ 2 ] = (*stepno);
118859599516SKenneth E. Jansen 
118959599516SKenneth E. Jansen     isize = (*nshg)*(*numvars);
119059599516SKenneth E. Jansen     writeheader( &irstou, fieldlabel, (void*)iarray, &nitems, &isize, datatype, phasta_iotype );
119159599516SKenneth E. Jansen 
119259599516SKenneth E. Jansen     nitems = (*nshg)*(*numvars);
119359599516SKenneth E. Jansen     writedatablock( &irstou, fieldlabel, array, &nitems, datatype, phasta_iotype );
119459599516SKenneth E. Jansen 
119559599516SKenneth E. Jansen     closefile( &irstou, fmode);
119659599516SKenneth E. Jansen 
119759599516SKenneth E. Jansen     free(fieldlabel);
119859599516SKenneth E. Jansen }
119959599516SKenneth E. Jansen 
120059599516SKenneth E. Jansen //MR CHANGE
120159599516SKenneth E. Jansen void
120259599516SKenneth E. Jansen Write_PhAvg2( int* pid,
120359599516SKenneth E. Jansen               char* filemode,
120459599516SKenneth E. Jansen               char* fieldtag,
120559599516SKenneth E. Jansen               int* tagsize,
120659599516SKenneth E. Jansen               int* iphase,
120759599516SKenneth E. Jansen               int* nphasesincycle,
120859599516SKenneth E. Jansen               void* array,
120959599516SKenneth E. Jansen               char* arraytype,
121059599516SKenneth E. Jansen               int* nshg,
121159599516SKenneth E. Jansen               int* numvars,
121259599516SKenneth E. Jansen               int* stepno) {
121359599516SKenneth E. Jansen 
121459599516SKenneth E. Jansen //     char rfile[32];
121559599516SKenneth E. Jansen     // assuming restart.sn.(pid+1)
121659599516SKenneth E. Jansen //     sprintf(rfile,"restart.%d.%d",*stepno,*pid+1);
121759599516SKenneth E. Jansen 
121859599516SKenneth E. Jansen     int addtagsize; // phase number is added to the name of the field
121959599516SKenneth E. Jansen     if(*iphase<10)
122059599516SKenneth E. Jansen       addtagsize=1;
122159599516SKenneth E. Jansen     else if(*iphase<100)
122259599516SKenneth E. Jansen       addtagsize=2;
122359599516SKenneth E. Jansen     else if(*iphase<1000)
122459599516SKenneth E. Jansen       addtagsize=3;
122559599516SKenneth E. Jansen 
122659599516SKenneth E. Jansen     int tagsize2;
122759599516SKenneth E. Jansen     tagsize2=*tagsize+addtagsize;
122859599516SKenneth E. Jansen 
122959599516SKenneth E. Jansen //     char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char));
123059599516SKenneth E. Jansen //     strncpy(fieldlabel, fieldtag, *tagsize);
123159599516SKenneth E. Jansen //     fieldlabel[*tagsize] = '\0';
123259599516SKenneth E. Jansen 
123359599516SKenneth E. Jansen     char *fieldlabel = (char *)malloc((tagsize2+1)*sizeof(char));
123459599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
123559599516SKenneth E. Jansen     fieldlabel[tagsize2] = '\0';
123659599516SKenneth E. Jansen 
123759599516SKenneth E. Jansen     char straddtagsize[10];
123859599516SKenneth E. Jansen     sprintf(straddtagsize,"%d",*iphase);
123959599516SKenneth E. Jansen 
124059599516SKenneth E. Jansen     if(*iphase<10) {
124159599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[0];
124259599516SKenneth E. Jansen     }
124359599516SKenneth E. Jansen     else if(*iphase<100) {
124459599516SKenneth E. Jansen       fieldlabel[tagsize2-2]=straddtagsize[0];
124559599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[1];
124659599516SKenneth E. Jansen     }
124759599516SKenneth E. Jansen     else if(*iphase<1000) {
124859599516SKenneth E. Jansen       fieldlabel[tagsize2-3]=straddtagsize[0];
124959599516SKenneth E. Jansen       fieldlabel[tagsize2-2]=straddtagsize[1];
125059599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[2];
125159599516SKenneth E. Jansen     }
125259599516SKenneth E. Jansen 
125359599516SKenneth E. Jansen     int irstou;
125459599516SKenneth E. Jansen     int magic_number = 362436;
125559599516SKenneth E. Jansen     int* mptr = &magic_number;
125659599516SKenneth E. Jansen     double version=0.0;
125759599516SKenneth E. Jansen     int isize, nitems;
125859599516SKenneth E. Jansen     int iarray[10];
125959599516SKenneth E. Jansen 
126059599516SKenneth E. Jansen     char fmode[10];
126159599516SKenneth E. Jansen     if(!strncmp(filemode,"w",1))
126259599516SKenneth E. Jansen       strcpy(fmode,"write");
126359599516SKenneth E. Jansen     else // default is append
126459599516SKenneth E. Jansen       strcpy(fmode,"append");
126559599516SKenneth E. Jansen 
126659599516SKenneth E. Jansen     char datatype[10];
126759599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
126859599516SKenneth E. Jansen       strcpy(datatype,"int");
126959599516SKenneth E. Jansen     else // default is double
127059599516SKenneth E. Jansen       strcpy(datatype,"double");
127159599516SKenneth E. Jansen 
127259599516SKenneth E. Jansen //
127359599516SKenneth E. Jansen // //     if(*iphase==1) //open the file but then keep it open for the remaining cycles
127459599516SKenneth E. Jansen //     openfile_(rfile, fmode, &irstou);
127559599516SKenneth E. Jansen //
127659599516SKenneth E. Jansen // //     printf("iphase: %d - pid: %d - irstou %d\n",*iphase,*pid,irstou);
127759599516SKenneth E. Jansen //
127859599516SKenneth E. Jansen //
127959599516SKenneth E. Jansen //     nitems = 3; // assuming field will write 3 items in iarray
128059599516SKenneth E. Jansen //     iarray[ 0 ] = (*nshg);
128159599516SKenneth E. Jansen //     iarray[ 1 ] = (*numvars);
128259599516SKenneth E. Jansen //     iarray[ 2 ] = (*stepno);
128359599516SKenneth E. Jansen //
128459599516SKenneth E. Jansen //     isize = (*nshg)*(*numvars);
128559599516SKenneth E. Jansen //     writeheader_( &irstou, fieldlabel, (void*)iarray, &nitems, &isize, datatype, phasta_iotype );
128659599516SKenneth E. Jansen //
128759599516SKenneth E. Jansen //     nitems = (*nshg)*(*numvars);
128859599516SKenneth E. Jansen //     writedatablock_( &irstou, fieldlabel, array, &nitems, datatype, phasta_iotype );
128959599516SKenneth E. Jansen //
129059599516SKenneth E. Jansen // //     if(*iphase==*nphasesincycle) //close the file after nphasesincycle
129159599516SKenneth E. Jansen //       closefile_( &irstou, fmode);
129259599516SKenneth E. Jansen //
129359599516SKenneth E. Jansen 
129459599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
129559599516SKenneth E. Jansen 
129659599516SKenneth E. Jansen     int nfiles;
129759599516SKenneth E. Jansen     int nfields;
129859599516SKenneth E. Jansen     int numparts;
129959599516SKenneth E. Jansen     int irank;
130059599516SKenneth E. Jansen     int nprocs;
130159599516SKenneth E. Jansen //    unsigned long long timer_start;
130259599516SKenneth E. Jansen //    unsigned long long timer_end;
130359599516SKenneth E. Jansen //    double time_span;
130459599516SKenneth E. Jansen 
130559599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
130659599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
130759599516SKenneth E. Jansen     numparts = workfc.numpe;
130859599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
130959599516SKenneth E. Jansen     nprocs = workfc.numpe;
131059599516SKenneth E. Jansen 
131159599516SKenneth E. Jansen     int nppf = numparts/nfiles;
131259599516SKenneth E. Jansen     int GPID;
131359599516SKenneth E. Jansen 
131459599516SKenneth E. Jansen     // Calculate number of parts each  proc deal with and where it start and end ...
131559599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
131659599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
131759599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
131859599516SKenneth E. Jansen 
131959599516SKenneth E. Jansen     //int descriptor;
132059599516SKenneth E. Jansen     char filename[255],path[255],fieldtag_s[255];
132159599516SKenneth E. Jansen     bzero((void*)filename,255);
132259599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
132359599516SKenneth E. Jansen 
132459599516SKenneth E. Jansen //     char * namer;
132559599516SKenneth E. Jansen //     namer = strtok(fieldlabel," ");
132659599516SKenneth E. Jansen //     strncpy(fieldlabel, fieldtag, *tagsize);
132759599516SKenneth E. Jansen 
132859599516SKenneth E. Jansen     field_flag++;
132959599516SKenneth E. Jansen     if(*pid==0) {
133059599516SKenneth E. Jansen //      printf("\n*****************************\n");
133159599516SKenneth E. Jansen       printf("\n");
133259599516SKenneth E. Jansen       printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel);
133359599516SKenneth E. Jansen     }
133459599516SKenneth E. Jansen 
133559599516SKenneth E. Jansen     sprintf(filename,"restart-dat.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1));
133659599516SKenneth E. Jansen 
133759599516SKenneth E. Jansen     int i;
133859599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++  ) {
133959599516SKenneth E. Jansen         GPID = startpart + i;
134059599516SKenneth E. Jansen 
134159599516SKenneth E. Jansen         // Write solution field ...
134259599516SKenneth E. Jansen         sprintf(fieldtag_s,"%s@%d",fieldlabel,GPID);
134359599516SKenneth E. Jansen 
134459599516SKenneth E. Jansen         //printf("This is %d and fieldtag_s is %s \n",myrank,fieldtag_s);
134559599516SKenneth E. Jansen 
134659599516SKenneth E. Jansen         isize = (*nshg)*(*numvars);
134759599516SKenneth E. Jansen         nitems = 3;
134859599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
134959599516SKenneth E. Jansen         iarray[ 1 ] = (*numvars);
135059599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
135159599516SKenneth E. Jansen 
135259599516SKenneth E. Jansen //MR CHANGE
135359599516SKenneth E. Jansen //  Measure the time - Start the timer
135459599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
135559599516SKenneth E. Jansen //        timer_start = rdtsc();
135659599516SKenneth E. Jansen //MR CHANGE END
135759599516SKenneth E. Jansen 
135859599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
135959599516SKenneth E. Jansen 
136059599516SKenneth E. Jansen //MR CHANGE
136159599516SKenneth E. Jansen //  Measure the time - End of timer
136259599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
136359599516SKenneth E. Jansen //        timer_end = rdtsc();
136459599516SKenneth E. Jansen //        time_span=(double)((timer_end-timer_start)/cpu_speed);
136559599516SKenneth E. Jansen //        if (*pid==0) {
136659599516SKenneth E. Jansen //          printf("Time: header for '%s':    %f s\n",fieldtag_s,time_span);
136759599516SKenneth E. Jansen //        }
136859599516SKenneth E. Jansen //MR CHANGE END
136959599516SKenneth E. Jansen 
137059599516SKenneth E. Jansen         nitems = (*nshg)*(*numvars);
137159599516SKenneth E. Jansen 
137259599516SKenneth E. Jansen //MR CHANGE
137359599516SKenneth E. Jansen //  Measure the time - Start the timer
137459599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
137559599516SKenneth E. Jansen //        timer_start = rdtsc();
137659599516SKenneth E. Jansen //MR CHANGE END
137759599516SKenneth E. Jansen 
137859599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, array, &isize, "double", phasta_iotype );
137959599516SKenneth E. Jansen 
138059599516SKenneth E. Jansen //MR CHANGE
138159599516SKenneth E. Jansen //  Measure the time - End of timer
138259599516SKenneth E. Jansen //        MPI_Barrier(MPI_COMM_WORLD);
138359599516SKenneth E. Jansen //        timer_end = rdtsc();
138459599516SKenneth E. Jansen //        time_span=(double)((timer_end-timer_start)/cpu_speed);
138559599516SKenneth E. Jansen 
138659599516SKenneth E. Jansen //        int isizemin,isizemax,isizetot;
138759599516SKenneth E. Jansen //        double sizemin,sizemax,sizeavg,sizetot,rate;
138859599516SKenneth E. Jansen 
138959599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizemin,1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
139059599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizemax,1,MPI_INT,MPI_MAX,MPI_COMM_WORLD);
139159599516SKenneth E. Jansen //        MPI_Allreduce(&isize,&isizetot,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD);
139259599516SKenneth E. Jansen 
139359599516SKenneth E. Jansen //        sizemin=(double)(8.0*isizemin/1024.0/1024.0);
139459599516SKenneth E. Jansen //        sizemax=(double)(8.0*isizemax/1024.0/1024.0);
139559599516SKenneth E. Jansen //        sizetot=(double)(8.0*isizetot/1024.0/1024.0);
139659599516SKenneth E. Jansen //        sizeavg=sizetot/workfc.numpe;
139759599516SKenneth E. Jansen //        rate=sizetot/time_span;
139859599516SKenneth E. Jansen 
139959599516SKenneth E. Jansen //        if (*pid==0) {
140059599516SKenneth E. Jansen //          printf("Time: block for '%s':    %f s\n",fieldtag_s,time_span);
140159599516SKenneth E. Jansen //          printf("Time: block:   Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB; Rate= %f MB/s; \n",sizemin,sizemax,sizeavg,sizetot,rate);
140259599516SKenneth E. Jansen //          printf("*****************************\n");
140359599516SKenneth E. Jansen //        }
140459599516SKenneth E. Jansen //MR CHANGE END
140559599516SKenneth E. Jansen 
140659599516SKenneth E. Jansen     }
140759599516SKenneth E. Jansen 
140859599516SKenneth E. Jansen //     if (*pid==0) {
140959599516SKenneth E. Jansen //         printf("Field '%s' written in:     %f s\n",fieldtag,time_span);
141059599516SKenneth E. Jansen //         printf("Write field '%s' finished! \n",fieldtag_s);
141159599516SKenneth E. Jansen //     }
141259599516SKenneth E. Jansen 
141359599516SKenneth E. Jansen //
141459599516SKenneth E. Jansen //     if (field_flag==nfields){
141559599516SKenneth E. Jansen //       closefile_(&f_descriptor, "write");
141659599516SKenneth E. Jansen //       finalizephmpiio_(&f_descriptor);
141759599516SKenneth E. Jansen //       if(*pid==0) {
141859599516SKenneth E. Jansen //         printf("Last field %d '%s' finished! \n",nfields, fieldtag_s);
141959599516SKenneth E. Jansen //         printf("\n*****************************\n");
142059599516SKenneth E. Jansen //       }
142159599516SKenneth E. Jansen //     }
142259599516SKenneth E. Jansen 
142359599516SKenneth E. Jansen     if (field_flag==nfields){
142459599516SKenneth E. Jansen 
142559599516SKenneth E. Jansen //MR CHANGE
142659599516SKenneth E. Jansen //  Measure the time - Start the timer
142759599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
142859599516SKenneth E. Jansen //      timer_start = rdtsc();
142959599516SKenneth E. Jansen //MR CHANGE END
143059599516SKenneth E. Jansen 
143159599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
143259599516SKenneth E. Jansen 
143359599516SKenneth E. Jansen //MR CHANGE
143459599516SKenneth E. Jansen //    Measure the time - End of timer
143559599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
143659599516SKenneth E. Jansen //      timer_end = rdtsc();
143759599516SKenneth E. Jansen //      time_span=(double)((timer_end-timer_start)/cpu_speed);
143859599516SKenneth E. Jansen //     if (*pid==0) {
143959599516SKenneth E. Jansen //        printf("\n*****************************\n");
144059599516SKenneth E. Jansen //        printf("Time: 'closefile' is:    %f s\n",time_span);
144159599516SKenneth E. Jansen //      }
144259599516SKenneth E. Jansen //MR CHANGE END
144359599516SKenneth E. Jansen 
144459599516SKenneth E. Jansen //MR CHANGE
144559599516SKenneth E. Jansen //  Measure the time - Start the timer
144659599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
144759599516SKenneth E. Jansen //      timer_start = rdtsc();
144859599516SKenneth E. Jansen //MR CHANGE END
144959599516SKenneth E. Jansen 
145059599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
145159599516SKenneth E. Jansen 
145259599516SKenneth E. Jansen //MR CHANGE
145359599516SKenneth E. Jansen //    Measure the time - End of timer
145459599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
145559599516SKenneth E. Jansen //      timer_end = rdtsc();
145659599516SKenneth E. Jansen //      time_span=(double)((timer_end-timer_start)/cpu_speed);
145759599516SKenneth E. Jansen       if (*pid==0) {
145859599516SKenneth E. Jansen //        printf("Time: 'finalizephmpiio' is:    %f s\n",time_span);
145959599516SKenneth E. Jansen //        printf("Last field %d '%s' finished! \n",nfields, fieldtag);
146059599516SKenneth E. Jansen         printf("\n");
146159599516SKenneth E. Jansen //        printf("*****************************\n");
146259599516SKenneth E. Jansen       }
146359599516SKenneth E. Jansen     }
146459599516SKenneth E. Jansen //MR CHANGE END
146559599516SKenneth E. Jansen 
146659599516SKenneth E. Jansen     ///////////////////////////////////////////////////////////////////////////////////////////
146759599516SKenneth E. Jansen 
146859599516SKenneth E. Jansen     free(fieldlabel);
146959599516SKenneth E. Jansen }
147059599516SKenneth E. Jansen 
147159599516SKenneth E. Jansen 
147259599516SKenneth E. Jansen void
147359599516SKenneth E. Jansen Write_d2wall(   int* pid,
147459599516SKenneth E. Jansen                 int* numnp,
147559599516SKenneth E. Jansen                 double* array1 ) {
147659599516SKenneth E. Jansen 
147759599516SKenneth E. Jansen //    time_t timenow = time ( &timenow);
147859599516SKenneth E. Jansen     int isize, nitems;
147959599516SKenneth E. Jansen     int iarray[10];
148059599516SKenneth E. Jansen 
148159599516SKenneth E. Jansen //    MPI_Barrier(MPI_COMM_WORLD);
148259599516SKenneth E. Jansen 
148359599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
148459599516SKenneth E. Jansen 
148559599516SKenneth E. Jansen     int nfiles;
148659599516SKenneth E. Jansen     int nfields;
148759599516SKenneth E. Jansen     int numparts;
148859599516SKenneth E. Jansen     int irank;
148959599516SKenneth E. Jansen     int nprocs;
149059599516SKenneth E. Jansen 
149159599516SKenneth E. Jansen     //  First, count the number of fields to write and store the result in
149259599516SKenneth E. Jansen     //countfieldstowriterestart();
149359599516SKenneth E. Jansen 
149459599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
149559599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
149659599516SKenneth E. Jansen     nfields = 1; //outpar.nsynciofieldswriterestart;  // Only the distance to the walls in d2wall
149759599516SKenneth E. Jansen     numparts = workfc.numpe;
149859599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
149959599516SKenneth E. Jansen     nprocs = workfc.numpe;
150059599516SKenneth E. Jansen     int nppf = numparts/nfiles;
150159599516SKenneth E. Jansen     int GPID;
150259599516SKenneth E. Jansen 
150359599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
150459599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
150559599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
150659599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
150759599516SKenneth E. Jansen 
150859599516SKenneth E. Jansen     int descriptor;
150959599516SKenneth E. Jansen     char filename[255],path[255],fieldtag_s[255];
151059599516SKenneth E. Jansen     bzero((void*)filename,255);
151159599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
151259599516SKenneth E. Jansen 
151359599516SKenneth E. Jansen     sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1));
151459599516SKenneth E. Jansen 
151559599516SKenneth E. Jansen     if (irank==0) {
151659599516SKenneth E. Jansen       printf("Filename is %s \n",filename);
151759599516SKenneth E. Jansen     }
151859599516SKenneth E. Jansen 
151959599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write");
152059599516SKenneth E. Jansen 
152159599516SKenneth E. Jansen     openfile(filename, "write", &f_descriptor);
152259599516SKenneth E. Jansen 
152359599516SKenneth E. Jansen     field_flag=0;
152459599516SKenneth E. Jansen 
152559599516SKenneth E. Jansen      int i;
152659599516SKenneth E. Jansen      for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
152759599516SKenneth E. Jansen      // GPID : global part id, corresponds to rank ...
152859599516SKenneth E. Jansen         // e.g : (in this example)
152959599516SKenneth E. Jansen         // proc 0 : 1--4
153059599516SKenneth E. Jansen         // proc 1 : 5--8 ...
153159599516SKenneth E. Jansen         GPID = startpart + i;
153259599516SKenneth E. Jansen 
153359599516SKenneth E. Jansen         // Write solution field ...
153459599516SKenneth E. Jansen         sprintf(fieldtag_s,"d2wall@%d",GPID);
153559599516SKenneth E. Jansen 
153659599516SKenneth E. Jansen         isize = (*numnp);
153759599516SKenneth E. Jansen         nitems = 2;
153859599516SKenneth E. Jansen         iarray[ 0 ] = (*numnp);
153959599516SKenneth E. Jansen         iarray[ 1 ] = 1; //numVars = 1
154059599516SKenneth E. Jansen 
154159599516SKenneth E. Jansen         writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype);
154259599516SKenneth E. Jansen 
154359599516SKenneth E. Jansen         //nitems = (*nshg)*(*numVars);
154459599516SKenneth E. Jansen         //nitems = (*numnp);
154559599516SKenneth E. Jansen 
154659599516SKenneth E. Jansen         writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
154759599516SKenneth E. Jansen 
154859599516SKenneth E. Jansen 
154959599516SKenneth E. Jansen     }
155059599516SKenneth E. Jansen     field_flag++;
155159599516SKenneth E. Jansen 
155259599516SKenneth E. Jansen     if (field_flag==nfields){
155359599516SKenneth E. Jansen 
155459599516SKenneth E. Jansen       closefile(&f_descriptor, "write");
155559599516SKenneth E. Jansen 
155659599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
155759599516SKenneth E. Jansen 
155859599516SKenneth E. Jansen       if (irank==0) {
155959599516SKenneth E. Jansen         printf("\n");
156059599516SKenneth E. Jansen       }
156159599516SKenneth E. Jansen     }
156259599516SKenneth E. Jansen }
156359599516SKenneth E. Jansen 
1564