xref: /phasta/phSolver/common/d2wall.c (revision 7d6b7e55a7cb2d69a356054541ddbb08d0657e30)
159599516SKenneth E. Jansen #include <stdlib.h>
259599516SKenneth E. Jansen #include <FCMangle.h>
359599516SKenneth E. Jansen #include <new_interface.h>
459599516SKenneth E. Jansen #include <stdio.h>
5*7d6b7e55SCameron Smith #include <string.h> //memset
659599516SKenneth E. Jansen #include "common_c.h"
759599516SKenneth E. Jansen #include "phastaIO.h"
859599516SKenneth E. Jansen #include "setsyncioparam.h"
959599516SKenneth E. Jansen 
1059599516SKenneth E. Jansen /*
1159599516SKenneth E. Jansen void
1259599516SKenneth E. Jansen read_d2wall(  int* pid,
1359599516SKenneth E. Jansen                int* numnp,
1459599516SKenneth E. Jansen                double* array1 ) {
1559599516SKenneth E. Jansen 
1659599516SKenneth E. Jansen //    time_t timenow = time ( &timenow);
1759599516SKenneth E. Jansen     int isize, nitems;
1859599516SKenneth E. Jansen     int iarray[10];
1959599516SKenneth E. Jansen 
2059599516SKenneth E. Jansen     //MPI_Barrier(MPI_COMM_WORLD);
2159599516SKenneth E. Jansen 
2259599516SKenneth E. Jansen     /////////////////////////////// Start of writing using new-lib ////////////////////////////
2359599516SKenneth E. Jansen 
2459599516SKenneth E. Jansen     int nfiles;
2559599516SKenneth E. Jansen     int nfields;
2659599516SKenneth E. Jansen     int numparts;
2759599516SKenneth E. Jansen     int irank;
2859599516SKenneth E. Jansen     int nprocs;
2959599516SKenneth E. Jansen 
3059599516SKenneth E. Jansen     //  First, count the number of fields to write and store the result in
3159599516SKenneth E. Jansen     //countfieldstowriterestart();
3259599516SKenneth E. Jansen 
3359599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
3459599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
3559599516SKenneth E. Jansen     //    nfields = 1; //outpar.nsynciofieldswriterestart;  // Only the distance to the walls in d2wall
3659599516SKenneth E. Jansen     numparts = workfc.numpe;
3759599516SKenneth E. Jansen     irank = *pid; // workfc.myrank;
3859599516SKenneth E. Jansen     nprocs = workfc.numpe;
3959599516SKenneth E. Jansen     int nppf = numparts/nfiles;
4059599516SKenneth E. Jansen     int GPID;
4159599516SKenneth E. Jansen 
4259599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
4359599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
4459599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
4559599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
4659599516SKenneth E. Jansen 
4759599516SKenneth E. Jansen     int descriptor;
4859599516SKenneth E. Jansen     char filename[255],path[255],fieldtag_s[255];
4959599516SKenneth E. Jansen     bzero((void*)filename,255);
5059599516SKenneth E. Jansen     bzero((void*)fieldtag_s,255);
5159599516SKenneth E. Jansen 
5259599516SKenneth E. Jansen     sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1));
5359599516SKenneth E. Jansen 
5459599516SKenneth E. Jansen     queryphmpiio(filename, &nfields, &nppf);
5559599516SKenneth E. Jansen 
5659599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read");
5759599516SKenneth E. Jansen 
5859599516SKenneth E. Jansen     if (irank==0) {
5959599516SKenneth E. Jansen       printf("Filename is %s \n",filename);
6059599516SKenneth E. Jansen     }
6159599516SKenneth E. Jansen     openfile(filename, "read", &f_descriptor);
6259599516SKenneth E. Jansen 
6359599516SKenneth E. Jansen     field_flag=0;
6459599516SKenneth E. Jansen 
6559599516SKenneth E. Jansen     int i;
6659599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
6759599516SKenneth E. Jansen     // GPID : global part id, corresponds to rank ...
6859599516SKenneth E. Jansen       // e.g : (in this example)
6959599516SKenneth E. Jansen       // proc 0 : 1--4
7059599516SKenneth E. Jansen       // proc 1 : 5--8 ...
7159599516SKenneth E. Jansen       GPID = startpart + i;
7259599516SKenneth E. Jansen 
7359599516SKenneth E. Jansen       // Write solution field ...
7459599516SKenneth E. Jansen       sprintf(fieldtag_s,"d2wall@%d",GPID);
7559599516SKenneth E. Jansen 
7659599516SKenneth E. Jansen       nitems = 2;
7759599516SKenneth E. Jansen       readheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, "double", phasta_iotype);
7859599516SKenneth E. Jansen       //iarray[ 0 ] = (*numnp); What we should get from readheader
7959599516SKenneth E. Jansen       //iarray[ 1 ] = 1;
8059599516SKenneth E. Jansen 
8159599516SKenneth E. Jansen       if (iarray[0] != (*numnp)) {
8259599516SKenneth E. Jansen         printf("ERROR - numnp in d2wall.dat not coherent %d %d/n", iarray[0], *numnp);
8359599516SKenneth E. Jansen       }
8459599516SKenneth E. Jansen 
8559599516SKenneth E. Jansen       isize = (*numnp);
8659599516SKenneth E. Jansen       readdatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
8759599516SKenneth E. Jansen 
8859599516SKenneth E. Jansen     }
8959599516SKenneth E. Jansen     field_flag++;
9059599516SKenneth E. Jansen 
9159599516SKenneth E. Jansen     if (field_flag==1){
9259599516SKenneth E. Jansen 
9359599516SKenneth E. Jansen       closefile(&f_descriptor, "read");
9459599516SKenneth E. Jansen 
9559599516SKenneth E. Jansen       finalizephmpiio(&f_descriptor);
9659599516SKenneth E. Jansen 
9759599516SKenneth E. Jansen       if (irank==0) {
9859599516SKenneth E. Jansen         printf("\n");
9959599516SKenneth E. Jansen       }
10059599516SKenneth E. Jansen     }
10159599516SKenneth E. Jansen }
10259599516SKenneth E. Jansen */
10359599516SKenneth E. Jansen 
10459599516SKenneth E. Jansen 
10559599516SKenneth E. Jansen void
10659599516SKenneth E. Jansen read_d2wall(  int* pid,
10759599516SKenneth E. Jansen               int* numnp,
10859599516SKenneth E. Jansen               double* array1,
10959599516SKenneth E. Jansen               int* foundd2wall ) {
11059599516SKenneth E. Jansen 
11159599516SKenneth E. Jansen //    time_t timenow = time ( &timenow);
11259599516SKenneth E. Jansen 
11359599516SKenneth E. Jansen     int isize, nitems;
11459599516SKenneth E. Jansen     int iarray[10];
11559599516SKenneth E. Jansen     int j;
11659599516SKenneth E. Jansen     for ( j = 0; j < 10; j++) {
11759599516SKenneth E. Jansen        //Initialize iarray to 0 so that we can assess the result of readheader
11859599516SKenneth E. Jansen        iarray[j] = 0;
11959599516SKenneth E. Jansen     }
12059599516SKenneth E. Jansen 
12159599516SKenneth E. Jansen     int nfiles;
12259599516SKenneth E. Jansen     int nfields;
12359599516SKenneth E. Jansen     int numparts;
12459599516SKenneth E. Jansen     int irank;
12559599516SKenneth E. Jansen     int nprocs;
12659599516SKenneth E. Jansen 
12759599516SKenneth E. Jansen     //  Retrieve and compute the parameters required for SyncIO
12859599516SKenneth E. Jansen     nfiles = outpar.nsynciofiles;
12959599516SKenneth E. Jansen     numparts = workfc.numpe;
13059599516SKenneth E. Jansen     irank = *pid; // workfc.myrank;
13159599516SKenneth E. Jansen     nprocs = workfc.numpe;
13259599516SKenneth E. Jansen     int nppf = numparts/nfiles;
13359599516SKenneth E. Jansen     int GPID;
13459599516SKenneth E. Jansen 
13559599516SKenneth E. Jansen     // Calculate number of parts each proc deal with and where it start and end ...
13659599516SKenneth E. Jansen     int nppp = numparts/nprocs;// nppp : Number of parts per proc ...
13759599516SKenneth E. Jansen     int startpart = irank * nppp +1;// Part id from which I (myrank) start ...
13859599516SKenneth E. Jansen     int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ...
13959599516SKenneth E. Jansen 
14059599516SKenneth E. Jansen     int descriptor;
14159599516SKenneth E. Jansen     char filename[255],path[255],fieldtag_s[255];
142*7d6b7e55SCameron Smith     memset((void*)filename,0,255);
143*7d6b7e55SCameron Smith     memset((void*)fieldtag_s,0,255);
14459599516SKenneth E. Jansen     *foundd2wall = 0;
14559599516SKenneth E. Jansen     ////////////////////////////////////////////////////
14659599516SKenneth E. Jansen     // First we try to read dwal from the restart files.
14759599516SKenneth E. Jansen     ////////////////////////////////////////////////////
14859599516SKenneth E. Jansen 
14959599516SKenneth E. Jansen     sprintf(filename,"restart-dat.%d.%d", timdat.lstep, ((int)(irank/(nprocs/nfiles))+1));
15059599516SKenneth E. Jansen     queryphmpiio(filename, &nfields, &nppf);
15159599516SKenneth E. Jansen     initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read");
15259599516SKenneth E. Jansen 
15359599516SKenneth E. Jansen     if (irank==0) {
15459599516SKenneth E. Jansen       printf("Filename is %s \n",filename);
15559599516SKenneth E. Jansen     }
15659599516SKenneth E. Jansen     openfile(filename, "read", &f_descriptor);
15759599516SKenneth E. Jansen 
15859599516SKenneth E. Jansen     int i;
15959599516SKenneth E. Jansen     for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
16059599516SKenneth E. Jansen     // GPID : global part id, corresponds to rank ...
16159599516SKenneth E. Jansen       // e.g : (in this example)
16259599516SKenneth E. Jansen       // proc 0 : 1--4
16359599516SKenneth E. Jansen       // proc 1 : 5--8 ...
16459599516SKenneth E. Jansen       GPID = startpart + i;
16559599516SKenneth E. Jansen 
16659599516SKenneth E. Jansen       // Write solution field ...
16759599516SKenneth E. Jansen       sprintf(fieldtag_s,"dwal@%d",GPID);
16859599516SKenneth E. Jansen 
16959599516SKenneth E. Jansen       nitems = 2;
17059599516SKenneth E. Jansen       readheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, "double", phasta_iotype);
17159599516SKenneth E. Jansen       //iarray[ 0 ] = (*numnp); What we should get from readheader
17259599516SKenneth E. Jansen       //iarray[ 1 ] = 1;
17359599516SKenneth E. Jansen 
17459599516SKenneth E. Jansen       if (iarray[0] == (*numnp)) {
17559599516SKenneth E. Jansen         if (irank==0) {
17659599516SKenneth E. Jansen           printf("d2wall field found in %s\n",filename);
17759599516SKenneth E. Jansen         }
17859599516SKenneth E. Jansen         *foundd2wall = 1;
17959599516SKenneth E. Jansen         isize = (*numnp);
18059599516SKenneth E. Jansen         readdatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
18159599516SKenneth E. Jansen       }
18259599516SKenneth E. Jansen       else { //d2wall fields was not found in the restart file
18359599516SKenneth E. Jansen         *foundd2wall = 0;
18459599516SKenneth E. Jansen         if (irank==0) {
18559599516SKenneth E. Jansen           printf("d2wall field not found in %s - trying d2wall files now\n",filename);
18659599516SKenneth E. Jansen         }
18759599516SKenneth E. Jansen       }
18859599516SKenneth E. Jansen     }
18959599516SKenneth E. Jansen     closefile(&f_descriptor, "read");
19059599516SKenneth E. Jansen     finalizephmpiio(&f_descriptor);
19159599516SKenneth E. Jansen 
19259599516SKenneth E. Jansen     ////////////////////////////////////////////////////
19359599516SKenneth E. Jansen     // We try to read dwal from the d2wall files if not found in the restart files
19459599516SKenneth E. Jansen     ////////////////////////////////////////////////////
19559599516SKenneth E. Jansen 
19659599516SKenneth E. Jansen     int numd2wallfiles;
19759599516SKenneth E. Jansen     if (*foundd2wall == 0) {
19859599516SKenneth E. Jansen 
19959599516SKenneth E. Jansen       detectd2wallfiles(&numd2wallfiles);
20059599516SKenneth E. Jansen 
20159599516SKenneth E. Jansen       if (numd2wallfiles == outpar.nsynciofiles ) {
20259599516SKenneth E. Jansen         // Read the d2wall field from the d2wall files
203*7d6b7e55SCameron Smith         memset((void*)filename,0,255);
204*7d6b7e55SCameron Smith         memset((void*)fieldtag_s,0,255);
20559599516SKenneth E. Jansen 
20659599516SKenneth E. Jansen         sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1));
20759599516SKenneth E. Jansen         queryphmpiio(filename, &nfields, &nppf);
20859599516SKenneth E. Jansen         initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read");
20959599516SKenneth E. Jansen 
21059599516SKenneth E. Jansen         if (irank==0) {
21159599516SKenneth E. Jansen           printf("Filename is %s \n",filename);
21259599516SKenneth E. Jansen         }
21359599516SKenneth E. Jansen         openfile(filename, "read", &f_descriptor);
21459599516SKenneth E. Jansen 
21559599516SKenneth E. Jansen         int i;
21659599516SKenneth E. Jansen         for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor
21759599516SKenneth E. Jansen           // GPID : global part id, corresponds to rank ...
21859599516SKenneth E. Jansen           // e.g : (in this example)
21959599516SKenneth E. Jansen           // proc 0 : 1--4
22059599516SKenneth E. Jansen           // proc 1 : 5--8 ...
22159599516SKenneth E. Jansen           GPID = startpart + i;
22259599516SKenneth E. Jansen 
22359599516SKenneth E. Jansen           // Write solution field ...
22459599516SKenneth E. Jansen           sprintf(fieldtag_s,"d2wall@%d",GPID);
22559599516SKenneth E. Jansen 
22659599516SKenneth E. Jansen           nitems = 2;
22759599516SKenneth E. Jansen           readheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, "double", phasta_iotype);
22859599516SKenneth E. Jansen           //iarray[ 0 ] = (*numnp); What we should get from readheader
22959599516SKenneth E. Jansen           //iarray[ 1 ] = 1;
23059599516SKenneth E. Jansen 
23159599516SKenneth E. Jansen           if (iarray[0] == (*numnp)) {
23259599516SKenneth E. Jansen             if (irank==0) {
23359599516SKenneth E. Jansen               printf("d2wall field found in %s\n",filename);
23459599516SKenneth E. Jansen             }
23559599516SKenneth E. Jansen             *foundd2wall = 1;
23659599516SKenneth E. Jansen             isize = (*numnp);
23759599516SKenneth E. Jansen             readdatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype );
23859599516SKenneth E. Jansen           }
23959599516SKenneth E. Jansen           else {
24059599516SKenneth E. Jansen             *foundd2wall = 0;
24159599516SKenneth E. Jansen               printf("WARNING - numnp not coherent in d2wall files: %d - %d\n",iarray[0],*numnp);
24259599516SKenneth E. Jansen               printf("WARNING - Recomputing the d2wall field for safety\n");
24359599516SKenneth E. Jansen             }
24459599516SKenneth E. Jansen           }
24559599516SKenneth E. Jansen 
24659599516SKenneth E. Jansen           closefile(&f_descriptor, "read");
24759599516SKenneth E. Jansen           finalizephmpiio(&f_descriptor);
24859599516SKenneth E. Jansen       }
24959599516SKenneth E. Jansen       else if (numd2wallfiles != 0) {
25059599516SKenneth E. Jansen         // The number of d2wall file should be either 0 or outpar.nsynciofiles
25159599516SKenneth E. Jansen         if (irank==0) {
25259599516SKenneth E. Jansen           printf("WARNING - Number of d2wall files not coherent: %d - %d\n",numd2wallfiles,outpar.nsynciofiles);
25359599516SKenneth E. Jansen           printf("WARNING - Recomputing the d2wall field for safety\n");
25459599516SKenneth E. Jansen           *foundd2wall = 0;
25559599516SKenneth E. Jansen         }
25659599516SKenneth E. Jansen       }
25759599516SKenneth E. Jansen     } // end of tentative reading from d2wall files
25859599516SKenneth E. Jansen 
25959599516SKenneth E. Jansen     if (irank==0) {
26059599516SKenneth E. Jansen       printf("\n");
26159599516SKenneth E. Jansen     }
26259599516SKenneth E. Jansen }
263