1560e081fSCameron Smith #include <mpi.h> 2560e081fSCameron Smith #include <stdio.h> 3560e081fSCameron Smith #include <stdlib.h> 4560e081fSCameron Smith #include <unistd.h> 54894d94eSMichel Rasquin #include <set> 6eeef5fd6SCameron Smith #include <string> 7eeef5fd6SCameron Smith #include <sstream> 8c0903dacSCameron Smith #include <cassert> 9560e081fSCameron Smith #include "phIO.h" 10560e081fSCameron Smith #include "posixio.h" 11560e081fSCameron Smith #include "phio_posix.h" 12560e081fSCameron Smith 13*ff414521SCameron Smith int openfile(const char* geomfilename, phio_fp& file) { 14*ff414521SCameron Smith int commrank; 15*ff414521SCameron Smith MPI_Comm_rank(MPI_COMM_WORLD,&commrank); 16*ff414521SCameron Smith int err = posix_openfile_single(geomfilename, file); 17*ff414521SCameron Smith int globalerr = 0; 18*ff414521SCameron Smith MPI_Allreduce(&err, &globalerr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD); 19*ff414521SCameron Smith if(err > 0 && !commrank) 20*ff414521SCameron Smith fprintf(stderr, "failed to open file %s\n", geomfilename); 21*ff414521SCameron Smith return globalerr; 22*ff414521SCameron Smith } 23*ff414521SCameron Smith 24560e081fSCameron Smith int main(int argc, char* argv[]) { 25560e081fSCameron Smith MPI_Init(&argc,&argv); 26302b84e8SCameron Smith int commrank,commsize; 27302b84e8SCameron Smith MPI_Comm_rank(MPI_COMM_WORLD,&commrank); 28302b84e8SCameron Smith MPI_Comm_size(MPI_COMM_WORLD,&commsize); 29eeef5fd6SCameron Smith if( argc != 5 ) { 30302b84e8SCameron Smith if( !commrank ) 31eeef5fd6SCameron Smith fprintf(stderr, "Usage: %s <geombc posix file> <verbosity=0|1|2> <rankoffset> <outfile>\n",argv[0]); 32eeef5fd6SCameron Smith fprintf(stderr, "verbosity=0 will only write to the specified \'outfile\'\n",argv[0]); 33eeef5fd6SCameron Smith fprintf(stderr, "verbosity>0 will write to the specified \'outfile\' and to stdout\n",argv[0]); 34560e081fSCameron Smith MPI_Finalize(); 35560e081fSCameron Smith return 1; 36560e081fSCameron Smith } 37560e081fSCameron Smith const char* filename = argv[1]; 38302b84e8SCameron Smith const int verbosity = atoi(argv[2]); 39302b84e8SCameron Smith const int rankoffset = atoi(argv[3]); 40eeef5fd6SCameron Smith char* outfilename = argv[4]; 41560e081fSCameron Smith const char* phrase = "ilwork"; 42560e081fSCameron Smith const char* type = "integer"; 43560e081fSCameron Smith const char* iotype = "binary"; 44560e081fSCameron Smith int* ilwork = NULL; 45560e081fSCameron Smith int len = 0; 46560e081fSCameron Smith int one = 2; 47560e081fSCameron Smith 48eb8873f5SCameron Smith const int phastarank = commrank+1+rankoffset; 49eb8873f5SCameron Smith const int group = (commrank+rankoffset)/2048; 50302b84e8SCameron Smith 51302b84e8SCameron Smith char geomfilename[4096]; 52eb8873f5SCameron Smith sprintf(geomfilename, "%s/%d/geombc.dat.%d",filename,group,phastarank); 53302b84e8SCameron Smith 54560e081fSCameron Smith phio_fp file; 55560e081fSCameron Smith posixio_setup(&(file), 'r'); 56*ff414521SCameron Smith int err = openfile(geomfilename, file); 57*ff414521SCameron Smith if(err > 0) { 58*ff414521SCameron Smith if(!commrank) fprintf(stderr, "trying again without the sub-directory...\n"); 59*ff414521SCameron Smith sprintf(geomfilename, "%s/geombc.dat.%d",filename,phastarank); 60*ff414521SCameron Smith err = openfile(geomfilename, file); 61*ff414521SCameron Smith assert(!err); 62*ff414521SCameron Smith if(!commrank) 63*ff414521SCameron Smith fprintf(stderr, "geombc files opened successfully\n"); 64*ff414521SCameron Smith } 65560e081fSCameron Smith phio_readheader(file, phrase, &len, &one, type, iotype); 66560e081fSCameron Smith ilwork = (int*) malloc(len*sizeof(int)); 67560e081fSCameron Smith phio_readdatablock(file, phrase, ilwork, &len, type, iotype); 68560e081fSCameron Smith phio_closefile(file); 694894d94eSMichel Rasquin 704894d94eSMichel Rasquin // Initialization 714894d94eSMichel Rasquin int itkbeg = 0; 724894d94eSMichel Rasquin int m = 0; 734894d94eSMichel Rasquin int idl = 0; 744894d94eSMichel Rasquin std::set<int> neighbors; 754894d94eSMichel Rasquin 764894d94eSMichel Rasquin // Compute summary info first such as number of communication tasks, neighboring parts, onwer parts, etc 774894d94eSMichel Rasquin int numtask = ilwork[0]; 784894d94eSMichel Rasquin int numowner = 0; 794894d94eSMichel Rasquin for(int itask=0;itask<numtask;itask++) { 804894d94eSMichel Rasquin int iacc = ilwork [itkbeg + 2]; 814894d94eSMichel Rasquin int iother = ilwork [itkbeg + 3]; 824894d94eSMichel Rasquin int numseg = ilwork [itkbeg + 4]; 834894d94eSMichel Rasquin if(iacc == 1) numowner++; 844894d94eSMichel Rasquin neighbors.insert(iother); 854894d94eSMichel Rasquin itkbeg = itkbeg + 4 + 2*numseg; 864894d94eSMichel Rasquin } 87c0903dacSCameron Smith assert(neighbors.size() != 0); 88eeef5fd6SCameron Smith MPI_Status status; 89eeef5fd6SCameron Smith MPI_File outfile; 90eeef5fd6SCameron Smith MPI_File_open(MPI_COMM_WORLD,outfilename, 91eeef5fd6SCameron Smith MPI_MODE_CREATE|MPI_MODE_WRONLY,MPI_INFO_NULL,&outfile); 92c0903dacSCameron Smith std::string header("rank,peers,tasks,owned,notowned\n"); 93eeef5fd6SCameron Smith if( !commrank ) //write header 94a58fb009SCameron Smith MPI_File_write_at(outfile,0,(void*)header.c_str(),header.size(),MPI_BYTE,&status); 95eeef5fd6SCameron Smith std::stringstream ss; 96eeef5fd6SCameron Smith ss << phastarank << "," 97eeef5fd6SCameron Smith << neighbors.size() << "," 98eeef5fd6SCameron Smith << numtask << "," 99eeef5fd6SCameron Smith << numowner << "," 100eeef5fd6SCameron Smith << numtask-numowner << "\n"; 101eeef5fd6SCameron Smith std::string s = ss.str(); 102eeef5fd6SCameron Smith int size = s.size(); 103eeef5fd6SCameron Smith int offset = 0; 104eeef5fd6SCameron Smith MPI_Exscan(&size,&offset,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD); 105eeef5fd6SCameron Smith offset += header.size(); 106a58fb009SCameron Smith int ret = MPI_File_write_at(outfile,offset,(void*)s.c_str(),s.size(),MPI_BYTE,&status); 107c0903dacSCameron Smith assert(ret == MPI_SUCCESS); 108302b84e8SCameron Smith if( verbosity > 0 ) { 1094894d94eSMichel Rasquin // Print now communication info 1104894d94eSMichel Rasquin printf("\n"); 1114894d94eSMichel Rasquin printf("Communication info for this part:\n"); 1124894d94eSMichel Rasquin itkbeg = 0; 1134894d94eSMichel Rasquin for(int itask=0;itask<numtask;itask++) { 1144894d94eSMichel Rasquin int itag = ilwork [itkbeg + 1]; 1154894d94eSMichel Rasquin int iacc = ilwork [itkbeg + 2]; 1164894d94eSMichel Rasquin int iother = ilwork [itkbeg + 3]; 1174894d94eSMichel Rasquin int numseg = ilwork [itkbeg + 4]; 1184894d94eSMichel Rasquin int isgbeg = ilwork [itkbeg + 5]; 1194894d94eSMichel Rasquin 1204894d94eSMichel Rasquin // Toal number of nodes involved in this communication (lfront), including all segments 1214894d94eSMichel Rasquin int lfront = 0; 1224894d94eSMichel Rasquin for(int is=1;is<=numseg;is++) { 1234894d94eSMichel Rasquin int lenseg = ilwork [itkbeg + 4 + 2*is]; 1244894d94eSMichel Rasquin lfront = lfront + lenseg; 1254894d94eSMichel Rasquin } 1264894d94eSMichel Rasquin printf("Communication %d:\ttag %d\townership %d\trank %d\tnumseg %d\tnumvtx %d\n",itask,itag,iacc,iother,numseg,lfront); 1274894d94eSMichel Rasquin itkbeg = itkbeg + 4 + 2*numseg; 1284894d94eSMichel Rasquin } 129302b84e8SCameron Smith printf("\n"); 130302b84e8SCameron Smith } 1314894d94eSMichel Rasquin 1324894d94eSMichel Rasquin // Print now the raw ilwork array 133302b84e8SCameron Smith if( verbosity > 1 ) { 1344894d94eSMichel Rasquin printf("ilwork array:\n"); 1354894d94eSMichel Rasquin for(int i=0;i<len;i++) { 1364894d94eSMichel Rasquin printf("%d\n",ilwork[i]); 1374894d94eSMichel Rasquin } 13825b215f0SCameron Smith } 1394894d94eSMichel Rasquin 140560e081fSCameron Smith free(ilwork); 141eeef5fd6SCameron Smith MPI_File_close(&outfile); 142560e081fSCameron Smith MPI_Finalize(); 143560e081fSCameron Smith return 0; 144560e081fSCameron Smith } 145