xref: /phasta/phSolver/common/new_interface.c (revision ff89a70fbab6ad11dee6f1333b0ab6cc24ae961c)
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 
6d7abaf6cSCameron Smith #include <stdlib.h>
759599516SKenneth E. Jansen #include <stdio.h>
859599516SKenneth E. Jansen #include <string.h>
959599516SKenneth E. Jansen #include <ctype.h>
1059599516SKenneth E. Jansen #include <stdlib.h>
1159599516SKenneth E. Jansen #include <time.h>
1259599516SKenneth E. Jansen #include <math.h>
13d7abaf6cSCameron Smith #include <assert.h>
1459599516SKenneth E. Jansen #include "mpi.h"
1559599516SKenneth E. Jansen #include "phastaIO.h"
1659599516SKenneth E. Jansen #include "rdtsc.h"
1759599516SKenneth E. Jansen #include <FCMangle.h>
1859599516SKenneth E. Jansen #include "new_interface.h"
19ade0e30fSCameron Smith #include "phIO.h"
20d7abaf6cSCameron Smith #include "syncio.h"
21d7abaf6cSCameron Smith #include "posixio.h"
22ecf8d2a9SCameron Smith #include "streamio.h"
2359599516SKenneth E. Jansen #include "common_c.h"
2420fccb6eSCameron Smith #include "tmrc.h"
25*ff89a70fSCameron Smith #include "phString.h"
2659599516SKenneth E. Jansen 
2759599516SKenneth E. Jansen #ifdef intel
2859599516SKenneth E. Jansen #include <winsock2.h>
2959599516SKenneth E. Jansen #else
3059599516SKenneth E. Jansen #include <unistd.h>
3159599516SKenneth E. Jansen #include <strings.h>
3259599516SKenneth E. Jansen #endif
3359599516SKenneth E. Jansen 
3459599516SKenneth E. Jansen void igetMinMaxAvg(int *ivalue, double *stats, int *statRanks) {
3559599516SKenneth E. Jansen   double *value = (double*)malloc(sizeof(double));
3659599516SKenneth E. Jansen   *value = 1.0*(*ivalue);
3759599516SKenneth E. Jansen   rgetMinMaxAvg(value,stats,statRanks);
3859599516SKenneth E. Jansen   free(value);
3959599516SKenneth E. Jansen }
4059599516SKenneth E. Jansen 
4159599516SKenneth E. Jansen void rgetMinMaxAvg(double *value, double *stats, int *statRanks) {
4259599516SKenneth E. Jansen   int isThisRank;
43*ff89a70fSCameron Smith   double sqValue = 0., sqValueAvg = 0.;
4459599516SKenneth E. Jansen 
4559599516SKenneth E. Jansen   MPI_Allreduce(value,&stats[0],1,MPI_DOUBLE,MPI_MIN,MPI_COMM_WORLD);
4659599516SKenneth E. Jansen   isThisRank=workfc.numpe+1;
4759599516SKenneth E. Jansen   if(*value==stats[0])
4859599516SKenneth E. Jansen     isThisRank=workfc.myrank;
4959599516SKenneth E. Jansen   MPI_Allreduce(&isThisRank,&statRanks[0],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
5059599516SKenneth E. Jansen 
5159599516SKenneth E. Jansen   MPI_Allreduce(value,&stats[1],1,MPI_DOUBLE,MPI_MAX,MPI_COMM_WORLD);
5259599516SKenneth E. Jansen   isThisRank=workfc.numpe+1;
5359599516SKenneth E. Jansen   if(*value==stats[1])
5459599516SKenneth E. Jansen     isThisRank=workfc.myrank;
5559599516SKenneth E. Jansen   MPI_Allreduce(&isThisRank,&statRanks[1],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
5659599516SKenneth E. Jansen 
5759599516SKenneth E. Jansen   MPI_Allreduce(value,&stats[2],1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
5859599516SKenneth E. Jansen   stats[2] /= workfc.numpe;
5959599516SKenneth E. Jansen 
60*ff89a70fSCameron Smith   sqValue = (*value)*(*value);
6159599516SKenneth E. Jansen   MPI_Allreduce(&sqValue,&sqValueAvg,1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
6259599516SKenneth E. Jansen   sqValueAvg /= workfc.numpe;
6359599516SKenneth E. Jansen 
6459599516SKenneth E. Jansen   stats[3] = sqrt(sqValueAvg-stats[2]*stats[2]);
6559599516SKenneth E. Jansen }
6659599516SKenneth E. Jansen 
6759599516SKenneth E. Jansen void print_mesh_stats(void) {
6859599516SKenneth E. Jansen   int statRanks[2];
69*ff89a70fSCameron Smith   double iStats[4];
7059599516SKenneth E. Jansen 
7159599516SKenneth E. Jansen   igetMinMaxAvg(&conpar.nshg,iStats,statRanks);
7259599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
7359599516SKenneth 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]);
7459599516SKenneth E. Jansen   igetMinMaxAvg(&conpar.numel,iStats,statRanks);
7559599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
7659599516SKenneth 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]);
7759599516SKenneth E. Jansen   igetMinMaxAvg(&conpar.numelb,iStats,statRanks);
7859599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
7959599516SKenneth 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]);
8059599516SKenneth E. Jansen   igetMinMaxAvg(&conpar.nnz_tot,iStats,statRanks);
8159599516SKenneth E. Jansen   if(workfc.myrank==workfc.master) {
8259599516SKenneth 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]);
8359599516SKenneth E. Jansen     printf("\n");
8459599516SKenneth E. Jansen   }
8559599516SKenneth E. Jansen }
8659599516SKenneth E. Jansen 
8759599516SKenneth E. Jansen void print_mpi_stats(void) {
8859599516SKenneth E. Jansen   int statRanks[2];
8959599516SKenneth E. Jansen   double iStats[4], rStats[4];
9059599516SKenneth E. Jansen 
9171350f02SCameron Smith /* NS equations*/
9259599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iISend,iStats,statRanks);
9359599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
9459599516SKenneth 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]);
9559599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iIRecv,iStats,statRanks);
9659599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
9759599516SKenneth 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]);
9859599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iWaitAll,iStats,statRanks);
9959599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
10059599516SKenneth 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]);
10159599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iAllR,iStats,statRanks);
10259599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
10359599516SKenneth 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]);
10459599516SKenneth E. Jansen 
10559599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rISend,rStats,statRanks);
10659599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
10759599516SKenneth 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]);
10859599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rIRecv,rStats,statRanks);
10959599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
11059599516SKenneth 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]);
11159599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rWaitAll,rStats,statRanks);
11259599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
11359599516SKenneth 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]);
11459599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rCommu,rStats,statRanks);
11559599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
11659599516SKenneth 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]);
11759599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rAllR,rStats,statRanks);
11859599516SKenneth E. Jansen   if(workfc.myrank==workfc.master) {
11959599516SKenneth 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]);
12059599516SKenneth E. Jansen     printf("\n");
12159599516SKenneth E. Jansen   }
12271350f02SCameron Smith /* Scalars*/
12359599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iISendScal,iStats,statRanks);
12459599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
12559599516SKenneth 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]);
12659599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iIRecvScal,iStats,statRanks);
12759599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
12859599516SKenneth 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]);
12959599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iWaitAllScal,iStats,statRanks);
13059599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
13159599516SKenneth 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]);
13259599516SKenneth E. Jansen   igetMinMaxAvg(&mpistats.iAllRScal,iStats,statRanks);
13359599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
13459599516SKenneth 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]);
13559599516SKenneth E. Jansen 
13659599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rISendScal,rStats,statRanks);
13759599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
13859599516SKenneth 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]);
13959599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rIRecvScal,rStats,statRanks);
14059599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
14159599516SKenneth 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]);
14259599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rWaitAllScal,rStats,statRanks);
14359599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
14459599516SKenneth 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]);
14559599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rCommuScal,rStats,statRanks);
14659599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
14759599516SKenneth 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]);
14859599516SKenneth E. Jansen   rgetMinMaxAvg(&mpistats.rAllRScal,rStats,statRanks);
14959599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
15059599516SKenneth 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]);
15159599516SKenneth E. Jansen 
15259599516SKenneth E. Jansen 
15359599516SKenneth E. Jansen }
15459599516SKenneth E. Jansen 
15559599516SKenneth E. Jansen void print_system_stats(double *tcorecp, double *tcorecpscal) {
15659599516SKenneth E. Jansen   int statRanks[2];
157*ff89a70fSCameron Smith   double rStats[4];
15859599516SKenneth E. Jansen   double syst_assembly, syst_solve;
15959599516SKenneth E. Jansen 
16071350f02SCameron Smith /* NS equations */
16159599516SKenneth E. Jansen   syst_assembly = tcorecp[0];
16259599516SKenneth E. Jansen   syst_solve = tcorecp[1];
16359599516SKenneth E. Jansen 
16459599516SKenneth E. Jansen   rgetMinMaxAvg(&syst_assembly,rStats,statRanks);
16559599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
16659599516SKenneth 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]);
16759599516SKenneth E. Jansen 
16859599516SKenneth E. Jansen   rgetMinMaxAvg(&syst_solve,rStats,statRanks);
16959599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
17059599516SKenneth 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]);
17159599516SKenneth E. Jansen 
17271350f02SCameron Smith /* Scalars */
17359599516SKenneth E. Jansen   syst_assembly = tcorecpscal[0];
17459599516SKenneth E. Jansen   syst_solve = tcorecpscal[1];
17559599516SKenneth E. Jansen 
17659599516SKenneth E. Jansen   rgetMinMaxAvg(&syst_assembly,rStats,statRanks);
17759599516SKenneth E. Jansen   if(workfc.myrank==workfc.master)
17859599516SKenneth 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]);
17959599516SKenneth E. Jansen 
18059599516SKenneth E. Jansen   rgetMinMaxAvg(&syst_solve,rStats,statRanks);
18159599516SKenneth E. Jansen   if(workfc.myrank==workfc.master) {
18259599516SKenneth 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]);
18359599516SKenneth E. Jansen     printf("\n");
18459599516SKenneth E. Jansen   }
18559599516SKenneth E. Jansen }
18659599516SKenneth E. Jansen 
18759599516SKenneth E. Jansen 
18859599516SKenneth E. Jansen 
18959599516SKenneth E. Jansen void countfieldstowriterestart()
19059599516SKenneth E. Jansen {
19171350f02SCameron Smith   int nfields = 3; /*magic number, solution, time derivatives*/
19259599516SKenneth E. Jansen 
19359599516SKenneth E. Jansen   if(outpar.ivort == 1){
19471350f02SCameron Smith     nfields++; /*vorticity*/
19559599516SKenneth E. Jansen   }
19659599516SKenneth E. Jansen 
19759599516SKenneth E. Jansen   if(abs(turbvar.itwmod) != 1 && outpar.iowflux == 1) {
19871350f02SCameron Smith     nfields++; /*instantaneous wss in bflux.f */
19959599516SKenneth E. Jansen   }
20059599516SKenneth E. Jansen 
20171350f02SCameron Smith   /*projection vectors and pressure projection vectors (call saveLesRestart in itrdrv)*/
2022efdc748SKenneth E. Jansen   if(matdat.matflg[0][0] ==-1) {
20359599516SKenneth E. Jansen     nfields = nfields +2;
2042efdc748SKenneth E. Jansen   }
20559599516SKenneth E. Jansen 
20671350f02SCameron Smith   /*if Print Error Indicators = true (call write_error in itrdrv)*/
20759599516SKenneth E. Jansen   if(turbvar.ierrcalc == 1){
20859599516SKenneth E. Jansen     nfields++;
20959599516SKenneth E. Jansen   }
21059599516SKenneth E. Jansen 
21171350f02SCameron Smith   /*if Print ybar = True (call write_field(myrank,'a','ybar',4,... in itrdrv)*/
21259599516SKenneth E. Jansen   if(outpar.ioybar == 1){
21371350f02SCameron Smith     nfields++;  /*ybar*/
21459599516SKenneth E. Jansen 
21571350f02SCameron Smith     /*phase average fields*/
21659599516SKenneth E. Jansen     if(outpar.nphasesincycle >0) {
21759599516SKenneth E. Jansen       nfields = nfields + outpar.nphasesincycle;
21859599516SKenneth E. Jansen     }
21959599516SKenneth E. Jansen 
22059599516SKenneth E. Jansen     if(abs(turbvar.itwmod) != 1 && outpar.iowflux == 1) {
22171350f02SCameron Smith       nfields++; /*wssbar*/
22259599516SKenneth E. Jansen     }
22359599516SKenneth E. Jansen 
22459599516SKenneth E. Jansen   }
22559599516SKenneth E. Jansen 
22659599516SKenneth E. Jansen   if(turbvari.irans < 0) {
22771350f02SCameron Smith     nfields++; /*dwal*/
22859599516SKenneth E. Jansen   }
22959599516SKenneth E. Jansen 
23059599516SKenneth E. Jansen   outpar.nsynciofieldswriterestart = nfields;
23159599516SKenneth E. Jansen 
23259599516SKenneth E. Jansen   if(workfc.myrank == 0) {
23359599516SKenneth E. Jansen     printf("Number of fields to write in restart files: %d\n", nfields);
23459599516SKenneth E. Jansen   }
23559599516SKenneth E. Jansen }
23659599516SKenneth E. Jansen 
23759599516SKenneth E. Jansen 
23859599516SKenneth E. Jansen void
23959599516SKenneth E. Jansen Write_Restart(  int* pid,
24059599516SKenneth E. Jansen                 int* stepno,
24159599516SKenneth E. Jansen                 int* nshg,
24259599516SKenneth E. Jansen                 int* numVars,
24359599516SKenneth E. Jansen                 double* array1,
24459599516SKenneth E. Jansen                 double* array2 ) {
24559599516SKenneth E. Jansen 
2462e667770SCameron Smith     const char* magic_name = "byteorder magic number";
24759599516SKenneth E. Jansen     int magic_number = 362436;
24859599516SKenneth E. Jansen     int isize, nitems;
24959599516SKenneth E. Jansen     int iarray[10];
25059599516SKenneth E. Jansen     int nfiles;
25159599516SKenneth E. Jansen     int nfields;
25259599516SKenneth E. Jansen     int numparts;
25359599516SKenneth E. Jansen     int nprocs;
2542e667770SCameron Smith     int ione = 1;
25520fccb6eSCameron Smith     double iotime = 0;
256*ff89a70fSCameron Smith     char filename[255];
25759599516SKenneth E. Jansen 
25871350f02SCameron Smith     /*  First, count the number of fields to write and store the result in*/
25959599516SKenneth E. Jansen     countfieldstowriterestart();
26059599516SKenneth E. Jansen 
26171350f02SCameron Smith     /*  Retrieve and compute the parameters required for SyncIO*/
26259599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
26359599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
26459599516SKenneth E. Jansen     numparts = workfc.numpe;
26559599516SKenneth E. Jansen     nprocs = workfc.numpe;
266*ff89a70fSCameron Smith     assert(numparts/nprocs == 1);/* Number of parts per proc ...*/
267*ff89a70fSCameron Smith 
26859599516SKenneth E. Jansen     bzero((void*)filename,255);
26959599516SKenneth E. Jansen 
27020fccb6eSCameron Smith     iotime = TMRC();
271740e4609SCameron Smith     if(outpar.output_mode == -1 )
272740e4609SCameron Smith       streamio_setup_write(&f_descriptor, streamio_get_r());
273740e4609SCameron Smith     else if(outpar.output_mode == 0 )
274d7abaf6cSCameron Smith       posixio_setup(&f_descriptor, 'w');
275740e4609SCameron Smith     else if(outpar.output_mode > 0 )
276740e4609SCameron Smith       syncio_setup_write(nfiles, nfields, numparts/nfiles, &f_descriptor);
277740e4609SCameron Smith     else
278740e4609SCameron Smith       exit(EXIT_FAILURE);
279740e4609SCameron Smith     phio_constructName(f_descriptor,"restart",filename);
280740e4609SCameron Smith     phstr_appendInt(filename, *stepno);
281740e4609SCameron Smith     phstr_appendStr(filename, ".");
282d7abaf6cSCameron Smith     phio_openfile(filename, f_descriptor);
28359599516SKenneth E. Jansen 
28459599516SKenneth E. Jansen     field_flag=0;
28559599516SKenneth E. Jansen 
28671350f02SCameron Smith     /* write the magic number*/
2872e667770SCameron Smith     phio_writeheader(f_descriptor, magic_name, (void*)&magic_number, &ione,
2882e667770SCameron Smith         &ione, "integer", phasta_iotype);
2892e667770SCameron Smith     phio_writedatablock(f_descriptor, magic_name, (void*)&magic_number,
2902e667770SCameron Smith         &ione, "integer", phasta_iotype );
2912e667770SCameron Smith     field_flag++;
2921a8cd4edSCameron Smith 
29371350f02SCameron Smith     /* Write solution field ...*/
29459599516SKenneth E. Jansen     isize = (*nshg)*(*numVars);
29559599516SKenneth E. Jansen     nitems = 3;
29659599516SKenneth E. Jansen     iarray[ 0 ] = (*nshg);
29759599516SKenneth E. Jansen     iarray[ 1 ] = (*numVars);
29859599516SKenneth E. Jansen     iarray[ 2 ] = (*stepno);
29959599516SKenneth E. Jansen 
300055123f6SCameron Smith     phio_writeheader(f_descriptor, "solution", (void*)iarray, &nitems,
30154d5a0aaSCameron Smith         &isize, "double", phasta_iotype);
30259599516SKenneth E. Jansen     nitems = (*nshg)*(*numVars);
303055123f6SCameron Smith     phio_writedatablock(f_descriptor, "solution", (void*)(array1),
30453d5e07cSCameron Smith         &isize, "double", phasta_iotype );
30559599516SKenneth E. Jansen     field_flag++;
30659599516SKenneth E. Jansen 
30771350f02SCameron Smith     /* Write solution field ...*/
30859599516SKenneth E. Jansen     isize = (*nshg)*(*numVars);
30959599516SKenneth E. Jansen     nitems = 3;
31059599516SKenneth E. Jansen     iarray[ 0 ] = (*nshg);
31159599516SKenneth E. Jansen     iarray[ 1 ] = (*numVars);
31259599516SKenneth E. Jansen     iarray[ 2 ] = (*stepno);
313055123f6SCameron Smith     phio_writeheader(f_descriptor, "time derivative of solution",
31454d5a0aaSCameron Smith         (void*)iarray, &nitems, &isize, "double", phasta_iotype);
31559599516SKenneth E. Jansen     nitems = (*nshg)*(*numVars);
316055123f6SCameron Smith     phio_writedatablock(f_descriptor, "time derivative of solution",
31753d5e07cSCameron Smith         (void*)(array2), &isize, "double", phasta_iotype );
31859599516SKenneth E. Jansen     field_flag++;
31959599516SKenneth E. Jansen 
32059599516SKenneth E. Jansen     if (field_flag==nfields){
321d7abaf6cSCameron Smith       phio_closefile(f_descriptor);
32259599516SKenneth E. Jansen       if (*pid==0) {
32359599516SKenneth E. Jansen         printf("\n");
32459599516SKenneth E. Jansen       }
32559599516SKenneth E. Jansen     }
32620fccb6eSCameron Smith     iotime = TMRC() - iotime;
32720fccb6eSCameron Smith     if (workfc.master == workfc.myrank)
32820fccb6eSCameron Smith       printf("time to write restart (seconds) %f\n",iotime);
32959599516SKenneth E. Jansen }
33059599516SKenneth E. Jansen 
33159599516SKenneth E. Jansen void
33259599516SKenneth E. Jansen Write_Error(  int* pid,
33359599516SKenneth E. Jansen               int* stepno,
33459599516SKenneth E. Jansen               int* nshg,
33559599516SKenneth E. Jansen               int* numVars,
33659599516SKenneth E. Jansen               double* array1 ) {
33759599516SKenneth E. Jansen     int isize, nitems;
33859599516SKenneth E. Jansen     int iarray[10];
33959599516SKenneth E. Jansen     int nfields;
34059599516SKenneth E. Jansen     int numparts;
34159599516SKenneth E. Jansen     int nprocs;
34259599516SKenneth E. Jansen 
343*ff89a70fSCameron Smith     (void)*pid; /*silence compiler warning*/
344*ff89a70fSCameron Smith 
34559599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
34659599516SKenneth E. Jansen     numparts = workfc.numpe;
34759599516SKenneth E. Jansen     nprocs = workfc.numpe;
34859599516SKenneth E. Jansen 
349*ff89a70fSCameron Smith     assert(numparts/nprocs == 1);/* Number of parts per proc ...*/
35059599516SKenneth E. Jansen 
35159599516SKenneth E. Jansen     field_flag++;
35259599516SKenneth E. Jansen 
35359599516SKenneth E. Jansen     if(*pid==0) {
35459599516SKenneth E. Jansen       printf("\n");
355ab9e12e4SCameron Smith       printf("The %d/%d th field to be written is 'errors'\n",field_flag,nfields);
35659599516SKenneth E. Jansen     }
35759599516SKenneth E. Jansen 
35859599516SKenneth E. Jansen     isize = (*nshg)*(*numVars);
35959599516SKenneth E. Jansen     nitems = 3;
36059599516SKenneth E. Jansen     iarray[ 0 ] = (*nshg);
36159599516SKenneth E. Jansen     iarray[ 1 ] = (*numVars);
36259599516SKenneth E. Jansen     iarray[ 2 ] = (*stepno);
36359599516SKenneth E. Jansen 
364055123f6SCameron Smith     phio_writeheader(f_descriptor, "errors", (void*)iarray, &nitems,
36554d5a0aaSCameron Smith         &isize, "double", phasta_iotype);
36659599516SKenneth E. Jansen 
367055123f6SCameron Smith     phio_writedatablock(f_descriptor, "errors", (void*)array1, &isize,
36853d5e07cSCameron Smith         "double", phasta_iotype );
369*ff89a70fSCameron Smith 
37059599516SKenneth E. Jansen     if (field_flag==nfields){
371d7abaf6cSCameron Smith       phio_closefile(f_descriptor);
37259599516SKenneth E. Jansen       if (*pid==0) {
373ab9e12e4SCameron Smith         printf("Last field %d 'errors' finished! \n",nfields);
37459599516SKenneth E. Jansen         printf("\n");
37559599516SKenneth E. Jansen       }
37659599516SKenneth E. Jansen     }
37759599516SKenneth E. Jansen }
37859599516SKenneth E. Jansen 
37959599516SKenneth E. Jansen void
38059599516SKenneth E. Jansen Write_Field(  int *pid,
38159599516SKenneth E. Jansen               char* filemode,
38259599516SKenneth E. Jansen               char* fieldtag,
38359599516SKenneth E. Jansen               int* tagsize,
38459599516SKenneth E. Jansen               void* array,
38559599516SKenneth E. Jansen               char* arraytype,
38659599516SKenneth E. Jansen               int* nshg,
38759599516SKenneth E. Jansen               int* numvars,
38859599516SKenneth E. Jansen               int* stepno) {
389*ff89a70fSCameron Smith     char *fieldlabel = NULL;
39059599516SKenneth E. Jansen 
39159599516SKenneth E. Jansen     int isize, nitems;
39259599516SKenneth E. Jansen     int iarray[10];
39359599516SKenneth E. Jansen     char datatype[10];
394*ff89a70fSCameron Smith 
395*ff89a70fSCameron Smith     int nfields;
396*ff89a70fSCameron Smith     int numparts;
397*ff89a70fSCameron Smith     int nprocs;
398*ff89a70fSCameron Smith 
399*ff89a70fSCameron Smith     (void)*filemode; /*silence compiler warning*/
400*ff89a70fSCameron Smith 
40159599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
40259599516SKenneth E. Jansen       strcpy(datatype,"int");
40371350f02SCameron Smith     else /* default is double*/
40459599516SKenneth E. Jansen       strcpy(datatype,"double");
40559599516SKenneth E. Jansen 
40659599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
40759599516SKenneth E. Jansen     numparts = workfc.numpe;
40859599516SKenneth E. Jansen     nprocs = workfc.numpe;
40959599516SKenneth E. Jansen 
410*ff89a70fSCameron Smith     assert(numparts/nprocs == 1);/* Number of parts per proc ...*/
41159599516SKenneth E. Jansen 
412*ff89a70fSCameron Smith     fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char));
41359599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
414*ff89a70fSCameron Smith     fieldlabel[*tagsize] = '\0';
41559599516SKenneth E. Jansen 
41659599516SKenneth E. Jansen     field_flag++;
41759599516SKenneth E. Jansen     if(*pid==0) {
41859599516SKenneth E. Jansen       printf("\n");
41959599516SKenneth E. Jansen       printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel);
42059599516SKenneth E. Jansen     }
42159599516SKenneth E. Jansen 
42271350f02SCameron Smith     /* Write solution field ...*/
42359599516SKenneth E. Jansen     isize = (*nshg)*(*numvars);
42459599516SKenneth E. Jansen     nitems = 3;
42559599516SKenneth E. Jansen     iarray[ 0 ] = (*nshg);
42659599516SKenneth E. Jansen     iarray[ 1 ] = (*numvars);
42759599516SKenneth E. Jansen     iarray[ 2 ] = (*stepno);
42859599516SKenneth E. Jansen 
429055123f6SCameron Smith     phio_writeheader(f_descriptor, fieldlabel, (void*)iarray, &nitems,
43054d5a0aaSCameron Smith         &isize, datatype, phasta_iotype);
43159599516SKenneth E. Jansen     nitems = (*nshg)*(*numvars);
432055123f6SCameron Smith     phio_writedatablock(f_descriptor, fieldlabel, array, &isize,
43353d5e07cSCameron Smith         datatype, phasta_iotype );
434*ff89a70fSCameron Smith 
43559599516SKenneth E. Jansen     if (field_flag==nfields){
436d7abaf6cSCameron Smith       phio_closefile(f_descriptor);
43759599516SKenneth E. Jansen       if (*pid==0) {
43859599516SKenneth E. Jansen         printf("Last field %d '%s' finished! \n",nfields, fieldtag);
43959599516SKenneth E. Jansen         printf("\n");
44059599516SKenneth E. Jansen       }
44159599516SKenneth E. Jansen     }
44259599516SKenneth E. Jansen     free(fieldlabel);
44359599516SKenneth E. Jansen }
44459599516SKenneth E. Jansen 
44559599516SKenneth E. Jansen void
44659599516SKenneth E. Jansen Write_PhAvg2( int* pid,
44759599516SKenneth E. Jansen               char* filemode,
44859599516SKenneth E. Jansen               char* fieldtag,
44959599516SKenneth E. Jansen               int* tagsize,
45059599516SKenneth E. Jansen               int* iphase,
45159599516SKenneth E. Jansen               int* nphasesincycle,
45259599516SKenneth E. Jansen               void* array,
45359599516SKenneth E. Jansen               char* arraytype,
45459599516SKenneth E. Jansen               int* nshg,
45559599516SKenneth E. Jansen               int* numvars,
45659599516SKenneth E. Jansen               int* stepno) {
45771350f02SCameron Smith     int addtagsize=0; /* phase number is added to the name of the field*/
458*ff89a70fSCameron Smith     int tagsize2 = 0;
459*ff89a70fSCameron Smith     char *fieldlabel = NULL;
460*ff89a70fSCameron Smith     char straddtagsize[10] = "\0";
461*ff89a70fSCameron Smith     int isize, nitems;
462*ff89a70fSCameron Smith     int iarray[10];
463*ff89a70fSCameron Smith     char datatype[10];
464*ff89a70fSCameron Smith     int nfields;
465*ff89a70fSCameron Smith     int numparts;
466*ff89a70fSCameron Smith     int nprocs;
467*ff89a70fSCameron Smith 
468*ff89a70fSCameron Smith     (void)*filemode; /*silence compiler warning*/
469*ff89a70fSCameron Smith     (void)*nphasesincycle; /*silence compiler warning*/
470*ff89a70fSCameron Smith 
47159599516SKenneth E. Jansen     if(*iphase<10)
47259599516SKenneth E. Jansen       addtagsize=1;
47359599516SKenneth E. Jansen     else if(*iphase<100)
47459599516SKenneth E. Jansen       addtagsize=2;
47559599516SKenneth E. Jansen     else if(*iphase<1000)
47659599516SKenneth E. Jansen       addtagsize=3;
47759599516SKenneth E. Jansen 
47859599516SKenneth E. Jansen     tagsize2=*tagsize+addtagsize;
47959599516SKenneth E. Jansen 
480*ff89a70fSCameron Smith     fieldlabel = (char *)malloc((tagsize2+1)*sizeof(char));
48159599516SKenneth E. Jansen     strncpy(fieldlabel, fieldtag, *tagsize);
48259599516SKenneth E. Jansen     fieldlabel[tagsize2] = '\0';
48359599516SKenneth E. Jansen 
48459599516SKenneth E. Jansen     sprintf(straddtagsize,"%d",*iphase);
48559599516SKenneth E. Jansen 
48659599516SKenneth E. Jansen     if(*iphase<10) {
48759599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[0];
48859599516SKenneth E. Jansen     }
48959599516SKenneth E. Jansen     else if(*iphase<100) {
49059599516SKenneth E. Jansen       fieldlabel[tagsize2-2]=straddtagsize[0];
49159599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[1];
49259599516SKenneth E. Jansen     }
49359599516SKenneth E. Jansen     else if(*iphase<1000) {
49459599516SKenneth E. Jansen       fieldlabel[tagsize2-3]=straddtagsize[0];
49559599516SKenneth E. Jansen       fieldlabel[tagsize2-2]=straddtagsize[1];
49659599516SKenneth E. Jansen       fieldlabel[tagsize2-1]=straddtagsize[2];
49759599516SKenneth E. Jansen     }
49859599516SKenneth E. Jansen 
49959599516SKenneth E. Jansen     if(!strncmp(arraytype,"i",1))
50059599516SKenneth E. Jansen       strcpy(datatype,"int");
50171350f02SCameron Smith     else /* default is double*/
50259599516SKenneth E. Jansen       strcpy(datatype,"double");
50359599516SKenneth E. Jansen 
50459599516SKenneth E. Jansen     nfields = outpar.nsynciofieldswriterestart;
50559599516SKenneth E. Jansen     numparts = workfc.numpe;
50659599516SKenneth E. Jansen     nprocs = workfc.numpe;
50759599516SKenneth E. Jansen 
508*ff89a70fSCameron Smith     assert(numparts/nprocs == 1);/* Number of parts per proc ...*/
50959599516SKenneth E. Jansen 
51059599516SKenneth E. Jansen     field_flag++;
51159599516SKenneth E. Jansen     if(*pid==0) {
51259599516SKenneth E. Jansen       printf("\n");
51359599516SKenneth E. Jansen       printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel);
51459599516SKenneth E. Jansen     }
51559599516SKenneth E. Jansen 
51671350f02SCameron Smith     /* Write solution field ...*/
51759599516SKenneth E. Jansen     isize = (*nshg)*(*numvars);
51859599516SKenneth E. Jansen     nitems = 3;
51959599516SKenneth E. Jansen     iarray[ 0 ] = (*nshg);
52059599516SKenneth E. Jansen     iarray[ 1 ] = (*numvars);
52159599516SKenneth E. Jansen     iarray[ 2 ] = (*stepno);
522055123f6SCameron Smith     phio_writeheader(f_descriptor, fieldlabel, (void*)iarray, &nitems,
52354d5a0aaSCameron Smith         &isize, "double", phasta_iotype);
52459599516SKenneth E. Jansen     nitems = (*nshg)*(*numvars);
525055123f6SCameron Smith     phio_writedatablock(f_descriptor, fieldlabel, array, &isize,
52653d5e07cSCameron Smith         "double", phasta_iotype );
52759599516SKenneth E. Jansen     if (field_flag==nfields){
528d7abaf6cSCameron Smith       phio_closefile(f_descriptor);
52959599516SKenneth E. Jansen       if (*pid==0) {
53059599516SKenneth E. Jansen         printf("\n");
53159599516SKenneth E. Jansen       }
53259599516SKenneth E. Jansen     }
53359599516SKenneth E. Jansen     free(fieldlabel);
53459599516SKenneth E. Jansen }
535