// Created by James McClure // Copyright 2008-2013 #include #include #include #include #include #include #include // std::exception #include #include "common/Domain.h" #include "common/Array.h" #include "common/Utilities.h" #include "common/MPI.h" #include "common/Communication.h" // Inline function to read line without a return argument static inline void fgetl( char * str, int num, FILE * stream ) { char* ptr = fgets( str, num, stream ); if ( 0 ) {char *temp = (char *)&ptr; temp++;} } /******************************************************** * Constructors/Destructor * ********************************************************/ Domain::Domain( int nx, int ny, int nz, int rnk, int npx, int npy, int npz, double lx, double ly, double lz, int BC): database(NULL), Nx(0), Ny(0), Nz(0), Lx(0), Ly(0), Lz(0), Volume(0), BoundaryCondition(0), voxel_length(1), Comm(MPI_COMM_WORLD), inlet_layers_x(0), inlet_layers_y(0), inlet_layers_z(0), inlet_layers_phase(1),outlet_layers_phase(2), sendCount_x(0), sendCount_y(0), sendCount_z(0), sendCount_X(0), sendCount_Y(0), sendCount_Z(0), sendCount_xy(0), sendCount_yz(0), sendCount_xz(0), sendCount_Xy(0), sendCount_Yz(0), sendCount_xZ(0), sendCount_xY(0), sendCount_yZ(0), sendCount_Xz(0), sendCount_XY(0), sendCount_YZ(0), sendCount_XZ(0), sendList_x(NULL), sendList_y(NULL), sendList_z(NULL), sendList_X(NULL), sendList_Y(NULL), sendList_Z(NULL), sendList_xy(NULL), sendList_yz(NULL), sendList_xz(NULL), sendList_Xy(NULL), sendList_Yz(NULL), sendList_xZ(NULL), sendList_xY(NULL), sendList_yZ(NULL), sendList_Xz(NULL), sendList_XY(NULL), sendList_YZ(NULL), sendList_XZ(NULL), sendBuf_x(NULL), sendBuf_y(NULL), sendBuf_z(NULL), sendBuf_X(NULL), sendBuf_Y(NULL), sendBuf_Z(NULL), sendBuf_xy(NULL), sendBuf_yz(NULL), sendBuf_xz(NULL), sendBuf_Xy(NULL), sendBuf_Yz(NULL), sendBuf_xZ(NULL), sendBuf_xY(NULL), sendBuf_yZ(NULL), sendBuf_Xz(NULL), sendBuf_XY(NULL), sendBuf_YZ(NULL), sendBuf_XZ(NULL), recvCount_x(0), recvCount_y(0), recvCount_z(0), recvCount_X(0), recvCount_Y(0), recvCount_Z(0), recvCount_xy(0), recvCount_yz(0), recvCount_xz(0), recvCount_Xy(0), recvCount_Yz(0), recvCount_xZ(0), recvCount_xY(0), recvCount_yZ(0), recvCount_Xz(0), recvCount_XY(0), recvCount_YZ(0), recvCount_XZ(0), recvList_x(NULL), recvList_y(NULL), recvList_z(NULL), recvList_X(NULL), recvList_Y(NULL), recvList_Z(NULL), recvList_xy(NULL), recvList_yz(NULL), recvList_xz(NULL), recvList_Xy(NULL), recvList_Yz(NULL), recvList_xZ(NULL), recvList_xY(NULL), recvList_yZ(NULL), recvList_Xz(NULL), recvList_XY(NULL), recvList_YZ(NULL), recvList_XZ(NULL), recvBuf_x(NULL), recvBuf_y(NULL), recvBuf_z(NULL), recvBuf_X(NULL), recvBuf_Y(NULL), recvBuf_Z(NULL), recvBuf_xy(NULL), recvBuf_yz(NULL), recvBuf_xz(NULL), recvBuf_Xy(NULL), recvBuf_Yz(NULL), recvBuf_xZ(NULL), recvBuf_xY(NULL), recvBuf_yZ(NULL), recvBuf_Xz(NULL), recvBuf_XY(NULL), recvBuf_YZ(NULL), recvBuf_XZ(NULL), sendData_x(NULL), sendData_y(NULL), sendData_z(NULL), sendData_X(NULL), sendData_Y(NULL), sendData_Z(NULL), sendData_xy(NULL), sendData_yz(NULL), sendData_xz(NULL), sendData_Xy(NULL), sendData_Yz(NULL), sendData_xZ(NULL), sendData_xY(NULL), sendData_yZ(NULL), sendData_Xz(NULL), sendData_XY(NULL), sendData_YZ(NULL), sendData_XZ(NULL), recvData_x(NULL), recvData_y(NULL), recvData_z(NULL), recvData_X(NULL), recvData_Y(NULL), recvData_Z(NULL), recvData_xy(NULL), recvData_yz(NULL), recvData_xz(NULL), recvData_Xy(NULL), recvData_Yz(NULL), recvData_xZ(NULL), recvData_xY(NULL), recvData_yZ(NULL), recvData_Xz(NULL), recvData_XY(NULL), recvData_YZ(NULL), recvData_XZ(NULL), id(NULL) { NULL_USE( rnk ); NULL_USE( npy ); NULL_USE( npz ); // set up the neighbor ranks int myrank = Comm.getRank(); rank_info = RankInfoStruct( myrank, rank_info.nx, rank_info.ny, rank_info.nz ); Comm.barrier(); auto db = std::make_shared( ); db->putScalar( "BC", BC ); db->putVector( "nproc", { npx, npx, npx } ); db->putVector( "n", { nx, ny, nz } ); db->putScalar( "nspheres", 0 ); db->putVector( "L", { lx, ly, lz } ); initialize( db ); } Domain::Domain( std::shared_ptr db, const Utilities::MPI& Communicator): database(db), Nx(0), Ny(0), Nz(0), Lx(0), Ly(0), Lz(0), Volume(0), BoundaryCondition(0), inlet_layers_x(0), inlet_layers_y(0), inlet_layers_z(0), outlet_layers_x(0), outlet_layers_y(0), outlet_layers_z(0), inlet_layers_phase(1),outlet_layers_phase(2), sendCount_x(0), sendCount_y(0), sendCount_z(0), sendCount_X(0), sendCount_Y(0), sendCount_Z(0), sendCount_xy(0), sendCount_yz(0), sendCount_xz(0), sendCount_Xy(0), sendCount_Yz(0), sendCount_xZ(0), sendCount_xY(0), sendCount_yZ(0), sendCount_Xz(0), sendCount_XY(0), sendCount_YZ(0), sendCount_XZ(0), sendList_x(NULL), sendList_y(NULL), sendList_z(NULL), sendList_X(NULL), sendList_Y(NULL), sendList_Z(NULL), sendList_xy(NULL), sendList_yz(NULL), sendList_xz(NULL), sendList_Xy(NULL), sendList_Yz(NULL), sendList_xZ(NULL), sendList_xY(NULL), sendList_yZ(NULL), sendList_Xz(NULL), sendList_XY(NULL), sendList_YZ(NULL), sendList_XZ(NULL), sendBuf_x(NULL), sendBuf_y(NULL), sendBuf_z(NULL), sendBuf_X(NULL), sendBuf_Y(NULL), sendBuf_Z(NULL), sendBuf_xy(NULL), sendBuf_yz(NULL), sendBuf_xz(NULL), sendBuf_Xy(NULL), sendBuf_Yz(NULL), sendBuf_xZ(NULL), sendBuf_xY(NULL), sendBuf_yZ(NULL), sendBuf_Xz(NULL), sendBuf_XY(NULL), sendBuf_YZ(NULL), sendBuf_XZ(NULL), recvCount_x(0), recvCount_y(0), recvCount_z(0), recvCount_X(0), recvCount_Y(0), recvCount_Z(0), recvCount_xy(0), recvCount_yz(0), recvCount_xz(0), recvCount_Xy(0), recvCount_Yz(0), recvCount_xZ(0), recvCount_xY(0), recvCount_yZ(0), recvCount_Xz(0), recvCount_XY(0), recvCount_YZ(0), recvCount_XZ(0), recvList_x(NULL), recvList_y(NULL), recvList_z(NULL), recvList_X(NULL), recvList_Y(NULL), recvList_Z(NULL), recvList_xy(NULL), recvList_yz(NULL), recvList_xz(NULL), recvList_Xy(NULL), recvList_Yz(NULL), recvList_xZ(NULL), recvList_xY(NULL), recvList_yZ(NULL), recvList_Xz(NULL), recvList_XY(NULL), recvList_YZ(NULL), recvList_XZ(NULL), recvBuf_x(NULL), recvBuf_y(NULL), recvBuf_z(NULL), recvBuf_X(NULL), recvBuf_Y(NULL), recvBuf_Z(NULL), recvBuf_xy(NULL), recvBuf_yz(NULL), recvBuf_xz(NULL), recvBuf_Xy(NULL), recvBuf_Yz(NULL), recvBuf_xZ(NULL), recvBuf_xY(NULL), recvBuf_yZ(NULL), recvBuf_Xz(NULL), recvBuf_XY(NULL), recvBuf_YZ(NULL), recvBuf_XZ(NULL), sendData_x(NULL), sendData_y(NULL), sendData_z(NULL), sendData_X(NULL), sendData_Y(NULL), sendData_Z(NULL), sendData_xy(NULL), sendData_yz(NULL), sendData_xz(NULL), sendData_Xy(NULL), sendData_Yz(NULL), sendData_xZ(NULL), sendData_xY(NULL), sendData_yZ(NULL), sendData_Xz(NULL), sendData_XY(NULL), sendData_YZ(NULL), sendData_XZ(NULL), recvData_x(NULL), recvData_y(NULL), recvData_z(NULL), recvData_X(NULL), recvData_Y(NULL), recvData_Z(NULL), recvData_xy(NULL), recvData_yz(NULL), recvData_xz(NULL), recvData_Xy(NULL), recvData_Yz(NULL), recvData_xZ(NULL), recvData_xY(NULL), recvData_yZ(NULL), recvData_Xz(NULL), recvData_XY(NULL), recvData_YZ(NULL), recvData_XZ(NULL), id(NULL) { Comm = Communicator.dup(); // set up the neighbor ranks int myrank = Comm.getRank(); initialize( db ); rank_info = RankInfoStruct( myrank, rank_info.nx, rank_info.ny, rank_info.nz ); Comm.barrier(); } Domain::~Domain() { // Free sendList delete [] sendList_x; delete [] sendList_y; delete [] sendList_z; delete [] sendList_X; delete [] sendList_Y; delete [] sendList_Z; delete [] sendList_xy; delete [] sendList_yz; delete [] sendList_xz; delete [] sendList_Xy; delete [] sendList_Yz; delete [] sendList_xZ; delete [] sendList_xY; delete [] sendList_yZ; delete [] sendList_Xz; delete [] sendList_XY; delete [] sendList_YZ; delete [] sendList_XZ; // Free sendBuf delete [] sendBuf_x; delete [] sendBuf_y; delete [] sendBuf_z; delete [] sendBuf_X; delete [] sendBuf_Y; delete [] sendBuf_Z; delete [] sendBuf_xy; delete [] sendBuf_yz; delete [] sendBuf_xz; delete [] sendBuf_Xy; delete [] sendBuf_Yz; delete [] sendBuf_xZ; delete [] sendBuf_xY; delete [] sendBuf_yZ; delete [] sendBuf_Xz; delete [] sendBuf_XY; delete [] sendBuf_YZ; delete [] sendBuf_XZ; // Free recvList delete [] recvList_x; delete [] recvList_y; delete [] recvList_z; delete [] recvList_X; delete [] recvList_Y; delete [] recvList_Z; delete [] recvList_xy; delete [] recvList_yz; delete [] recvList_xz; delete [] recvList_Xy; delete [] recvList_Yz; delete [] recvList_xZ; delete [] recvList_xY; delete [] recvList_yZ; delete [] recvList_Xz; delete [] recvList_XY; delete [] recvList_YZ; delete [] recvList_XZ; // Free recvBuf delete [] recvBuf_x; delete [] recvBuf_y; delete [] recvBuf_z; delete [] recvBuf_X; delete [] recvBuf_Y; delete [] recvBuf_Z; delete [] recvBuf_xy; delete [] recvBuf_yz; delete [] recvBuf_xz; delete [] recvBuf_Xy; delete [] recvBuf_Yz; delete [] recvBuf_xZ; delete [] recvBuf_xY; delete [] recvBuf_yZ; delete [] recvBuf_Xz; delete [] recvBuf_XY; delete [] recvBuf_YZ; delete [] recvBuf_XZ; // Free sendData delete [] sendData_x; delete [] sendData_y; delete [] sendData_z; delete [] sendData_X; delete [] sendData_Y; delete [] sendData_Z; delete [] sendData_xy; delete [] sendData_xY; delete [] sendData_Xy; delete [] sendData_XY; delete [] sendData_xz; delete [] sendData_xZ; delete [] sendData_Xz; delete [] sendData_XZ; delete [] sendData_yz; delete [] sendData_yZ; delete [] sendData_Yz; delete [] sendData_YZ; // Free recvData delete [] recvData_x; delete [] recvData_y; delete [] recvData_z; delete [] recvData_X; delete [] recvData_Y; delete [] recvData_Z; delete [] recvData_xy; delete [] recvData_xY; delete [] recvData_Xy; delete [] recvData_XY; delete [] recvData_xz; delete [] recvData_xZ; delete [] recvData_Xz; delete [] recvData_XZ; delete [] recvData_yz; delete [] recvData_yZ; delete [] recvData_Yz; delete [] recvData_YZ; // Free id delete [] id; } void Domain::initialize( std::shared_ptr db ) { d_db = db; auto nproc = d_db->getVector("nproc"); auto n = d_db->getVector("n"); ASSERT( n.size() == 3u ); ASSERT( nproc.size() == 3u ); int nx = n[0]; int ny = n[1]; int nz = n[2]; if (d_db->keyExists( "InletLayers" )){ auto InletCount = d_db->getVector( "InletLayers" ); inlet_layers_x = InletCount[0]; inlet_layers_y = InletCount[1]; inlet_layers_z = InletCount[2]; } if (d_db->keyExists( "OutletLayers" )){ auto OutletCount = d_db->getVector( "OutletLayers" ); outlet_layers_x = OutletCount[0]; outlet_layers_y = OutletCount[1]; outlet_layers_z = OutletCount[2]; } if (d_db->keyExists( "InletLayersPhase" )){ inlet_layers_phase = d_db->getScalar( "InletLayersPhase" ); } if (d_db->keyExists( "OutletLayersPhase" )){ outlet_layers_phase = d_db->getScalar( "OutletLayersPhase" ); } voxel_length = 1.0; if (d_db->keyExists( "voxel_length" )){ voxel_length = d_db->getScalar("voxel_length"); } else if (d_db->keyExists( "L" )){ auto Length = d_db->getVector("L"); Lx = Length[0]; Ly = Length[1]; Lz = Length[2]; voxel_length = Lx/(nx*nproc[0]); } Lx = nx*nproc[0]*voxel_length; Ly = ny*nproc[1]*voxel_length; Lz = nz*nproc[2]*voxel_length; Nx = nx+2; Ny = ny+2; Nz = nz+2; // Initialize ranks int myrank = Comm.getRank(); rank_info = RankInfoStruct(myrank,nproc[0],nproc[1],nproc[2]); // inlet layers only apply to lower part of domain if (rank_info.ix > 0) inlet_layers_x = 0; if (rank_info.jy > 0) inlet_layers_y = 0; if (rank_info.kz > 0) inlet_layers_z = 0; // outlet layers only apply to top part of domain if (rank_info.ix < nproc[0]-1 ) outlet_layers_x = 0; if (rank_info.jy < nproc[1]-1) outlet_layers_y = 0; if (rank_info.kz < nproc[2]-1) outlet_layers_z = 0; // Fill remaining variables N = Nx*Ny*Nz; Volume = nx*ny*nx*nproc[0]*nproc[1]*nproc[2]*1.0; if (myrank==0) printf("voxel length = %f micron \n", voxel_length); id = new signed char[N]; memset(id,0,N); BoundaryCondition = d_db->getScalar("BC"); int nprocs = Comm.getSize(); INSIST(nprocs == nproc[0]*nproc[1]*nproc[2],"Fatal error in processor count!"); } void Domain::Decomp( const std::string& Filename ) { //....................................................................... // Reading the domain information file //....................................................................... int rank_offset = 0; int RANK = rank(); int nprocs, nprocx, nprocy, nprocz, nx, ny, nz; int64_t global_Nx,global_Ny,global_Nz; int64_t i,j,k,n; int64_t xStart,yStart,zStart; int checkerSize; //int inlet_layers_x, inlet_layers_y, inlet_layers_z; //int outlet_layers_x, outlet_layers_y, outlet_layers_z; xStart=yStart=zStart=0; inlet_layers_x = 0; inlet_layers_y = 0; inlet_layers_z = 0; outlet_layers_x = 0; outlet_layers_y = 0; outlet_layers_z = 0; inlet_layers_phase=1; outlet_layers_phase=2; checkerSize = 32; // Read domain parameters //auto Filename = database->getScalar( "Filename" ); //auto L = database->getVector( "L" ); auto size = database->getVector( "n" ); auto SIZE = database->getVector( "N" ); auto nproc = database->getVector( "nproc" ); if (database->keyExists( "offset" )){ auto offset = database->getVector( "offset" ); xStart = offset[0]; yStart = offset[1]; zStart = offset[2]; } if (database->keyExists( "InletLayers" )){ auto InletCount = database->getVector( "InletLayers" ); inlet_layers_x = InletCount[0]; inlet_layers_y = InletCount[1]; inlet_layers_z = InletCount[2]; } if (database->keyExists( "OutletLayers" )){ auto OutletCount = database->getVector( "OutletLayers" ); outlet_layers_x = OutletCount[0]; outlet_layers_y = OutletCount[1]; outlet_layers_z = OutletCount[2]; } if (database->keyExists( "checkerSize" )){ checkerSize = database->getScalar( "checkerSize" ); } else { checkerSize = SIZE[0]; } if (database->keyExists( "InletLayersPhase" )){ inlet_layers_phase = database->getScalar( "InletLayersPhase" ); } if (database->keyExists( "OutletLayersPhase" )){ outlet_layers_phase = database->getScalar( "OutletLayersPhase" ); } auto ReadValues = database->getVector( "ReadValues" ); auto WriteValues = database->getVector( "WriteValues" ); auto ReadType = database->getScalar( "ReadType" ); if (ReadType == "8bit"){ } else if (ReadType == "16bit"){ } else{ //printf("INPUT ERROR: Valid ReadType are 8bit, 16bit \n"); ReadType = "8bit"; } nx = size[0]; ny = size[1]; nz = size[2]; nprocx = nproc[0]; nprocy = nproc[1]; nprocz = nproc[2]; global_Nx = SIZE[0]; global_Ny = SIZE[1]; global_Nz = SIZE[2]; nprocs=nprocx*nprocy*nprocz; char *SegData = NULL; if (RANK==0){ printf("Input media: %s\n",Filename.c_str()); printf("Relabeling %lu values\n",ReadValues.size()); for (size_t idx=0; idx LabelCount(ReadValues.size(),0); for (int k = 0; k 0){ // use checkerboard pattern printf("Checkerboard pattern at x inlet for %i layers \n",inlet_layers_x); for (int k = 0; k 0){ printf("Checkerboard pattern at y inlet for %i layers \n",inlet_layers_y); // use checkerboard pattern for (int k = 0; k 0){ printf("Checkerboard pattern at z inlet for %i layers \n",inlet_layers_z); // use checkerboard pattern for (int k = zStart; k < zStart+inlet_layers_z; k++){ for (int j = 0; j 0){ // use checkerboard pattern printf("Checkerboard pattern at x outlet for %i layers \n",outlet_layers_x); for (int k = 0; k 0){ printf("Checkerboard pattern at y outlet for %i layers \n",outlet_layers_y); // use checkerboard pattern for (int k = 0; k 0){ printf("Checkerboard pattern at z outlet for %i layers \n",outlet_layers_z); // use checkerboard pattern for (int k = zStart + nz*nprocz - outlet_layers_z; k < zStart + nz*nprocz; k++){ for (int j = 0; j 0) iVol_global = 1.0/(1.0*(Nx-2)*nprocx*(Ny-2)*nprocy*((Nz-2)*nprocz-6)); //......................................................... // If external boundary conditions are applied remove solid if (BoundaryCondition > 0 && kproc() == 0){ if (inlet_layers_z < 4) inlet_layers_z=4; for (int k=0; k 0 && kproc() == nprocz-1){ if (outlet_layers_z < 4) outlet_layers_z=4; for (int k=Nz-outlet_layers_z; k 0){ sum_local+=1.0; } } } } sum = Comm.sumReduce(sum_local); porosity = sum*iVol_global; if (rank()==0) printf("Media porosity = %f \n",porosity); //......................................................... } void Domain::AggregateLabels( const std::string& filename ){ int nx = Nx; int ny = Ny; int nz = Nz; int npx = nprocx(); int npy = nprocy(); int npz = nprocz(); int ipx = iproc(); int ipy = jproc(); int ipz = kproc(); int nprocs = nprocx()*nprocy()*nprocz(); int full_nx = npx*(nx-2); int full_ny = npy*(ny-2); int full_nz = npz*(nz-2); int local_size = (nx-2)*(ny-2)*(nz-2); long int full_size = long(full_nx)*long(full_ny)*long(full_nz); signed char *LocalID; LocalID = new signed char [local_size]; //printf("aggregate labels: local size=%i, global size = %i",local_size, full_size); // assign the ID for the local sub-region for (int k=1; k 0){ // Counts for the six faces if (i==1) sendCount_x++; if (j==1) sendCount_y++; if (k==1) sendCount_z++; if (i==Nx-2) sendCount_X++; if (j==Ny-2) sendCount_Y++; if (k==Nz-2) sendCount_Z++; // Counts for the twelve edges if (i==1 && j==1) sendCount_xy++; if (i==1 && j==Ny-2) sendCount_xY++; if (i==Nx-2 && j==1) sendCount_Xy++; if (i==Nx-2 && j==Ny-2) sendCount_XY++; if (i==1 && k==1) sendCount_xz++; if (i==1 && k==Nz-2) sendCount_xZ++; if (i==Nx-2 && k==1) sendCount_Xz++; if (i==Nx-2 && k==Nz-2) sendCount_XZ++; if (j==1 && k==1) sendCount_yz++; if (j==1 && k==Nz-2) sendCount_yZ++; if (j==Ny-2 && k==1) sendCount_Yz++; if (j==Ny-2 && k==Nz-2) sendCount_YZ++; } } } } // allocate send lists sendList_x = new int [sendCount_x]; sendList_y = new int [sendCount_y]; sendList_z = new int [sendCount_z]; sendList_X = new int [sendCount_X]; sendList_Y = new int [sendCount_Y]; sendList_Z = new int [sendCount_Z]; sendList_xy = new int [sendCount_xy]; sendList_yz = new int [sendCount_yz]; sendList_xz = new int [sendCount_xz]; sendList_Xy = new int [sendCount_Xy]; sendList_Yz = new int [sendCount_Yz]; sendList_xZ = new int [sendCount_xZ]; sendList_xY = new int [sendCount_xY]; sendList_yZ = new int [sendCount_yZ]; sendList_Xz = new int [sendCount_Xz]; sendList_XY = new int [sendCount_XY]; sendList_YZ = new int [sendCount_YZ]; sendList_XZ = new int [sendCount_XZ]; // Populate the send list sendCount_x = sendCount_y = sendCount_z = sendCount_X = sendCount_Y = sendCount_Z = 0; sendCount_xy = sendCount_yz = sendCount_xz = sendCount_Xy = sendCount_Yz = sendCount_xZ = 0; sendCount_xY = sendCount_yZ = sendCount_Xz = sendCount_XY = sendCount_YZ = sendCount_XZ = 0; for (k=1; k 0){ // Counts for the six faces if (i==1) sendList_x[sendCount_x++]=n; if (j==1) sendList_y[sendCount_y++]=n; if (k==1) sendList_z[sendCount_z++]=n; if (i==Nx-2) sendList_X[sendCount_X++]=n; if (j==Ny-2) sendList_Y[sendCount_Y++]=n; if (k==Nz-2) sendList_Z[sendCount_Z++]=n; // Counts for the twelve edges if (i==1 && j==1) sendList_xy[sendCount_xy++]=n; if (i==1 && j==Ny-2) sendList_xY[sendCount_xY++]=n; if (i==Nx-2 && j==1) sendList_Xy[sendCount_Xy++]=n; if (i==Nx-2 && j==Ny-2) sendList_XY[sendCount_XY++]=n; if (i==1 && k==1) sendList_xz[sendCount_xz++]=n; if (i==1 && k==Nz-2) sendList_xZ[sendCount_xZ++]=n; if (i==Nx-2 && k==1) sendList_Xz[sendCount_Xz++]=n; if (i==Nx-2 && k==Nz-2) sendList_XZ[sendCount_XZ++]=n; if (j==1 && k==1) sendList_yz[sendCount_yz++]=n; if (j==1 && k==Nz-2) sendList_yZ[sendCount_yZ++]=n; if (j==Ny-2 && k==1) sendList_Yz[sendCount_Yz++]=n; if (j==Ny-2 && k==Nz-2) sendList_YZ[sendCount_YZ++]=n; } } } } // allocate send buffers sendBuf_x = new int [sendCount_x]; sendBuf_y = new int [sendCount_y]; sendBuf_z = new int [sendCount_z]; sendBuf_X = new int [sendCount_X]; sendBuf_Y = new int [sendCount_Y]; sendBuf_Z = new int [sendCount_Z]; sendBuf_xy = new int [sendCount_xy]; sendBuf_yz = new int [sendCount_yz]; sendBuf_xz = new int [sendCount_xz]; sendBuf_Xy = new int [sendCount_Xy]; sendBuf_Yz = new int [sendCount_Yz]; sendBuf_xZ = new int [sendCount_xZ]; sendBuf_xY = new int [sendCount_xY]; sendBuf_yZ = new int [sendCount_yZ]; sendBuf_Xz = new int [sendCount_Xz]; sendBuf_XY = new int [sendCount_XY]; sendBuf_YZ = new int [sendCount_YZ]; sendBuf_XZ = new int [sendCount_XZ]; //...................................................................................... MPI_Isend(&sendCount_x, 1,MPI_INT,rank_x(),sendtag+0,Comm.getCommunicator(),&req1[0]); MPI_Irecv(&recvCount_X, 1,MPI_INT,rank_X(),recvtag+0,Comm.getCommunicator(),&req2[0]); MPI_Isend(&sendCount_X, 1,MPI_INT,rank_X(),sendtag+1,Comm.getCommunicator(),&req1[1]); MPI_Irecv(&recvCount_x, 1,MPI_INT,rank_x(),recvtag+1,Comm.getCommunicator(),&req2[1]); MPI_Isend(&sendCount_y, 1,MPI_INT,rank_y(),sendtag+2,Comm.getCommunicator(),&req1[2]); MPI_Irecv(&recvCount_Y, 1,MPI_INT,rank_Y(),recvtag+2,Comm.getCommunicator(),&req2[2]); MPI_Isend(&sendCount_Y, 1,MPI_INT,rank_Y(),sendtag+3,Comm.getCommunicator(),&req1[3]); MPI_Irecv(&recvCount_y, 1,MPI_INT,rank_y(),recvtag+3,Comm.getCommunicator(),&req2[3]); MPI_Isend(&sendCount_z, 1,MPI_INT,rank_z(),sendtag+4,Comm.getCommunicator(),&req1[4]); MPI_Irecv(&recvCount_Z, 1,MPI_INT,rank_Z(),recvtag+4,Comm.getCommunicator(),&req2[4]); MPI_Isend(&sendCount_Z, 1,MPI_INT,rank_Z(),sendtag+5,Comm.getCommunicator(),&req1[5]); MPI_Irecv(&recvCount_z, 1,MPI_INT,rank_z(),recvtag+5,Comm.getCommunicator(),&req2[5]); MPI_Isend(&sendCount_xy, 1,MPI_INT,rank_xy(),sendtag+6,Comm.getCommunicator(),&req1[6]); MPI_Irecv(&recvCount_XY, 1,MPI_INT,rank_XY(),recvtag+6,Comm.getCommunicator(),&req2[6]); MPI_Isend(&sendCount_XY, 1,MPI_INT,rank_XY(),sendtag+7,Comm.getCommunicator(),&req1[7]); MPI_Irecv(&recvCount_xy, 1,MPI_INT,rank_xy(),recvtag+7,Comm.getCommunicator(),&req2[7]); MPI_Isend(&sendCount_Xy, 1,MPI_INT,rank_Xy(),sendtag+8,Comm.getCommunicator(),&req1[8]); MPI_Irecv(&recvCount_xY, 1,MPI_INT,rank_xY(),recvtag+8,Comm.getCommunicator(),&req2[8]); MPI_Isend(&sendCount_xY, 1,MPI_INT,rank_xY(),sendtag+9,Comm.getCommunicator(),&req1[9]); MPI_Irecv(&recvCount_Xy, 1,MPI_INT,rank_Xy(),recvtag+9,Comm.getCommunicator(),&req2[9]); MPI_Isend(&sendCount_xz, 1,MPI_INT,rank_xz(),sendtag+10,Comm.getCommunicator(),&req1[10]); MPI_Irecv(&recvCount_XZ, 1,MPI_INT,rank_XZ(),recvtag+10,Comm.getCommunicator(),&req2[10]); MPI_Isend(&sendCount_XZ, 1,MPI_INT,rank_XZ(),sendtag+11,Comm.getCommunicator(),&req1[11]); MPI_Irecv(&recvCount_xz, 1,MPI_INT,rank_xz(),recvtag+11,Comm.getCommunicator(),&req2[11]); MPI_Isend(&sendCount_Xz, 1,MPI_INT,rank_Xz(),sendtag+12,Comm.getCommunicator(),&req1[12]); MPI_Irecv(&recvCount_xZ, 1,MPI_INT,rank_xZ(),recvtag+12,Comm.getCommunicator(),&req2[12]); MPI_Isend(&sendCount_xZ, 1,MPI_INT,rank_xZ(),sendtag+13,Comm.getCommunicator(),&req1[13]); MPI_Irecv(&recvCount_Xz, 1,MPI_INT,rank_Xz(),recvtag+13,Comm.getCommunicator(),&req2[13]); MPI_Isend(&sendCount_yz, 1,MPI_INT,rank_yz(),sendtag+14,Comm.getCommunicator(),&req1[14]); MPI_Irecv(&recvCount_YZ, 1,MPI_INT,rank_YZ(),recvtag+14,Comm.getCommunicator(),&req2[14]); MPI_Isend(&sendCount_YZ, 1,MPI_INT,rank_YZ(),sendtag+15,Comm.getCommunicator(),&req1[15]); MPI_Irecv(&recvCount_yz, 1,MPI_INT,rank_yz(),recvtag+15,Comm.getCommunicator(),&req2[15]); MPI_Isend(&sendCount_Yz, 1,MPI_INT,rank_Yz(),sendtag+16,Comm.getCommunicator(),&req1[16]); MPI_Irecv(&recvCount_yZ, 1,MPI_INT,rank_yZ(),recvtag+16,Comm.getCommunicator(),&req2[16]); MPI_Isend(&sendCount_yZ, 1,MPI_INT,rank_yZ(),sendtag+17,Comm.getCommunicator(),&req1[17]); MPI_Irecv(&recvCount_Yz, 1,MPI_INT,rank_Yz(),recvtag+17,Comm.getCommunicator(),&req2[17]); MPI_Waitall(18,req1,stat1); MPI_Waitall(18,req2,stat2); Comm.barrier(); //...................................................................................... // recv buffers recvList_x = new int [recvCount_x]; recvList_y = new int [recvCount_y]; recvList_z = new int [recvCount_z]; recvList_X = new int [recvCount_X]; recvList_Y = new int [recvCount_Y]; recvList_Z = new int [recvCount_Z]; recvList_xy = new int [recvCount_xy]; recvList_yz = new int [recvCount_yz]; recvList_xz = new int [recvCount_xz]; recvList_Xy = new int [recvCount_Xy]; recvList_Yz = new int [recvCount_Yz]; recvList_xZ = new int [recvCount_xZ]; recvList_xY = new int [recvCount_xY]; recvList_yZ = new int [recvCount_yZ]; recvList_Xz = new int [recvCount_Xz]; recvList_XY = new int [recvCount_XY]; recvList_YZ = new int [recvCount_YZ]; recvList_XZ = new int [recvCount_XZ]; //...................................................................................... MPI_Isend(sendList_x, sendCount_x,MPI_INT,rank_x(),sendtag,Comm.getCommunicator(),&req1[0]); MPI_Irecv(recvList_X, recvCount_X,MPI_INT,rank_X(),recvtag,Comm.getCommunicator(),&req2[0]); MPI_Isend(sendList_X, sendCount_X,MPI_INT,rank_X(),sendtag,Comm.getCommunicator(),&req1[1]); MPI_Irecv(recvList_x, recvCount_x,MPI_INT,rank_x(),recvtag,Comm.getCommunicator(),&req2[1]); MPI_Isend(sendList_y, sendCount_y,MPI_INT,rank_y(),sendtag,Comm.getCommunicator(),&req1[2]); MPI_Irecv(recvList_Y, recvCount_Y,MPI_INT,rank_Y(),recvtag,Comm.getCommunicator(),&req2[2]); MPI_Isend(sendList_Y, sendCount_Y,MPI_INT,rank_Y(),sendtag,Comm.getCommunicator(),&req1[3]); MPI_Irecv(recvList_y, recvCount_y,MPI_INT,rank_y(),recvtag,Comm.getCommunicator(),&req2[3]); MPI_Isend(sendList_z, sendCount_z,MPI_INT,rank_z(),sendtag,Comm.getCommunicator(),&req1[4]); MPI_Irecv(recvList_Z, recvCount_Z,MPI_INT,rank_Z(),recvtag,Comm.getCommunicator(),&req2[4]); MPI_Isend(sendList_Z, sendCount_Z,MPI_INT,rank_Z(),sendtag,Comm.getCommunicator(),&req1[5]); MPI_Irecv(recvList_z, recvCount_z,MPI_INT,rank_z(),recvtag,Comm.getCommunicator(),&req2[5]); MPI_Isend(sendList_xy, sendCount_xy,MPI_INT,rank_xy(),sendtag,Comm.getCommunicator(),&req1[6]); MPI_Irecv(recvList_XY, recvCount_XY,MPI_INT,rank_XY(),recvtag,Comm.getCommunicator(),&req2[6]); MPI_Isend(sendList_XY, sendCount_XY,MPI_INT,rank_XY(),sendtag,Comm.getCommunicator(),&req1[7]); MPI_Irecv(recvList_xy, recvCount_xy,MPI_INT,rank_xy(),recvtag,Comm.getCommunicator(),&req2[7]); MPI_Isend(sendList_Xy, sendCount_Xy,MPI_INT,rank_Xy(),sendtag,Comm.getCommunicator(),&req1[8]); MPI_Irecv(recvList_xY, recvCount_xY,MPI_INT,rank_xY(),recvtag,Comm.getCommunicator(),&req2[8]); MPI_Isend(sendList_xY, sendCount_xY,MPI_INT,rank_xY(),sendtag,Comm.getCommunicator(),&req1[9]); MPI_Irecv(recvList_Xy, recvCount_Xy,MPI_INT,rank_Xy(),recvtag,Comm.getCommunicator(),&req2[9]); MPI_Isend(sendList_xz, sendCount_xz,MPI_INT,rank_xz(),sendtag,Comm.getCommunicator(),&req1[10]); MPI_Irecv(recvList_XZ, recvCount_XZ,MPI_INT,rank_XZ(),recvtag,Comm.getCommunicator(),&req2[10]); MPI_Isend(sendList_XZ, sendCount_XZ,MPI_INT,rank_XZ(),sendtag,Comm.getCommunicator(),&req1[11]); MPI_Irecv(recvList_xz, recvCount_xz,MPI_INT,rank_xz(),recvtag,Comm.getCommunicator(),&req2[11]); MPI_Isend(sendList_Xz, sendCount_Xz,MPI_INT,rank_Xz(),sendtag,Comm.getCommunicator(),&req1[12]); MPI_Irecv(recvList_xZ, recvCount_xZ,MPI_INT,rank_xZ(),recvtag,Comm.getCommunicator(),&req2[12]); MPI_Isend(sendList_xZ, sendCount_xZ,MPI_INT,rank_xZ(),sendtag,Comm.getCommunicator(),&req1[13]); MPI_Irecv(recvList_Xz, recvCount_Xz,MPI_INT,rank_Xz(),recvtag,Comm.getCommunicator(),&req2[13]); MPI_Isend(sendList_yz, sendCount_yz,MPI_INT,rank_yz(),sendtag,Comm.getCommunicator(),&req1[14]); MPI_Irecv(recvList_YZ, recvCount_YZ,MPI_INT,rank_YZ(),recvtag,Comm.getCommunicator(),&req2[14]); MPI_Isend(sendList_YZ, sendCount_YZ,MPI_INT,rank_YZ(),sendtag,Comm.getCommunicator(),&req1[15]); MPI_Irecv(recvList_yz, recvCount_yz,MPI_INT,rank_yz(),recvtag,Comm.getCommunicator(),&req2[15]); MPI_Isend(sendList_Yz, sendCount_Yz,MPI_INT,rank_Yz(),sendtag,Comm.getCommunicator(),&req1[16]); MPI_Irecv(recvList_yZ, recvCount_yZ,MPI_INT,rank_yZ(),recvtag,Comm.getCommunicator(),&req2[16]); MPI_Isend(sendList_yZ, sendCount_yZ,MPI_INT,rank_yZ(),sendtag,Comm.getCommunicator(),&req1[17]); MPI_Irecv(recvList_Yz, recvCount_Yz,MPI_INT,rank_Yz(),recvtag,Comm.getCommunicator(),&req2[17]); MPI_Waitall(18,req1,stat1); MPI_Waitall(18,req2,stat2); //...................................................................................... for (int idx=0; idx 0) iVol_global = 1.0/(1.0*(Nx-2)*nprocx()*(Ny-2)*nprocy()*((Nz-2)*nprocz()-6)); //......................................................... // If external boundary conditions are applied remove solid if (BoundaryCondition > 0 && kproc() == 0){ if (inlet_layers_z < 4) inlet_layers_z=4; for (int k=0; k 0 && kproc() == nprocz()-1){ if (outlet_layers_z < 4) outlet_layers_z=4; for (int k=Nz-outlet_layers_z; k 0){ sum_local+=1.0; } } } } sum = Comm.sumReduce(sum_local); porosity = sum*iVol_global; if (rank()==0) printf("Media porosity = %f \n",porosity); //......................................................... } int Domain::PoreCount(){ /* * count the number of nodes occupied by mobile phases */ int Npore=0; // number of local pore nodes for (int k=1;k 0){ Npore++; } } } } return Npore; } void Domain::CommunicateMeshHalo(DoubleArray &Mesh) { int sendtag, recvtag; sendtag = recvtag = 7; double *MeshData = Mesh.data(); PackMeshData(sendList_x, sendCount_x ,sendData_x, MeshData); PackMeshData(sendList_X, sendCount_X ,sendData_X, MeshData); PackMeshData(sendList_y, sendCount_y ,sendData_y, MeshData); PackMeshData(sendList_Y, sendCount_Y ,sendData_Y, MeshData); PackMeshData(sendList_z, sendCount_z ,sendData_z, MeshData); PackMeshData(sendList_Z, sendCount_Z ,sendData_Z, MeshData); PackMeshData(sendList_xy, sendCount_xy ,sendData_xy, MeshData); PackMeshData(sendList_Xy, sendCount_Xy ,sendData_Xy, MeshData); PackMeshData(sendList_xY, sendCount_xY ,sendData_xY, MeshData); PackMeshData(sendList_XY, sendCount_XY ,sendData_XY, MeshData); PackMeshData(sendList_xz, sendCount_xz ,sendData_xz, MeshData); PackMeshData(sendList_Xz, sendCount_Xz ,sendData_Xz, MeshData); PackMeshData(sendList_xZ, sendCount_xZ ,sendData_xZ, MeshData); PackMeshData(sendList_XZ, sendCount_XZ ,sendData_XZ, MeshData); PackMeshData(sendList_yz, sendCount_yz ,sendData_yz, MeshData); PackMeshData(sendList_Yz, sendCount_Yz ,sendData_Yz, MeshData); PackMeshData(sendList_yZ, sendCount_yZ ,sendData_yZ, MeshData); PackMeshData(sendList_YZ, sendCount_YZ ,sendData_YZ, MeshData); //...................................................................................... MPI_Sendrecv(sendData_x,sendCount_x,MPI_DOUBLE,rank_x(),sendtag, recvData_X,recvCount_X,MPI_DOUBLE,rank_X(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_X,sendCount_X,MPI_DOUBLE,rank_X(),sendtag, recvData_x,recvCount_x,MPI_DOUBLE,rank_x(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_y,sendCount_y,MPI_DOUBLE,rank_y(),sendtag, recvData_Y,recvCount_Y,MPI_DOUBLE,rank_Y(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_Y,sendCount_Y,MPI_DOUBLE,rank_Y(),sendtag, recvData_y,recvCount_y,MPI_DOUBLE,rank_y(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_z,sendCount_z,MPI_DOUBLE,rank_z(),sendtag, recvData_Z,recvCount_Z,MPI_DOUBLE,rank_Z(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_Z,sendCount_Z,MPI_DOUBLE,rank_Z(),sendtag, recvData_z,recvCount_z,MPI_DOUBLE,rank_z(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_xy,sendCount_xy,MPI_DOUBLE,rank_xy(),sendtag, recvData_XY,recvCount_XY,MPI_DOUBLE,rank_XY(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_XY,sendCount_XY,MPI_DOUBLE,rank_XY(),sendtag, recvData_xy,recvCount_xy,MPI_DOUBLE,rank_xy(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_Xy,sendCount_Xy,MPI_DOUBLE,rank_Xy(),sendtag, recvData_xY,recvCount_xY,MPI_DOUBLE,rank_xY(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_xY,sendCount_xY,MPI_DOUBLE,rank_xY(),sendtag, recvData_Xy,recvCount_Xy,MPI_DOUBLE,rank_Xy(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_xz,sendCount_xz,MPI_DOUBLE,rank_xz(),sendtag, recvData_XZ,recvCount_XZ,MPI_DOUBLE,rank_XZ(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_XZ,sendCount_XZ,MPI_DOUBLE,rank_XZ(),sendtag, recvData_xz,recvCount_xz,MPI_DOUBLE,rank_xz(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_Xz,sendCount_Xz,MPI_DOUBLE,rank_Xz(),sendtag, recvData_xZ,recvCount_xZ,MPI_DOUBLE,rank_xZ(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_xZ,sendCount_xZ,MPI_DOUBLE,rank_xZ(),sendtag, recvData_Xz,recvCount_Xz,MPI_DOUBLE,rank_Xz(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_yz,sendCount_yz,MPI_DOUBLE,rank_yz(),sendtag, recvData_YZ,recvCount_YZ,MPI_DOUBLE,rank_YZ(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_YZ,sendCount_YZ,MPI_DOUBLE,rank_YZ(),sendtag, recvData_yz,recvCount_yz,MPI_DOUBLE,rank_yz(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_Yz,sendCount_Yz,MPI_DOUBLE,rank_Yz(),sendtag, recvData_yZ,recvCount_yZ,MPI_DOUBLE,rank_yZ(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); MPI_Sendrecv(sendData_yZ,sendCount_yZ,MPI_DOUBLE,rank_yZ(),sendtag, recvData_Yz,recvCount_Yz,MPI_DOUBLE,rank_Yz(),recvtag,Comm.getCommunicator(),MPI_STATUS_IGNORE); //........................................................................................ UnpackMeshData(recvList_x, recvCount_x ,recvData_x, MeshData); UnpackMeshData(recvList_X, recvCount_X ,recvData_X, MeshData); UnpackMeshData(recvList_y, recvCount_y ,recvData_y, MeshData); UnpackMeshData(recvList_Y, recvCount_Y ,recvData_Y, MeshData); UnpackMeshData(recvList_z, recvCount_z ,recvData_z, MeshData); UnpackMeshData(recvList_Z, recvCount_Z ,recvData_Z, MeshData); UnpackMeshData(recvList_xy, recvCount_xy ,recvData_xy, MeshData); UnpackMeshData(recvList_Xy, recvCount_Xy ,recvData_Xy, MeshData); UnpackMeshData(recvList_xY, recvCount_xY ,recvData_xY, MeshData); UnpackMeshData(recvList_XY, recvCount_XY ,recvData_XY, MeshData); UnpackMeshData(recvList_xz, recvCount_xz ,recvData_xz, MeshData); UnpackMeshData(recvList_Xz, recvCount_Xz ,recvData_Xz, MeshData); UnpackMeshData(recvList_xZ, recvCount_xZ ,recvData_xZ, MeshData); UnpackMeshData(recvList_XZ, recvCount_XZ ,recvData_XZ, MeshData); UnpackMeshData(recvList_yz, recvCount_yz ,recvData_yz, MeshData); UnpackMeshData(recvList_Yz, recvCount_Yz ,recvData_Yz, MeshData); UnpackMeshData(recvList_yZ, recvCount_yZ ,recvData_yZ, MeshData); UnpackMeshData(recvList_YZ, recvCount_YZ ,recvData_YZ, MeshData); } // Ideally stuff below here should be moved somewhere else -- doesn't really belong here void WriteCheckpoint(const char *FILENAME, const double *cDen, const double *cfq, size_t Np) { double value; ofstream File(FILENAME,ios::binary); for (size_t n=0; n