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" 20*520c014cSCameron 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 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 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 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 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 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 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 22759599516SKenneth E. Jansen if(turbvari.irans < 0) { 22871350f02SCameron Smith nfields++; /*dwal*/ 22959599516SKenneth 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 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, "."); 283*520c014cSCameron 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 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 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 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