/* * Pre-processor to generate signed distance function from segmented data * segmented data should be stored in a raw binary file as 1-byte integer (type char) * will output distance functions for phases */ #include #include #include #include #include #include #include #include inline void FlipID(char *ID, int N) { for (int n=0; n> nprocx; domain >> nprocy; domain >> nprocz; domain >> nx; domain >> ny; domain >> nz; domain >> nspheres; domain >> Lx; domain >> Ly; domain >> Lz; } MPI_Barrier(MPI_COMM_WORLD); // Computational domain MPI_Bcast(&nx,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&ny,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&nz,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&nprocx,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&nprocy,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&nprocz,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&nspheres,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&Lx,1,MPI_DOUBLE,0,MPI_COMM_WORLD); MPI_Bcast(&Ly,1,MPI_DOUBLE,0,MPI_COMM_WORLD); MPI_Bcast(&Lz,1,MPI_DOUBLE,0,MPI_COMM_WORLD); //................................................. MPI_Barrier(MPI_COMM_WORLD); // Check that the number of processors >= the number of ranks if ( rank==0 ) { printf("Number of MPI ranks required: %i \n", nprocx*nprocy*nprocz); printf("Number of MPI ranks used: %i \n", nprocs); printf("Full domain size: %i x %i x %i \n",nx*nprocx,ny*nprocy,nz*nprocz); } if ( nprocs < nprocx*nprocy*nprocz ){ ERROR("Insufficient number of processors"); } char LocalRankFilename[40]; int BoundaryCondition=0; Domain Dm(nx,ny,nz,rank,nprocx,nprocy,nprocz,Lx,Ly,Lz,BoundaryCondition); nx+=2; ny+=2; nz+=2; int N = nx*ny*nz; char *id; id = new char[N]; DoubleArray SignDist(nx,ny,nz); // Read the signed distance from file sprintf(LocalRankFilename,"SignDist.%05i",rank); FILE *DIST = fopen(LocalRankFilename,"rb"); fread(SignDist.get(),8,N,DIST); fclose(DIST); int count,countGlobal,totalGlobal; count = 0; for (int k=0; k> binCount; int *SizeX, *SizeY, *SizeZ; // printf("Number of blob sizes: %i \n",binCount); SizeX = new int [binCount]; SizeY = new int [binCount]; SizeZ = new int [binCount]; for (bin=0; bin> SizeX[bin]; Dist >> SizeY[bin]; Dist >> SizeZ[bin]; // printf("Blob %i dimension: %i x %i x %i \n",bin, SizeX[bin], SizeY[bin], SizeZ[bin]); } Dist.close(); // Generate the residual NWP if (rank==0) printf("Initializing with NWP saturation = %f \n",Saturation); // GenerateResidual(id,nx,ny,nz,Saturation); int x,y,z; int sizeX,sizeY,sizeZ; int ii,jj,kk; int Nx = nx; int Ny = ny; int Nz = nz; float sat = 0.f; int Number = 0; // number of features while (sat < Saturation){ if (rank==0){ Number++; // Randomly generate a point in the domain x = (Nx-2)*nprocx*float(rand())/float(RAND_MAX); y = (Ny-2)*nprocy*float(rand())/float(RAND_MAX); z = (Nz-2)*nprocz*float(rand())/float(RAND_MAX); bin = int(floor(binCount*float(rand())/float(RAND_MAX))); sizeX = SizeX[bin]; sizeY = SizeY[bin]; sizeZ = SizeZ[bin]; } MPI_Bcast(&x,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&y,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&z,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&sizeX,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&sizeY,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&sizeZ,1,MPI_INT,0,MPI_COMM_WORLD); if (rank==0) printf("Broadcast block at %i,%i,%i \n",x,y,z); for (k=z;knprocx*(Nx-2)) ii-=nprocx*(Nx-2); if (jj>nprocy*(Ny-2)) jj-=nprocy*(Ny-2); if (kk>nprocz*(Nz-2)) kk-=nprocz*(Nz-2); // Check if this is in the subdomain if (ii < (iproc+1)*(Nx-2) && jj < (jproc+1)*(Ny-2) && kk < (kproc+1)*(Nz-2) && ii > iproc*(Nx-2) && jj > jproc*(Ny-2) && kk > kproc*(Nz-2) ){ // Map from global to local coordinates ii -= iproc*(Nx-2); jj -= jproc*(Ny-2); kk -= kproc*(Nz-2); n = kk*Nx*Ny+jj*Nx+ii; if (id[n] == 2){ id[n] = 1; //count++; } } } } } count = 0; for (int k=0; k