xref: /phasta/phSolver/common/d2wall.c (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen #include <stdlib.h>
2*59599516SKenneth E. Jansen #include <FCMangle.h>
3*59599516SKenneth E. Jansen #include <new_interface.h>
4*59599516SKenneth E. Jansen #include <stdio.h>
5*59599516SKenneth E. Jansen #include "common_c.h"
6*59599516SKenneth E. Jansen #include "phastaIO.h"
7*59599516SKenneth E. Jansen #include "setsyncioparam.h"
8*59599516SKenneth E. Jansen 
9*59599516SKenneth E. Jansen /*
10*59599516SKenneth E. Jansen void
11*59599516SKenneth E. Jansen read_d2wall(  int* pid,
12*59599516SKenneth E. Jansen                int* numnp,
13*59599516SKenneth E. Jansen                double* array1 ) {
14*59599516SKenneth E. Jansen 
15*59599516SKenneth E. Jansen //    time_t timenow = time ( &timenow);
16*59599516SKenneth E. Jansen     int isize, nitems;
17*59599516SKenneth E. Jansen     int iarray[10];
18*59599516SKenneth E. Jansen 
19*59599516SKenneth E. Jansen     //MPI_Barrier(MPI_COMM_WORLD);
20*59599516SKenneth E. Jansen 
21*59599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
22*59599516SKenneth E. Jansen 
23*59599516SKenneth E. Jansen     int nfiles;
24*59599516SKenneth E. Jansen     int nfields;
25*59599516SKenneth E. Jansen     int numparts;
26*59599516SKenneth E. Jansen     int irank;
27*59599516SKenneth E. Jansen     int nprocs;
28*59599516SKenneth E. Jansen 
29*59599516SKenneth E. Jansen     //  First, count the number of fields to write and store the result in
30*59599516SKenneth E. Jansen     //countfieldstowriterestart();
31*59599516SKenneth E. Jansen 
32*59599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
33*59599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
34*59599516SKenneth E. Jansen     //    nfields = 1; //outpar.nsynciofieldswriterestart;  // Only the distance to the walls in d2wall
35*59599516SKenneth E. Jansen     numparts = workfc.numpe;
36*59599516SKenneth E. Jansen     irank = *pid; // workfc.myrank;
37*59599516SKenneth E. Jansen     nprocs = workfc.numpe;
38*59599516SKenneth E. Jansen     int nppf = numparts/nfiles;
39*59599516SKenneth E. Jansen     int GPID;
40*59599516SKenneth E. Jansen 
41*59599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
42*59599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
43*59599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
44*59599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
45*59599516SKenneth E. Jansen 
46*59599516SKenneth E. Jansen     int descriptor;
47*59599516SKenneth E. Jansen     char filename[255],path[255],fieldtag_s[255];
48*59599516SKenneth E. Jansen     bzero((void*)filename,255);
49*59599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
50*59599516SKenneth E. Jansen 
51*59599516SKenneth E. Jansen     sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1));
52*59599516SKenneth E. Jansen 
53*59599516SKenneth E. Jansen     queryphmpiio(filename, &nfields, &nppf);
54*59599516SKenneth E. Jansen 
55*59599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read");
56*59599516SKenneth E. Jansen 
57*59599516SKenneth E. Jansen     if (irank==0) {
58*59599516SKenneth E. Jansen       printf("Filename is %s \n",filename);
59*59599516SKenneth E. Jansen     }
60*59599516SKenneth E. Jansen     openfile(filename, "read", &f_descriptor);
61*59599516SKenneth E. Jansen 
62*59599516SKenneth E. Jansen     field_flag=0;
63*59599516SKenneth E. Jansen 
64*59599516SKenneth E. Jansen     int i;
65*59599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
66*59599516SKenneth E. Jansen     // GPID : global part id, corresponds to rank ...
67*59599516SKenneth E. Jansen       // e.g : (in this example)
68*59599516SKenneth E. Jansen       // proc 0 : 1--4
69*59599516SKenneth E. Jansen       // proc 1 : 5--8 ...
70*59599516SKenneth E. Jansen       GPID = startpart + i;
71*59599516SKenneth E. Jansen 
72*59599516SKenneth E. Jansen       // Write solution field ...
73*59599516SKenneth E. Jansen       sprintf(fieldtag_s,"d2wall@%d",GPID);
74*59599516SKenneth E. Jansen 
75*59599516SKenneth E. Jansen       nitems = 2;
76*59599516SKenneth E. Jansen       readheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, "double", phasta_iotype);
77*59599516SKenneth E. Jansen       //iarray[ 0 ] = (*numnp); What we should get from readheader
78*59599516SKenneth E. Jansen       //iarray[ 1 ] = 1;
79*59599516SKenneth E. Jansen 
80*59599516SKenneth E. Jansen       if (iarray[0] != (*numnp)) {
81*59599516SKenneth E. Jansen         printf("ERROR - numnp in d2wall.dat not coherent %d %d/n", iarray[0], *numnp);
82*59599516SKenneth E. Jansen       }
83*59599516SKenneth E. Jansen 
84*59599516SKenneth E. Jansen       isize = (*numnp);
85*59599516SKenneth E. Jansen       readdatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
86*59599516SKenneth E. Jansen 
87*59599516SKenneth E. Jansen     }
88*59599516SKenneth E. Jansen     field_flag++;
89*59599516SKenneth E. Jansen 
90*59599516SKenneth E. Jansen     if (field_flag==1){
91*59599516SKenneth E. Jansen 
92*59599516SKenneth E. Jansen       closefile(&f_descriptor, "read");
93*59599516SKenneth E. Jansen 
94*59599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
95*59599516SKenneth E. Jansen 
96*59599516SKenneth E. Jansen       if (irank==0) {
97*59599516SKenneth E. Jansen         printf("\n");
98*59599516SKenneth E. Jansen       }
99*59599516SKenneth E. Jansen     }
100*59599516SKenneth E. Jansen }
101*59599516SKenneth E. Jansen */
102*59599516SKenneth E. Jansen 
103*59599516SKenneth E. Jansen 
104*59599516SKenneth E. Jansen void
105*59599516SKenneth E. Jansen read_d2wall(  int* pid,
106*59599516SKenneth E. Jansen               int* numnp,
107*59599516SKenneth E. Jansen               double* array1,
108*59599516SKenneth E. Jansen               int* foundd2wall ) {
109*59599516SKenneth E. Jansen 
110*59599516SKenneth E. Jansen //    time_t timenow = time ( &timenow);
111*59599516SKenneth E. Jansen 
112*59599516SKenneth E. Jansen     int isize, nitems;
113*59599516SKenneth E. Jansen     int iarray[10];
114*59599516SKenneth E. Jansen     int j;
115*59599516SKenneth E. Jansen     for ( j = 0; j < 10; j++) {
116*59599516SKenneth E. Jansen        //Initialize iarray to 0 so that we can assess the result of readheader
117*59599516SKenneth E. Jansen        iarray[j] = 0;
118*59599516SKenneth E. Jansen     }
119*59599516SKenneth E. Jansen 
120*59599516SKenneth E. Jansen     int nfiles;
121*59599516SKenneth E. Jansen     int nfields;
122*59599516SKenneth E. Jansen     int numparts;
123*59599516SKenneth E. Jansen     int irank;
124*59599516SKenneth E. Jansen     int nprocs;
125*59599516SKenneth E. Jansen 
126*59599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
127*59599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
128*59599516SKenneth E. Jansen     numparts = workfc.numpe;
129*59599516SKenneth E. Jansen     irank = *pid; // workfc.myrank;
130*59599516SKenneth E. Jansen     nprocs = workfc.numpe;
131*59599516SKenneth E. Jansen     int nppf = numparts/nfiles;
132*59599516SKenneth E. Jansen     int GPID;
133*59599516SKenneth E. Jansen 
134*59599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
135*59599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
136*59599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
137*59599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
138*59599516SKenneth E. Jansen 
139*59599516SKenneth E. Jansen     int descriptor;
140*59599516SKenneth E. Jansen     char filename[255],path[255],fieldtag_s[255];
141*59599516SKenneth E. Jansen     bzero((void*)filename,255);
142*59599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
143*59599516SKenneth E. Jansen     *foundd2wall = 0;
144*59599516SKenneth E. Jansen     ////////////////////////////////////////////////////
145*59599516SKenneth E. Jansen     // First we try to read dwal from the restart files.
146*59599516SKenneth E. Jansen     ////////////////////////////////////////////////////
147*59599516SKenneth E. Jansen 
148*59599516SKenneth E. Jansen     sprintf(filename,"restart-dat.%d.%d", timdat.lstep, ((int)(irank/(nprocs/nfiles))+1));
149*59599516SKenneth E. Jansen     queryphmpiio(filename, &nfields, &nppf);
150*59599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read");
151*59599516SKenneth E. Jansen 
152*59599516SKenneth E. Jansen     if (irank==0) {
153*59599516SKenneth E. Jansen       printf("Filename is %s \n",filename);
154*59599516SKenneth E. Jansen     }
155*59599516SKenneth E. Jansen     openfile(filename, "read", &f_descriptor);
156*59599516SKenneth E. Jansen 
157*59599516SKenneth E. Jansen     int i;
158*59599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
159*59599516SKenneth E. Jansen     // GPID : global part id, corresponds to rank ...
160*59599516SKenneth E. Jansen       // e.g : (in this example)
161*59599516SKenneth E. Jansen       // proc 0 : 1--4
162*59599516SKenneth E. Jansen       // proc 1 : 5--8 ...
163*59599516SKenneth E. Jansen       GPID = startpart + i;
164*59599516SKenneth E. Jansen 
165*59599516SKenneth E. Jansen       // Write solution field ...
166*59599516SKenneth E. Jansen       sprintf(fieldtag_s,"dwal@%d",GPID);
167*59599516SKenneth E. Jansen 
168*59599516SKenneth E. Jansen       nitems = 2;
169*59599516SKenneth E. Jansen       readheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, "double", phasta_iotype);
170*59599516SKenneth E. Jansen       //iarray[ 0 ] = (*numnp); What we should get from readheader
171*59599516SKenneth E. Jansen       //iarray[ 1 ] = 1;
172*59599516SKenneth E. Jansen 
173*59599516SKenneth E. Jansen       if (iarray[0] == (*numnp)) {
174*59599516SKenneth E. Jansen         if (irank==0) {
175*59599516SKenneth E. Jansen           printf("d2wall field found in %s\n",filename);
176*59599516SKenneth E. Jansen         }
177*59599516SKenneth E. Jansen         *foundd2wall = 1;
178*59599516SKenneth E. Jansen         isize = (*numnp);
179*59599516SKenneth E. Jansen         readdatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
180*59599516SKenneth E. Jansen       }
181*59599516SKenneth E. Jansen       else { //d2wall fields was not found in the restart file
182*59599516SKenneth E. Jansen         *foundd2wall = 0;
183*59599516SKenneth E. Jansen         if (irank==0) {
184*59599516SKenneth E. Jansen           printf("d2wall field not found in %s - trying d2wall files now\n",filename);
185*59599516SKenneth E. Jansen         }
186*59599516SKenneth E. Jansen       }
187*59599516SKenneth E. Jansen     }
188*59599516SKenneth E. Jansen     closefile(&f_descriptor, "read");
189*59599516SKenneth E. Jansen     finalizephmpiio(&f_descriptor);
190*59599516SKenneth E. Jansen 
191*59599516SKenneth E. Jansen     ////////////////////////////////////////////////////
192*59599516SKenneth E. Jansen     // We try to read dwal from the d2wall files if not found in the restart files
193*59599516SKenneth E. Jansen     ////////////////////////////////////////////////////
194*59599516SKenneth E. Jansen 
195*59599516SKenneth E. Jansen     int numd2wallfiles;
196*59599516SKenneth E. Jansen     if (*foundd2wall == 0) {
197*59599516SKenneth E. Jansen 
198*59599516SKenneth E. Jansen       detectd2wallfiles(&numd2wallfiles);
199*59599516SKenneth E. Jansen 
200*59599516SKenneth E. Jansen       if (numd2wallfiles == outpar.nsynciofiles ) {
201*59599516SKenneth E. Jansen         // Read the d2wall field from the d2wall files
202*59599516SKenneth E. Jansen         bzero((void*)filename,255);
203*59599516SKenneth E. Jansen         bzero((void*)fieldtag_s,255);
204*59599516SKenneth E. Jansen 
205*59599516SKenneth E. Jansen         sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1));
206*59599516SKenneth E. Jansen         queryphmpiio(filename, &nfields, &nppf);
207*59599516SKenneth E. Jansen         initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read");
208*59599516SKenneth E. Jansen 
209*59599516SKenneth E. Jansen         if (irank==0) {
210*59599516SKenneth E. Jansen           printf("Filename is %s \n",filename);
211*59599516SKenneth E. Jansen         }
212*59599516SKenneth E. Jansen         openfile(filename, "read", &f_descriptor);
213*59599516SKenneth E. Jansen 
214*59599516SKenneth E. Jansen         int i;
215*59599516SKenneth E. Jansen         for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
216*59599516SKenneth E. Jansen           // GPID : global part id, corresponds to rank ...
217*59599516SKenneth E. Jansen           // e.g : (in this example)
218*59599516SKenneth E. Jansen           // proc 0 : 1--4
219*59599516SKenneth E. Jansen           // proc 1 : 5--8 ...
220*59599516SKenneth E. Jansen           GPID = startpart + i;
221*59599516SKenneth E. Jansen 
222*59599516SKenneth E. Jansen           // Write solution field ...
223*59599516SKenneth E. Jansen           sprintf(fieldtag_s,"d2wall@%d",GPID);
224*59599516SKenneth E. Jansen 
225*59599516SKenneth E. Jansen           nitems = 2;
226*59599516SKenneth E. Jansen           readheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, "double", phasta_iotype);
227*59599516SKenneth E. Jansen           //iarray[ 0 ] = (*numnp); What we should get from readheader
228*59599516SKenneth E. Jansen           //iarray[ 1 ] = 1;
229*59599516SKenneth E. Jansen 
230*59599516SKenneth E. Jansen           if (iarray[0] == (*numnp)) {
231*59599516SKenneth E. Jansen             if (irank==0) {
232*59599516SKenneth E. Jansen               printf("d2wall field found in %s\n",filename);
233*59599516SKenneth E. Jansen             }
234*59599516SKenneth E. Jansen             *foundd2wall = 1;
235*59599516SKenneth E. Jansen             isize = (*numnp);
236*59599516SKenneth E. Jansen             readdatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
237*59599516SKenneth E. Jansen           }
238*59599516SKenneth E. Jansen           else {
239*59599516SKenneth E. Jansen             *foundd2wall = 0;
240*59599516SKenneth E. Jansen               printf("WARNING - numnp not coherent in d2wall files: %d - %d\n",iarray[0],*numnp);
241*59599516SKenneth E. Jansen               printf("WARNING - Recomputing the d2wall field for safety\n");
242*59599516SKenneth E. Jansen             }
243*59599516SKenneth E. Jansen           }
244*59599516SKenneth E. Jansen 
245*59599516SKenneth E. Jansen           closefile(&f_descriptor, "read");
246*59599516SKenneth E. Jansen           finalizephmpiio(&f_descriptor);
247*59599516SKenneth E. Jansen       }
248*59599516SKenneth E. Jansen       else if (numd2wallfiles != 0) {
249*59599516SKenneth E. Jansen         // The number of d2wall file should be either 0 or outpar.nsynciofiles
250*59599516SKenneth E. Jansen         if (irank==0) {
251*59599516SKenneth E. Jansen           printf("WARNING - Number of d2wall files not coherent: %d - %d\n",numd2wallfiles,outpar.nsynciofiles);
252*59599516SKenneth E. Jansen           printf("WARNING - Recomputing the d2wall field for safety\n");
253*59599516SKenneth E. Jansen           *foundd2wall = 0;
254*59599516SKenneth E. Jansen         }
255*59599516SKenneth E. Jansen       }
256*59599516SKenneth E. Jansen     } // end of tentative reading from d2wall files
257*59599516SKenneth E. Jansen 
258*59599516SKenneth E. Jansen     if (irank==0) {
259*59599516SKenneth E. Jansen       printf("\n");
260*59599516SKenneth E. Jansen     }
261*59599516SKenneth E. Jansen }
262