xref: /phasta/phSolver/common/new_interface.c (revision 4ead34e5d5e094065da4d96ce571099cb42db973)
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"
17ade0e30fSCameron Smith #include "phIO.h"
1859599516SKenneth E. Jansen #include "common_c.h"
1959599516SKenneth E. Jansen 
2059599516SKenneth E. Jansen #ifdef intel
2159599516SKenneth E. Jansen #include <winsock2.h>
2259599516SKenneth E. Jansen #else
2359599516SKenneth E. Jansen #include <unistd.h>
2459599516SKenneth E. Jansen #include <strings.h>
2559599516SKenneth E. Jansen #endif
2659599516SKenneth E. Jansen 
2759599516SKenneth E. Jansen void igetMinMaxAvg(int *ivalue, double *stats, int *statRanks) {
2859599516SKenneth E. Jansen   int isThisRank;
2959599516SKenneth E. Jansen   double *value = (double*)malloc(sizeof(double));
3059599516SKenneth E. Jansen   *value = 1.0*(*ivalue);
3159599516SKenneth E. Jansen   rgetMinMaxAvg(value,stats,statRanks);
3259599516SKenneth E. Jansen   free(value);
3359599516SKenneth E. Jansen }
3459599516SKenneth E. Jansen 
3559599516SKenneth E. Jansen void rgetMinMaxAvg(double *value, double *stats, int *statRanks) {
3659599516SKenneth E. Jansen   int isThisRank;
3759599516SKenneth E. Jansen 
3859599516SKenneth E. Jansen   MPI_Allreduce(value,&stats[0],1,MPI_DOUBLE,MPI_MIN,MPI_COMM_WORLD);
3959599516SKenneth E. Jansen   isThisRank=workfc.numpe+1;
4059599516SKenneth E. Jansen   if(*value==stats[0])
4159599516SKenneth E. Jansen     isThisRank=workfc.myrank;
4259599516SKenneth E. Jansen   MPI_Allreduce(&isThisRank,&statRanks[0],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
4359599516SKenneth E. Jansen 
4459599516SKenneth E. Jansen   MPI_Allreduce(value,&stats[1],1,MPI_DOUBLE,MPI_MAX,MPI_COMM_WORLD);
4559599516SKenneth E. Jansen   isThisRank=workfc.numpe+1;
4659599516SKenneth E. Jansen   if(*value==stats[1])
4759599516SKenneth E. Jansen     isThisRank=workfc.myrank;
4859599516SKenneth E. Jansen   MPI_Allreduce(&isThisRank,&statRanks[1],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
4959599516SKenneth E. Jansen 
5059599516SKenneth E. Jansen   MPI_Allreduce(value,&stats[2],1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
5159599516SKenneth E. Jansen   stats[2] /= workfc.numpe;
5259599516SKenneth E. Jansen 
5359599516SKenneth E. Jansen   double sqValue = (*value)*(*value), sqValueAvg = 0.;
5459599516SKenneth E. Jansen   MPI_Allreduce(&sqValue,&sqValueAvg,1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
5559599516SKenneth E. Jansen   sqValueAvg /= workfc.numpe;
5659599516SKenneth E. Jansen 
5759599516SKenneth E. Jansen   stats[3] = sqrt(sqValueAvg-stats[2]*stats[2]);
5859599516SKenneth E. Jansen }
5959599516SKenneth E. Jansen 
6059599516SKenneth E. Jansen void print_mesh_stats(void) {
6159599516SKenneth E. Jansen   int statRanks[2];
6259599516SKenneth E. Jansen   double iStats[4], rStats[4];
6359599516SKenneth E. Jansen 
6459599516SKenneth E. Jansen   igetMinMaxAvg(&conpar.nshg,iStats,statRanks);
6559599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
6659599516SKenneth 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]);
6759599516SKenneth E. Jansen   igetMinMaxAvg(&conpar.numel,iStats,statRanks);
6859599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
6959599516SKenneth 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]);
7059599516SKenneth E. Jansen   igetMinMaxAvg(&conpar.numelb,iStats,statRanks);
7159599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
7259599516SKenneth 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]);
7359599516SKenneth E. Jansen   igetMinMaxAvg(&conpar.nnz_tot,iStats,statRanks);
7459599516SKenneth E. Jansen   if(workfc.myrank==workfc.master) {
7559599516SKenneth 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]);
7659599516SKenneth E. Jansen     printf("\n");
7759599516SKenneth E. Jansen   }
7859599516SKenneth E. Jansen }
7959599516SKenneth E. Jansen 
8059599516SKenneth E. Jansen void print_mpi_stats(void) {
8159599516SKenneth E. Jansen   int statRanks[2];
8259599516SKenneth E. Jansen   double iStats[4], rStats[4];
8359599516SKenneth E. Jansen 
8459599516SKenneth E. Jansen // NS equations
8559599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iISend,iStats,statRanks);
8659599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
8759599516SKenneth 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]);
8859599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iIRecv,iStats,statRanks);
8959599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
9059599516SKenneth 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]);
9159599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iWaitAll,iStats,statRanks);
9259599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
9359599516SKenneth 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]);
9459599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iAllR,iStats,statRanks);
9559599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
9659599516SKenneth 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]);
9759599516SKenneth E. Jansen 
9859599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rISend,rStats,statRanks);
9959599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
10059599516SKenneth 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]);
10159599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rIRecv,rStats,statRanks);
10259599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
10359599516SKenneth 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]);
10459599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rWaitAll,rStats,statRanks);
10559599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
10659599516SKenneth 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]);
10759599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rCommu,rStats,statRanks);
10859599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
10959599516SKenneth 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]);
11059599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rAllR,rStats,statRanks);
11159599516SKenneth E. Jansen   if(workfc.myrank==workfc.master) {
11259599516SKenneth 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]);
11359599516SKenneth E. Jansen     printf("\n");
11459599516SKenneth E. Jansen   }
11559599516SKenneth E. Jansen // Scalars
11659599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iISendScal,iStats,statRanks);
11759599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
11859599516SKenneth 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]);
11959599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iIRecvScal,iStats,statRanks);
12059599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
12159599516SKenneth 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]);
12259599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iWaitAllScal,iStats,statRanks);
12359599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
12459599516SKenneth 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]);
12559599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iAllRScal,iStats,statRanks);
12659599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
12759599516SKenneth 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]);
12859599516SKenneth E. Jansen 
12959599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rISendScal,rStats,statRanks);
13059599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
13159599516SKenneth 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]);
13259599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rIRecvScal,rStats,statRanks);
13359599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
13459599516SKenneth 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]);
13559599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rWaitAllScal,rStats,statRanks);
13659599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
13759599516SKenneth 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]);
13859599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rCommuScal,rStats,statRanks);
13959599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
14059599516SKenneth 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]);
14159599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rAllRScal,rStats,statRanks);
14259599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
14359599516SKenneth 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]);
14459599516SKenneth E. Jansen 
14559599516SKenneth E. Jansen 
14659599516SKenneth E. Jansen }
14759599516SKenneth E. Jansen 
14859599516SKenneth E. Jansen void print_system_stats(double *tcorecp, double *tcorecpscal) {
14959599516SKenneth E. Jansen   int statRanks[2];
15059599516SKenneth E. Jansen   double iStats[4], rStats[4];
15159599516SKenneth E. Jansen   double syst_assembly, syst_solve;
15259599516SKenneth E. Jansen 
15359599516SKenneth E. Jansen // NS equations
15459599516SKenneth E. Jansen   syst_assembly = tcorecp[0];
15559599516SKenneth E. Jansen   syst_solve = tcorecp[1];
15659599516SKenneth E. Jansen 
15759599516SKenneth E. Jansen   rgetMinMaxAvg(&syst_assembly,rStats,statRanks);
15859599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
15959599516SKenneth 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]);
16059599516SKenneth E. Jansen 
16159599516SKenneth E. Jansen   rgetMinMaxAvg(&syst_solve,rStats,statRanks);
16259599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
16359599516SKenneth 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]);
16459599516SKenneth E. Jansen 
16559599516SKenneth E. Jansen // Scalars
16659599516SKenneth E. Jansen   syst_assembly = tcorecpscal[0];
16759599516SKenneth E. Jansen   syst_solve = tcorecpscal[1];
16859599516SKenneth E. Jansen 
16959599516SKenneth E. Jansen   rgetMinMaxAvg(&syst_assembly,rStats,statRanks);
17059599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
17159599516SKenneth 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]);
17259599516SKenneth E. Jansen 
17359599516SKenneth E. Jansen   rgetMinMaxAvg(&syst_solve,rStats,statRanks);
17459599516SKenneth E. Jansen   if(workfc.myrank==workfc.master) {
17559599516SKenneth 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]);
17659599516SKenneth E. Jansen     printf("\n");
17759599516SKenneth E. Jansen   }
17859599516SKenneth E. Jansen }
17959599516SKenneth E. Jansen 
18059599516SKenneth E. Jansen 
18159599516SKenneth E. Jansen 
18259599516SKenneth E. Jansen void countfieldstowriterestart()
18359599516SKenneth E. Jansen {
184*4ead34e5SCameron Smith   int nfields = 2; //solution, time derivatives
18559599516SKenneth E. Jansen 
18659599516SKenneth E. Jansen   if(outpar.ivort == 1){
18759599516SKenneth E. Jansen     nfields++; //vorticity
18859599516SKenneth E. Jansen   }
18959599516SKenneth E. Jansen 
19059599516SKenneth E. Jansen   if(abs(turbvar.itwmod) != 1 && outpar.iowflux == 1) {
19159599516SKenneth E. Jansen     nfields++; //instantaneous wss in bflux.f
19259599516SKenneth E. Jansen   }
19359599516SKenneth E. Jansen 
19459599516SKenneth E. Jansen   if(timdat.istep == inpdat.nstep[timdat.itseq-1]){ //Last time step of the computation
19559599516SKenneth E. Jansen 
19659599516SKenneth E. Jansen     //projection vectors and pressure projection vectors (call saveLesRestart in itrdrv)
1972efdc748SKenneth E. Jansen     if(matdat.matflg[0][0] ==-1) {
19859599516SKenneth E. Jansen         nfields = nfields +2;
1992efdc748SKenneth E. Jansen     }
20059599516SKenneth E. Jansen 
20159599516SKenneth E. Jansen     //if Print Error Indicators = true (call write_error in itrdrv)
20259599516SKenneth E. Jansen     if(turbvar.ierrcalc == 1){
20359599516SKenneth E. Jansen       nfields++;
20459599516SKenneth E. Jansen     }
20559599516SKenneth E. Jansen 
20659599516SKenneth E. Jansen     //if Print ybar = True (call write_field(myrank,'a','ybar',4,... in itrdrv)
20759599516SKenneth E. Jansen     if(outpar.ioybar == 1){
20859599516SKenneth E. Jansen       nfields++;  //ybar
20959599516SKenneth E. Jansen 
21059599516SKenneth E. Jansen       //phase average fields
21159599516SKenneth E. Jansen       if(outpar.nphasesincycle >0) {
21259599516SKenneth E. Jansen         nfields = nfields + outpar.nphasesincycle;
21359599516SKenneth E. Jansen       }
21459599516SKenneth E. Jansen 
21559599516SKenneth E. Jansen       if(abs(turbvar.itwmod) != 1 && outpar.iowflux == 1) {
21659599516SKenneth E. Jansen         nfields++; //wssbar
21759599516SKenneth E. Jansen       }
21859599516SKenneth E. Jansen 
21959599516SKenneth E. Jansen     }
22059599516SKenneth E. Jansen 
22159599516SKenneth E. Jansen     if(turbvari.irans < 0) {
22259599516SKenneth E. Jansen       nfields++; //dwal
22359599516SKenneth E. Jansen     }
22459599516SKenneth E. Jansen 
22559599516SKenneth E. Jansen   }
22659599516SKenneth E. Jansen 
22759599516SKenneth E. Jansen   outpar.nsynciofieldswriterestart = nfields;
22859599516SKenneth E. Jansen 
22959599516SKenneth E. Jansen   if(workfc.myrank == 0) {
23059599516SKenneth E. Jansen     printf("Number of fields to write in restart files: %d\n", nfields);
23159599516SKenneth E. Jansen   }
23259599516SKenneth E. Jansen }
23359599516SKenneth E. Jansen 
23459599516SKenneth E. Jansen 
23559599516SKenneth E. Jansen void
23659599516SKenneth E. Jansen Write_Restart(  int* pid,
23759599516SKenneth E. Jansen                 int* stepno,
23859599516SKenneth E. Jansen                 int* nshg,
23959599516SKenneth E. Jansen                 int* numVars,
24059599516SKenneth E. Jansen                 double* array1,
24159599516SKenneth E. Jansen                 double* array2 ) {
24259599516SKenneth E. Jansen 
24359599516SKenneth E. Jansen     char fname[255];
24459599516SKenneth E. Jansen     char rfile[60];
24559599516SKenneth E. Jansen     char existingfile[30], linkfile[30];
24659599516SKenneth E. Jansen     int irstou;
24759599516SKenneth E. Jansen     int magic_number = 362436;
24859599516SKenneth E. Jansen     int* mptr = &magic_number;
24959599516SKenneth E. Jansen     double version=0.0;
25059599516SKenneth E. Jansen     int isize, nitems;
25159599516SKenneth E. Jansen     int iarray[10];
25259599516SKenneth E. Jansen     int nfiles;
25359599516SKenneth E. Jansen     int nfields;
25459599516SKenneth E. Jansen     int numparts;
25559599516SKenneth E. Jansen     int irank;
25659599516SKenneth E. Jansen     int nprocs;
2572efdc748SKenneth E. Jansen     int nppf;
25859599516SKenneth E. Jansen 
25959599516SKenneth E. Jansen     //  First, count the number of fields to write and store the result in
26059599516SKenneth E. Jansen     countfieldstowriterestart();
26159599516SKenneth E. Jansen 
26259599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
26359599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
26459599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
26559599516SKenneth E. Jansen     numparts = workfc.numpe;
26659599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
26759599516SKenneth E. Jansen     nprocs = workfc.numpe;
2682efdc748SKenneth E. Jansen     int nppp = numparts/nprocs;   // always 1 for PHASTA
26959599516SKenneth E. Jansen     int descriptor;
2702efdc748SKenneth E. Jansen     char filename[255];
27159599516SKenneth E. Jansen     bzero((void*)filename,255);
27259599516SKenneth E. Jansen 
2732efdc748SKenneth E. Jansen     if(nfiles == 0 ){
2742efdc748SKenneth E. Jansen       sprintf(filename,"restart.%d.", *stepno);
2752efdc748SKenneth E. Jansen       nppf=1;
2762efdc748SKenneth E. Jansen     } else {
2772efdc748SKenneth E. Jansen       nppf=numparts/nfiles;
278055123f6SCameron Smith       sprintf(filename,"restart-dat.%d.", *stepno);
2792efdc748SKenneth E. Jansen     }
28092bfab9aSCameron Smith     phio_openfile_write(filename, &nfiles, &nfields, &nppf, &f_descriptor);
28159599516SKenneth E. Jansen 
28259599516SKenneth E. Jansen     field_flag=0;
28359599516SKenneth E. Jansen 
28459599516SKenneth E. Jansen      int i;
28559599516SKenneth E. Jansen      for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
28659599516SKenneth E. Jansen         // Write solution field ...
28759599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
28859599516SKenneth E. Jansen         nitems = 3;
28959599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
29059599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
29159599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
29259599516SKenneth E. Jansen 
293055123f6SCameron Smith         phio_writeheader(f_descriptor, "solution", (void*)iarray, &nitems,
29454d5a0aaSCameron Smith             &isize, "double", phasta_iotype);
29559599516SKenneth E. Jansen         nitems = (*nshg)*(*numVars);
296055123f6SCameron Smith         phio_writedatablock(f_descriptor, "solution", (void*)(array1),
29753d5e07cSCameron Smith             &isize, "double", phasta_iotype );
29859599516SKenneth E. Jansen     }
29959599516SKenneth E. Jansen     field_flag++;
30059599516SKenneth E. Jansen 
30159599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++) {
30259599516SKenneth E. Jansen         // Write solution field ...
30359599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
30459599516SKenneth E. Jansen         nitems = 3;
30559599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
30659599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
30759599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
308055123f6SCameron Smith         phio_writeheader(f_descriptor, "time derivative of solution",
30954d5a0aaSCameron Smith             (void*)iarray, &nitems, &isize, "double", phasta_iotype);
31059599516SKenneth E. Jansen         nitems = (*nshg)*(*numVars);
311055123f6SCameron Smith         phio_writedatablock(f_descriptor, "time derivative of solution",
31253d5e07cSCameron Smith             (void*)(array2), &isize, "double", phasta_iotype );
31359599516SKenneth E. Jansen     }
31459599516SKenneth E. Jansen     field_flag++;
31559599516SKenneth E. Jansen 
31659599516SKenneth E. Jansen     if (field_flag==nfields){
317055123f6SCameron Smith       phio_closefile_write(f_descriptor);
31859599516SKenneth E. Jansen       if (*pid==0) {
31959599516SKenneth E. Jansen         printf("\n");
32059599516SKenneth E. Jansen       }
32159599516SKenneth E. Jansen     }
32259599516SKenneth E. Jansen }
32359599516SKenneth E. Jansen 
32459599516SKenneth E. Jansen void
32559599516SKenneth E. Jansen Write_Error(  int* pid,
32659599516SKenneth E. Jansen               int* stepno,
32759599516SKenneth E. Jansen               int* nshg,
32859599516SKenneth E. Jansen               int* numVars,
32959599516SKenneth E. Jansen               double* array1 ) {
33059599516SKenneth E. Jansen     char fname[255];
33159599516SKenneth E. Jansen     char rfile[60];
33259599516SKenneth E. Jansen     int irstou;
33359599516SKenneth E. Jansen     int magic_number = 362436;
33459599516SKenneth E. Jansen     int* mptr = &magic_number;
33559599516SKenneth E. Jansen     double version=0.0;
33659599516SKenneth E. Jansen     int isize, nitems;
33759599516SKenneth E. Jansen     int iarray[10];
33859599516SKenneth E. Jansen     int nfiles;
33959599516SKenneth E. Jansen     int nfields;
34059599516SKenneth E. Jansen     int numparts;
34159599516SKenneth E. Jansen     int irank;
34259599516SKenneth E. Jansen     int nprocs;
34359599516SKenneth E. Jansen 
34459599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
34559599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
34659599516SKenneth E. Jansen     numparts = workfc.numpe;
34759599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
34859599516SKenneth E. Jansen     nprocs = workfc.numpe;
34959599516SKenneth E. Jansen 
35059599516SKenneth E. Jansen     // Calculate number of parts each  proc deal with and where it start and end ...
35159599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
35259599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
35359599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
35459599516SKenneth E. Jansen 
35559599516SKenneth E. Jansen     field_flag++;
35659599516SKenneth E. Jansen 
35759599516SKenneth E. Jansen     int i;
35859599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++  ) {
35959599516SKenneth E. Jansen 
36059599516SKenneth E. Jansen         if(*pid==0) {
36159599516SKenneth E. Jansen           printf("\n");
362ab9e12e4SCameron Smith           printf("The %d/%d th field to be written is 'errors'\n",field_flag,nfields);
36359599516SKenneth E. Jansen         }
36459599516SKenneth E. Jansen 
36559599516SKenneth E. Jansen         isize = (*nshg)*(*numVars);
36659599516SKenneth E. Jansen         nitems = 3;
36759599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
36859599516SKenneth E. Jansen         iarray[ 1 ] = (*numVars);
36959599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
37059599516SKenneth E. Jansen 
371055123f6SCameron Smith         phio_writeheader(f_descriptor, "errors", (void*)iarray, &nitems,
37254d5a0aaSCameron Smith             &isize, "double", phasta_iotype);
37359599516SKenneth E. Jansen 
374055123f6SCameron Smith         phio_writedatablock(f_descriptor, "errors", (void*)array1, &isize,
37553d5e07cSCameron Smith             "double", phasta_iotype );
37659599516SKenneth E. Jansen     }
37759599516SKenneth E. Jansen     if (field_flag==nfields){
378055123f6SCameron Smith       phio_closefile_write(f_descriptor);
37959599516SKenneth E. Jansen       if (*pid==0) {
380ab9e12e4SCameron Smith         printf("Last field %d 'errors' finished! \n",nfields);
38159599516SKenneth E. Jansen         printf("\n");
38259599516SKenneth E. Jansen       }
38359599516SKenneth E. Jansen     }
38459599516SKenneth E. Jansen }
38559599516SKenneth E. Jansen 
38659599516SKenneth E. Jansen void
38759599516SKenneth E. Jansen Write_Displ(  int* pid,
38859599516SKenneth E. Jansen               int* stepno,
38959599516SKenneth E. Jansen               int* nshg,
39059599516SKenneth E. Jansen               int* numVars,
39159599516SKenneth E. Jansen               double* array1 ) {
392fd390aa3SCameron Smith   fprintf(stderr, "This function is dead...exiting\n");
393fd390aa3SCameron Smith   exit(1);
39459599516SKenneth E. Jansen }
39559599516SKenneth E. Jansen 
39659599516SKenneth E. Jansen void
39759599516SKenneth E. Jansen Write_Field(  int *pid,
39859599516SKenneth E. Jansen               char* filemode,
39959599516SKenneth E. Jansen               char* fieldtag,
40059599516SKenneth E. Jansen               int* tagsize,
40159599516SKenneth E. Jansen               void* array,
40259599516SKenneth E. Jansen               char* arraytype,
40359599516SKenneth E. Jansen               int* nshg,
40459599516SKenneth E. Jansen               int* numvars,
40559599516SKenneth E. Jansen               int* stepno) {
40659599516SKenneth E. Jansen     char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char));
40759599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
40859599516SKenneth E. Jansen     fieldlabel[*tagsize] = '\0';
40959599516SKenneth E. Jansen 
41059599516SKenneth E. Jansen     int irstou;
41159599516SKenneth E. Jansen     int magic_number = 362436;
41259599516SKenneth E. Jansen     int* mptr = &magic_number;
41359599516SKenneth E. Jansen     double version=0.0;
41459599516SKenneth E. Jansen     int isize, nitems;
41559599516SKenneth E. Jansen     int iarray[10];
41659599516SKenneth E. Jansen 
41759599516SKenneth E. Jansen     char fmode[10];
41859599516SKenneth E. Jansen     if(!strncmp(filemode,"w",1))
41959599516SKenneth E. Jansen       strcpy(fmode,"write");
42059599516SKenneth E. Jansen     else // default is append
42159599516SKenneth E. Jansen       strcpy(fmode,"append");
42259599516SKenneth E. Jansen 
42359599516SKenneth E. Jansen     char datatype[10];
42459599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
42559599516SKenneth E. Jansen       strcpy(datatype,"int");
42659599516SKenneth E. Jansen     else // default is double
42759599516SKenneth E. Jansen       strcpy(datatype,"double");
42859599516SKenneth E. Jansen 
42959599516SKenneth E. Jansen     int nfiles;
43059599516SKenneth E. Jansen     int nfields;
43159599516SKenneth E. Jansen     int numparts;
43259599516SKenneth E. Jansen     int irank;
43359599516SKenneth E. Jansen     int nprocs;
43459599516SKenneth E. Jansen 
43559599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
43659599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
43759599516SKenneth E. Jansen     numparts = workfc.numpe;
43859599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
43959599516SKenneth E. Jansen     nprocs = workfc.numpe;
44059599516SKenneth E. Jansen 
44159599516SKenneth E. Jansen     // Calculate number of parts each  proc deal with and where it start and end ...
44259599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
44359599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
44459599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
44559599516SKenneth E. Jansen 
44659599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
44759599516SKenneth E. Jansen 
44859599516SKenneth E. Jansen     field_flag++;
44959599516SKenneth E. Jansen     if(*pid==0) {
45059599516SKenneth E. Jansen       printf("\n");
45159599516SKenneth E. Jansen       printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel);
45259599516SKenneth E. Jansen     }
45359599516SKenneth E. Jansen 
45459599516SKenneth E. Jansen     int i;
45559599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++  ) {
45659599516SKenneth E. Jansen         // Write solution field ...
45759599516SKenneth E. Jansen         isize = (*nshg)*(*numvars);
45859599516SKenneth E. Jansen         nitems = 3;
45959599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
46059599516SKenneth E. Jansen         iarray[ 1 ] = (*numvars);
46159599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
46259599516SKenneth E. Jansen 
463055123f6SCameron Smith         phio_writeheader(f_descriptor, fieldlabel, (void*)iarray, &nitems,
46454d5a0aaSCameron Smith             &isize, datatype, phasta_iotype);
46559599516SKenneth E. Jansen         nitems = (*nshg)*(*numvars);
466055123f6SCameron Smith         phio_writedatablock(f_descriptor, fieldlabel, array, &isize,
46753d5e07cSCameron Smith             datatype, phasta_iotype );
46859599516SKenneth E. Jansen     }
46959599516SKenneth E. Jansen     if (field_flag==nfields){
470055123f6SCameron Smith       phio_closefile_write(f_descriptor);
47159599516SKenneth E. Jansen       if (*pid==0) {
47259599516SKenneth E. Jansen         printf("Last field %d '%s' finished! \n",nfields, fieldtag);
47359599516SKenneth E. Jansen         printf("\n");
47459599516SKenneth E. Jansen       }
47559599516SKenneth E. Jansen     }
47659599516SKenneth E. Jansen     free(fieldlabel);
47759599516SKenneth E. Jansen }
47859599516SKenneth E. Jansen 
47959599516SKenneth E. Jansen void
48059599516SKenneth E. Jansen Write_PhAvg2( int* pid,
48159599516SKenneth E. Jansen               char* filemode,
48259599516SKenneth E. Jansen               char* fieldtag,
48359599516SKenneth E. Jansen               int* tagsize,
48459599516SKenneth E. Jansen               int* iphase,
48559599516SKenneth E. Jansen               int* nphasesincycle,
48659599516SKenneth E. Jansen               void* array,
48759599516SKenneth E. Jansen               char* arraytype,
48859599516SKenneth E. Jansen               int* nshg,
48959599516SKenneth E. Jansen               int* numvars,
49059599516SKenneth E. Jansen               int* stepno) {
491ade0e30fSCameron Smith     int addtagsize=0; // phase number is added to the name of the field
49259599516SKenneth E. Jansen     if(*iphase<10)
49359599516SKenneth E. Jansen       addtagsize=1;
49459599516SKenneth E. Jansen     else if(*iphase<100)
49559599516SKenneth E. Jansen       addtagsize=2;
49659599516SKenneth E. Jansen     else if(*iphase<1000)
49759599516SKenneth E. Jansen       addtagsize=3;
49859599516SKenneth E. Jansen 
49959599516SKenneth E. Jansen     int tagsize2;
50059599516SKenneth E. Jansen     tagsize2=*tagsize+addtagsize;
50159599516SKenneth E. Jansen 
50259599516SKenneth E. Jansen     char *fieldlabel = (char *)malloc((tagsize2+1)*sizeof(char));
50359599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
50459599516SKenneth E. Jansen     fieldlabel[tagsize2] = '\0';
50559599516SKenneth E. Jansen 
50659599516SKenneth E. Jansen     char straddtagsize[10];
50759599516SKenneth E. Jansen     sprintf(straddtagsize,"%d",*iphase);
50859599516SKenneth E. Jansen 
50959599516SKenneth E. Jansen     if(*iphase<10) {
51059599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[0];
51159599516SKenneth E. Jansen     }
51259599516SKenneth E. Jansen     else if(*iphase<100) {
51359599516SKenneth E. Jansen       fieldlabel[tagsize2-2]=straddtagsize[0];
51459599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[1];
51559599516SKenneth E. Jansen     }
51659599516SKenneth E. Jansen     else if(*iphase<1000) {
51759599516SKenneth E. Jansen       fieldlabel[tagsize2-3]=straddtagsize[0];
51859599516SKenneth E. Jansen       fieldlabel[tagsize2-2]=straddtagsize[1];
51959599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[2];
52059599516SKenneth E. Jansen     }
52159599516SKenneth E. Jansen 
52259599516SKenneth E. Jansen     int irstou;
52359599516SKenneth E. Jansen     int magic_number = 362436;
52459599516SKenneth E. Jansen     int* mptr = &magic_number;
52559599516SKenneth E. Jansen     double version=0.0;
52659599516SKenneth E. Jansen     int isize, nitems;
52759599516SKenneth E. Jansen     int iarray[10];
52859599516SKenneth E. Jansen 
52959599516SKenneth E. Jansen     char fmode[10];
53059599516SKenneth E. Jansen     if(!strncmp(filemode,"w",1))
53159599516SKenneth E. Jansen       strcpy(fmode,"write");
53259599516SKenneth E. Jansen     else // default is append
53359599516SKenneth E. Jansen       strcpy(fmode,"append");
53459599516SKenneth E. Jansen 
53559599516SKenneth E. Jansen     char datatype[10];
53659599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
53759599516SKenneth E. Jansen       strcpy(datatype,"int");
53859599516SKenneth E. Jansen     else // default is double
53959599516SKenneth E. Jansen       strcpy(datatype,"double");
54059599516SKenneth E. Jansen 
54159599516SKenneth E. Jansen     int nfiles;
54259599516SKenneth E. Jansen     int nfields;
54359599516SKenneth E. Jansen     int numparts;
54459599516SKenneth E. Jansen     int irank;
54559599516SKenneth E. Jansen     int nprocs;
54659599516SKenneth E. Jansen 
54759599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
54859599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
54959599516SKenneth E. Jansen     numparts = workfc.numpe;
55059599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
55159599516SKenneth E. Jansen     nprocs = workfc.numpe;
55259599516SKenneth E. Jansen 
55359599516SKenneth E. Jansen     // Calculate number of parts each  proc deal with and where it start and end ...
55459599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
55559599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
55659599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
55759599516SKenneth E. Jansen 
55859599516SKenneth E. Jansen     field_flag++;
55959599516SKenneth E. Jansen     if(*pid==0) {
56059599516SKenneth E. Jansen       printf("\n");
56159599516SKenneth E. Jansen       printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel);
56259599516SKenneth E. Jansen     }
56359599516SKenneth E. Jansen 
56459599516SKenneth E. Jansen     int i;
56559599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++  ) {
56659599516SKenneth E. Jansen         // Write solution field ...
56759599516SKenneth E. Jansen         isize = (*nshg)*(*numvars);
56859599516SKenneth E. Jansen         nitems = 3;
56959599516SKenneth E. Jansen         iarray[ 0 ] = (*nshg);
57059599516SKenneth E. Jansen         iarray[ 1 ] = (*numvars);
57159599516SKenneth E. Jansen         iarray[ 2 ] = (*stepno);
572055123f6SCameron Smith         phio_writeheader(f_descriptor, fieldlabel, (void*)iarray, &nitems,
57354d5a0aaSCameron Smith             &isize, "double", phasta_iotype);
57459599516SKenneth E. Jansen         nitems = (*nshg)*(*numvars);
575055123f6SCameron Smith         phio_writedatablock(f_descriptor, fieldlabel, array, &isize,
57653d5e07cSCameron Smith             "double", phasta_iotype );
57759599516SKenneth E. Jansen     }
57859599516SKenneth E. Jansen     if (field_flag==nfields){
579055123f6SCameron Smith       phio_closefile_write(f_descriptor);
58059599516SKenneth E. Jansen       if (*pid==0) {
58159599516SKenneth E. Jansen         printf("\n");
58259599516SKenneth E. Jansen       }
58359599516SKenneth E. Jansen     }
58459599516SKenneth E. Jansen     free(fieldlabel);
58559599516SKenneth E. Jansen }
58659599516SKenneth E. Jansen 
58759599516SKenneth E. Jansen 
58859599516SKenneth E. Jansen void
58959599516SKenneth E. Jansen Write_d2wall(   int* pid,
59059599516SKenneth E. Jansen                 int* numnp,
59159599516SKenneth E. Jansen                 double* array1 ) {
59259599516SKenneth E. Jansen     int isize, nitems;
59359599516SKenneth E. Jansen     int iarray[10];
59459599516SKenneth E. Jansen     int nfiles;
59559599516SKenneth E. Jansen     int nfields;
59659599516SKenneth E. Jansen     int numparts;
59759599516SKenneth E. Jansen     int irank;
59859599516SKenneth E. Jansen     int nprocs;
59959599516SKenneth E. Jansen 
60059599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
60159599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
60259599516SKenneth E. Jansen     nfields = 1; //outpar.nsynciofieldswriterestart;  // Only the distance to the walls in d2wall
60359599516SKenneth E. Jansen     numparts = workfc.numpe;
60459599516SKenneth E. Jansen     irank = *pid; //workfc.myrank;
60559599516SKenneth E. Jansen     nprocs = workfc.numpe;
60659599516SKenneth E. Jansen 
60759599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
60859599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
60959599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
61059599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
61159599516SKenneth E. Jansen 
61259599516SKenneth E. Jansen     int descriptor;
6132efdc748SKenneth E. Jansen     int nppf=numparts/nfiles;
61459599516SKenneth E. Jansen 
61592bfab9aSCameron Smith     phio_openfile_write("d2wall.", &nfiles, &nfields, &nppf, &f_descriptor);
61659599516SKenneth E. Jansen 
61759599516SKenneth E. Jansen     field_flag=0;
61859599516SKenneth E. Jansen 
61959599516SKenneth E. Jansen      int i;
62059599516SKenneth E. Jansen      for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
62159599516SKenneth E. Jansen         // Write solution field ...
62259599516SKenneth E. Jansen         isize = (*numnp);
62359599516SKenneth E. Jansen         nitems = 2;
62459599516SKenneth E. Jansen         iarray[ 0 ] = (*numnp);
62559599516SKenneth E. Jansen         iarray[ 1 ] = 1; //numVars = 1
62659599516SKenneth E. Jansen 
62754d5a0aaSCameron Smith         phio_writeheader( &f_descriptor, "d2wall", (void*)iarray, &nitems,
62854d5a0aaSCameron Smith             &isize, "double", phasta_iotype);
62953d5e07cSCameron Smith         phio_writedatablock( &f_descriptor, "d2wall", (void*)(array1), &isize,
63053d5e07cSCameron Smith             "double", phasta_iotype );
63159599516SKenneth E. Jansen     }
63259599516SKenneth E. Jansen     field_flag++;
63359599516SKenneth E. Jansen 
63459599516SKenneth E. Jansen     if (field_flag==nfields){
635b63f4427SCameron Smith       phio_closefile_write(&f_descriptor);
63659599516SKenneth E. Jansen       if (irank==0) {
63759599516SKenneth E. Jansen         printf("\n");
63859599516SKenneth E. Jansen       }
63959599516SKenneth E. Jansen     }
64059599516SKenneth E. Jansen }
641