xref: /phasta/phSolver/common/test/phIOreadIlwork.cc (revision 302b84e89edd6b5e92f2fe38c7bb6c81f3daaee4)
1560e081fSCameron Smith #include <mpi.h>
2560e081fSCameron Smith #include <stdio.h>
3560e081fSCameron Smith #include <stdlib.h>
4560e081fSCameron Smith #include <unistd.h>
54894d94eSMichel Rasquin #include <set>
6560e081fSCameron Smith #include "phIO.h"
7560e081fSCameron Smith #include "posixio.h"
8560e081fSCameron Smith #include "phio_posix.h"
9560e081fSCameron Smith 
10560e081fSCameron Smith int main(int argc, char* argv[]) {
11560e081fSCameron Smith   MPI_Init(&argc,&argv);
12*302b84e8SCameron Smith   int commrank,commsize;
13*302b84e8SCameron Smith   MPI_Comm_rank(MPI_COMM_WORLD,&commrank);
14*302b84e8SCameron Smith   MPI_Comm_size(MPI_COMM_WORLD,&commsize);
15*302b84e8SCameron Smith   if( argc != 4 ) {
16*302b84e8SCameron Smith     if( !commrank )
17*302b84e8SCameron Smith       fprintf(stderr, "Usage: %s <geombc posix file> <verbosity=0|1|2> <rankoffset>\n",argv[0]);
18560e081fSCameron Smith     MPI_Finalize();
19560e081fSCameron Smith     return 1;
20560e081fSCameron Smith   }
21560e081fSCameron Smith   const char* filename = argv[1];
22*302b84e8SCameron Smith   const int verbosity = atoi(argv[2]);
23*302b84e8SCameron Smith   const int rankoffset = atoi(argv[3]);
24560e081fSCameron Smith   const char* phrase = "ilwork";
25560e081fSCameron Smith   const char* type = "integer";
26560e081fSCameron Smith   const char* iotype = "binary";
27560e081fSCameron Smith   int* ilwork = NULL;
28560e081fSCameron Smith   int len = 0;
29560e081fSCameron Smith   int one = 2;
30560e081fSCameron Smith 
31*302b84e8SCameron Smith 
32*302b84e8SCameron Smith   int phastarank = commrank+1+rankoffset;
33*302b84e8SCameron Smith 
34*302b84e8SCameron Smith   char geomfilename[4096];
35*302b84e8SCameron Smith   sprintf(geomfilename, "%s/geombc.dat.%d",filename,phastarank);
36*302b84e8SCameron Smith 
37560e081fSCameron Smith   phio_fp file;
38560e081fSCameron Smith   posixio_setup(&(file), 'r');
39*302b84e8SCameron Smith   posix_openfile_single(geomfilename, file);
40560e081fSCameron Smith   phio_readheader(file, phrase, &len, &one, type, iotype);
41560e081fSCameron Smith   ilwork = (int*) malloc(len*sizeof(int));
42560e081fSCameron Smith   phio_readdatablock(file, phrase, ilwork, &len, type, iotype);
43560e081fSCameron Smith   phio_closefile(file);
444894d94eSMichel Rasquin 
454894d94eSMichel Rasquin   // Initialization
464894d94eSMichel Rasquin   int itkbeg = 0;
474894d94eSMichel Rasquin   int m = 0;
484894d94eSMichel Rasquin   int idl = 0;
494894d94eSMichel Rasquin   std::set<int> neighbors;
504894d94eSMichel Rasquin 
514894d94eSMichel Rasquin   // Compute summary info first such as number of communication tasks, neighboring parts, onwer parts, etc
524894d94eSMichel Rasquin   int numtask = ilwork[0];
534894d94eSMichel Rasquin   int numowner = 0;
544894d94eSMichel Rasquin   for(int itask=0;itask<numtask;itask++) {
554894d94eSMichel Rasquin     int iacc   = ilwork [itkbeg + 2];
564894d94eSMichel Rasquin     int iother = ilwork [itkbeg + 3];
574894d94eSMichel Rasquin     int numseg = ilwork [itkbeg + 4];
584894d94eSMichel Rasquin     if(iacc == 1) numowner++;
594894d94eSMichel Rasquin     neighbors.insert(iother);
604894d94eSMichel Rasquin     itkbeg = itkbeg + 4 + 2*numseg;
614894d94eSMichel Rasquin   }
62*302b84e8SCameron Smith   if( !commrank )
63*302b84e8SCameron Smith       printf("rank peers tasks owned notowned\n");
64*302b84e8SCameron Smith   MPI_Barrier(MPI_COMM_WORLD);
65*302b84e8SCameron Smith   for(int i=0; i<commsize; i++) {
66*302b84e8SCameron Smith     if( i == commrank )
67*302b84e8SCameron Smith       printf("%d %d %d %d %d\n",
68*302b84e8SCameron Smith           phastarank,neighbors.size(),numtask,numowner,numtask-numowner);
69*302b84e8SCameron Smith     MPI_Barrier(MPI_COMM_WORLD);
70*302b84e8SCameron Smith   }
714894d94eSMichel Rasquin 
72*302b84e8SCameron Smith   if( verbosity > 0 ) {
734894d94eSMichel Rasquin     // Print now communication info
744894d94eSMichel Rasquin     printf("\n");
754894d94eSMichel Rasquin     printf("Communication info for this part:\n");
764894d94eSMichel Rasquin     itkbeg = 0;
774894d94eSMichel Rasquin     for(int itask=0;itask<numtask;itask++) {
784894d94eSMichel Rasquin       int itag   = ilwork [itkbeg + 1];
794894d94eSMichel Rasquin       int iacc   = ilwork [itkbeg + 2];
804894d94eSMichel Rasquin       int iother = ilwork [itkbeg + 3];
814894d94eSMichel Rasquin       int numseg = ilwork [itkbeg + 4];
824894d94eSMichel Rasquin       int isgbeg = ilwork [itkbeg + 5];
834894d94eSMichel Rasquin 
844894d94eSMichel Rasquin       // Toal number of nodes involved in this communication (lfront), including all segments
854894d94eSMichel Rasquin       int lfront = 0;
864894d94eSMichel Rasquin       for(int is=1;is<=numseg;is++) {
874894d94eSMichel Rasquin         int lenseg = ilwork [itkbeg + 4 + 2*is];
884894d94eSMichel Rasquin         lfront = lfront + lenseg;
894894d94eSMichel Rasquin       }
904894d94eSMichel Rasquin       printf("Communication %d:\ttag %d\townership %d\trank %d\tnumseg %d\tnumvtx %d\n",itask,itag,iacc,iother,numseg,lfront);
914894d94eSMichel Rasquin       itkbeg = itkbeg + 4 + 2*numseg;
924894d94eSMichel Rasquin     }
93*302b84e8SCameron Smith     printf("\n");
94*302b84e8SCameron Smith   }
954894d94eSMichel Rasquin 
964894d94eSMichel Rasquin   // Print now the raw ilwork array
97*302b84e8SCameron Smith   if( verbosity > 1 ) {
984894d94eSMichel Rasquin     printf("ilwork array:\n");
994894d94eSMichel Rasquin     for(int i=0;i<len;i++) {
1004894d94eSMichel Rasquin       printf("%d\n",ilwork[i]);
1014894d94eSMichel Rasquin     }
10225b215f0SCameron Smith   }
1034894d94eSMichel Rasquin 
104560e081fSCameron Smith   free(ilwork);
105560e081fSCameron Smith 
106560e081fSCameron Smith   MPI_Finalize();
107560e081fSCameron Smith   return 0;
108560e081fSCameron Smith }
109