xref: /phasta/phSolver/common/new_interface.c (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
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