1*59599516SKenneth E. Jansen /* This file provides interface functions for 'partial ' random 2*59599516SKenneth E. Jansen access into the PHASTA input files 3*59599516SKenneth E. Jansen 4*59599516SKenneth E. Jansen Anil Karanam March 2001 */ 5*59599516SKenneth E. Jansen 6*59599516SKenneth E. Jansen #include <stdio.h> 7*59599516SKenneth E. Jansen #include <string.h> 8*59599516SKenneth E. Jansen #include <ctype.h> 9*59599516SKenneth E. Jansen #include <stdlib.h> 10*59599516SKenneth E. Jansen #include <time.h> 11*59599516SKenneth E. Jansen #include <math.h> 12*59599516SKenneth E. Jansen #include "mpi.h" 13*59599516SKenneth E. Jansen #include "phastaIO.h" 14*59599516SKenneth E. Jansen #include "rdtsc.h" 15*59599516SKenneth E. Jansen #include <FCMangle.h> 16*59599516SKenneth E. Jansen #include "new_interface.h" 17*59599516SKenneth E. Jansen 18*59599516SKenneth E. Jansen //MR CHANGE 19*59599516SKenneth E. Jansen #include "common_c.h" 20*59599516SKenneth E. Jansen //MR CHANGE END 21*59599516SKenneth E. Jansen 22*59599516SKenneth E. Jansen #ifdef intel 23*59599516SKenneth E. Jansen #include <winsock2.h> 24*59599516SKenneth E. Jansen #else 25*59599516SKenneth E. Jansen #include <unistd.h> 26*59599516SKenneth E. Jansen #include <strings.h> 27*59599516SKenneth E. Jansen #endif 28*59599516SKenneth E. Jansen 29*59599516SKenneth E. Jansen //extern double cpu_speed = 2600000000.0; //for Jaguar XT5 30*59599516SKenneth E. Jansen //extern double cpu_speed = 2100000000.0; //for Jaguar xt4 31*59599516SKenneth E. Jansen //extern double cpu_speed = 850000000.0; //for Intrepid 32*59599516SKenneth E. Jansen 33*59599516SKenneth E. Jansen void igetMinMaxAvg(int *ivalue, double *stats, int *statRanks) { 34*59599516SKenneth E. Jansen int isThisRank; 35*59599516SKenneth E. Jansen 36*59599516SKenneth E. Jansen double *value = (double*)malloc(sizeof(double)); 37*59599516SKenneth E. Jansen *value = 1.0*(*ivalue); 38*59599516SKenneth E. Jansen 39*59599516SKenneth E. Jansen rgetMinMaxAvg(value,stats,statRanks); 40*59599516SKenneth E. Jansen 41*59599516SKenneth E. Jansen /* MPI_Allreduce(value,&stats[0],1,MPI_DOUBLE,MPI_MIN,MPI_COMM_WORLD); 42*59599516SKenneth E. Jansen isThisRank=workfc.numpe+1; 43*59599516SKenneth E. Jansen if(*value==stats[0]) 44*59599516SKenneth E. Jansen isThisRank=workfc.myrank; 45*59599516SKenneth E. Jansen MPI_Allreduce(&isThisRank,&statRanks[0],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD); 46*59599516SKenneth E. Jansen 47*59599516SKenneth E. Jansen MPI_Allreduce(value,&stats[1],1,MPI_DOUBLE,MPI_MAX,MPI_COMM_WORLD); 48*59599516SKenneth E. Jansen isThisRank=workfc.numpe+1; 49*59599516SKenneth E. Jansen if(*value==stats[1]) 50*59599516SKenneth E. Jansen isThisRank=workfc.myrank; 51*59599516SKenneth E. Jansen MPI_Allreduce(&isThisRank,&statRanks[1],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD); 52*59599516SKenneth E. Jansen 53*59599516SKenneth E. Jansen MPI_Allreduce(value,&stats[2],1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD); 54*59599516SKenneth E. Jansen stats[2] /= workfc.numpe; */ 55*59599516SKenneth E. Jansen 56*59599516SKenneth E. Jansen free(value); 57*59599516SKenneth E. Jansen } 58*59599516SKenneth E. Jansen 59*59599516SKenneth E. Jansen void rgetMinMaxAvg(double *value, double *stats, int *statRanks) { 60*59599516SKenneth E. Jansen int isThisRank; 61*59599516SKenneth E. Jansen 62*59599516SKenneth E. Jansen MPI_Allreduce(value,&stats[0],1,MPI_DOUBLE,MPI_MIN,MPI_COMM_WORLD); 63*59599516SKenneth E. Jansen isThisRank=workfc.numpe+1; 64*59599516SKenneth E. Jansen if(*value==stats[0]) 65*59599516SKenneth E. Jansen isThisRank=workfc.myrank; 66*59599516SKenneth E. Jansen MPI_Allreduce(&isThisRank,&statRanks[0],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD); 67*59599516SKenneth E. Jansen 68*59599516SKenneth E. Jansen MPI_Allreduce(value,&stats[1],1,MPI_DOUBLE,MPI_MAX,MPI_COMM_WORLD); 69*59599516SKenneth E. Jansen isThisRank=workfc.numpe+1; 70*59599516SKenneth E. Jansen if(*value==stats[1]) 71*59599516SKenneth E. Jansen isThisRank=workfc.myrank; 72*59599516SKenneth E. Jansen MPI_Allreduce(&isThisRank,&statRanks[1],1,MPI_INT,MPI_MIN,MPI_COMM_WORLD); 73*59599516SKenneth E. Jansen 74*59599516SKenneth E. Jansen MPI_Allreduce(value,&stats[2],1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD); 75*59599516SKenneth E. Jansen stats[2] /= workfc.numpe; 76*59599516SKenneth E. Jansen 77*59599516SKenneth E. Jansen double sqValue = (*value)*(*value), sqValueAvg = 0.; 78*59599516SKenneth E. Jansen MPI_Allreduce(&sqValue,&sqValueAvg,1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD); 79*59599516SKenneth E. Jansen sqValueAvg /= workfc.numpe; 80*59599516SKenneth E. Jansen // stats[3] = sqValueAvg; 81*59599516SKenneth E. Jansen 82*59599516SKenneth E. Jansen stats[3] = sqrt(sqValueAvg-stats[2]*stats[2]); 83*59599516SKenneth E. Jansen } 84*59599516SKenneth E. Jansen 85*59599516SKenneth E. Jansen void print_mesh_stats(void) { 86*59599516SKenneth E. Jansen int statRanks[2]; 87*59599516SKenneth E. Jansen double iStats[4], rStats[4]; 88*59599516SKenneth E. Jansen 89*59599516SKenneth E. Jansen igetMinMaxAvg(&conpar.nshg,iStats,statRanks); 90*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 91*59599516SKenneth 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]); 92*59599516SKenneth E. Jansen igetMinMaxAvg(&conpar.numel,iStats,statRanks); 93*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 94*59599516SKenneth 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]); 95*59599516SKenneth E. Jansen igetMinMaxAvg(&conpar.numelb,iStats,statRanks); 96*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 97*59599516SKenneth 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]); 98*59599516SKenneth E. Jansen igetMinMaxAvg(&conpar.nnz_tot,iStats,statRanks); 99*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) { 100*59599516SKenneth 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]); 101*59599516SKenneth E. Jansen printf("\n"); 102*59599516SKenneth E. Jansen } 103*59599516SKenneth E. Jansen } 104*59599516SKenneth E. Jansen 105*59599516SKenneth E. Jansen void print_mpi_stats(void) { 106*59599516SKenneth E. Jansen int statRanks[2]; 107*59599516SKenneth E. Jansen double iStats[4], rStats[4]; 108*59599516SKenneth E. Jansen 109*59599516SKenneth E. Jansen // NS equations 110*59599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iISend,iStats,statRanks); 111*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 112*59599516SKenneth 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]); 113*59599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iIRecv,iStats,statRanks); 114*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 115*59599516SKenneth 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]); 116*59599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iWaitAll,iStats,statRanks); 117*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 118*59599516SKenneth 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]); 119*59599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iAllR,iStats,statRanks); 120*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 121*59599516SKenneth 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]); 122*59599516SKenneth E. Jansen 123*59599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rISend,rStats,statRanks); 124*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 125*59599516SKenneth 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]); 126*59599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rIRecv,rStats,statRanks); 127*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 128*59599516SKenneth 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]); 129*59599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rWaitAll,rStats,statRanks); 130*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 131*59599516SKenneth 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]); 132*59599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rCommu,rStats,statRanks); 133*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 134*59599516SKenneth 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]); 135*59599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rAllR,rStats,statRanks); 136*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) { 137*59599516SKenneth 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]); 138*59599516SKenneth E. Jansen printf("\n"); 139*59599516SKenneth E. Jansen } 140*59599516SKenneth E. Jansen // Scalars 141*59599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iISendScal,iStats,statRanks); 142*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 143*59599516SKenneth 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]); 144*59599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iIRecvScal,iStats,statRanks); 145*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 146*59599516SKenneth 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]); 147*59599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iWaitAllScal,iStats,statRanks); 148*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 149*59599516SKenneth 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]); 150*59599516SKenneth E. Jansen igetMinMaxAvg(&mpistats.iAllRScal,iStats,statRanks); 151*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 152*59599516SKenneth 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]); 153*59599516SKenneth E. Jansen 154*59599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rISendScal,rStats,statRanks); 155*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 156*59599516SKenneth 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]); 157*59599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rIRecvScal,rStats,statRanks); 158*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 159*59599516SKenneth 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]); 160*59599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rWaitAllScal,rStats,statRanks); 161*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 162*59599516SKenneth 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]); 163*59599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rCommuScal,rStats,statRanks); 164*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 165*59599516SKenneth 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]); 166*59599516SKenneth E. Jansen rgetMinMaxAvg(&mpistats.rAllRScal,rStats,statRanks); 167*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 168*59599516SKenneth 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]); 169*59599516SKenneth E. Jansen 170*59599516SKenneth E. Jansen 171*59599516SKenneth E. Jansen } 172*59599516SKenneth E. Jansen 173*59599516SKenneth E. Jansen //void print_system_stats(double tcorecp[2]) { 174*59599516SKenneth E. Jansen void print_system_stats(double *tcorecp, double *tcorecpscal) { 175*59599516SKenneth E. Jansen int statRanks[2]; 176*59599516SKenneth E. Jansen double iStats[4], rStats[4]; 177*59599516SKenneth E. Jansen double syst_assembly, syst_solve; 178*59599516SKenneth E. Jansen 179*59599516SKenneth E. Jansen // NS equations 180*59599516SKenneth E. Jansen syst_assembly = tcorecp[0]; 181*59599516SKenneth E. Jansen syst_solve = tcorecp[1]; 182*59599516SKenneth E. Jansen 183*59599516SKenneth E. Jansen rgetMinMaxAvg(&syst_assembly,rStats,statRanks); 184*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 185*59599516SKenneth 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]); 186*59599516SKenneth E. Jansen 187*59599516SKenneth E. Jansen rgetMinMaxAvg(&syst_solve,rStats,statRanks); 188*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 189*59599516SKenneth 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]); 190*59599516SKenneth E. Jansen 191*59599516SKenneth E. Jansen // Scalars 192*59599516SKenneth E. Jansen syst_assembly = tcorecpscal[0]; 193*59599516SKenneth E. Jansen syst_solve = tcorecpscal[1]; 194*59599516SKenneth E. Jansen 195*59599516SKenneth E. Jansen rgetMinMaxAvg(&syst_assembly,rStats,statRanks); 196*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) 197*59599516SKenneth 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]); 198*59599516SKenneth E. Jansen 199*59599516SKenneth E. Jansen rgetMinMaxAvg(&syst_solve,rStats,statRanks); 200*59599516SKenneth E. Jansen if(workfc.myrank==workfc.master) { 201*59599516SKenneth 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]); 202*59599516SKenneth E. Jansen printf("\n"); 203*59599516SKenneth E. Jansen } 204*59599516SKenneth E. Jansen //printf("rank %d - syst_assembly %f - syst_solve %f\n",workfc.myrank,syst_assembly,syst_solve); 205*59599516SKenneth E. Jansen } 206*59599516SKenneth E. Jansen 207*59599516SKenneth E. Jansen 208*59599516SKenneth E. Jansen 209*59599516SKenneth E. Jansen void countfieldstowriterestart() 210*59599516SKenneth E. Jansen { 211*59599516SKenneth E. Jansen int nfields; 212*59599516SKenneth E. Jansen 213*59599516SKenneth E. Jansen // printf("TEST: %d %d %d %d %d\n",timdat.istep,timdat.itseq,inpdat.nstep[0],inpdat.nstep[1],timdat.lstep); 214*59599516SKenneth E. Jansen 215*59599516SKenneth E. Jansen nfields = 2; //solution, time derivatives 216*59599516SKenneth E. Jansen 217*59599516SKenneth E. Jansen if(outpar.ivort == 1){ 218*59599516SKenneth E. Jansen nfields++; //vorticity 219*59599516SKenneth E. Jansen } 220*59599516SKenneth E. Jansen 221*59599516SKenneth E. Jansen if(abs(turbvar.itwmod) != 1 && outpar.iowflux == 1) { 222*59599516SKenneth E. Jansen nfields++; //instantaneous wss in bflux.f 223*59599516SKenneth E. Jansen } 224*59599516SKenneth E. Jansen 225*59599516SKenneth E. Jansen // if(ideformwall.eq.1) not handled yet 226*59599516SKenneth E. Jansen 227*59599516SKenneth E. Jansen if(timdat.istep == inpdat.nstep[timdat.itseq-1]){ //Last time step of the computation 228*59599516SKenneth E. Jansen 229*59599516SKenneth E. Jansen //projection vectors and pressure projection vectors (call saveLesRestart in itrdrv) 230*59599516SKenneth E. Jansen nfields = nfields +2; 231*59599516SKenneth E. Jansen 232*59599516SKenneth E. Jansen //if Print Error Indicators = true (call write_error in itrdrv) 233*59599516SKenneth E. Jansen if(turbvar.ierrcalc == 1){ 234*59599516SKenneth E. Jansen nfields++; 235*59599516SKenneth E. Jansen } 236*59599516SKenneth E. Jansen 237*59599516SKenneth E. Jansen //if Print ybar = True (call write_field(myrank,'a','ybar',4,... in itrdrv) 238*59599516SKenneth E. Jansen if(outpar.ioybar == 1){ 239*59599516SKenneth E. Jansen nfields++; //ybar 240*59599516SKenneth E. Jansen 241*59599516SKenneth E. Jansen //phase average fields 242*59599516SKenneth E. Jansen if(outpar.nphasesincycle >0) { 243*59599516SKenneth E. Jansen nfields = nfields + outpar.nphasesincycle; 244*59599516SKenneth E. Jansen } 245*59599516SKenneth E. Jansen 246*59599516SKenneth E. Jansen if(abs(turbvar.itwmod) != 1 && outpar.iowflux == 1) { 247*59599516SKenneth E. Jansen nfields++; //wssbar 248*59599516SKenneth E. Jansen } 249*59599516SKenneth E. Jansen 250*59599516SKenneth E. Jansen } 251*59599516SKenneth E. Jansen 252*59599516SKenneth E. Jansen if(turbvari.irans < 0) { 253*59599516SKenneth E. Jansen nfields++; //dwal 254*59599516SKenneth E. Jansen } 255*59599516SKenneth E. Jansen 256*59599516SKenneth E. Jansen } 257*59599516SKenneth E. Jansen 258*59599516SKenneth E. Jansen outpar.nsynciofieldswriterestart = nfields; 259*59599516SKenneth E. Jansen 260*59599516SKenneth E. Jansen if(workfc.myrank == 0) { 261*59599516SKenneth E. Jansen printf("Number of fields to write in restart files: %d\n", nfields); 262*59599516SKenneth E. Jansen } 263*59599516SKenneth E. Jansen } 264*59599516SKenneth E. Jansen 265*59599516SKenneth E. Jansen 266*59599516SKenneth E. Jansen void 267*59599516SKenneth E. Jansen Write_Restart( int* pid, 268*59599516SKenneth E. Jansen int* stepno, 269*59599516SKenneth E. Jansen int* nshg, 270*59599516SKenneth E. Jansen int* numVars, 271*59599516SKenneth E. Jansen double* array1, 272*59599516SKenneth E. Jansen double* array2 ) { 273*59599516SKenneth E. Jansen 274*59599516SKenneth E. Jansen char fname[255]; 275*59599516SKenneth E. Jansen char rfile[60]; 276*59599516SKenneth E. Jansen char existingfile[30], linkfile[30]; 277*59599516SKenneth E. Jansen int irstou; 278*59599516SKenneth E. Jansen int magic_number = 362436; 279*59599516SKenneth E. Jansen int* mptr = &magic_number; 280*59599516SKenneth E. Jansen // time_t timenow = time ( &timenow); 281*59599516SKenneth E. Jansen double version=0.0; 282*59599516SKenneth E. Jansen int isize, nitems; 283*59599516SKenneth E. Jansen int iarray[10]; 284*59599516SKenneth E. Jansen 285*59599516SKenneth E. Jansen /*sprintf(rfile,"restart.%d.%d",*stepno,*pid+1); 286*59599516SKenneth E. Jansen openfile_(rfile,"write", &irstou); 287*59599516SKenneth E. Jansen 288*59599516SKenneth E. Jansen // writing the top ascii header for the restart file 289*59599516SKenneth E. Jansen 290*59599516SKenneth E. Jansen writestring_( &irstou,"# PHASTA Input File Version 2.0\n"); 291*59599516SKenneth E. Jansen writestring_( &irstou, 292*59599516SKenneth E. Jansen "# format \"keyphrase : sizeofnextblock usual headers\"\n"); 293*59599516SKenneth E. Jansen 294*59599516SKenneth E. Jansen bzero( (void*)fname, 255 ); 295*59599516SKenneth E. Jansen sprintf(fname,"# Output generated by phasta version (NOT YET CURRENT): %lf \n", version); 296*59599516SKenneth E. Jansen writestring_( &irstou, fname ); 297*59599516SKenneth E. Jansen 298*59599516SKenneth E. Jansen bzero( (void*)fname, 255 ); 299*59599516SKenneth E. Jansen gethostname(fname,255); 300*59599516SKenneth E. Jansen writestring_( &irstou,"# This result was produced on: "); 301*59599516SKenneth E. Jansen writestring_( &irstou, fname ); 302*59599516SKenneth E. Jansen writestring_( &irstou,"\n"); 303*59599516SKenneth E. Jansen 304*59599516SKenneth E. Jansen bzero( (void*)fname, 255 ); 305*59599516SKenneth E. Jansen sprintf(fname,"# %s\n", ctime( &timenow )); 306*59599516SKenneth E. Jansen writestring_( &irstou, fname ); 307*59599516SKenneth E. Jansen 308*59599516SKenneth E. Jansen isize = 1; 309*59599516SKenneth E. Jansen nitems = 1; 310*59599516SKenneth E. Jansen iarray[ 0 ] = 1; 311*59599516SKenneth E. Jansen writeheader_( &irstou, "byteorder magic number ", 312*59599516SKenneth E. Jansen (void*)iarray, &nitems, &isize, "integer", phasta_iotype ); 313*59599516SKenneth E. Jansen 314*59599516SKenneth E. Jansen nitems = 1; 315*59599516SKenneth E. Jansen writedatablock_( &irstou, "byteorder magic number ", 316*59599516SKenneth E. Jansen (void*)mptr, &nitems, "integer", phasta_iotype ); 317*59599516SKenneth E. Jansen 318*59599516SKenneth E. Jansen 319*59599516SKenneth E. Jansen bzero( (void*)fname, 255 ); 320*59599516SKenneth E. Jansen sprintf(fname,"number of modes : < 0 > %d\n", *nshg); 321*59599516SKenneth E. Jansen writestring_( &irstou, fname ); 322*59599516SKenneth E. Jansen 323*59599516SKenneth E. Jansen bzero( (void*)fname, 255 ); 324*59599516SKenneth E. Jansen sprintf(fname,"number of variables : < 0 > %d\n", *numVars); 325*59599516SKenneth E. Jansen writestring_( &irstou, fname ); 326*59599516SKenneth E. Jansen 327*59599516SKenneth E. Jansen 328*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 329*59599516SKenneth E. Jansen nitems = 3; 330*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 331*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 332*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 333*59599516SKenneth E. Jansen writeheader_( &irstou, "solution ", 334*59599516SKenneth E. Jansen (void*)iarray, &nitems, &isize, "double", phasta_iotype ); 335*59599516SKenneth E. Jansen 336*59599516SKenneth E. Jansen 337*59599516SKenneth E. Jansen nitems = (*nshg)*(*numVars); 338*59599516SKenneth E. Jansen writedatablock_( &irstou, "solution ", 339*59599516SKenneth E. Jansen (void*)(array1), &nitems, "double", phasta_iotype ); 340*59599516SKenneth E. Jansen 341*59599516SKenneth E. Jansen 342*59599516SKenneth E. Jansen 343*59599516SKenneth E. Jansen nitems = 3; 344*59599516SKenneth E. Jansen writeheader_( &irstou, "time derivative of solution ", 345*59599516SKenneth E. Jansen (void*)iarray, &nitems, &isize, "double", phasta_iotype ); 346*59599516SKenneth E. Jansen 347*59599516SKenneth E. Jansen 348*59599516SKenneth E. Jansen nitems = (*nshg)*(*numVars); 349*59599516SKenneth E. Jansen writedatablock_( &irstou, "time derivative of solution ", 350*59599516SKenneth E. Jansen (void*)(array2), &nitems, "double", phasta_iotype ); 351*59599516SKenneth E. Jansen 352*59599516SKenneth E. Jansen 353*59599516SKenneth E. Jansen closefile_( &irstou, "write" ); 354*59599516SKenneth E. Jansen */ 355*59599516SKenneth E. Jansen //MPI_Barrier(MPI_COMM_WORLD); 356*59599516SKenneth E. Jansen 357*59599516SKenneth E. Jansen /////////////////////////////// Start of writing using new-lib //////////////////////////// 358*59599516SKenneth E. Jansen 359*59599516SKenneth E. Jansen //MR CHANGE 360*59599516SKenneth E. Jansen int nfiles; 361*59599516SKenneth E. Jansen int nfields; 362*59599516SKenneth E. Jansen int numparts; 363*59599516SKenneth E. Jansen int irank; 364*59599516SKenneth E. Jansen int nprocs; 365*59599516SKenneth E. Jansen 366*59599516SKenneth E. Jansen // First, count the number of fields to write and store the result in 367*59599516SKenneth E. Jansen countfieldstowriterestart(); 368*59599516SKenneth E. Jansen 369*59599516SKenneth E. Jansen // Retrieve and compute the parameters required for SyncIO 370*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 371*59599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart; 372*59599516SKenneth E. Jansen numparts = workfc.numpe; 373*59599516SKenneth E. Jansen irank = *pid; //workfc.myrank; 374*59599516SKenneth E. Jansen nprocs = workfc.numpe; 375*59599516SKenneth E. Jansen //MR CHANGE END 376*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 377*59599516SKenneth E. Jansen int GPID; 378*59599516SKenneth E. Jansen 379*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 380*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 381*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 382*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 383*59599516SKenneth E. Jansen 384*59599516SKenneth E. Jansen int descriptor; 385*59599516SKenneth E. Jansen char filename[255],path[255],fieldtag_s[255]; 386*59599516SKenneth E. Jansen bzero((void*)filename,255); 387*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 388*59599516SKenneth E. Jansen 389*59599516SKenneth E. Jansen sprintf(filename,"restart-dat.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1)); 390*59599516SKenneth E. Jansen 391*59599516SKenneth E. Jansen // unsigned long long timer_start; 392*59599516SKenneth E. Jansen // unsigned long long timer_end; 393*59599516SKenneth E. Jansen // double time_span; 394*59599516SKenneth E. Jansen 395*59599516SKenneth E. Jansen //MR CHANGE 396*59599516SKenneth E. Jansen // Measure the time - Start the timer 397*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 398*59599516SKenneth E. Jansen // timer_start = rdtsc(); 399*59599516SKenneth E. Jansen //MR CHANGE END 400*59599516SKenneth E. Jansen 401*59599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write"); 402*59599516SKenneth E. Jansen 403*59599516SKenneth E. Jansen //MR CHANGE 404*59599516SKenneth E. Jansen // Measure the time - End of timer 405*59599516SKenneth E. Jansen // timer_end = rdtsc(); 406*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 407*59599516SKenneth E. Jansen if (*pid==0) { 408*59599516SKenneth E. Jansen // printf("\n*****************************\n"); 409*59599516SKenneth E. Jansen // printf("Time: 'initphmpiio' of %s with %d fields and %d files is: %f s\n",filename,nfields,nfiles,time_span); 410*59599516SKenneth E. Jansen printf("Filename is %s \n",filename); 411*59599516SKenneth E. Jansen } 412*59599516SKenneth E. Jansen //MR CHANGE END 413*59599516SKenneth E. Jansen 414*59599516SKenneth E. Jansen 415*59599516SKenneth E. Jansen //MR CHANGE 416*59599516SKenneth E. Jansen // Measure the time - Start the timer 417*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 418*59599516SKenneth E. Jansen // timer_start = rdtsc(); 419*59599516SKenneth E. Jansen //MR CHANGE END 420*59599516SKenneth E. Jansen 421*59599516SKenneth E. Jansen openfile(filename, "write", &f_descriptor); 422*59599516SKenneth E. Jansen 423*59599516SKenneth E. Jansen //MR CHANGE 424*59599516SKenneth E. Jansen // Measure the time - End of timer 425*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 426*59599516SKenneth E. Jansen // timer_end = rdtsc(); 427*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 428*59599516SKenneth E. Jansen // if (*pid==0) { 429*59599516SKenneth E. Jansen // printf("Time: 'openfile' of %s with %d fields and %d files is: %f s\n",filename,nfields,nfiles,time_span); 430*59599516SKenneth E. Jansen // printf("*****************************\n"); 431*59599516SKenneth E. Jansen // } 432*59599516SKenneth E. Jansen //MR CHANGE END 433*59599516SKenneth E. Jansen 434*59599516SKenneth E. Jansen field_flag=0; 435*59599516SKenneth E. Jansen 436*59599516SKenneth E. Jansen int i; 437*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 438*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 439*59599516SKenneth E. Jansen // e.g : (in this example) 440*59599516SKenneth E. Jansen // proc 0 : 1--4 441*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 442*59599516SKenneth E. Jansen GPID = startpart + i; 443*59599516SKenneth E. Jansen 444*59599516SKenneth E. Jansen // Write solution field ... 445*59599516SKenneth E. Jansen sprintf(fieldtag_s,"solution@%d",GPID); 446*59599516SKenneth E. Jansen 447*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 448*59599516SKenneth E. Jansen nitems = 3; 449*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 450*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 451*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 452*59599516SKenneth E. Jansen 453*59599516SKenneth E. Jansen //MR CHANGE 454*59599516SKenneth E. Jansen // Measure the time - Start the timer 455*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 456*59599516SKenneth E. Jansen // timer_start = rdtsc(); 457*59599516SKenneth E. Jansen //MR CHANGE END 458*59599516SKenneth E. Jansen 459*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 460*59599516SKenneth E. Jansen 461*59599516SKenneth E. Jansen //MR CHANGE 462*59599516SKenneth E. Jansen // Measure the time - End of timer 463*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 464*59599516SKenneth E. Jansen // timer_end = rdtsc(); 465*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 466*59599516SKenneth E. Jansen // if (*pid==0) { 467*59599516SKenneth E. Jansen // printf("\n*****************************\n"); 468*59599516SKenneth E. Jansen // printf("Time: header for 'Solution': %f s\n",time_span); 469*59599516SKenneth E. Jansen // } 470*59599516SKenneth E. Jansen //MR CHANGE END 471*59599516SKenneth E. Jansen 472*59599516SKenneth E. Jansen nitems = (*nshg)*(*numVars); 473*59599516SKenneth E. Jansen 474*59599516SKenneth E. Jansen //MR CHANGE 475*59599516SKenneth E. Jansen // Measure the time - Start the timer 476*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 477*59599516SKenneth E. Jansen // timer_start = rdtsc(); 478*59599516SKenneth E. Jansen //MR CHANGE END 479*59599516SKenneth E. Jansen 480*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 481*59599516SKenneth E. Jansen 482*59599516SKenneth E. Jansen //MR CHANGE 483*59599516SKenneth E. Jansen // Measure the time - End of timer 484*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 485*59599516SKenneth E. Jansen // timer_end = rdtsc(); 486*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 487*59599516SKenneth E. Jansen 488*59599516SKenneth E. Jansen // int isizemin,isizemax,isizetot; 489*59599516SKenneth E. Jansen // double sizemin,sizemax,sizeavg,sizetot,rate; 490*59599516SKenneth E. Jansen 491*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizemin,1,MPI_INT,MPI_MIN,MPI_COMM_WORLD); 492*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizemax,1,MPI_INT,MPI_MAX,MPI_COMM_WORLD); 493*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizetot,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD); 494*59599516SKenneth E. Jansen 495*59599516SKenneth E. Jansen // sizemin=(double)(8.0*isizemin/1024.0/1024.0); 496*59599516SKenneth E. Jansen // sizemax=(double)(8.0*isizemax/1024.0/1024.0); 497*59599516SKenneth E. Jansen // sizetot=(double)(8.0*isizetot/1024.0/1024.0); 498*59599516SKenneth E. Jansen // sizeavg=(double)(1.0*sizetot/workfc.numpe); 499*59599516SKenneth E. Jansen // rate=(double)(1.0*sizetot/time_span); 500*59599516SKenneth E. Jansen 501*59599516SKenneth E. Jansen // if (*pid==0) { 502*59599516SKenneth E. Jansen // printf("Time: block for 'Solution': %f s\n",time_span); 503*59599516SKenneth E. Jansen // printf("Time: block: Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB; Rate= %f MB/s; \n",sizemin,sizemax,sizeavg,sizetot,rate); 504*59599516SKenneth E. Jansen 505*59599516SKenneth E. Jansen // } 506*59599516SKenneth E. Jansen //MR CHANGE END 507*59599516SKenneth E. Jansen 508*59599516SKenneth E. Jansen } 509*59599516SKenneth E. Jansen field_flag++; 510*59599516SKenneth E. Jansen 511*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { 512*59599516SKenneth E. Jansen 513*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 514*59599516SKenneth E. Jansen // e.g : (in this example) 515*59599516SKenneth E. Jansen // proc 0 : 1--4 516*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 517*59599516SKenneth E. Jansen GPID = startpart + i; 518*59599516SKenneth E. Jansen 519*59599516SKenneth E. Jansen // Write solution field ... 520*59599516SKenneth E. Jansen sprintf(fieldtag_s,"time derivative of solution@%d",GPID); 521*59599516SKenneth E. Jansen 522*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 523*59599516SKenneth E. Jansen nitems = 3; 524*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 525*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 526*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 527*59599516SKenneth E. Jansen 528*59599516SKenneth E. Jansen //MR CHANGE 529*59599516SKenneth E. Jansen // Measure the time - Start the timer 530*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 531*59599516SKenneth E. Jansen // timer_start = rdtsc(); 532*59599516SKenneth E. Jansen //MR CHANGE END 533*59599516SKenneth E. Jansen 534*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 535*59599516SKenneth E. Jansen 536*59599516SKenneth E. Jansen //MR CHANGE 537*59599516SKenneth E. Jansen // Measure the time - End of timer 538*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 539*59599516SKenneth E. Jansen // timer_end = rdtsc(); 540*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 541*59599516SKenneth E. Jansen // if (*pid==0) { 542*59599516SKenneth E. Jansen // printf("Time: header for 'Time Derivative of solution': %f s\n",time_span); 543*59599516SKenneth E. Jansen // } 544*59599516SKenneth E. Jansen //MR CHANGE END 545*59599516SKenneth E. Jansen 546*59599516SKenneth E. Jansen nitems = (*nshg)*(*numVars); 547*59599516SKenneth E. Jansen 548*59599516SKenneth E. Jansen //MR CHANGE 549*59599516SKenneth E. Jansen // Measure the time - Start the timer 550*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 551*59599516SKenneth E. Jansen // timer_start = rdtsc(); 552*59599516SKenneth E. Jansen //MR CHANGE END 553*59599516SKenneth E. Jansen 554*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, (void*)(array2), &isize, "double", phasta_iotype ); 555*59599516SKenneth E. Jansen 556*59599516SKenneth E. Jansen //MR CHANGE 557*59599516SKenneth E. Jansen // Measure the time - End of timer 558*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 559*59599516SKenneth E. Jansen // timer_end = rdtsc(); 560*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 561*59599516SKenneth E. Jansen 562*59599516SKenneth E. Jansen // int isizemin,isizemax,isizetot; 563*59599516SKenneth E. Jansen // double sizemin,sizemax,sizeavg,sizetot,rate; 564*59599516SKenneth E. Jansen 565*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizemin,1,MPI_INT,MPI_MIN,MPI_COMM_WORLD); 566*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizemax,1,MPI_INT,MPI_MAX,MPI_COMM_WORLD); 567*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizetot,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD); 568*59599516SKenneth E. Jansen 569*59599516SKenneth E. Jansen // sizemin=(double)(8.0*isizemin/1024.0/1024.0); 570*59599516SKenneth E. Jansen // sizemax=(double)(8.0*isizemax/1024.0/1024.0); 571*59599516SKenneth E. Jansen // sizetot=(double)(8.0*isizetot/1024.0/1024.0); 572*59599516SKenneth E. Jansen // sizeavg=sizetot/workfc.numpe; 573*59599516SKenneth E. Jansen // rate=sizetot/time_span; 574*59599516SKenneth E. Jansen 575*59599516SKenneth E. Jansen // if (*pid==0) { 576*59599516SKenneth E. Jansen // printf("Time: block for 'Time Derivative of Solution': %f s\n",time_span); 577*59599516SKenneth E. Jansen // printf("Time: block: Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB; Rate= %f MB/s; \n",sizemin,sizemax,sizeavg,sizetot,rate); 578*59599516SKenneth E. Jansen // printf("*****************************\n"); 579*59599516SKenneth E. Jansen 580*59599516SKenneth E. Jansen // } 581*59599516SKenneth E. Jansen //MR CHANGE END 582*59599516SKenneth E. Jansen 583*59599516SKenneth E. Jansen } 584*59599516SKenneth E. Jansen field_flag++; 585*59599516SKenneth E. Jansen 586*59599516SKenneth E. Jansen if (field_flag==nfields){ 587*59599516SKenneth E. Jansen 588*59599516SKenneth E. Jansen //MR CHANGE 589*59599516SKenneth E. Jansen // Measure the time - Start the timer 590*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 591*59599516SKenneth E. Jansen // timer_start = rdtsc(); 592*59599516SKenneth E. Jansen //MR CHANGE END 593*59599516SKenneth E. Jansen 594*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 595*59599516SKenneth E. Jansen 596*59599516SKenneth E. Jansen //MR CHANGE 597*59599516SKenneth E. Jansen // Measure the time - End of timer 598*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 599*59599516SKenneth E. Jansen // timer_end = rdtsc(); 600*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 601*59599516SKenneth E. Jansen // if (*pid==0) { 602*59599516SKenneth E. Jansen // printf("\n*****************************\n"); 603*59599516SKenneth E. Jansen // printf("Time: 'closefile' is: %f s\n",time_span); 604*59599516SKenneth E. Jansen // } 605*59599516SKenneth E. Jansen //MR CHANGE END 606*59599516SKenneth E. Jansen 607*59599516SKenneth E. Jansen //MR CHANGE 608*59599516SKenneth E. Jansen // Measure the time - Start the timer 609*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 610*59599516SKenneth E. Jansen // timer_start = rdtsc(); 611*59599516SKenneth E. Jansen //MR CHANGE END 612*59599516SKenneth E. Jansen 613*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 614*59599516SKenneth E. Jansen 615*59599516SKenneth E. Jansen //MR CHANGE 616*59599516SKenneth E. Jansen // Measure the time - End of timer 617*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 618*59599516SKenneth E. Jansen // timer_end = rdtsc(); 619*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 620*59599516SKenneth E. Jansen if (*pid==0) { 621*59599516SKenneth E. Jansen // printf("Time: 'finalizephmpiio' is: %f s\n",time_span); 622*59599516SKenneth E. Jansen // printf("Last field %d '%s' finished! \n",nfields, fieldtag_s); 623*59599516SKenneth E. Jansen printf("\n"); 624*59599516SKenneth E. Jansen // printf("*****************************\n"); 625*59599516SKenneth E. Jansen } 626*59599516SKenneth E. Jansen } 627*59599516SKenneth E. Jansen //MR CHANGE END 628*59599516SKenneth E. Jansen 629*59599516SKenneth E. Jansen 630*59599516SKenneth E. Jansen 631*59599516SKenneth E. Jansen /////////////////////////////////////////////////////////////////////////////////////////// 632*59599516SKenneth E. Jansen 633*59599516SKenneth E. Jansen /* create a soft link of the restart we just wrote to restart.latest 634*59599516SKenneth E. Jansen this is the file the next run will always try to start from */ 635*59599516SKenneth E. Jansen 636*59599516SKenneth E. Jansen /* sprintf( linkfile, "restart.latest.%d", *pid+1 ); 637*59599516SKenneth E. Jansen unlink( linkfile ); 638*59599516SKenneth E. Jansen sprintf( existingfile, "restart.%d.%d", *stepno, *pid+1 ); 639*59599516SKenneth E. Jansen link( existingfile, linkfile ); 640*59599516SKenneth E. Jansen */ 641*59599516SKenneth E. Jansen } 642*59599516SKenneth E. Jansen 643*59599516SKenneth E. Jansen void 644*59599516SKenneth E. Jansen Write_Error( int* pid, 645*59599516SKenneth E. Jansen int* stepno, 646*59599516SKenneth E. Jansen int* nshg, 647*59599516SKenneth E. Jansen int* numVars, 648*59599516SKenneth E. Jansen double* array1 ) { 649*59599516SKenneth E. Jansen 650*59599516SKenneth E. Jansen 651*59599516SKenneth E. Jansen char fname[255]; 652*59599516SKenneth E. Jansen char rfile[60]; 653*59599516SKenneth E. Jansen int irstou; 654*59599516SKenneth E. Jansen int magic_number = 362436; 655*59599516SKenneth E. Jansen int* mptr = &magic_number; 656*59599516SKenneth E. Jansen //printf("Time is commented\n"); 657*59599516SKenneth E. Jansen //time_t timenow = time ( &timenow); 658*59599516SKenneth E. Jansen //printf("Yes\n"); 659*59599516SKenneth E. Jansen double version=0.0; 660*59599516SKenneth E. Jansen int isize, nitems; 661*59599516SKenneth E. Jansen int iarray[10]; 662*59599516SKenneth E. Jansen 663*59599516SKenneth E. Jansen /*sprintf(rfile,"restart.%d.%d",*stepno,*pid+1); 664*59599516SKenneth E. Jansen openfile_(rfile,"append", &irstou); 665*59599516SKenneth E. Jansen 666*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 667*59599516SKenneth E. Jansen nitems = 3; 668*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 669*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 670*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 671*59599516SKenneth E. Jansen writeheader_( &irstou, "errors", (void*)iarray, &nitems, &isize, "double", phasta_iotype ); 672*59599516SKenneth E. Jansen 673*59599516SKenneth E. Jansen 674*59599516SKenneth E. Jansen nitems = (*nshg)*(*numVars); 675*59599516SKenneth E. Jansen writedatablock_( &irstou, "errors ", (void*)(array1), &nitems, "double", phasta_iotype ); 676*59599516SKenneth E. Jansen 677*59599516SKenneth E. Jansen closefile_( &irstou, "append" );*/ 678*59599516SKenneth E. Jansen 679*59599516SKenneth E. Jansen /////////////////////////////// Start of writing using new-lib //////////////////////////// 680*59599516SKenneth E. Jansen 681*59599516SKenneth E. Jansen int nfiles; 682*59599516SKenneth E. Jansen int nfields; 683*59599516SKenneth E. Jansen int numparts; 684*59599516SKenneth E. Jansen int irank; 685*59599516SKenneth E. Jansen int nprocs; 686*59599516SKenneth E. Jansen 687*59599516SKenneth E. Jansen // unsigned long long timer_start; 688*59599516SKenneth E. Jansen // unsigned long long timer_end; 689*59599516SKenneth E. Jansen // double time_span; 690*59599516SKenneth E. Jansen 691*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 692*59599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart; 693*59599516SKenneth E. Jansen numparts = workfc.numpe; 694*59599516SKenneth E. Jansen irank = *pid; //workfc.myrank; 695*59599516SKenneth E. Jansen nprocs = workfc.numpe; 696*59599516SKenneth E. Jansen 697*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 698*59599516SKenneth E. Jansen int GPID; 699*59599516SKenneth E. Jansen 700*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 701*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 702*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 703*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 704*59599516SKenneth E. Jansen 705*59599516SKenneth E. Jansen field_flag++; 706*59599516SKenneth E. Jansen 707*59599516SKenneth E. Jansen char fieldtag[255]; 708*59599516SKenneth E. Jansen 709*59599516SKenneth E. Jansen int i; 710*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) { 711*59599516SKenneth E. Jansen GPID = startpart + i; 712*59599516SKenneth E. Jansen sprintf(fieldtag,"errors@%d",GPID); 713*59599516SKenneth E. Jansen 714*59599516SKenneth E. Jansen if(*pid==0) { 715*59599516SKenneth E. Jansen // printf("\n*****************************\n"); 716*59599516SKenneth E. Jansen printf("\n"); 717*59599516SKenneth E. Jansen printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldtag); 718*59599516SKenneth E. Jansen } 719*59599516SKenneth E. Jansen 720*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 721*59599516SKenneth E. Jansen nitems = 3; 722*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 723*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 724*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 725*59599516SKenneth E. Jansen 726*59599516SKenneth E. Jansen //MR CHANGE 727*59599516SKenneth E. Jansen // Measure the time - Start the timer 728*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 729*59599516SKenneth E. Jansen // timer_start = rdtsc(); 730*59599516SKenneth E. Jansen //MR CHANGE END 731*59599516SKenneth E. Jansen 732*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 733*59599516SKenneth E. Jansen 734*59599516SKenneth E. Jansen //MR CHANGE 735*59599516SKenneth E. Jansen // Measure the time - End of timer 736*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 737*59599516SKenneth E. Jansen // timer_end = rdtsc(); 738*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 739*59599516SKenneth E. Jansen // if (*pid==0) { 740*59599516SKenneth E. Jansen // printf("Time: header for 'error': %f s\n",time_span); 741*59599516SKenneth E. Jansen // } 742*59599516SKenneth E. Jansen //MR CHANGE END 743*59599516SKenneth E. Jansen 744*59599516SKenneth E. Jansen //MR CHANGE 745*59599516SKenneth E. Jansen // Measure the time - Start the timer 746*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 747*59599516SKenneth E. Jansen // timer_start = rdtsc(); 748*59599516SKenneth E. Jansen //MR CHANGE END 749*59599516SKenneth E. Jansen 750*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag, (void*)array1, &isize, "double", phasta_iotype ); 751*59599516SKenneth E. Jansen 752*59599516SKenneth E. Jansen //MR CHANGE 753*59599516SKenneth E. Jansen // Measure the time - End of timer 754*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 755*59599516SKenneth E. Jansen // timer_end = rdtsc(); 756*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 757*59599516SKenneth E. Jansen 758*59599516SKenneth E. Jansen // int isizemin,isizemax,isizetot; 759*59599516SKenneth E. Jansen // double sizemin,sizemax,sizeavg,sizetot,rate; 760*59599516SKenneth E. Jansen 761*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizemin,1,MPI_INT,MPI_MIN,MPI_COMM_WORLD); 762*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizemax,1,MPI_INT,MPI_MAX,MPI_COMM_WORLD); 763*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizetot,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD); 764*59599516SKenneth E. Jansen 765*59599516SKenneth E. Jansen // sizemin=(double)(8.0*isizemin/1024.0/1024.0); 766*59599516SKenneth E. Jansen // sizemax=(double)(8.0*isizemax/1024.0/1024.0); 767*59599516SKenneth E. Jansen // sizetot=(double)(8.0*isizetot/1024.0/1024.0); 768*59599516SKenneth E. Jansen // sizeavg=sizetot/workfc.numpe; 769*59599516SKenneth E. Jansen // rate=sizetot/time_span; 770*59599516SKenneth E. Jansen 771*59599516SKenneth E. Jansen // if (*pid==0) { 772*59599516SKenneth E. Jansen // printf("Time: block for 'error': %f s\n",time_span); 773*59599516SKenneth E. Jansen // printf("Time: block: Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB; Rate= %f MB/s; \n",sizemin,sizemax,sizeavg,sizetot,rate); 774*59599516SKenneth E. Jansen // printf("*****************************\n"); 775*59599516SKenneth E. Jansen // } 776*59599516SKenneth E. Jansen //MR CHANGE END 777*59599516SKenneth E. Jansen 778*59599516SKenneth E. Jansen } 779*59599516SKenneth E. Jansen 780*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 781*59599516SKenneth E. Jansen // timer_end = rdtsc(); 782*59599516SKenneth E. Jansen // time_span=(double)(timer_end-timer_start)/cpu_speed; 783*59599516SKenneth E. Jansen 784*59599516SKenneth E. Jansen // if (*pid==0) { 785*59599516SKenneth E. Jansen // printf("Field 'error' written in: %f s\n",time_span); 786*59599516SKenneth E. Jansen // printf("Write field '%s' finished! \n",fieldtag); 787*59599516SKenneth E. Jansen // } 788*59599516SKenneth E. Jansen 789*59599516SKenneth E. Jansen if (field_flag==nfields){ 790*59599516SKenneth E. Jansen 791*59599516SKenneth E. Jansen //MR CHANGE 792*59599516SKenneth E. Jansen // Measure the time - Start the timer 793*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 794*59599516SKenneth E. Jansen // timer_start = rdtsc(); 795*59599516SKenneth E. Jansen //MR CHANGE END 796*59599516SKenneth E. Jansen 797*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 798*59599516SKenneth E. Jansen 799*59599516SKenneth E. Jansen //MR CHANGE 800*59599516SKenneth E. Jansen // Measure the time - End of timer 801*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 802*59599516SKenneth E. Jansen // timer_end = rdtsc(); 803*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 804*59599516SKenneth E. Jansen // if (*pid==0) { 805*59599516SKenneth E. Jansen // printf("\n*****************************\n"); 806*59599516SKenneth E. Jansen // printf("Time: 'closefile' is: %f s\n",time_span); 807*59599516SKenneth E. Jansen // } 808*59599516SKenneth E. Jansen //MR CHANGE END 809*59599516SKenneth E. Jansen 810*59599516SKenneth E. Jansen //MR CHANGE 811*59599516SKenneth E. Jansen // Measure the time - Start the timer 812*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 813*59599516SKenneth E. Jansen // timer_start = rdtsc(); 814*59599516SKenneth E. Jansen //MR CHANGE END 815*59599516SKenneth E. Jansen 816*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 817*59599516SKenneth E. Jansen 818*59599516SKenneth E. Jansen //MR CHANGE 819*59599516SKenneth E. Jansen // Measure the time - End of timer 820*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 821*59599516SKenneth E. Jansen // timer_end = rdtsc(); 822*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 823*59599516SKenneth E. Jansen if (*pid==0) { 824*59599516SKenneth E. Jansen // printf("Time: 'finalizephmpiio' is: %f s\n",time_span); 825*59599516SKenneth E. Jansen printf("Last field %d '%s' finished! \n",nfields, fieldtag); 826*59599516SKenneth E. Jansen printf("\n"); 827*59599516SKenneth E. Jansen // printf("*****************************\n"); 828*59599516SKenneth E. Jansen } 829*59599516SKenneth E. Jansen } 830*59599516SKenneth E. Jansen //MR CHANGE END 831*59599516SKenneth E. Jansen 832*59599516SKenneth E. Jansen /////////////////////////////////////////////////////////////////////////////////////////// 833*59599516SKenneth E. Jansen 834*59599516SKenneth E. Jansen 835*59599516SKenneth E. Jansen } 836*59599516SKenneth E. Jansen 837*59599516SKenneth E. Jansen 838*59599516SKenneth E. Jansen void 839*59599516SKenneth E. Jansen Write_Displ( int* pid, 840*59599516SKenneth E. Jansen int* stepno, 841*59599516SKenneth E. Jansen int* nshg, 842*59599516SKenneth E. Jansen int* numVars, 843*59599516SKenneth E. Jansen double* array1 ) { 844*59599516SKenneth E. Jansen 845*59599516SKenneth E. Jansen 846*59599516SKenneth E. Jansen char fname[255]; 847*59599516SKenneth E. Jansen char rfile[60]; 848*59599516SKenneth E. Jansen int irstou; 849*59599516SKenneth E. Jansen int magic_number = 362436; 850*59599516SKenneth E. Jansen int* mptr = &magic_number; 851*59599516SKenneth E. Jansen time_t timenow = time ( &timenow); 852*59599516SKenneth E. Jansen double version=0.0; 853*59599516SKenneth E. Jansen int isize, nitems; 854*59599516SKenneth E. Jansen int iarray[10]; 855*59599516SKenneth E. Jansen 856*59599516SKenneth E. Jansen sprintf(rfile,"restart.%d.%d",*stepno,*pid+1); 857*59599516SKenneth E. Jansen openfile(rfile,"append", &irstou); 858*59599516SKenneth E. Jansen 859*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 860*59599516SKenneth E. Jansen nitems = 3; 861*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 862*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 863*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 864*59599516SKenneth E. Jansen writeheader( &irstou, "displacement", (void*)iarray, &nitems, &isize, "double", phasta_iotype ); 865*59599516SKenneth E. Jansen 866*59599516SKenneth E. Jansen nitems = (*nshg)*(*numVars); 867*59599516SKenneth E. Jansen writedatablock( &irstou, "displacement", (void*)(array1), &nitems, "double", phasta_iotype ); 868*59599516SKenneth E. Jansen 869*59599516SKenneth E. Jansen closefile( &irstou, "append" ); 870*59599516SKenneth E. Jansen } 871*59599516SKenneth E. Jansen 872*59599516SKenneth E. Jansen void 873*59599516SKenneth E. Jansen Write_Field( int *pid, 874*59599516SKenneth E. Jansen char* filemode, 875*59599516SKenneth E. Jansen char* fieldtag, 876*59599516SKenneth E. Jansen int* tagsize, 877*59599516SKenneth E. Jansen void* array, 878*59599516SKenneth E. Jansen char* arraytype, 879*59599516SKenneth E. Jansen int* nshg, 880*59599516SKenneth E. Jansen int* numvars, 881*59599516SKenneth E. Jansen int* stepno) { 882*59599516SKenneth E. Jansen 883*59599516SKenneth E. Jansen //printf("Rank is %d, field is %s, tagsize is %d, nshg is %d, numvars is %d\n",*pid,fieldtag,*tagsize,*nshg,*numvars); 884*59599516SKenneth E. Jansen 885*59599516SKenneth E. Jansen // char rfile[32]; 886*59599516SKenneth E. Jansen // assuming restart.sn.(pid+1) 887*59599516SKenneth E. Jansen // sprintf(rfile,"restart.%d.%d",*stepno,*pid+1); 888*59599516SKenneth E. Jansen 889*59599516SKenneth E. Jansen char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char)); 890*59599516SKenneth E. Jansen strncpy(fieldlabel, fieldtag, *tagsize); 891*59599516SKenneth E. Jansen fieldlabel[*tagsize] = '\0'; 892*59599516SKenneth E. Jansen 893*59599516SKenneth E. Jansen int irstou; 894*59599516SKenneth E. Jansen int magic_number = 362436; 895*59599516SKenneth E. Jansen int* mptr = &magic_number; 896*59599516SKenneth E. Jansen double version=0.0; 897*59599516SKenneth E. Jansen int isize, nitems; 898*59599516SKenneth E. Jansen int iarray[10]; 899*59599516SKenneth E. Jansen 900*59599516SKenneth E. Jansen char fmode[10]; 901*59599516SKenneth E. Jansen if(!strncmp(filemode,"w",1)) 902*59599516SKenneth E. Jansen strcpy(fmode,"write"); 903*59599516SKenneth E. Jansen else // default is append 904*59599516SKenneth E. Jansen strcpy(fmode,"append"); 905*59599516SKenneth E. Jansen 906*59599516SKenneth E. Jansen char datatype[10]; 907*59599516SKenneth E. Jansen if(!strncmp(arraytype,"i",1)) 908*59599516SKenneth E. Jansen strcpy(datatype,"int"); 909*59599516SKenneth E. Jansen else // default is double 910*59599516SKenneth E. Jansen strcpy(datatype,"double"); 911*59599516SKenneth E. Jansen 912*59599516SKenneth E. Jansen /* openfile_(rfile, fmode, &irstou); 913*59599516SKenneth E. Jansen 914*59599516SKenneth E. Jansen nitems = 3; // assuming field will write 3 items in iarray 915*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 916*59599516SKenneth E. Jansen iarray[ 1 ] = (*numvars); 917*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 918*59599516SKenneth E. Jansen 919*59599516SKenneth E. Jansen isize = (*nshg)*(*numvars); 920*59599516SKenneth E. Jansen writeheader_( &irstou, fieldlabel, (void*)iarray, &nitems, &isize, datatype, phasta_iotype ); 921*59599516SKenneth E. Jansen 922*59599516SKenneth E. Jansen nitems = (*nshg)*(*numvars); 923*59599516SKenneth E. Jansen writedatablock_( &irstou, fieldlabel, array, &nitems, datatype, phasta_iotype ); 924*59599516SKenneth E. Jansen closefile_( &irstou, fmode); 925*59599516SKenneth E. Jansen */ 926*59599516SKenneth E. Jansen /////////////////////////////// Start of writing using new-lib //////////////////////////// 927*59599516SKenneth E. Jansen 928*59599516SKenneth E. Jansen int nfiles; 929*59599516SKenneth E. Jansen int nfields; 930*59599516SKenneth E. Jansen int numparts; 931*59599516SKenneth E. Jansen int irank; 932*59599516SKenneth E. Jansen int nprocs; 933*59599516SKenneth E. Jansen 934*59599516SKenneth E. Jansen // unsigned long long timer_start; 935*59599516SKenneth E. Jansen // unsigned long long timer_end; 936*59599516SKenneth E. Jansen // double time_span; 937*59599516SKenneth E. Jansen 938*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 939*59599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart; 940*59599516SKenneth E. Jansen numparts = workfc.numpe; 941*59599516SKenneth E. Jansen irank = *pid; //workfc.myrank; 942*59599516SKenneth E. Jansen nprocs = workfc.numpe; 943*59599516SKenneth E. Jansen 944*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 945*59599516SKenneth E. Jansen int GPID; 946*59599516SKenneth E. Jansen 947*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 948*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 949*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 950*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 951*59599516SKenneth E. Jansen 952*59599516SKenneth E. Jansen char filename[255],path[255],fieldtag_s[255]; 953*59599516SKenneth E. Jansen bzero((void*)filename,255); 954*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 955*59599516SKenneth E. Jansen 956*59599516SKenneth E. Jansen strncpy(fieldlabel, fieldtag, *tagsize); 957*59599516SKenneth E. Jansen 958*59599516SKenneth E. Jansen field_flag++; 959*59599516SKenneth E. Jansen if(*pid==0) { 960*59599516SKenneth E. Jansen // printf("\n*****************************\n"); 961*59599516SKenneth E. Jansen printf("\n"); 962*59599516SKenneth E. Jansen printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel); 963*59599516SKenneth E. Jansen } 964*59599516SKenneth E. Jansen 965*59599516SKenneth E. Jansen sprintf(filename,"restart-dat.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1)); 966*59599516SKenneth E. Jansen 967*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 968*59599516SKenneth E. Jansen // timer_start = rdtsc(); 969*59599516SKenneth E. Jansen 970*59599516SKenneth E. Jansen int i; 971*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) { 972*59599516SKenneth E. Jansen GPID = startpart + i; 973*59599516SKenneth E. Jansen 974*59599516SKenneth E. Jansen // Write solution field ... 975*59599516SKenneth E. Jansen sprintf(fieldtag_s,"%s@%d",fieldlabel,GPID); 976*59599516SKenneth E. Jansen 977*59599516SKenneth E. Jansen isize = (*nshg)*(*numvars); 978*59599516SKenneth E. Jansen nitems = 3; 979*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 980*59599516SKenneth E. Jansen iarray[ 1 ] = (*numvars); 981*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 982*59599516SKenneth E. Jansen 983*59599516SKenneth E. Jansen //MR CHANGE 984*59599516SKenneth E. Jansen // Measure the time - Start the timer 985*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 986*59599516SKenneth E. Jansen // timer_start = rdtsc(); 987*59599516SKenneth E. Jansen //MR CHANGE END 988*59599516SKenneth E. Jansen 989*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, datatype, phasta_iotype); 990*59599516SKenneth E. Jansen 991*59599516SKenneth E. Jansen //MR CHANGE 992*59599516SKenneth E. Jansen // Measure the time - End of timer 993*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 994*59599516SKenneth E. Jansen // timer_end = rdtsc(); 995*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 996*59599516SKenneth E. Jansen // if (*pid==0) { 997*59599516SKenneth E. Jansen // printf("Time: header for '%s': %f s\n",fieldtag_s,time_span); 998*59599516SKenneth E. Jansen // } 999*59599516SKenneth E. Jansen //MR CHANGE END 1000*59599516SKenneth E. Jansen 1001*59599516SKenneth E. Jansen nitems = (*nshg)*(*numvars); 1002*59599516SKenneth E. Jansen 1003*59599516SKenneth E. Jansen //MR CHANGE 1004*59599516SKenneth E. Jansen // Measure the time - Start the timer 1005*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1006*59599516SKenneth E. Jansen // timer_start = rdtsc(); 1007*59599516SKenneth E. Jansen //MR CHANGE END 1008*59599516SKenneth E. Jansen 1009*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, array, &isize, datatype, phasta_iotype ); 1010*59599516SKenneth E. Jansen 1011*59599516SKenneth E. Jansen //MR CHANGE 1012*59599516SKenneth E. Jansen // Measure the time - End of timer 1013*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1014*59599516SKenneth E. Jansen // timer_end = rdtsc(); 1015*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 1016*59599516SKenneth E. Jansen 1017*59599516SKenneth E. Jansen // int isizemin,isizemax,isizetot; 1018*59599516SKenneth E. Jansen // double sizemin,sizemax,sizeavg,sizetot,rate; 1019*59599516SKenneth E. Jansen 1020*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizemin,1,MPI_INT,MPI_MIN,MPI_COMM_WORLD); 1021*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizemax,1,MPI_INT,MPI_MAX,MPI_COMM_WORLD); 1022*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizetot,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD); 1023*59599516SKenneth E. Jansen 1024*59599516SKenneth E. Jansen // sizemin=(double)(8.0*isizemin/1024.0/1024.0); 1025*59599516SKenneth E. Jansen // sizemax=(double)(8.0*isizemax/1024.0/1024.0); 1026*59599516SKenneth E. Jansen // sizetot=(double)(8.0*isizetot/1024.0/1024.0); 1027*59599516SKenneth E. Jansen // sizeavg=sizetot/workfc.numpe; 1028*59599516SKenneth E. Jansen // rate=sizetot/time_span; 1029*59599516SKenneth E. Jansen 1030*59599516SKenneth E. Jansen // if (*pid==0) { 1031*59599516SKenneth E. Jansen // printf("Time: block for '%s': %f s\n",fieldtag_s,time_span); 1032*59599516SKenneth E. Jansen // printf("Time: block: Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB; Rate= %f MB/s; \n",sizemin,sizemax,sizeavg,sizetot,rate); 1033*59599516SKenneth E. Jansen // printf("*****************************\n"); 1034*59599516SKenneth E. Jansen // } 1035*59599516SKenneth E. Jansen //MR CHANGE END 1036*59599516SKenneth E. Jansen 1037*59599516SKenneth E. Jansen } 1038*59599516SKenneth E. Jansen 1039*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1040*59599516SKenneth E. Jansen // timer_end = rdtsc(); 1041*59599516SKenneth E. Jansen // time_span=(double)(timer_end-timer_start)/cpu_speed; 1042*59599516SKenneth E. Jansen 1043*59599516SKenneth E. Jansen // if (*pid==0) { 1044*59599516SKenneth E. Jansen // printf("Field '%s' written in: %f s\n",fieldtag,time_span); 1045*59599516SKenneth E. Jansen // printf("Write field '%s' finished! \n",fieldtag_s); 1046*59599516SKenneth E. Jansen // } 1047*59599516SKenneth E. Jansen 1048*59599516SKenneth E. Jansen // if (field_flag==nfields){ 1049*59599516SKenneth E. Jansen // closefile_(&f_descriptor, "write"); 1050*59599516SKenneth E. Jansen // finalizephmpiio_(&f_descriptor); 1051*59599516SKenneth E. Jansen // if(*pid==0) { 1052*59599516SKenneth E. Jansen // printf("Last field %d '%s' finished! \n",nfields, fieldtag_s); 1053*59599516SKenneth E. Jansen // printf("\n*****************************\n"); 1054*59599516SKenneth E. Jansen // } 1055*59599516SKenneth E. Jansen // } 1056*59599516SKenneth E. Jansen 1057*59599516SKenneth E. Jansen if (field_flag==nfields){ 1058*59599516SKenneth E. Jansen 1059*59599516SKenneth E. Jansen //MR CHANGE 1060*59599516SKenneth E. Jansen // Measure the time - Start the timer 1061*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1062*59599516SKenneth E. Jansen // timer_start = rdtsc(); 1063*59599516SKenneth E. Jansen //MR CHANGE END 1064*59599516SKenneth E. Jansen 1065*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 1066*59599516SKenneth E. Jansen 1067*59599516SKenneth E. Jansen //MR CHANGE 1068*59599516SKenneth E. Jansen // Measure the time - End of timer 1069*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1070*59599516SKenneth E. Jansen // timer_end = rdtsc(); 1071*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 1072*59599516SKenneth E. Jansen // if (*pid==0) { 1073*59599516SKenneth E. Jansen // printf("\n*****************************\n"); 1074*59599516SKenneth E. Jansen // printf("Time: 'closefile' is: %f s\n",time_span); 1075*59599516SKenneth E. Jansen // } 1076*59599516SKenneth E. Jansen //MR CHANGE END 1077*59599516SKenneth E. Jansen 1078*59599516SKenneth E. Jansen //MR CHANGE 1079*59599516SKenneth E. Jansen // Measure the time - Start the timer 1080*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1081*59599516SKenneth E. Jansen // timer_start = rdtsc(); 1082*59599516SKenneth E. Jansen //MR CHANGE END 1083*59599516SKenneth E. Jansen 1084*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 1085*59599516SKenneth E. Jansen 1086*59599516SKenneth E. Jansen //MR CHANGE 1087*59599516SKenneth E. Jansen // Measure the time - End of timer 1088*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1089*59599516SKenneth E. Jansen // timer_end = rdtsc(); 1090*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 1091*59599516SKenneth E. Jansen if (*pid==0) { 1092*59599516SKenneth E. Jansen // printf("Time: 'finalizephmpiio' is: %f s\n",time_span); 1093*59599516SKenneth E. Jansen printf("Last field %d '%s' finished! \n",nfields, fieldtag); 1094*59599516SKenneth E. Jansen printf("\n"); 1095*59599516SKenneth E. Jansen // printf("*****************************\n"); 1096*59599516SKenneth E. Jansen } 1097*59599516SKenneth E. Jansen } 1098*59599516SKenneth E. Jansen //MR CHANGE END 1099*59599516SKenneth E. Jansen 1100*59599516SKenneth E. Jansen /////////////////////////////////////////////////////////////////////////////////////////// 1101*59599516SKenneth E. Jansen 1102*59599516SKenneth E. Jansen free(fieldlabel); 1103*59599516SKenneth E. Jansen } 1104*59599516SKenneth E. Jansen 1105*59599516SKenneth E. Jansen //MR CHANGE 1106*59599516SKenneth E. Jansen void 1107*59599516SKenneth E. Jansen Write_PhAvg( int* pid, 1108*59599516SKenneth E. Jansen char* filemode, 1109*59599516SKenneth E. Jansen char* fieldtag, 1110*59599516SKenneth E. Jansen int* tagsize, 1111*59599516SKenneth E. Jansen int* iphase, 1112*59599516SKenneth E. Jansen void* array, 1113*59599516SKenneth E. Jansen char* arraytype, 1114*59599516SKenneth E. Jansen int* nshg, 1115*59599516SKenneth E. Jansen int* numvars, 1116*59599516SKenneth E. Jansen int* stepno) { 1117*59599516SKenneth E. Jansen 1118*59599516SKenneth E. Jansen char rfile[32]; 1119*59599516SKenneth E. Jansen // assuming restart_phase_avg_<sn>.<iphase>.<pid+1> 1120*59599516SKenneth E. Jansen sprintf(rfile,"restart_phase_avg_%d.%d.%d",*stepno,*iphase,*pid+1); 1121*59599516SKenneth E. Jansen 1122*59599516SKenneth E. Jansen char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char)); 1123*59599516SKenneth E. Jansen strncpy(fieldlabel, fieldtag, *tagsize); 1124*59599516SKenneth E. Jansen fieldlabel[*tagsize] = '\0'; 1125*59599516SKenneth E. Jansen 1126*59599516SKenneth E. Jansen int irstou; 1127*59599516SKenneth E. Jansen int isize, nitems; 1128*59599516SKenneth E. Jansen int iarray[10]; 1129*59599516SKenneth E. Jansen 1130*59599516SKenneth E. Jansen char fmode[10]; 1131*59599516SKenneth E. Jansen if(!strncmp(filemode,"w",1)) 1132*59599516SKenneth E. Jansen strcpy(fmode,"write"); 1133*59599516SKenneth E. Jansen else // default is append 1134*59599516SKenneth E. Jansen strcpy(fmode,"append"); 1135*59599516SKenneth E. Jansen 1136*59599516SKenneth E. Jansen char datatype[10]; 1137*59599516SKenneth E. Jansen if(!strncmp(arraytype,"i",1)) 1138*59599516SKenneth E. Jansen strcpy(datatype,"int"); 1139*59599516SKenneth E. Jansen else // default is double 1140*59599516SKenneth E. Jansen strcpy(datatype,"double"); 1141*59599516SKenneth E. Jansen 1142*59599516SKenneth E. Jansen openfile(rfile, fmode, &irstou); 1143*59599516SKenneth E. Jansen 1144*59599516SKenneth E. Jansen if(!strcmp(fmode,"write")) { 1145*59599516SKenneth E. Jansen // may be create a routine for 'top' portion under write mode 1146*59599516SKenneth E. Jansen int magic_number = 362436; 1147*59599516SKenneth E. Jansen int* mptr = &magic_number; 1148*59599516SKenneth E. Jansen time_t timenow = time ( &timenow); 1149*59599516SKenneth E. Jansen double version=0.0; 1150*59599516SKenneth E. Jansen 1151*59599516SKenneth E. Jansen /* writing the top ascii header for the restart file */ 1152*59599516SKenneth E. Jansen 1153*59599516SKenneth E. Jansen writestring( &irstou,"# PHASTA Input File Version 2.0\n"); 1154*59599516SKenneth E. Jansen writestring( &irstou, 1155*59599516SKenneth E. Jansen "# format \"keyphrase : sizeofnextblock usual headers\"\n"); 1156*59599516SKenneth E. Jansen 1157*59599516SKenneth E. Jansen char fname[255]; 1158*59599516SKenneth E. Jansen bzero( (void*)fname, 255 ); 1159*59599516SKenneth E. Jansen sprintf(fname,"# Output generated by phasta version (NOT YET CURRENT): %lf \n", version); 1160*59599516SKenneth E. Jansen writestring( &irstou, fname ); 1161*59599516SKenneth E. Jansen 1162*59599516SKenneth E. Jansen bzero( (void*)fname, 255 ); 1163*59599516SKenneth E. Jansen gethostname(fname,255); 1164*59599516SKenneth E. Jansen writestring( &irstou,"# This result was produced on: "); 1165*59599516SKenneth E. Jansen writestring( &irstou, fname ); 1166*59599516SKenneth E. Jansen writestring( &irstou,"\n"); 1167*59599516SKenneth E. Jansen 1168*59599516SKenneth E. Jansen bzero( (void*)fname, 255 ); 1169*59599516SKenneth E. Jansen sprintf(fname,"# %s\n", ctime( &timenow )); 1170*59599516SKenneth E. Jansen writestring( &irstou, fname ); 1171*59599516SKenneth E. Jansen 1172*59599516SKenneth E. Jansen isize = 1; 1173*59599516SKenneth E. Jansen nitems = 1; 1174*59599516SKenneth E. Jansen iarray[ 0 ] = 1; 1175*59599516SKenneth E. Jansen writeheader( &irstou, "byteorder magic number ", 1176*59599516SKenneth E. Jansen (void*)iarray, &nitems, &isize, "integer", phasta_iotype ); 1177*59599516SKenneth E. Jansen nitems = 1; 1178*59599516SKenneth E. Jansen writedatablock( &irstou, "byteorder magic number ", 1179*59599516SKenneth E. Jansen (void*)mptr, &nitems, "integer", phasta_iotype ); 1180*59599516SKenneth E. Jansen } 1181*59599516SKenneth E. Jansen 1182*59599516SKenneth E. Jansen nitems = 3; // assuming field will write 3 items in iarray 1183*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 1184*59599516SKenneth E. Jansen iarray[ 1 ] = (*numvars); 1185*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 1186*59599516SKenneth E. Jansen 1187*59599516SKenneth E. Jansen isize = (*nshg)*(*numvars); 1188*59599516SKenneth E. Jansen writeheader( &irstou, fieldlabel, (void*)iarray, &nitems, &isize, datatype, phasta_iotype ); 1189*59599516SKenneth E. Jansen 1190*59599516SKenneth E. Jansen nitems = (*nshg)*(*numvars); 1191*59599516SKenneth E. Jansen writedatablock( &irstou, fieldlabel, array, &nitems, datatype, phasta_iotype ); 1192*59599516SKenneth E. Jansen 1193*59599516SKenneth E. Jansen closefile( &irstou, fmode); 1194*59599516SKenneth E. Jansen 1195*59599516SKenneth E. Jansen free(fieldlabel); 1196*59599516SKenneth E. Jansen } 1197*59599516SKenneth E. Jansen 1198*59599516SKenneth E. Jansen //MR CHANGE 1199*59599516SKenneth E. Jansen void 1200*59599516SKenneth E. Jansen Write_PhAvg2( int* pid, 1201*59599516SKenneth E. Jansen char* filemode, 1202*59599516SKenneth E. Jansen char* fieldtag, 1203*59599516SKenneth E. Jansen int* tagsize, 1204*59599516SKenneth E. Jansen int* iphase, 1205*59599516SKenneth E. Jansen int* nphasesincycle, 1206*59599516SKenneth E. Jansen void* array, 1207*59599516SKenneth E. Jansen char* arraytype, 1208*59599516SKenneth E. Jansen int* nshg, 1209*59599516SKenneth E. Jansen int* numvars, 1210*59599516SKenneth E. Jansen int* stepno) { 1211*59599516SKenneth E. Jansen 1212*59599516SKenneth E. Jansen // char rfile[32]; 1213*59599516SKenneth E. Jansen // assuming restart.sn.(pid+1) 1214*59599516SKenneth E. Jansen // sprintf(rfile,"restart.%d.%d",*stepno,*pid+1); 1215*59599516SKenneth E. Jansen 1216*59599516SKenneth E. Jansen int addtagsize; // phase number is added to the name of the field 1217*59599516SKenneth E. Jansen if(*iphase<10) 1218*59599516SKenneth E. Jansen addtagsize=1; 1219*59599516SKenneth E. Jansen else if(*iphase<100) 1220*59599516SKenneth E. Jansen addtagsize=2; 1221*59599516SKenneth E. Jansen else if(*iphase<1000) 1222*59599516SKenneth E. Jansen addtagsize=3; 1223*59599516SKenneth E. Jansen 1224*59599516SKenneth E. Jansen int tagsize2; 1225*59599516SKenneth E. Jansen tagsize2=*tagsize+addtagsize; 1226*59599516SKenneth E. Jansen 1227*59599516SKenneth E. Jansen // char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char)); 1228*59599516SKenneth E. Jansen // strncpy(fieldlabel, fieldtag, *tagsize); 1229*59599516SKenneth E. Jansen // fieldlabel[*tagsize] = '\0'; 1230*59599516SKenneth E. Jansen 1231*59599516SKenneth E. Jansen char *fieldlabel = (char *)malloc((tagsize2+1)*sizeof(char)); 1232*59599516SKenneth E. Jansen strncpy(fieldlabel, fieldtag, *tagsize); 1233*59599516SKenneth E. Jansen fieldlabel[tagsize2] = '\0'; 1234*59599516SKenneth E. Jansen 1235*59599516SKenneth E. Jansen char straddtagsize[10]; 1236*59599516SKenneth E. Jansen sprintf(straddtagsize,"%d",*iphase); 1237*59599516SKenneth E. Jansen 1238*59599516SKenneth E. Jansen if(*iphase<10) { 1239*59599516SKenneth E. Jansen fieldlabel[tagsize2-1]=straddtagsize[0]; 1240*59599516SKenneth E. Jansen } 1241*59599516SKenneth E. Jansen else if(*iphase<100) { 1242*59599516SKenneth E. Jansen fieldlabel[tagsize2-2]=straddtagsize[0]; 1243*59599516SKenneth E. Jansen fieldlabel[tagsize2-1]=straddtagsize[1]; 1244*59599516SKenneth E. Jansen } 1245*59599516SKenneth E. Jansen else if(*iphase<1000) { 1246*59599516SKenneth E. Jansen fieldlabel[tagsize2-3]=straddtagsize[0]; 1247*59599516SKenneth E. Jansen fieldlabel[tagsize2-2]=straddtagsize[1]; 1248*59599516SKenneth E. Jansen fieldlabel[tagsize2-1]=straddtagsize[2]; 1249*59599516SKenneth E. Jansen } 1250*59599516SKenneth E. Jansen 1251*59599516SKenneth E. Jansen int irstou; 1252*59599516SKenneth E. Jansen int magic_number = 362436; 1253*59599516SKenneth E. Jansen int* mptr = &magic_number; 1254*59599516SKenneth E. Jansen double version=0.0; 1255*59599516SKenneth E. Jansen int isize, nitems; 1256*59599516SKenneth E. Jansen int iarray[10]; 1257*59599516SKenneth E. Jansen 1258*59599516SKenneth E. Jansen char fmode[10]; 1259*59599516SKenneth E. Jansen if(!strncmp(filemode,"w",1)) 1260*59599516SKenneth E. Jansen strcpy(fmode,"write"); 1261*59599516SKenneth E. Jansen else // default is append 1262*59599516SKenneth E. Jansen strcpy(fmode,"append"); 1263*59599516SKenneth E. Jansen 1264*59599516SKenneth E. Jansen char datatype[10]; 1265*59599516SKenneth E. Jansen if(!strncmp(arraytype,"i",1)) 1266*59599516SKenneth E. Jansen strcpy(datatype,"int"); 1267*59599516SKenneth E. Jansen else // default is double 1268*59599516SKenneth E. Jansen strcpy(datatype,"double"); 1269*59599516SKenneth E. Jansen 1270*59599516SKenneth E. Jansen // 1271*59599516SKenneth E. Jansen // // if(*iphase==1) //open the file but then keep it open for the remaining cycles 1272*59599516SKenneth E. Jansen // openfile_(rfile, fmode, &irstou); 1273*59599516SKenneth E. Jansen // 1274*59599516SKenneth E. Jansen // // printf("iphase: %d - pid: %d - irstou %d\n",*iphase,*pid,irstou); 1275*59599516SKenneth E. Jansen // 1276*59599516SKenneth E. Jansen // 1277*59599516SKenneth E. Jansen // nitems = 3; // assuming field will write 3 items in iarray 1278*59599516SKenneth E. Jansen // iarray[ 0 ] = (*nshg); 1279*59599516SKenneth E. Jansen // iarray[ 1 ] = (*numvars); 1280*59599516SKenneth E. Jansen // iarray[ 2 ] = (*stepno); 1281*59599516SKenneth E. Jansen // 1282*59599516SKenneth E. Jansen // isize = (*nshg)*(*numvars); 1283*59599516SKenneth E. Jansen // writeheader_( &irstou, fieldlabel, (void*)iarray, &nitems, &isize, datatype, phasta_iotype ); 1284*59599516SKenneth E. Jansen // 1285*59599516SKenneth E. Jansen // nitems = (*nshg)*(*numvars); 1286*59599516SKenneth E. Jansen // writedatablock_( &irstou, fieldlabel, array, &nitems, datatype, phasta_iotype ); 1287*59599516SKenneth E. Jansen // 1288*59599516SKenneth E. Jansen // // if(*iphase==*nphasesincycle) //close the file after nphasesincycle 1289*59599516SKenneth E. Jansen // closefile_( &irstou, fmode); 1290*59599516SKenneth E. Jansen // 1291*59599516SKenneth E. Jansen 1292*59599516SKenneth E. Jansen /////////////////////////////// Start of writing using new-lib //////////////////////////// 1293*59599516SKenneth E. Jansen 1294*59599516SKenneth E. Jansen int nfiles; 1295*59599516SKenneth E. Jansen int nfields; 1296*59599516SKenneth E. Jansen int numparts; 1297*59599516SKenneth E. Jansen int irank; 1298*59599516SKenneth E. Jansen int nprocs; 1299*59599516SKenneth E. Jansen // unsigned long long timer_start; 1300*59599516SKenneth E. Jansen // unsigned long long timer_end; 1301*59599516SKenneth E. Jansen // double time_span; 1302*59599516SKenneth E. Jansen 1303*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 1304*59599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart; 1305*59599516SKenneth E. Jansen numparts = workfc.numpe; 1306*59599516SKenneth E. Jansen irank = *pid; //workfc.myrank; 1307*59599516SKenneth E. Jansen nprocs = workfc.numpe; 1308*59599516SKenneth E. Jansen 1309*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 1310*59599516SKenneth E. Jansen int GPID; 1311*59599516SKenneth E. Jansen 1312*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 1313*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 1314*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 1315*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 1316*59599516SKenneth E. Jansen 1317*59599516SKenneth E. Jansen //int descriptor; 1318*59599516SKenneth E. Jansen char filename[255],path[255],fieldtag_s[255]; 1319*59599516SKenneth E. Jansen bzero((void*)filename,255); 1320*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 1321*59599516SKenneth E. Jansen 1322*59599516SKenneth E. Jansen // char * namer; 1323*59599516SKenneth E. Jansen // namer = strtok(fieldlabel," "); 1324*59599516SKenneth E. Jansen // strncpy(fieldlabel, fieldtag, *tagsize); 1325*59599516SKenneth E. Jansen 1326*59599516SKenneth E. Jansen field_flag++; 1327*59599516SKenneth E. Jansen if(*pid==0) { 1328*59599516SKenneth E. Jansen // printf("\n*****************************\n"); 1329*59599516SKenneth E. Jansen printf("\n"); 1330*59599516SKenneth E. Jansen printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel); 1331*59599516SKenneth E. Jansen } 1332*59599516SKenneth E. Jansen 1333*59599516SKenneth E. Jansen sprintf(filename,"restart-dat.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1)); 1334*59599516SKenneth E. Jansen 1335*59599516SKenneth E. Jansen int i; 1336*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) { 1337*59599516SKenneth E. Jansen GPID = startpart + i; 1338*59599516SKenneth E. Jansen 1339*59599516SKenneth E. Jansen // Write solution field ... 1340*59599516SKenneth E. Jansen sprintf(fieldtag_s,"%s@%d",fieldlabel,GPID); 1341*59599516SKenneth E. Jansen 1342*59599516SKenneth E. Jansen //printf("This is %d and fieldtag_s is %s \n",myrank,fieldtag_s); 1343*59599516SKenneth E. Jansen 1344*59599516SKenneth E. Jansen isize = (*nshg)*(*numvars); 1345*59599516SKenneth E. Jansen nitems = 3; 1346*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 1347*59599516SKenneth E. Jansen iarray[ 1 ] = (*numvars); 1348*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 1349*59599516SKenneth E. Jansen 1350*59599516SKenneth E. Jansen //MR CHANGE 1351*59599516SKenneth E. Jansen // Measure the time - Start the timer 1352*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1353*59599516SKenneth E. Jansen // timer_start = rdtsc(); 1354*59599516SKenneth E. Jansen //MR CHANGE END 1355*59599516SKenneth E. Jansen 1356*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 1357*59599516SKenneth E. Jansen 1358*59599516SKenneth E. Jansen //MR CHANGE 1359*59599516SKenneth E. Jansen // Measure the time - End of timer 1360*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1361*59599516SKenneth E. Jansen // timer_end = rdtsc(); 1362*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 1363*59599516SKenneth E. Jansen // if (*pid==0) { 1364*59599516SKenneth E. Jansen // printf("Time: header for '%s': %f s\n",fieldtag_s,time_span); 1365*59599516SKenneth E. Jansen // } 1366*59599516SKenneth E. Jansen //MR CHANGE END 1367*59599516SKenneth E. Jansen 1368*59599516SKenneth E. Jansen nitems = (*nshg)*(*numvars); 1369*59599516SKenneth E. Jansen 1370*59599516SKenneth E. Jansen //MR CHANGE 1371*59599516SKenneth E. Jansen // Measure the time - Start the timer 1372*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1373*59599516SKenneth E. Jansen // timer_start = rdtsc(); 1374*59599516SKenneth E. Jansen //MR CHANGE END 1375*59599516SKenneth E. Jansen 1376*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, array, &isize, "double", phasta_iotype ); 1377*59599516SKenneth E. Jansen 1378*59599516SKenneth E. Jansen //MR CHANGE 1379*59599516SKenneth E. Jansen // Measure the time - End of timer 1380*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1381*59599516SKenneth E. Jansen // timer_end = rdtsc(); 1382*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 1383*59599516SKenneth E. Jansen 1384*59599516SKenneth E. Jansen // int isizemin,isizemax,isizetot; 1385*59599516SKenneth E. Jansen // double sizemin,sizemax,sizeavg,sizetot,rate; 1386*59599516SKenneth E. Jansen 1387*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizemin,1,MPI_INT,MPI_MIN,MPI_COMM_WORLD); 1388*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizemax,1,MPI_INT,MPI_MAX,MPI_COMM_WORLD); 1389*59599516SKenneth E. Jansen // MPI_Allreduce(&isize,&isizetot,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD); 1390*59599516SKenneth E. Jansen 1391*59599516SKenneth E. Jansen // sizemin=(double)(8.0*isizemin/1024.0/1024.0); 1392*59599516SKenneth E. Jansen // sizemax=(double)(8.0*isizemax/1024.0/1024.0); 1393*59599516SKenneth E. Jansen // sizetot=(double)(8.0*isizetot/1024.0/1024.0); 1394*59599516SKenneth E. Jansen // sizeavg=sizetot/workfc.numpe; 1395*59599516SKenneth E. Jansen // rate=sizetot/time_span; 1396*59599516SKenneth E. Jansen 1397*59599516SKenneth E. Jansen // if (*pid==0) { 1398*59599516SKenneth E. Jansen // printf("Time: block for '%s': %f s\n",fieldtag_s,time_span); 1399*59599516SKenneth E. Jansen // printf("Time: block: Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB; Rate= %f MB/s; \n",sizemin,sizemax,sizeavg,sizetot,rate); 1400*59599516SKenneth E. Jansen // printf("*****************************\n"); 1401*59599516SKenneth E. Jansen // } 1402*59599516SKenneth E. Jansen //MR CHANGE END 1403*59599516SKenneth E. Jansen 1404*59599516SKenneth E. Jansen } 1405*59599516SKenneth E. Jansen 1406*59599516SKenneth E. Jansen // if (*pid==0) { 1407*59599516SKenneth E. Jansen // printf("Field '%s' written in: %f s\n",fieldtag,time_span); 1408*59599516SKenneth E. Jansen // printf("Write field '%s' finished! \n",fieldtag_s); 1409*59599516SKenneth E. Jansen // } 1410*59599516SKenneth E. Jansen 1411*59599516SKenneth E. Jansen // 1412*59599516SKenneth E. Jansen // if (field_flag==nfields){ 1413*59599516SKenneth E. Jansen // closefile_(&f_descriptor, "write"); 1414*59599516SKenneth E. Jansen // finalizephmpiio_(&f_descriptor); 1415*59599516SKenneth E. Jansen // if(*pid==0) { 1416*59599516SKenneth E. Jansen // printf("Last field %d '%s' finished! \n",nfields, fieldtag_s); 1417*59599516SKenneth E. Jansen // printf("\n*****************************\n"); 1418*59599516SKenneth E. Jansen // } 1419*59599516SKenneth E. Jansen // } 1420*59599516SKenneth E. Jansen 1421*59599516SKenneth E. Jansen if (field_flag==nfields){ 1422*59599516SKenneth E. Jansen 1423*59599516SKenneth E. Jansen //MR CHANGE 1424*59599516SKenneth E. Jansen // Measure the time - Start the timer 1425*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1426*59599516SKenneth E. Jansen // timer_start = rdtsc(); 1427*59599516SKenneth E. Jansen //MR CHANGE END 1428*59599516SKenneth E. Jansen 1429*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 1430*59599516SKenneth E. Jansen 1431*59599516SKenneth E. Jansen //MR CHANGE 1432*59599516SKenneth E. Jansen // Measure the time - End of timer 1433*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1434*59599516SKenneth E. Jansen // timer_end = rdtsc(); 1435*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 1436*59599516SKenneth E. Jansen // if (*pid==0) { 1437*59599516SKenneth E. Jansen // printf("\n*****************************\n"); 1438*59599516SKenneth E. Jansen // printf("Time: 'closefile' is: %f s\n",time_span); 1439*59599516SKenneth E. Jansen // } 1440*59599516SKenneth E. Jansen //MR CHANGE END 1441*59599516SKenneth E. Jansen 1442*59599516SKenneth E. Jansen //MR CHANGE 1443*59599516SKenneth E. Jansen // Measure the time - Start the timer 1444*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1445*59599516SKenneth E. Jansen // timer_start = rdtsc(); 1446*59599516SKenneth E. Jansen //MR CHANGE END 1447*59599516SKenneth E. Jansen 1448*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 1449*59599516SKenneth E. Jansen 1450*59599516SKenneth E. Jansen //MR CHANGE 1451*59599516SKenneth E. Jansen // Measure the time - End of timer 1452*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1453*59599516SKenneth E. Jansen // timer_end = rdtsc(); 1454*59599516SKenneth E. Jansen // time_span=(double)((timer_end-timer_start)/cpu_speed); 1455*59599516SKenneth E. Jansen if (*pid==0) { 1456*59599516SKenneth E. Jansen // printf("Time: 'finalizephmpiio' is: %f s\n",time_span); 1457*59599516SKenneth E. Jansen // printf("Last field %d '%s' finished! \n",nfields, fieldtag); 1458*59599516SKenneth E. Jansen printf("\n"); 1459*59599516SKenneth E. Jansen // printf("*****************************\n"); 1460*59599516SKenneth E. Jansen } 1461*59599516SKenneth E. Jansen } 1462*59599516SKenneth E. Jansen //MR CHANGE END 1463*59599516SKenneth E. Jansen 1464*59599516SKenneth E. Jansen /////////////////////////////////////////////////////////////////////////////////////////// 1465*59599516SKenneth E. Jansen 1466*59599516SKenneth E. Jansen free(fieldlabel); 1467*59599516SKenneth E. Jansen } 1468*59599516SKenneth E. Jansen 1469*59599516SKenneth E. Jansen 1470*59599516SKenneth E. Jansen void 1471*59599516SKenneth E. Jansen Write_d2wall( int* pid, 1472*59599516SKenneth E. Jansen int* numnp, 1473*59599516SKenneth E. Jansen double* array1 ) { 1474*59599516SKenneth E. Jansen 1475*59599516SKenneth E. Jansen // time_t timenow = time ( &timenow); 1476*59599516SKenneth E. Jansen int isize, nitems; 1477*59599516SKenneth E. Jansen int iarray[10]; 1478*59599516SKenneth E. Jansen 1479*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 1480*59599516SKenneth E. Jansen 1481*59599516SKenneth E. Jansen /////////////////////////////// Start of writing using new-lib //////////////////////////// 1482*59599516SKenneth E. Jansen 1483*59599516SKenneth E. Jansen int nfiles; 1484*59599516SKenneth E. Jansen int nfields; 1485*59599516SKenneth E. Jansen int numparts; 1486*59599516SKenneth E. Jansen int irank; 1487*59599516SKenneth E. Jansen int nprocs; 1488*59599516SKenneth E. Jansen 1489*59599516SKenneth E. Jansen // First, count the number of fields to write and store the result in 1490*59599516SKenneth E. Jansen //countfieldstowriterestart(); 1491*59599516SKenneth E. Jansen 1492*59599516SKenneth E. Jansen // Retrieve and compute the parameters required for SyncIO 1493*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 1494*59599516SKenneth E. Jansen nfields = 1; //outpar.nsynciofieldswriterestart; // Only the distance to the walls in d2wall 1495*59599516SKenneth E. Jansen numparts = workfc.numpe; 1496*59599516SKenneth E. Jansen irank = *pid; //workfc.myrank; 1497*59599516SKenneth E. Jansen nprocs = workfc.numpe; 1498*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 1499*59599516SKenneth E. Jansen int GPID; 1500*59599516SKenneth E. Jansen 1501*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 1502*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 1503*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 1504*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 1505*59599516SKenneth E. Jansen 1506*59599516SKenneth E. Jansen int descriptor; 1507*59599516SKenneth E. Jansen char filename[255],path[255],fieldtag_s[255]; 1508*59599516SKenneth E. Jansen bzero((void*)filename,255); 1509*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 1510*59599516SKenneth E. Jansen 1511*59599516SKenneth E. Jansen sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1)); 1512*59599516SKenneth E. Jansen 1513*59599516SKenneth E. Jansen if (irank==0) { 1514*59599516SKenneth E. Jansen printf("Filename is %s \n",filename); 1515*59599516SKenneth E. Jansen } 1516*59599516SKenneth E. Jansen 1517*59599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write"); 1518*59599516SKenneth E. Jansen 1519*59599516SKenneth E. Jansen openfile(filename, "write", &f_descriptor); 1520*59599516SKenneth E. Jansen 1521*59599516SKenneth E. Jansen field_flag=0; 1522*59599516SKenneth E. Jansen 1523*59599516SKenneth E. Jansen int i; 1524*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 1525*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 1526*59599516SKenneth E. Jansen // e.g : (in this example) 1527*59599516SKenneth E. Jansen // proc 0 : 1--4 1528*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 1529*59599516SKenneth E. Jansen GPID = startpart + i; 1530*59599516SKenneth E. Jansen 1531*59599516SKenneth E. Jansen // Write solution field ... 1532*59599516SKenneth E. Jansen sprintf(fieldtag_s,"d2wall@%d",GPID); 1533*59599516SKenneth E. Jansen 1534*59599516SKenneth E. Jansen isize = (*numnp); 1535*59599516SKenneth E. Jansen nitems = 2; 1536*59599516SKenneth E. Jansen iarray[ 0 ] = (*numnp); 1537*59599516SKenneth E. Jansen iarray[ 1 ] = 1; //numVars = 1 1538*59599516SKenneth E. Jansen 1539*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 1540*59599516SKenneth E. Jansen 1541*59599516SKenneth E. Jansen //nitems = (*nshg)*(*numVars); 1542*59599516SKenneth E. Jansen //nitems = (*numnp); 1543*59599516SKenneth E. Jansen 1544*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 1545*59599516SKenneth E. Jansen 1546*59599516SKenneth E. Jansen 1547*59599516SKenneth E. Jansen } 1548*59599516SKenneth E. Jansen field_flag++; 1549*59599516SKenneth E. Jansen 1550*59599516SKenneth E. Jansen if (field_flag==nfields){ 1551*59599516SKenneth E. Jansen 1552*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 1553*59599516SKenneth E. Jansen 1554*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 1555*59599516SKenneth E. Jansen 1556*59599516SKenneth E. Jansen if (irank==0) { 1557*59599516SKenneth E. Jansen printf("\n"); 1558*59599516SKenneth E. Jansen } 1559*59599516SKenneth E. Jansen } 1560*59599516SKenneth E. Jansen } 1561*59599516SKenneth E. Jansen 1562