//************************************************************************* // Lattice Boltzmann Simulator for Single Phase Flow in Porous Media // James E. McCLure //************************************************************************* #include #include #include #include "common/ScaLBL.h" #include "common/MPI.h" using namespace std; std::shared_ptr loadInputs( int nprocs ) { auto db = std::make_shared(); db->putScalar( "BC", 0 ); db->putVector( "nproc", { 1, 1, 1 } ); db->putVector( "n", { 100, 100, 100 } ); db->putScalar( "nspheres", 1 ); db->putVector( "L", { 1, 1, 1 } ); return db; } //*************************************************************************************** int main(int argc, char **argv) { // Initialize MPI Utilities::startup( argc, argv ); Utilities::MPI comm( MPI_COMM_WORLD ); int rank = comm.getRank(); int nprocs = comm.getSize(); int check=0; { // parallel domain size (# of sub-domains) if (rank == 0){ printf("********************************************************\n"); printf("Running Color Model: TestColorGradDFH \n"); printf("********************************************************\n"); } // BGK Model parameters string FILENAME; // Domain variables int i,j,k,n; // Load inputs auto db = loadInputs( nprocs ); int Nx = db->getVector( "n" )[0]; int Ny = db->getVector( "n" )[1]; int Nz = db->getVector( "n" )[2]; if (rank==0){ printf("********************************************************\n"); printf("Sub-domain size = %i x %i x %i\n",Nx,Ny,Nz); printf("********************************************************\n"); } // Get the rank info auto Dm = std::make_shared(db,comm); Nx += 2; Ny += 2; Nz += 2; int N = Nx*Ny*Nz; double *PhaseLabel; PhaseLabel = new double[N]; //....................................................................... for (k=0;kid[n]=1; // Initialize gradient ColorGrad = (1,2,3) double value=double(3*k+2*j+i); PhaseLabel[n]= value; } } } Dm->CommInit(); comm.barrier(); if (rank == 0) cout << "Domain set." << endl; if (rank==0) printf ("Create ScaLBL_Communicator \n"); //Create a second communicator based on the regular data layout std::shared_ptr ScaLBL_Comm(new ScaLBL_Communicator(Dm)); // LBM variables if (rank==0) printf ("Set up the neighborlist \n"); int Np=0; // number of local pore nodes for (k=1;kMemoryOptimizedLayoutAA(Map,neighborList,Dm->id.data(),Np); comm.barrier(); //......................device distributions................................. int neighborSize=18*Np*sizeof(int); if (rank==0) printf ("Allocating distributions \n"); int *NeighborList; int *dvcMap; double *Phi; double *Potential; double *ColorGrad; //........................................................................... ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); ScaLBL_AllocateDeviceMemory((void **) &dvcMap, sizeof(int)*Np); ScaLBL_AllocateDeviceMemory((void **) &Phi, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Potential, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &ColorGrad, 3*sizeof(double)*Np); //........................................................................... // Update GPU data structures if (rank==0) printf ("Setting up device map and neighbor list \n"); int *TmpMap; TmpMap=new int[Np*sizeof(int)]; for (k=1; kfirst_interior, ScaLBL_Comm->last_interior, Np); ScaLBL_Comm->SendHalo(Phi); ScaLBL_D3Q19_Gradient_DFH(neighborList, Phi, ColorGrad, 0, ScaLBL_Comm->first_interior, Np); ScaLBL_Comm->RecvGrad(Phi,ColorGrad); double *COLORGRAD; COLORGRAD= new double [3*Np]; int SIZE=3*Np*sizeof(double); ScaLBL_CopyToHost(&COLORGRAD[0],&ColorGrad[0],SIZE); for (k=1;kid[n] > 0){ int idx = Map(i,j,k); printf("%i ",idx); } } printf("\n"); } printf("-------\n"); } double CX,CY,CZ; for (k=1;kid[n] > 0){ int idx = Map(i,j,k); CX=COLORGRAD[idx]; CY=COLORGRAD[Np+idx]; CZ=COLORGRAD[2*Np+idx]; double error=sqrt((CX-1.0)*(CX-1.0)+(CY-2.0)*(CY-2.0)+ (CZ-3.0)*(CZ-3.0)); if (error > 1e-8){ printf("i,j,k=%i,%i,%i; idx=%i: Color gradient=%f,%f,%f \n",i,j,k,idx,CX,CY,CZ); /* for (int q=0; q<18; q++){ int nn = neighborList[q*Np+idx]%Np; double value= PHASE[nn]; printf(" q=%i, nn=%i, value=%f \n",q,nn,value); } */ } } } } } } Utilities::shutdown(); return check; }