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