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