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"
20520c014cSCameron Smith #include "phiotimer.h"
21d7abaf6cSCameron Smith #include "syncio.h"
22d7abaf6cSCameron Smith #include "posixio.h"
23ecf8d2a9SCameron Smith #include "streamio.h"
2459599516SKenneth E. Jansen #include "common_c.h"
2520fccb6eSCameron Smith #include "tmrc.h"
26ff89a70fSCameron Smith #include "phString.h"
2759599516SKenneth E. Jansen
2859599516SKenneth E. Jansen #ifdef intel
2959599516SKenneth E. Jansen #include <winsock2.h>
3059599516SKenneth E. Jansen #else
3159599516SKenneth E. Jansen #include <unistd.h>
3259599516SKenneth E. Jansen #include <strings.h>
3359599516SKenneth E. Jansen #endif
3459599516SKenneth E. Jansen
igetMinMaxAvg(int * ivalue,double * stats,int * statRanks)3559599516SKenneth E. Jansen void igetMinMaxAvg(int *ivalue, double *stats, int *statRanks) {
3659599516SKenneth E. Jansen double *value = (double*)malloc(sizeof(double));
3759599516SKenneth E. Jansen *value = 1.0*(*ivalue);
3859599516SKenneth E. Jansen rgetMinMaxAvg(value,stats,statRanks);
3959599516SKenneth E. Jansen free(value);
4059599516SKenneth E. Jansen }
4159599516SKenneth E. Jansen
rgetMinMaxAvg(double * value,double * stats,int * statRanks)4259599516SKenneth E. Jansen void rgetMinMaxAvg(double *value, double *stats, int *statRanks) {
4359599516SKenneth E. Jansen int isThisRank;
44ff89a70fSCameron Smith double sqValue = 0., sqValueAvg = 0.;
4559599516SKenneth E. Jansen
4659599516SKenneth E. Jansen MPI_Allreduce(value,&stats[0],1,MPI_DOUBLE,MPI_MIN,MPI_COMM_WORLD);
4759599516SKenneth E. Jansen isThisRank=workfc.numpe+1;
4859599516SKenneth E. Jansen if(*value==stats[0])
4959599516SKenneth E. Jansen isThisRank=workfc.myrank;
5059599516SKenneth E. Jansen MPI_Allreduce(&isThisRank,&statRanks[0],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
5159599516SKenneth E. Jansen
5259599516SKenneth E. Jansen MPI_Allreduce(value,&stats[1],1,MPI_DOUBLE,MPI_MAX,MPI_COMM_WORLD);
5359599516SKenneth E. Jansen isThisRank=workfc.numpe+1;
5459599516SKenneth E. Jansen if(*value==stats[1])
5559599516SKenneth E. Jansen isThisRank=workfc.myrank;
5659599516SKenneth E. Jansen MPI_Allreduce(&isThisRank,&statRanks[1],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD);
5759599516SKenneth E. Jansen
5859599516SKenneth E. Jansen MPI_Allreduce(value,&stats[2],1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
5959599516SKenneth E. Jansen stats[2] /= workfc.numpe;
6059599516SKenneth E. Jansen
61ff89a70fSCameron Smith sqValue = (*value)*(*value);
6259599516SKenneth E. Jansen MPI_Allreduce(&sqValue,&sqValueAvg,1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
6359599516SKenneth E. Jansen sqValueAvg /= workfc.numpe;
6459599516SKenneth E. Jansen
6559599516SKenneth E. Jansen stats[3] = sqrt(sqValueAvg-stats[2]*stats[2]);
6659599516SKenneth E. Jansen }
6759599516SKenneth E. Jansen
print_mesh_stats(void)6859599516SKenneth E. Jansen void print_mesh_stats(void) {
6959599516SKenneth E. Jansen int statRanks[2];
70ff89a70fSCameron Smith double iStats[4];
7159599516SKenneth E. Jansen
7259599516SKenneth E. Jansen igetMinMaxAvg(&conpar.nshg,iStats,statRanks);
7359599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
7459599516SKenneth 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]);
7559599516SKenneth E. Jansen igetMinMaxAvg(&conpar.numel,iStats,statRanks);
7659599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
7759599516SKenneth 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]);
7859599516SKenneth E. Jansen igetMinMaxAvg(&conpar.numelb,iStats,statRanks);
7959599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
8059599516SKenneth 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]);
8159599516SKenneth E. Jansen igetMinMaxAvg(&conpar.nnz_tot,iStats,statRanks);
8259599516SKenneth E. Jansen if(workfc.myrank==workfc.master) {
8359599516SKenneth 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]);
8459599516SKenneth E. Jansen printf("\n");
8559599516SKenneth E. Jansen }
8659599516SKenneth E. Jansen }
8759599516SKenneth E. Jansen
print_mpi_stats(void)8859599516SKenneth E. Jansen void print_mpi_stats(void) {
8959599516SKenneth E. Jansen int statRanks[2];
9059599516SKenneth E. Jansen double iStats[4], rStats[4];
9159599516SKenneth E. Jansen
9271350f02SCameron Smith /* NS equations*/
9359599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iISend,iStats,statRanks);
9459599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
9559599516SKenneth 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]);
9659599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iIRecv,iStats,statRanks);
9759599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
9859599516SKenneth 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]);
9959599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iWaitAll,iStats,statRanks);
10059599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
10159599516SKenneth 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]);
10259599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iAllR,iStats,statRanks);
10359599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
10459599516SKenneth 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]);
10559599516SKenneth E. Jansen
10659599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rISend,rStats,statRanks);
10759599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
10859599516SKenneth 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]);
10959599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rIRecv,rStats,statRanks);
11059599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
11159599516SKenneth 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]);
11259599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rWaitAll,rStats,statRanks);
11359599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
11459599516SKenneth 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]);
11559599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rCommu,rStats,statRanks);
11659599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
11759599516SKenneth 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]);
11859599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rAllR,rStats,statRanks);
11959599516SKenneth E. Jansen if(workfc.myrank==workfc.master) {
12059599516SKenneth 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]);
12159599516SKenneth E. Jansen printf("\n");
12259599516SKenneth E. Jansen }
12371350f02SCameron Smith /* Scalars*/
12459599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iISendScal,iStats,statRanks);
12559599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
12659599516SKenneth 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]);
12759599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iIRecvScal,iStats,statRanks);
12859599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
12959599516SKenneth 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]);
13059599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iWaitAllScal,iStats,statRanks);
13159599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
13259599516SKenneth 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]);
13359599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iAllRScal,iStats,statRanks);
13459599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
13559599516SKenneth 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]);
13659599516SKenneth E. Jansen
13759599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rISendScal,rStats,statRanks);
13859599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
13959599516SKenneth 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]);
14059599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rIRecvScal,rStats,statRanks);
14159599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
14259599516SKenneth 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]);
14359599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rWaitAllScal,rStats,statRanks);
14459599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
14559599516SKenneth 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]);
14659599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rCommuScal,rStats,statRanks);
14759599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
14859599516SKenneth 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]);
14959599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rAllRScal,rStats,statRanks);
15059599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
15159599516SKenneth 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]);
15259599516SKenneth E. Jansen
15359599516SKenneth E. Jansen
15459599516SKenneth E. Jansen }
15559599516SKenneth E. Jansen
print_system_stats(double * tcorecp,double * tcorecpscal)15659599516SKenneth E. Jansen void print_system_stats(double *tcorecp, double *tcorecpscal) {
15759599516SKenneth E. Jansen int statRanks[2];
158ff89a70fSCameron Smith double rStats[4];
15959599516SKenneth E. Jansen double syst_assembly, syst_solve;
16059599516SKenneth E. Jansen
16171350f02SCameron Smith /* NS equations */
16259599516SKenneth E. Jansen syst_assembly = tcorecp[0];
16359599516SKenneth E. Jansen syst_solve = tcorecp[1];
16459599516SKenneth E. Jansen
16559599516SKenneth E. Jansen rgetMinMaxAvg(&syst_assembly,rStats,statRanks);
16659599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
16759599516SKenneth 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]);
16859599516SKenneth E. Jansen
16959599516SKenneth E. Jansen rgetMinMaxAvg(&syst_solve,rStats,statRanks);
17059599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
17159599516SKenneth 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]);
17259599516SKenneth E. Jansen
17371350f02SCameron Smith /* Scalars */
17459599516SKenneth E. Jansen syst_assembly = tcorecpscal[0];
17559599516SKenneth E. Jansen syst_solve = tcorecpscal[1];
17659599516SKenneth E. Jansen
17759599516SKenneth E. Jansen rgetMinMaxAvg(&syst_assembly,rStats,statRanks);
17859599516SKenneth E. Jansen if(workfc.myrank==workfc.master)
17959599516SKenneth 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]);
18059599516SKenneth E. Jansen
18159599516SKenneth E. Jansen rgetMinMaxAvg(&syst_solve,rStats,statRanks);
18259599516SKenneth E. Jansen if(workfc.myrank==workfc.master) {
18359599516SKenneth 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]);
18459599516SKenneth E. Jansen printf("\n");
18559599516SKenneth E. Jansen }
18659599516SKenneth E. Jansen }
18759599516SKenneth E. Jansen
18859599516SKenneth E. Jansen
18959599516SKenneth E. Jansen
countfieldstowriterestart()19059599516SKenneth E. Jansen void countfieldstowriterestart()
19159599516SKenneth E. Jansen {
19271350f02SCameron Smith int nfields = 3; /*magic number, solution, time derivatives*/
19359599516SKenneth E. Jansen
19459599516SKenneth E. Jansen if(outpar.ivort == 1){
19571350f02SCameron Smith nfields++; /*vorticity*/
19659599516SKenneth E. Jansen }
19759599516SKenneth E. Jansen
19859599516SKenneth E. Jansen if(abs(turbvar.itwmod) != 1 && outpar.iowflux == 1) {
19971350f02SCameron Smith nfields++; /*instantaneous wss in bflux.f */
20059599516SKenneth E. Jansen }
20159599516SKenneth E. Jansen
20271350f02SCameron Smith /*projection vectors and pressure projection vectors (call saveLesRestart in itrdrv)*/
203efb88323SKenneth E. Jansen if(incomp.ipresPrjFlag ==1) {
20459599516SKenneth E. Jansen nfields = nfields +2;
2052efdc748SKenneth E. Jansen }
20659599516SKenneth E. Jansen
20771350f02SCameron Smith /*if Print Error Indicators = true (call write_error in itrdrv)*/
20859599516SKenneth E. Jansen if(turbvar.ierrcalc == 1){
20959599516SKenneth E. Jansen nfields++;
21059599516SKenneth E. Jansen }
21159599516SKenneth E. Jansen
21271350f02SCameron Smith /*if Print ybar = True (call write_field(myrank,'a','ybar',4,... in itrdrv)*/
21359599516SKenneth E. Jansen if(outpar.ioybar == 1){
21471350f02SCameron Smith nfields++; /*ybar*/
21559599516SKenneth E. Jansen
21671350f02SCameron Smith /*phase average fields*/
21759599516SKenneth E. Jansen if(outpar.nphasesincycle >0) {
21859599516SKenneth E. Jansen nfields = nfields + outpar.nphasesincycle;
21959599516SKenneth E. Jansen }
22059599516SKenneth E. Jansen
22159599516SKenneth E. Jansen if(abs(turbvar.itwmod) != 1 && outpar.iowflux == 1) {
22271350f02SCameron Smith nfields++; /*wssbar*/
22359599516SKenneth E. Jansen }
22459599516SKenneth E. Jansen
22559599516SKenneth E. Jansen }
22659599516SKenneth E. Jansen
227*b4542ea8SKenneth E. Jansen // if(turbvari.irans < 0) {
22871350f02SCameron Smith nfields++; /*dwal*/
229*b4542ea8SKenneth E. Jansen // }
23059599516SKenneth E. Jansen
23159599516SKenneth E. Jansen outpar.nsynciofieldswriterestart = nfields;
23259599516SKenneth E. Jansen
23359599516SKenneth E. Jansen if(workfc.myrank == 0) {
23459599516SKenneth E. Jansen printf("Number of fields to write in restart files: %d\n", nfields);
23559599516SKenneth E. Jansen }
23659599516SKenneth E. Jansen }
23759599516SKenneth E. Jansen
23859599516SKenneth E. Jansen
23959599516SKenneth E. Jansen void
Write_Restart(int * pid,int * stepno,int * nshg,int * numVars,double * array1,double * array2)24059599516SKenneth E. Jansen Write_Restart( int* pid,
24159599516SKenneth E. Jansen int* stepno,
24259599516SKenneth E. Jansen int* nshg,
24359599516SKenneth E. Jansen int* numVars,
24459599516SKenneth E. Jansen double* array1,
24559599516SKenneth E. Jansen double* array2 ) {
24659599516SKenneth E. Jansen
2472e667770SCameron Smith const char* magic_name = "byteorder magic number";
24859599516SKenneth E. Jansen int magic_number = 362436;
24959599516SKenneth E. Jansen int isize, nitems;
25059599516SKenneth E. Jansen int iarray[10];
25159599516SKenneth E. Jansen int nfiles;
25259599516SKenneth E. Jansen int nfields;
25359599516SKenneth E. Jansen int numparts;
25459599516SKenneth E. Jansen int nprocs;
2552e667770SCameron Smith int ione = 1;
25620fccb6eSCameron Smith double iotime = 0;
257ff89a70fSCameron Smith char filename[255];
25859599516SKenneth E. Jansen
25971350f02SCameron Smith /* First, count the number of fields to write and store the result in*/
26059599516SKenneth E. Jansen countfieldstowriterestart();
26159599516SKenneth E. Jansen
26271350f02SCameron Smith /* 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 nprocs = workfc.numpe;
267ff89a70fSCameron Smith assert(numparts/nprocs == 1);/* Number of parts per proc ...*/
268ff89a70fSCameron Smith
26959599516SKenneth E. Jansen bzero((void*)filename,255);
27059599516SKenneth E. Jansen
27120fccb6eSCameron Smith iotime = TMRC();
272740e4609SCameron Smith if(outpar.output_mode == -1 )
273740e4609SCameron Smith streamio_setup_write(&f_descriptor, streamio_get_r());
274740e4609SCameron Smith else if(outpar.output_mode == 0 )
275d7abaf6cSCameron Smith posixio_setup(&f_descriptor, 'w');
276740e4609SCameron Smith else if(outpar.output_mode > 0 )
277740e4609SCameron Smith syncio_setup_write(nfiles, nfields, numparts/nfiles, &f_descriptor);
278740e4609SCameron Smith else
279740e4609SCameron Smith exit(EXIT_FAILURE);
280740e4609SCameron Smith phio_constructName(f_descriptor,"restart",filename);
281740e4609SCameron Smith phstr_appendInt(filename, *stepno);
282740e4609SCameron Smith phstr_appendStr(filename, ".");
283520c014cSCameron Smith phastaio_setfile(RESTART_WRITE);
284d7abaf6cSCameron Smith phio_openfile(filename, f_descriptor);
28559599516SKenneth E. Jansen
28659599516SKenneth E. Jansen field_flag=0;
28759599516SKenneth E. Jansen
28871350f02SCameron Smith /* write the magic number*/
2892e667770SCameron Smith phio_writeheader(f_descriptor, magic_name, (void*)&magic_number, &ione,
2902e667770SCameron Smith &ione, "integer", phasta_iotype);
2912e667770SCameron Smith phio_writedatablock(f_descriptor, magic_name, (void*)&magic_number,
2922e667770SCameron Smith &ione, "integer", phasta_iotype );
2932e667770SCameron Smith field_flag++;
2941a8cd4edSCameron Smith
29571350f02SCameron Smith /* Write solution field ...*/
29659599516SKenneth E. Jansen isize = (*nshg)*(*numVars);
29759599516SKenneth E. Jansen nitems = 3;
29859599516SKenneth E. Jansen iarray[ 0 ] = (*nshg);
29959599516SKenneth E. Jansen iarray[ 1 ] = (*numVars);
30059599516SKenneth E. Jansen iarray[ 2 ] = (*stepno);
30159599516SKenneth E. Jansen
302055123f6SCameron Smith phio_writeheader(f_descriptor, "solution", (void*)iarray, &nitems,
30354d5a0aaSCameron Smith &isize, "double", phasta_iotype);
30459599516SKenneth E. Jansen nitems = (*nshg)*(*numVars);
305055123f6SCameron Smith phio_writedatablock(f_descriptor, "solution", (void*)(array1),
30653d5e07cSCameron Smith &isize, "double", phasta_iotype );
30759599516SKenneth E. Jansen field_flag++;
30859599516SKenneth E. Jansen
30971350f02SCameron Smith /* Write solution field ...*/
31059599516SKenneth E. Jansen isize = (*nshg)*(*numVars);
31159599516SKenneth E. Jansen nitems = 3;
31259599516SKenneth E. Jansen iarray[ 0 ] = (*nshg);
31359599516SKenneth E. Jansen iarray[ 1 ] = (*numVars);
31459599516SKenneth E. Jansen iarray[ 2 ] = (*stepno);
315055123f6SCameron Smith phio_writeheader(f_descriptor, "time derivative of solution",
31654d5a0aaSCameron Smith (void*)iarray, &nitems, &isize, "double", phasta_iotype);
31759599516SKenneth E. Jansen nitems = (*nshg)*(*numVars);
318055123f6SCameron Smith phio_writedatablock(f_descriptor, "time derivative of solution",
31953d5e07cSCameron Smith (void*)(array2), &isize, "double", phasta_iotype );
32059599516SKenneth E. Jansen field_flag++;
32159599516SKenneth E. Jansen
32259599516SKenneth E. Jansen if (field_flag==nfields){
323d7abaf6cSCameron Smith phio_closefile(f_descriptor);
32459599516SKenneth E. Jansen if (*pid==0) {
32559599516SKenneth E. Jansen printf("\n");
32659599516SKenneth E. Jansen }
32759599516SKenneth E. Jansen }
32820fccb6eSCameron Smith iotime = TMRC() - iotime;
32920fccb6eSCameron Smith if (workfc.master == workfc.myrank)
33020fccb6eSCameron Smith printf("time to write restart (seconds) %f\n",iotime);
33159599516SKenneth E. Jansen }
33259599516SKenneth E. Jansen
33359599516SKenneth E. Jansen void
Write_Error(int * pid,int * stepno,int * nshg,int * numVars,double * array1)33459599516SKenneth E. Jansen Write_Error( int* pid,
33559599516SKenneth E. Jansen int* stepno,
33659599516SKenneth E. Jansen int* nshg,
33759599516SKenneth E. Jansen int* numVars,
33859599516SKenneth E. Jansen double* array1 ) {
33959599516SKenneth E. Jansen int isize, nitems;
34059599516SKenneth E. Jansen int iarray[10];
34159599516SKenneth E. Jansen int nfields;
34259599516SKenneth E. Jansen int numparts;
34359599516SKenneth E. Jansen int nprocs;
34459599516SKenneth E. Jansen
345ff89a70fSCameron Smith (void)*pid; /*silence compiler warning*/
346ff89a70fSCameron Smith
34759599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart;
34859599516SKenneth E. Jansen numparts = workfc.numpe;
34959599516SKenneth E. Jansen nprocs = workfc.numpe;
35059599516SKenneth E. Jansen
351ff89a70fSCameron Smith assert(numparts/nprocs == 1);/* Number of parts per proc ...*/
35259599516SKenneth E. Jansen
35359599516SKenneth E. Jansen field_flag++;
35459599516SKenneth E. Jansen
35559599516SKenneth E. Jansen if(*pid==0) {
35659599516SKenneth E. Jansen printf("\n");
357ab9e12e4SCameron Smith printf("The %d/%d th field to be written is 'errors'\n",field_flag,nfields);
35859599516SKenneth E. Jansen }
35959599516SKenneth E. Jansen
36059599516SKenneth E. Jansen isize = (*nshg)*(*numVars);
36159599516SKenneth E. Jansen nitems = 3;
36259599516SKenneth E. Jansen iarray[ 0 ] = (*nshg);
36359599516SKenneth E. Jansen iarray[ 1 ] = (*numVars);
36459599516SKenneth E. Jansen iarray[ 2 ] = (*stepno);
36559599516SKenneth E. Jansen
366055123f6SCameron Smith phio_writeheader(f_descriptor, "errors", (void*)iarray, &nitems,
36754d5a0aaSCameron Smith &isize, "double", phasta_iotype);
36859599516SKenneth E. Jansen
369055123f6SCameron Smith phio_writedatablock(f_descriptor, "errors", (void*)array1, &isize,
37053d5e07cSCameron Smith "double", phasta_iotype );
371ff89a70fSCameron Smith
37259599516SKenneth E. Jansen if (field_flag==nfields){
373d7abaf6cSCameron Smith phio_closefile(f_descriptor);
37459599516SKenneth E. Jansen if (*pid==0) {
375ab9e12e4SCameron Smith printf("Last field %d 'errors' finished! \n",nfields);
37659599516SKenneth E. Jansen printf("\n");
37759599516SKenneth E. Jansen }
37859599516SKenneth E. Jansen }
37959599516SKenneth E. Jansen }
38059599516SKenneth E. Jansen
38159599516SKenneth E. Jansen void
Write_Field(int * pid,char * filemode,char * fieldtag,int * tagsize,void * array,char * arraytype,int * nshg,int * numvars,int * stepno)38259599516SKenneth E. Jansen Write_Field( int *pid,
38359599516SKenneth E. Jansen char* filemode,
38459599516SKenneth E. Jansen char* fieldtag,
38559599516SKenneth E. Jansen int* tagsize,
38659599516SKenneth E. Jansen void* array,
38759599516SKenneth E. Jansen char* arraytype,
38859599516SKenneth E. Jansen int* nshg,
38959599516SKenneth E. Jansen int* numvars,
39059599516SKenneth E. Jansen int* stepno) {
391ff89a70fSCameron Smith char *fieldlabel = NULL;
39259599516SKenneth E. Jansen
39359599516SKenneth E. Jansen int isize, nitems;
39459599516SKenneth E. Jansen int iarray[10];
39559599516SKenneth E. Jansen char datatype[10];
396ff89a70fSCameron Smith
397ff89a70fSCameron Smith int nfields;
398ff89a70fSCameron Smith int numparts;
399ff89a70fSCameron Smith int nprocs;
400ff89a70fSCameron Smith
401ff89a70fSCameron Smith (void)*filemode; /*silence compiler warning*/
402ff89a70fSCameron Smith
40359599516SKenneth E. Jansen if(!strncmp(arraytype,"i",1))
40459599516SKenneth E. Jansen strcpy(datatype,"int");
40571350f02SCameron Smith else /* default is double*/
40659599516SKenneth E. Jansen strcpy(datatype,"double");
40759599516SKenneth E. Jansen
40859599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart;
40959599516SKenneth E. Jansen numparts = workfc.numpe;
41059599516SKenneth E. Jansen nprocs = workfc.numpe;
41159599516SKenneth E. Jansen
412ff89a70fSCameron Smith assert(numparts/nprocs == 1);/* Number of parts per proc ...*/
41359599516SKenneth E. Jansen
414ff89a70fSCameron Smith fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char));
41559599516SKenneth E. Jansen strncpy(fieldlabel, fieldtag, *tagsize);
416ff89a70fSCameron Smith fieldlabel[*tagsize] = '\0';
41759599516SKenneth E. Jansen
41859599516SKenneth E. Jansen field_flag++;
41959599516SKenneth E. Jansen if(*pid==0) {
42059599516SKenneth E. Jansen printf("\n");
42159599516SKenneth E. Jansen printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel);
42259599516SKenneth E. Jansen }
42359599516SKenneth E. Jansen
42471350f02SCameron Smith /* Write solution field ...*/
42559599516SKenneth E. Jansen isize = (*nshg)*(*numvars);
42659599516SKenneth E. Jansen nitems = 3;
42759599516SKenneth E. Jansen iarray[ 0 ] = (*nshg);
42859599516SKenneth E. Jansen iarray[ 1 ] = (*numvars);
42959599516SKenneth E. Jansen iarray[ 2 ] = (*stepno);
43059599516SKenneth E. Jansen
431055123f6SCameron Smith phio_writeheader(f_descriptor, fieldlabel, (void*)iarray, &nitems,
43254d5a0aaSCameron Smith &isize, datatype, phasta_iotype);
43359599516SKenneth E. Jansen nitems = (*nshg)*(*numvars);
434055123f6SCameron Smith phio_writedatablock(f_descriptor, fieldlabel, array, &isize,
43553d5e07cSCameron Smith datatype, phasta_iotype );
436ff89a70fSCameron Smith
43759599516SKenneth E. Jansen if (field_flag==nfields){
438d7abaf6cSCameron Smith phio_closefile(f_descriptor);
43959599516SKenneth E. Jansen if (*pid==0) {
44059599516SKenneth E. Jansen printf("Last field %d '%s' finished! \n",nfields, fieldtag);
44159599516SKenneth E. Jansen printf("\n");
44259599516SKenneth E. Jansen }
44359599516SKenneth E. Jansen }
44459599516SKenneth E. Jansen free(fieldlabel);
44559599516SKenneth E. Jansen }
44659599516SKenneth E. Jansen
44759599516SKenneth E. Jansen void
Write_PhAvg2(int * pid,char * filemode,char * fieldtag,int * tagsize,int * iphase,int * nphasesincycle,void * array,char * arraytype,int * nshg,int * numvars,int * stepno)44859599516SKenneth E. Jansen Write_PhAvg2( int* pid,
44959599516SKenneth E. Jansen char* filemode,
45059599516SKenneth E. Jansen char* fieldtag,
45159599516SKenneth E. Jansen int* tagsize,
45259599516SKenneth E. Jansen int* iphase,
45359599516SKenneth E. Jansen int* nphasesincycle,
45459599516SKenneth E. Jansen void* array,
45559599516SKenneth E. Jansen char* arraytype,
45659599516SKenneth E. Jansen int* nshg,
45759599516SKenneth E. Jansen int* numvars,
45859599516SKenneth E. Jansen int* stepno) {
45971350f02SCameron Smith int addtagsize=0; /* phase number is added to the name of the field*/
460ff89a70fSCameron Smith int tagsize2 = 0;
461ff89a70fSCameron Smith char *fieldlabel = NULL;
462ff89a70fSCameron Smith char straddtagsize[10] = "\0";
463ff89a70fSCameron Smith int isize, nitems;
464ff89a70fSCameron Smith int iarray[10];
465ff89a70fSCameron Smith char datatype[10];
466ff89a70fSCameron Smith int nfields;
467ff89a70fSCameron Smith int numparts;
468ff89a70fSCameron Smith int nprocs;
469ff89a70fSCameron Smith
470ff89a70fSCameron Smith (void)*filemode; /*silence compiler warning*/
471ff89a70fSCameron Smith (void)*nphasesincycle; /*silence compiler warning*/
472ff89a70fSCameron Smith
47359599516SKenneth E. Jansen if(*iphase<10)
47459599516SKenneth E. Jansen addtagsize=1;
47559599516SKenneth E. Jansen else if(*iphase<100)
47659599516SKenneth E. Jansen addtagsize=2;
47759599516SKenneth E. Jansen else if(*iphase<1000)
47859599516SKenneth E. Jansen addtagsize=3;
47959599516SKenneth E. Jansen
48059599516SKenneth E. Jansen tagsize2=*tagsize+addtagsize;
48159599516SKenneth E. Jansen
482ff89a70fSCameron Smith fieldlabel = (char *)malloc((tagsize2+1)*sizeof(char));
48359599516SKenneth E. Jansen strncpy(fieldlabel, fieldtag, *tagsize);
48459599516SKenneth E. Jansen fieldlabel[tagsize2] = '\0';
48559599516SKenneth E. Jansen
48659599516SKenneth E. Jansen sprintf(straddtagsize,"%d",*iphase);
48759599516SKenneth E. Jansen
48859599516SKenneth E. Jansen if(*iphase<10) {
48959599516SKenneth E. Jansen fieldlabel[tagsize2-1]=straddtagsize[0];
49059599516SKenneth E. Jansen }
49159599516SKenneth E. Jansen else if(*iphase<100) {
49259599516SKenneth E. Jansen fieldlabel[tagsize2-2]=straddtagsize[0];
49359599516SKenneth E. Jansen fieldlabel[tagsize2-1]=straddtagsize[1];
49459599516SKenneth E. Jansen }
49559599516SKenneth E. Jansen else if(*iphase<1000) {
49659599516SKenneth E. Jansen fieldlabel[tagsize2-3]=straddtagsize[0];
49759599516SKenneth E. Jansen fieldlabel[tagsize2-2]=straddtagsize[1];
49859599516SKenneth E. Jansen fieldlabel[tagsize2-1]=straddtagsize[2];
49959599516SKenneth E. Jansen }
50059599516SKenneth E. Jansen
50159599516SKenneth E. Jansen if(!strncmp(arraytype,"i",1))
50259599516SKenneth E. Jansen strcpy(datatype,"int");
50371350f02SCameron Smith else /* default is double*/
50459599516SKenneth E. Jansen strcpy(datatype,"double");
50559599516SKenneth E. Jansen
50659599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart;
50759599516SKenneth E. Jansen numparts = workfc.numpe;
50859599516SKenneth E. Jansen nprocs = workfc.numpe;
50959599516SKenneth E. Jansen
510ff89a70fSCameron Smith assert(numparts/nprocs == 1);/* Number of parts per proc ...*/
51159599516SKenneth E. Jansen
51259599516SKenneth E. Jansen field_flag++;
51359599516SKenneth E. Jansen if(*pid==0) {
51459599516SKenneth E. Jansen printf("\n");
51559599516SKenneth E. Jansen printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel);
51659599516SKenneth E. Jansen }
51759599516SKenneth E. Jansen
51871350f02SCameron Smith /* Write solution field ...*/
51959599516SKenneth E. Jansen isize = (*nshg)*(*numvars);
52059599516SKenneth E. Jansen nitems = 3;
52159599516SKenneth E. Jansen iarray[ 0 ] = (*nshg);
52259599516SKenneth E. Jansen iarray[ 1 ] = (*numvars);
52359599516SKenneth E. Jansen iarray[ 2 ] = (*stepno);
524055123f6SCameron Smith phio_writeheader(f_descriptor, fieldlabel, (void*)iarray, &nitems,
52554d5a0aaSCameron Smith &isize, "double", phasta_iotype);
52659599516SKenneth E. Jansen nitems = (*nshg)*(*numvars);
527055123f6SCameron Smith phio_writedatablock(f_descriptor, fieldlabel, array, &isize,
52853d5e07cSCameron Smith "double", phasta_iotype );
52959599516SKenneth E. Jansen if (field_flag==nfields){
530d7abaf6cSCameron Smith phio_closefile(f_descriptor);
53159599516SKenneth E. Jansen if (*pid==0) {
53259599516SKenneth E. Jansen printf("\n");
53359599516SKenneth E. Jansen }
53459599516SKenneth E. Jansen }
53559599516SKenneth E. Jansen free(fieldlabel);
53659599516SKenneth E. Jansen }
537