diff --git a/common/ScaLBL.h b/common/ScaLBL.h index 521bda87..cb89858c 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -188,7 +188,9 @@ extern "C" void ScaLBL_D3Q19_Init(double *Dist, int Np); */ extern "C" void ScaLBL_D3Q19_Momentum(double *dist, double *vel, int Np); -extern "C" void ScaLBL_D3Q19_Momentum_2nd_order(double *dist, double *vel, int Np, double Fx, double Fy, double Fz); +extern "C" void ScaLBL_D3Q19_Momentum_2nd_order(double *dist, double *vel, + int Np, double Fx, double Fy, + double Fz); /** * \brief compute pressure from D3Q19 distribution @@ -295,37 +297,38 @@ extern "C" void ScaLBL_D3Q7_Membrane_Unpack(int q, int *d3q7_recvlist, extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *Dist, int Np, double Den); -extern "C" void -ScaLBL_D3Q19_AAeven_Greyscale(double *dist, int start, int finish, int Np, - double rlx, double rlx_eff, double Fx, double Fy, - double Fz, double *Poros, double *Perm, - double *Velocity, double *Pressure); +extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( + double *dist, int start, int finish, int Np, double rlx, double rlx_eff, + double Fx, double Fy, double Fz, double *Poros, double *Perm, + double *Velocity, double *Pressure, bool Forchheimer); -extern "C" void -ScaLBL_D3Q19_AAodd_Greyscale(int *neighborList, double *dist, int start, - int finish, int Np, double rlx, double rlx_eff, - double Fx, double Fy, double Fz, double *Poros, - double *Perm, double *Velocity, double *Pressure); +extern "C" void ScaLBL_D3Q19_AAodd_Greyscale( + int *neighborList, double *dist, int start, int finish, int Np, double rlx, + double rlx_eff, double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double *Pressure, bool Forchheimer); extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT( double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz, double *Poros, double *Perm, - double *Velocity, double Den, double *Pressure); + double *Velocity, double Den, double *Pressure, bool Forchheimer); extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT( int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz, double *Poros, - double *Perm, double *Velocity, double Den, double *Pressure); + double *Perm, double *Velocity, double Den, double *Pressure, + bool Forchheimer); extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT( double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz, double *Poros, double *Perm, - double *Velocity, double Den, double *Pressure); + double *Velocity, double Den, double *Pressure, bool Forchheimer); -extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT( - int *neighborList, double *dist, int start, int finish, int Np, double rlx, - double rlx_eff, double Fx, double Fy, double Fz, double *Poros, - double *Perm, double *Velocity, double Den, double *Pressure); +extern "C" void +ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, + int finish, int Np, double rlx, double rlx_eff, + double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double Den, + double *Pressure, bool Forchheimer); extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor( int *Map, double *dist, double *Aq, double *Bq, double *Den, double *Phi, @@ -628,10 +631,10 @@ extern "C" void ScaLBL_D3Q19_AAodd_MRT(int *neighborList, double *dist, * @param Np - size of local sub-domain (derived from Domain structure) */ extern "C" void ScaLBL_D3Q19_AAeven_Color( - int *Map, double *dist, double *Aq, double *Bq, double *Den, double *Phi, unsigned int *NeighborSolid, - double *Vel, double rhoA, double rhoB, double tauA, double tauB, - double alpha, double beta, double Fx, double Fy, double Fz, int strideY, - int strideZ, int start, int finish, int Np); + int *Map, double *dist, double *Aq, double *Bq, double *Den, double *Phi, + unsigned int *NeighborSolid, double *Vel, double rhoA, double rhoB, + double tauA, double tauB, double alpha, double beta, double Fx, double Fy, + double Fz, int strideY, int strideZ, int start, int finish, int Np); /** * \brief Color model collision based on AA even access pattern for D3Q19 @@ -660,9 +663,10 @@ extern "C" void ScaLBL_D3Q19_AAeven_Color( */ extern "C" void ScaLBL_D3Q19_AAodd_Color( int *NeighborList, int *Map, double *dist, double *Aq, double *Bq, - double *Den, double *Phi, unsigned int *NeighborSolid, double *Vel, double rhoA, double rhoB, - double tauA, double tauB, double alpha, double beta, double Fx, double Fy, - double Fz, int strideY, int strideZ, int start, int finish, int Np); + double *Den, double *Phi, unsigned int *NeighborSolid, double *Vel, + double rhoA, double rhoB, double tauA, double tauB, double alpha, + double beta, double Fx, double Fy, double Fz, int strideY, int strideZ, + int start, int finish, int Np); /** * \brief Compute phase field based on AA odd access pattern for D3Q19 @@ -1251,4 +1255,4 @@ class ScaLBL_Communicator { float *lattice_cx, *lattice_cy, *lattice_cz; //...................................................................................... }; -#endif +#endif \ No newline at end of file diff --git a/cpu/Greyscale.cpp b/cpu/Greyscale.cpp index f0d8edc5..4c43614d 100644 --- a/cpu/Greyscale.cpp +++ b/cpu/Greyscale.cpp @@ -16,11 +16,10 @@ */ #include -extern "C" void -ScaLBL_D3Q19_AAeven_Greyscale(double *dist, int start, int finish, int Np, - double rlx, double rlx_eff, double Gx, double Gy, - double Gz, double *Poros, double *Perm, - double *Velocity, double *Pressure) { +extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( + double *dist, int start, int finish, int Np, double rlx_eff, double rlx, + double Gx, double Gy, double Gz, double *Poros, double *Perm, + double *Velocity, double *Pressure, bool Forchheimer) { // conserved momemnts double rho, vx, vy, vz, v_mag; double ux, uy, uz, u_mag; @@ -31,9 +30,9 @@ ScaLBL_D3Q19_AAeven_Greyscale(double *dist, int start, int finish, int Np, f16, f17, f18; double GeoFun; //geometric function from Guo's PRE 66, 036304 (2002) double porosity; - double perm; //voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0 / rlx_eff - 0.5) / 3.0; //kinematic viscosity + double perm; //voxel permeability + double c0, c1; //Guo's model parameters + double viscosity = (1.0 / rlx - 0.5) / 3.0; //kinematic viscosity double Fx, Fy, Fz; //The total body force including Brinkman force and user-specified (Gx,Gy,Gz) @@ -62,10 +61,13 @@ ScaLBL_D3Q19_AAeven_Greyscale(double *dist, int start, int finish, int Np, porosity = Poros[n]; perm = Perm[n]; - c0 = 0.5 * (1.0 + porosity * 0.5 * mu_eff / perm); + c0 = 0.5 * (1.0 + porosity * 0.5 * viscosity / perm); if (porosity == 1.0) c0 = 0.5; //i.e. apparent pore nodes - GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + if (Forchheimer) + GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + else + GeoFun = 0; c1 = porosity * 0.5 * GeoFun / sqrt(perm); if (porosity == 1.0) c1 = 0.0; //i.e. apparent pore nodes @@ -86,11 +88,11 @@ ScaLBL_D3Q19_AAeven_Greyscale(double *dist, int start, int finish, int Np, u_mag = sqrt(ux * ux + uy * uy + uz * uz); //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = -porosity * mu_eff / perm * ux - + Fx = -porosity * viscosity / perm * ux - porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx; - Fy = -porosity * mu_eff / perm * uy - + Fy = -porosity * viscosity / perm * uy - porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy; - Fz = -porosity * mu_eff / perm * uz - + Fz = -porosity * viscosity / perm * uz - porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz; if (porosity == 1.0) { Fx = Gx; @@ -100,260 +102,260 @@ ScaLBL_D3Q19_AAeven_Greyscale(double *dist, int start, int finish, int Np, //------------------------ BGK collison where body force has higher-order terms ----------------------------------------------------------// // // q=0 - // dist[n] = f0*(1.0-rlx)+ rlx*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // + 0.3333333333333333*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // dist[n] = f0*(1.0-rlx_eff)+ rlx_eff*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // + 0.3333333333333333*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); // // // q = 1 - // dist[1*Np+n] = f1*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // dist[1*Np+n] = f1*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); // // // q=2 - // dist[2*Np+n] = f2*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(-3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // dist[2*Np+n] = f2*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(-3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); // // // q = 3 - // dist[3*Np+n] = f3*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // dist[3*Np+n] = f3*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); // // // q = 4 - // dist[4*Np+n] = f4*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // dist[4*Np+n] = f4*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); // // // q = 5 - // dist[5*Np+n] = f5*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(3. + (6.*uz)/porosity)); + // dist[5*Np+n] = f5*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(3. + (6.*uz)/porosity)); // // // q = 6 - // dist[6*Np+n] = f6*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) - // +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(-3. + (6.*uz)/porosity)); + // dist[6*Np+n] = f6*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(-3. + (6.*uz)/porosity)); // // // q = 7 - // dist[7*Np+n] = f7*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) + + // dist[7*Np+n] = f7*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) + // Fz*(0. - (3.*uz)/porosity)); // // // q = 8 - // dist[8*Np+n] = f8*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + Fy*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) + + // dist[8*Np+n] = f8*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + Fy*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) + // Fz*(0. - (3.*uz)/porosity)); // // // q = 9 - // dist[9*Np+n] = f9*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + Fy*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) + + // dist[9*Np+n] = f9*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + Fy*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) + // Fz*(0. - (3.*uz)/porosity)); // // // q = 10 - // dist[10*Np+n] = f10*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) + + // dist[10*Np+n] = f10*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) + // Fz*(0. - (3.*uz)/porosity)); // // // q = 11 - // dist[11*Np+n] = f11*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) + + // dist[11*Np+n] = f11*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) + // Fz*(3. - (3.*uz)/porosity + (9.*(ux + uz))/porosity)); // // // q = 12 - // dist[12*Np+n] = f12*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) + + // dist[12*Np+n] = f12*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) + // Fz*(-3. - (9.*(-ux - uz))/porosity - (3.*uz)/porosity)); // // // q = 13 - // dist[13*Np+n] = f13*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) + + // dist[13*Np+n] = f13*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) + // Fz*(-3. - (9.*(ux - uz))/porosity - (3.*uz)/porosity)); // // // q= 14 - // dist[14*Np+n] = f14*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) + + // dist[14*Np+n] = f14*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) + // Fz*(3. - (3.*uz)/porosity + (9.*(-ux + uz))/porosity)); // // // q = 15 - // dist[15*Np+n] = f15*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) + + // dist[15*Np+n] = f15*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) + // Fz*(3. - (3.*uz)/porosity + (9.*(uy + uz))/porosity)); // // // q = 16 - // dist[16*Np+n] = f16*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) + + // dist[16*Np+n] = f16*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) + // Fz*(-3. - (9.*(-uy - uz))/porosity - (3.*uz)/porosity)); // // // q = 17 - // dist[17*Np+n] = f17*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) + + // dist[17*Np+n] = f17*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) + // Fz*(-3. - (9.*(uy - uz))/porosity - (3.*uz)/porosity)); // // // q = 18 - // dist[18*Np+n] = f18*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) + + // dist[18*Np+n] = f18*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) + // Fz*(3. - (3.*uz)/porosity + (9.*(-uy + uz))/porosity)); //----------------------------------------------------------------------------------------------------------------------------------------// //------------------------ BGK collison where body force has NO higher-order terms ----------------------------------------------------------// // q=0 - dist[n] = f0 * (1.0 - rlx) + - rlx * 0.3333333333333333 * rho * + dist[n] = f0 * (1.0 - rlx_eff) + + rlx_eff * 0.3333333333333333 * rho * (1. - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity); // q = 1 dist[1 * Np + n] = - f1 * (1.0 - rlx) + - rlx * 0.05555555555555555 * rho * + f1 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * (1 + 3. * ux + (4.5 * ux * ux) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.05555555555555555 * rho * (1. - 0.5 * rlx) * (Fx * (3.)); + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fx * (3.)); // q=2 dist[2 * Np + n] = - f2 * (1.0 - rlx) + - rlx * 0.05555555555555555 * rho * + f2 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * (1 - 3. * ux + (4.5 * ux * ux) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.05555555555555555 * rho * (1. - 0.5 * rlx) * (Fx * (-3.)); + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fx * (-3.)); // q = 3 dist[3 * Np + n] = - f3 * (1.0 - rlx) + - rlx * 0.05555555555555555 * rho * + f3 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * (1 + 3. * uy + (4.5 * uy * uy) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.05555555555555555 * rho * (1. - 0.5 * rlx) * (Fy * (3.)); + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fy * (3.)); // q = 4 dist[4 * Np + n] = - f4 * (1.0 - rlx) + - rlx * 0.05555555555555555 * rho * + f4 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * (1 - 3. * uy + (4.5 * uy * uy) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.05555555555555555 * rho * (1. - 0.5 * rlx) * (Fy * (-3.)); + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fy * (-3.)); // q = 5 dist[5 * Np + n] = - f5 * (1.0 - rlx) + - rlx * 0.05555555555555555 * rho * + f5 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * (1 + 3. * uz + (4.5 * uz * uz) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.05555555555555555 * rho * (1. - 0.5 * rlx) * (Fz * (3.)); + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fz * (3.)); // q = 6 dist[6 * Np + n] = - f6 * (1.0 - rlx) + - rlx * 0.05555555555555555 * rho * + f6 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * (1 - 3. * uz + (4.5 * uz * uz) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.05555555555555555 * rho * (1. - 0.5 * rlx) * (Fz * (-3.)); + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fz * (-3.)); // q = 7 dist[7 * Np + n] = - f7 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f7 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (ux + uy) + (4.5 * (ux + uy) * (ux + uy)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (3.) + Fy * (3.)); // q = 8 dist[8 * Np + n] = - f8 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f8 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (-ux - uy) + (4.5 * (-ux - uy) * (-ux - uy)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (-3.) + Fy * (-3.)); // q = 9 dist[9 * Np + n] = - f9 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f9 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (ux - uy) + (4.5 * (ux - uy) * (ux - uy)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (3.) + Fy * (-3.)); // q = 10 dist[10 * Np + n] = - f10 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f10 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (-ux + uy) + (4.5 * (-ux + uy) * (-ux + uy)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (-3.) + Fy * (3.)); // q = 11 dist[11 * Np + n] = - f11 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f11 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (ux + uz) + (4.5 * (ux + uz) * (ux + uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (3.) + Fz * (3.)); // q = 12 dist[12 * Np + n] = - f12 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f12 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (-ux - uz) + (4.5 * (-ux - uz) * (-ux - uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (-3.) + Fz * (-3.)); // q = 13 dist[13 * Np + n] = - f13 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f13 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (ux - uz) + (4.5 * (ux - uz) * (ux - uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (3.) + Fz * (-3.)); // q= 14 dist[14 * Np + n] = - f14 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f14 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (-ux + uz) + (4.5 * (-ux + uz) * (-ux + uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (-3.) + Fz * (3.)); // q = 15 dist[15 * Np + n] = - f15 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f15 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (uy + uz) + (4.5 * (uy + uz) * (uy + uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fy * (3.) + Fz * (3.)); // q = 16 dist[16 * Np + n] = - f16 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f16 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (-uy - uz) + (4.5 * (-uy - uz) * (-uy - uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fy * (-3.) + Fz * (-3.)); // q = 17 dist[17 * Np + n] = - f17 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f17 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (uy - uz) + (4.5 * (uy - uz) * (uy - uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fy * (3.) + Fz * (-3.)); // q = 18 dist[18 * Np + n] = - f18 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f18 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (-uy + uz) + (4.5 * (-uy + uz) * (-uy + uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fy * (-3.) + Fz * (3.)); //-------------------------------------------------------------------------------------------------------------------------------------------// @@ -366,11 +368,10 @@ ScaLBL_D3Q19_AAeven_Greyscale(double *dist, int start, int finish, int Np, } } -extern "C" void -ScaLBL_D3Q19_AAodd_Greyscale(int *neighborList, double *dist, int start, - int finish, int Np, double rlx, double rlx_eff, - double Gx, double Gy, double Gz, double *Poros, - double *Perm, double *Velocity, double *Pressure) { +extern "C" void ScaLBL_D3Q19_AAodd_Greyscale( + int *neighborList, double *dist, int start, int finish, int Np, + double rlx_eff, double rlx, double Gx, double Gy, double Gz, double *Poros, + double *Perm, double *Velocity, double *Pressure, bool Forchheimer) { // conserved momemnts double rho, vx, vy, vz, v_mag; double ux, uy, uz, u_mag; @@ -383,9 +384,9 @@ ScaLBL_D3Q19_AAodd_Greyscale(int *neighborList, double *dist, int start, nr14, nr15, nr16, nr17, nr18; double GeoFun; //geometric function from Guo's PRE 66, 036304 (2002) double porosity; - double perm; //voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0 / rlx_eff - 0.5) / 3.0; //kinematic viscosity + double perm; //voxel permeability + double c0, c1; //Guo's model parameters + double viscosity = (1.0 / rlx - 0.5) / 3.0; //kinematic viscosity double Fx, Fy, Fz; //The total body force including Brinkman force and user-specified (Gx,Gy,Gz) @@ -468,10 +469,13 @@ ScaLBL_D3Q19_AAodd_Greyscale(int *neighborList, double *dist, int start, porosity = Poros[n]; perm = Perm[n]; - c0 = 0.5 * (1.0 + porosity * 0.5 * mu_eff / perm); + c0 = 0.5 * (1.0 + porosity * 0.5 * viscosity / perm); if (porosity == 1.0) c0 = 0.5; //i.e. apparent pore nodes - GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + if (Forchheimer) + GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + else + GeoFun = 0; c1 = porosity * 0.5 * GeoFun / sqrt(perm); if (porosity == 1.0) c1 = 0.0; //i.e. apparent pore nodes @@ -492,11 +496,11 @@ ScaLBL_D3Q19_AAodd_Greyscale(int *neighborList, double *dist, int start, u_mag = sqrt(ux * ux + uy * uy + uz * uz); //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = -porosity * mu_eff / perm * ux - + Fx = -porosity * viscosity / perm * ux - porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx; - Fy = -porosity * mu_eff / perm * uy - + Fy = -porosity * viscosity / perm * uy - porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy; - Fz = -porosity * mu_eff / perm * uz - + Fz = -porosity * viscosity / perm * uz - porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz; if (porosity == 1.0) { Fx = Gx; @@ -506,248 +510,254 @@ ScaLBL_D3Q19_AAodd_Greyscale(int *neighborList, double *dist, int start, //------------------------ BGK collison where body force has higher-order terms ----------------------------------------------------------// // // q=0 - // dist[n] = f0*(1.0-rlx) + rlx*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // + 0.3333333333333333*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // dist[n] = f0*(1.0-rlx_eff) + rlx_eff*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // + 0.3333333333333333*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); // // // q = 1 - // dist[nr2] = f1*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // dist[nr2] = f1*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); // // // q=2 - // dist[nr1] = f2*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(-3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // dist[nr1] = f2*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(-3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); // // // q = 3 - // dist[nr4] = f3*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // dist[nr4] = f3*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); // // // q = 4 - // dist[nr3] = f4*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // dist[nr3] = f4*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); // // // q = 5 - // dist[nr6] = f5*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(3. + (6.*uz)/porosity)); + // dist[nr6] = f5*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(3. + (6.*uz)/porosity)); // // // q = 6 - // dist[nr5] = f6*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) - // +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(-3. + (6.*uz)/porosity)); + // dist[nr5] = f6*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(-3. + (6.*uz)/porosity)); // // // q = 7 - // dist[nr8] = f7*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) + + // dist[nr8] = f7*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) + // Fz*(0. - (3.*uz)/porosity)); // // // q = 8 - // dist[nr7] = f8*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + Fy*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) + + // dist[nr7] = f8*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + Fy*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) + // Fz*(0. - (3.*uz)/porosity)); // // // q = 9 - // dist[nr10] = f9*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + Fy*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) + + // dist[nr10] = f9*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + Fy*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) + // Fz*(0. - (3.*uz)/porosity)); // // // q = 10 - // dist[nr9] = f10*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) + + // dist[nr9] = f10*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) + // Fz*(0. - (3.*uz)/porosity)); // // // q = 11 - // dist[nr12] = f11*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) + + // dist[nr12] = f11*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) + // Fz*(3. - (3.*uz)/porosity + (9.*(ux + uz))/porosity)); // // // q = 12 - // dist[nr11] = f12*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) + + // dist[nr11] = f12*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) + // Fz*(-3. - (9.*(-ux - uz))/porosity - (3.*uz)/porosity)); // // // q = 13 - // dist[nr14] = f13*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) + + // dist[nr14] = f13*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) + // Fz*(-3. - (9.*(ux - uz))/porosity - (3.*uz)/porosity)); // // // q= 14 - // dist[nr13] = f14*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) + + // dist[nr13] = f14*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) + // Fz*(3. - (3.*uz)/porosity + (9.*(-ux + uz))/porosity)); // // // q = 15 - // dist[nr16] = f15*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) + + // dist[nr16] = f15*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) + // Fz*(3. - (3.*uz)/porosity + (9.*(uy + uz))/porosity)); // // // q = 16 - // dist[nr15] = f16*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) + + // dist[nr15] = f16*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) + // Fz*(-3. - (9.*(-uy - uz))/porosity - (3.*uz)/porosity)); // // // q = 17 - // dist[nr18] = f17*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) + + // dist[nr18] = f17*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) + // Fz*(-3. - (9.*(uy - uz))/porosity - (3.*uz)/porosity)); // // // q = 18 - // dist[nr17] = f18*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - // +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) + + // dist[nr17] = f18*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) + // Fz*(3. - (3.*uz)/porosity + (9.*(-uy + uz))/porosity)); //----------------------------------------------------------------------------------------------------------------------------------------// //------------------------ BGK collison where body force has NO higher-order terms ----------------------------------------------------------// // q=0 - dist[n] = f0 * (1.0 - rlx) + - rlx * 0.3333333333333333 * rho * + dist[n] = f0 * (1.0 - rlx_eff) + + rlx_eff * 0.3333333333333333 * rho * (1. - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity); // q = 1 - dist[nr2] = f1 * (1.0 - rlx) + - rlx * 0.05555555555555555 * rho * - (1 + 3. * ux + (4.5 * ux * ux) / porosity - - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.05555555555555555 * rho * (1. - 0.5 * rlx) * (Fx * (3.)); + dist[nr2] = + f1 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 + 3. * ux + (4.5 * ux * ux) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fx * (3.)); // q=2 - dist[nr1] = f2 * (1.0 - rlx) + - rlx * 0.05555555555555555 * rho * - (1 - 3. * ux + (4.5 * ux * ux) / porosity - - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.05555555555555555 * rho * (1. - 0.5 * rlx) * (Fx * (-3.)); + dist[nr1] = + f2 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 - 3. * ux + (4.5 * ux * ux) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fx * (-3.)); // q = 3 - dist[nr4] = f3 * (1.0 - rlx) + - rlx * 0.05555555555555555 * rho * - (1 + 3. * uy + (4.5 * uy * uy) / porosity - - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.05555555555555555 * rho * (1. - 0.5 * rlx) * (Fy * (3.)); + dist[nr4] = + f3 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 + 3. * uy + (4.5 * uy * uy) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fy * (3.)); // q = 4 - dist[nr3] = f4 * (1.0 - rlx) + - rlx * 0.05555555555555555 * rho * - (1 - 3. * uy + (4.5 * uy * uy) / porosity - - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.05555555555555555 * rho * (1. - 0.5 * rlx) * (Fy * (-3.)); + dist[nr3] = + f4 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 - 3. * uy + (4.5 * uy * uy) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fy * (-3.)); // q = 5 - dist[nr6] = f5 * (1.0 - rlx) + - rlx * 0.05555555555555555 * rho * - (1 + 3. * uz + (4.5 * uz * uz) / porosity - - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.05555555555555555 * rho * (1. - 0.5 * rlx) * (Fz * (3.)); + dist[nr6] = + f5 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 + 3. * uz + (4.5 * uz * uz) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fz * (3.)); // q = 6 - dist[nr5] = f6 * (1.0 - rlx) + - rlx * 0.05555555555555555 * rho * - (1 - 3. * uz + (4.5 * uz * uz) / porosity - - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.05555555555555555 * rho * (1. - 0.5 * rlx) * (Fz * (-3.)); + dist[nr5] = + f6 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 - 3. * uz + (4.5 * uz * uz) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fz * (-3.)); // q = 7 dist[nr8] = - f7 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f7 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (ux + uy) + (4.5 * (ux + uy) * (ux + uy)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (3.) + Fy * (3.)); // q = 8 - dist[nr7] = f8 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + dist[nr7] = f8 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (-ux - uy) + (4.5 * (-ux - uy) * (-ux - uy)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (-3.) + Fy * (-3.)); // q = 9 dist[nr10] = - f9 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f9 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (ux - uy) + (4.5 * (ux - uy) * (ux - uy)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (3.) + Fy * (-3.)); // q = 10 - dist[nr9] = f10 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + dist[nr9] = f10 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (-ux + uy) + (4.5 * (-ux + uy) * (-ux + uy)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (-3.) + Fy * (3.)); // q = 11 dist[nr12] = - f11 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f11 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (ux + uz) + (4.5 * (ux + uz) * (ux + uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (3.) + Fz * (3.)); // q = 12 - dist[nr11] = f12 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + dist[nr11] = f12 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (-ux - uz) + (4.5 * (-ux - uz) * (-ux - uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (-3.) + Fz * (-3.)); // q = 13 dist[nr14] = - f13 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f13 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (ux - uz) + (4.5 * (ux - uz) * (ux - uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (3.) + Fz * (-3.)); // q= 14 - dist[nr13] = f14 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + dist[nr13] = f14 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (-ux + uz) + (4.5 * (-ux + uz) * (-ux + uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fx * (-3.) + Fz * (3.)); // q = 15 dist[nr16] = - f15 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f15 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (uy + uz) + (4.5 * (uy + uz) * (uy + uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fy * (3.) + Fz * (3.)); // q = 16 - dist[nr15] = f16 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + dist[nr15] = f16 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (-uy - uz) + (4.5 * (-uy - uz) * (-uy - uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fy * (-3.) + Fz * (-3.)); // q = 17 dist[nr18] = - f17 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + f17 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (uy - uz) + (4.5 * (uy - uz) * (uy - uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fy * (3.) + Fz * (-3.)); // q = 18 - dist[nr17] = f18 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + dist[nr17] = f18 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * (1 + 3. * (-uy + uz) + (4.5 * (-uy + uz) * (-uy + uz)) / porosity - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + - 0.027777777777777776 * rho * (1. - 0.5 * rlx) * + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * (Fy * (-3.) + Fz * (3.)); //-------------------------------------------------------------------------------------------------------------------------------------------// @@ -761,9 +771,9 @@ ScaLBL_D3Q19_AAodd_Greyscale(int *neighborList, double *dist, int start, } extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT( - double *dist, int start, int finish, int Np, double rlx, double rlx_eff, + double *dist, int start, int finish, int Np, double rlx_eff, double rlx, double Gx, double Gy, double Gz, double *Poros, double *Perm, - double *Velocity, double Den, double *Pressure) { + double *Velocity, double Den, double *Pressure, bool Forchheimer) { double vx, vy, vz, v_mag; double ux, uy, uz, u_mag; double pressure; //defined for this incompressible model @@ -775,13 +785,13 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT( //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; double GeoFun; //geometric function from Guo's PRE 66, 036304 (2002) double porosity; - double perm; //voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0 / rlx_eff - 0.5) / 3.0; //kinematic viscosity + double perm; //voxel permeability + double c0, c1; //Guo's model parameters + double viscosity = (1.0 / rlx - 0.5) / 3.0; //kinematic viscosity double Fx, Fy, Fz; //The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double rlx_setA = rlx; - double rlx_setB = 8.f * (2.f - rlx_setA) / (8.f - rlx_setA); + double rlx_eff_setA = rlx_eff; + double rlx_eff_setB = 8.f * (2.f - rlx_eff_setA) / (8.f - rlx_eff_setA); const double mrt_V1 = 0.05263157894736842; const double mrt_V2 = 0.012531328320802; @@ -1075,10 +1085,13 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT( porosity = Poros[n]; perm = Perm[n]; - c0 = 0.5 * (1.0 + porosity * 0.5 * mu_eff / perm); + c0 = 0.5 * (1.0 + porosity * 0.5 * viscosity / perm); if (porosity == 1.0) c0 = 0.5; //i.e. apparent pore nodes - GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + if (Forchheimer) + GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + else + GeoFun = 0; c1 = porosity * 0.5 * GeoFun / sqrt(perm); if (porosity == 1.0) c1 = 0.0; //i.e. apparent pore nodes @@ -1094,13 +1107,13 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT( //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium Fx = - Den * (-porosity * mu_eff / perm * ux - + Den * (-porosity * viscosity / perm * ux - porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx); Fy = - Den * (-porosity * mu_eff / perm * uy - + Den * (-porosity * viscosity / perm * uy - porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy); Fz = - Den * (-porosity * mu_eff / perm * uz - + Den * (-porosity * viscosity / perm * uz - porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz); if (porosity == 1.0) { Fx = Den * Gx; @@ -1114,75 +1127,76 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT( //-------------------- IMRT collison where body force has higher-order terms -------------// // //..............carry out relaxation process............................................... - // m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) - // + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; - // m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) - // + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; + // m1 = m1 + rlx_eff_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) + // + (1-0.5*rlx_eff_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; + // m2 = m2 + rlx_eff_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) + // + (1-0.5*rlx_eff_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; // jx = jx + Fx; - // m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) - // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + // m4 = m4 + rlx_eff_setB*((-0.6666666666666666*ux*Den) - m4) + // + (1-0.5*rlx_eff_setB)*(-0.6666666666666666*Fx); // jy = jy + Fy; - // m6 = m6 + rlx_setB*((-0.6666666666666666*uy*Den) - m6) - // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + // m6 = m6 + rlx_eff_setB*((-0.6666666666666666*uy*Den) - m6) + // + (1-0.5*rlx_eff_setB)*(-0.6666666666666666*Fy); // jz = jz + Fz; - // m8 = m8 + rlx_setB*((-0.6666666666666666*uz*Den) - m8) - // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - // m9 = m9 + rlx_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) - // + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; - // m10 = m10 + rlx_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) - // + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; - // m11 = m11 + rlx_setA*((Den*(uy*uy-uz*uz)/porosity) - m11) - // + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; - // m12 = m12 + rlx_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12) - // + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; - // m13 = m13 + rlx_setA*((Den*ux*uy/porosity) - m13) - // + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; - // m14 = m14 + rlx_setA*((Den*uy*uz/porosity) - m14) - // + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; - // m15 = m15 + rlx_setA*((Den*ux*uz/porosity) - m15) - // + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; - // m16 = m16 + rlx_setB*( - m16); - // m17 = m17 + rlx_setB*( - m17); - // m18 = m18 + rlx_setB*( - m18); + // m8 = m8 + rlx_eff_setB*((-0.6666666666666666*uz*Den) - m8) + // + (1-0.5*rlx_eff_setB)*(-0.6666666666666666*Fz); + // m9 = m9 + rlx_eff_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) + // + (1-0.5*rlx_eff_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; + // m10 = m10 + rlx_eff_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) + // + (1-0.5*rlx_eff_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; + // m11 = m11 + rlx_eff_setA*((Den*(uy*uy-uz*uz)/porosity) - m11) + // + (1-0.5*rlx_eff_setA)*(2*Fy*uy-2*Fz*uz)/porosity; + // m12 = m12 + rlx_eff_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12) + // + (1-0.5*rlx_eff_setA)*(-Fy*uy+Fz*uz)/porosity; + // m13 = m13 + rlx_eff_setA*((Den*ux*uy/porosity) - m13) + // + (1-0.5*rlx_eff_setA)*(Fy*ux+Fx*uy)/porosity; + // m14 = m14 + rlx_eff_setA*((Den*uy*uz/porosity) - m14) + // + (1-0.5*rlx_eff_setA)*(Fz*uy+Fy*uz)/porosity; + // m15 = m15 + rlx_eff_setA*((Den*ux*uz/porosity) - m15) + // + (1-0.5*rlx_eff_setA)*(Fz*ux+Fx*uz)/porosity; + // m16 = m16 + rlx_eff_setB*( - m16); + // m17 = m17 + rlx_eff_setB*( - m17); + // m18 = m18 + rlx_eff_setB*( - m18); // //....................................................................................................... //-------------------- IMRT collison where body force has NO higher-order terms -------------// //..............carry out relaxation process............................................... - m1 = m1 + - rlx_setA * ((-30 * Den + - 19 * Den * (ux * ux + uy * uy + uz * uz) / porosity + - 57 * pressure * porosity) - - m1); - m2 = m2 + - rlx_setA * ((12 * Den - - 5.5 * Den * (ux * ux + uy * uy + uz * uz) / porosity - - 27 * pressure * porosity) - - m2); + m1 = m1 + rlx_eff_setA * + ((-30 * Den + + 19 * Den * (ux * ux + uy * uy + uz * uz) / porosity + + 57 * pressure * porosity) - + m1); + m2 = m2 + rlx_eff_setA * + ((12 * Den - + 5.5 * Den * (ux * ux + uy * uy + uz * uz) / porosity - + 27 * pressure * porosity) - + m2); jx = jx + Fx; - m4 = m4 + rlx_setB * ((-0.6666666666666666 * ux * Den) - m4) + - (1 - 0.5 * rlx_setB) * (-0.6666666666666666 * Fx); + m4 = m4 + rlx_eff_setB * ((-0.6666666666666666 * ux * Den) - m4) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fx); jy = jy + Fy; - m6 = m6 + rlx_setB * ((-0.6666666666666666 * uy * Den) - m6) + - (1 - 0.5 * rlx_setB) * (-0.6666666666666666 * Fy); + m6 = m6 + rlx_eff_setB * ((-0.6666666666666666 * uy * Den) - m6) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fy); jz = jz + Fz; - m8 = m8 + rlx_setB * ((-0.6666666666666666 * uz * Den) - m8) + - (1 - 0.5 * rlx_setB) * (-0.6666666666666666 * Fz); + m8 = m8 + rlx_eff_setB * ((-0.6666666666666666 * uz * Den) - m8) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fz); m9 = m9 + - rlx_setA * + rlx_eff_setA * ((Den * (2 * ux * ux - uy * uy - uz * uz) / porosity) - m9); m10 = m10 + - rlx_setA * + rlx_eff_setA * (-0.5 * Den * ((2 * ux * ux - uy * uy - uz * uz) / porosity) - m10); - m11 = m11 + rlx_setA * ((Den * (uy * uy - uz * uz) / porosity) - m11); - m12 = m12 + - rlx_setA * (-0.5 * (Den * (uy * uy - uz * uz) / porosity) - m12); - m13 = m13 + rlx_setA * ((Den * ux * uy / porosity) - m13); - m14 = m14 + rlx_setA * ((Den * uy * uz / porosity) - m14); - m15 = m15 + rlx_setA * ((Den * ux * uz / porosity) - m15); - m16 = m16 + rlx_setB * (-m16); - m17 = m17 + rlx_setB * (-m17); - m18 = m18 + rlx_setB * (-m18); + m11 = + m11 + rlx_eff_setA * ((Den * (uy * uy - uz * uz) / porosity) - m11); + m12 = m12 + rlx_eff_setA * + (-0.5 * (Den * (uy * uy - uz * uz) / porosity) - m12); + m13 = m13 + rlx_eff_setA * ((Den * ux * uy / porosity) - m13); + m14 = m14 + rlx_eff_setA * ((Den * uy * uz / porosity) - m14); + m15 = m15 + rlx_eff_setA * ((Den * ux * uz / porosity) - m15); + m16 = m16 + rlx_eff_setB * (-m16); + m17 = m17 + rlx_eff_setB * (-m17); + m18 = m18 + rlx_eff_setB * (-m18); //....................................................................................................... //.................inverse transformation...................................................... @@ -1303,9 +1317,10 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT( } extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT( - int *neighborList, double *dist, int start, int finish, int Np, double rlx, - double rlx_eff, double Gx, double Gy, double Gz, double *Poros, - double *Perm, double *Velocity, double Den, double *Pressure) { + int *neighborList, double *dist, int start, int finish, int Np, + double rlx_eff, double rlx, double Gx, double Gy, double Gz, double *Poros, + double *Perm, double *Velocity, double Den, double *Pressure, + bool Forchheimer) { int nread; double vx, vy, vz, v_mag; double ux, uy, uz, u_mag; @@ -1318,13 +1333,13 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT( //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; double GeoFun; //geometric function from Guo's PRE 66, 036304 (2002) double porosity; - double perm; //voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0 / rlx_eff - 0.5) / 3.0; //kinematic viscosity + double perm; //voxel permeability + double c0, c1; //Guo's model parameters + double viscosity = (1.0 / rlx - 0.5) / 3.0; //kinematic viscosity double Fx, Fy, Fz; //The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double rlx_setA = rlx; - double rlx_setB = 8.f * (2.f - rlx_setA) / (8.f - rlx_setA); + double rlx_eff_setA = rlx_eff; + double rlx_eff_setB = 8.f * (2.f - rlx_eff_setA) / (8.f - rlx_eff_setA); const double mrt_V1 = 0.05263157894736842; const double mrt_V2 = 0.012531328320802; @@ -1638,10 +1653,13 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT( porosity = Poros[n]; perm = Perm[n]; - c0 = 0.5 * (1.0 + porosity * 0.5 * mu_eff / perm); + c0 = 0.5 * (1.0 + porosity * 0.5 * viscosity / perm); if (porosity == 1.0) c0 = 0.5; //i.e. apparent pore nodes - GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + if (Forchheimer) + GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + else + GeoFun = 0; c1 = porosity * 0.5 * GeoFun / sqrt(perm); if (porosity == 1.0) c1 = 0.0; //i.e. apparent pore nodes @@ -1657,13 +1675,13 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT( //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium Fx = - Den * (-porosity * mu_eff / perm * ux - + Den * (-porosity * viscosity / perm * ux - porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx); Fy = - Den * (-porosity * mu_eff / perm * uy - + Den * (-porosity * viscosity / perm * uy - porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy); Fz = - Den * (-porosity * mu_eff / perm * uz - + Den * (-porosity * viscosity / perm * uz - porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz); if (porosity == 1.0) { Fx = Den * Gx; @@ -1677,75 +1695,76 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT( //-------------------- IMRT collison where body force has higher-order terms -------------// // //..............carry out relaxation process............................................... - // m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) - // + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; - // m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) - // + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; + // m1 = m1 + rlx_eff_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) + // + (1-0.5*rlx_eff_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; + // m2 = m2 + rlx_eff_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) + // + (1-0.5*rlx_eff_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; // jx = jx + Fx; - // m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) - // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + // m4 = m4 + rlx_eff_setB*((-0.6666666666666666*ux*Den) - m4) + // + (1-0.5*rlx_eff_setB)*(-0.6666666666666666*Fx); // jy = jy + Fy; - // m6 = m6 + rlx_setB*((-0.6666666666666666*uy*Den) - m6) - // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + // m6 = m6 + rlx_eff_setB*((-0.6666666666666666*uy*Den) - m6) + // + (1-0.5*rlx_eff_setB)*(-0.6666666666666666*Fy); // jz = jz + Fz; - // m8 = m8 + rlx_setB*((-0.6666666666666666*uz*Den) - m8) - // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - // m9 = m9 + rlx_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) - // + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; - // m10 = m10 + rlx_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) - // + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; - // m11 = m11 + rlx_setA*((Den*(uy*uy-uz*uz)/porosity) - m11) - // + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; - // m12 = m12 + rlx_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12) - // + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; - // m13 = m13 + rlx_setA*((Den*ux*uy/porosity) - m13) - // + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; - // m14 = m14 + rlx_setA*((Den*uy*uz/porosity) - m14) - // + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; - // m15 = m15 + rlx_setA*((Den*ux*uz/porosity) - m15) - // + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; - // m16 = m16 + rlx_setB*( - m16); - // m17 = m17 + rlx_setB*( - m17); - // m18 = m18 + rlx_setB*( - m18); + // m8 = m8 + rlx_eff_setB*((-0.6666666666666666*uz*Den) - m8) + // + (1-0.5*rlx_eff_setB)*(-0.6666666666666666*Fz); + // m9 = m9 + rlx_eff_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) + // + (1-0.5*rlx_eff_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; + // m10 = m10 + rlx_eff_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) + // + (1-0.5*rlx_eff_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; + // m11 = m11 + rlx_eff_setA*((Den*(uy*uy-uz*uz)/porosity) - m11) + // + (1-0.5*rlx_eff_setA)*(2*Fy*uy-2*Fz*uz)/porosity; + // m12 = m12 + rlx_eff_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12) + // + (1-0.5*rlx_eff_setA)*(-Fy*uy+Fz*uz)/porosity; + // m13 = m13 + rlx_eff_setA*((Den*ux*uy/porosity) - m13) + // + (1-0.5*rlx_eff_setA)*(Fy*ux+Fx*uy)/porosity; + // m14 = m14 + rlx_eff_setA*((Den*uy*uz/porosity) - m14) + // + (1-0.5*rlx_eff_setA)*(Fz*uy+Fy*uz)/porosity; + // m15 = m15 + rlx_eff_setA*((Den*ux*uz/porosity) - m15) + // + (1-0.5*rlx_eff_setA)*(Fz*ux+Fx*uz)/porosity; + // m16 = m16 + rlx_eff_setB*( - m16); + // m17 = m17 + rlx_eff_setB*( - m17); + // m18 = m18 + rlx_eff_setB*( - m18); // //....................................................................................................... //-------------------- IMRT collison where body force has NO higher-order terms -------------// //..............carry out relaxation process............................................... - m1 = m1 + - rlx_setA * ((-30 * Den + - 19 * Den * (ux * ux + uy * uy + uz * uz) / porosity + - 57 * pressure * porosity) - - m1); - m2 = m2 + - rlx_setA * ((12 * Den - - 5.5 * Den * (ux * ux + uy * uy + uz * uz) / porosity - - 27 * pressure * porosity) - - m2); + m1 = m1 + rlx_eff_setA * + ((-30 * Den + + 19 * Den * (ux * ux + uy * uy + uz * uz) / porosity + + 57 * pressure * porosity) - + m1); + m2 = m2 + rlx_eff_setA * + ((12 * Den - + 5.5 * Den * (ux * ux + uy * uy + uz * uz) / porosity - + 27 * pressure * porosity) - + m2); jx = jx + Fx; - m4 = m4 + rlx_setB * ((-0.6666666666666666 * ux * Den) - m4) + - (1 - 0.5 * rlx_setB) * (-0.6666666666666666 * Fx); + m4 = m4 + rlx_eff_setB * ((-0.6666666666666666 * ux * Den) - m4) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fx); jy = jy + Fy; - m6 = m6 + rlx_setB * ((-0.6666666666666666 * uy * Den) - m6) + - (1 - 0.5 * rlx_setB) * (-0.6666666666666666 * Fy); + m6 = m6 + rlx_eff_setB * ((-0.6666666666666666 * uy * Den) - m6) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fy); jz = jz + Fz; - m8 = m8 + rlx_setB * ((-0.6666666666666666 * uz * Den) - m8) + - (1 - 0.5 * rlx_setB) * (-0.6666666666666666 * Fz); + m8 = m8 + rlx_eff_setB * ((-0.6666666666666666 * uz * Den) - m8) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fz); m9 = m9 + - rlx_setA * + rlx_eff_setA * ((Den * (2 * ux * ux - uy * uy - uz * uz) / porosity) - m9); m10 = m10 + - rlx_setA * + rlx_eff_setA * (-0.5 * Den * ((2 * ux * ux - uy * uy - uz * uz) / porosity) - m10); - m11 = m11 + rlx_setA * ((Den * (uy * uy - uz * uz) / porosity) - m11); - m12 = m12 + - rlx_setA * (-0.5 * (Den * (uy * uy - uz * uz) / porosity) - m12); - m13 = m13 + rlx_setA * ((Den * ux * uy / porosity) - m13); - m14 = m14 + rlx_setA * ((Den * uy * uz / porosity) - m14); - m15 = m15 + rlx_setA * ((Den * ux * uz / porosity) - m15); - m16 = m16 + rlx_setB * (-m16); - m17 = m17 + rlx_setB * (-m17); - m18 = m18 + rlx_setB * (-m18); + m11 = + m11 + rlx_eff_setA * ((Den * (uy * uy - uz * uz) / porosity) - m11); + m12 = m12 + rlx_eff_setA * + (-0.5 * (Den * (uy * uy - uz * uz) / porosity) - m12); + m13 = m13 + rlx_eff_setA * ((Den * ux * uy / porosity) - m13); + m14 = m14 + rlx_eff_setA * ((Den * uy * uz / porosity) - m14); + m15 = m15 + rlx_eff_setA * ((Den * ux * uz / porosity) - m15); + m16 = m16 + rlx_eff_setB * (-m16); + m17 = m17 + rlx_eff_setB * (-m17); + m18 = m18 + rlx_eff_setB * (-m18); //....................................................................................................... //.................inverse transformation...................................................... @@ -1883,10 +1902,12 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT( } } -extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT( - int *neighborList, double *dist, int start, int finish, int Np, double rlx, - double rlx_eff, double Gx, double Gy, double Gz, double *Poros, - double *Perm, double *Velocity, double rho0, double *Pressure) { +extern "C" void +ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, + int finish, int Np, double rlx_eff, double rlx, + double Gx, double Gy, double Gz, double *Poros, + double *Perm, double *Velocity, double rho0, + double *Pressure, bool Forchheimer) { int nread; int nr1, nr2, nr3, nr4, nr5, nr6; @@ -1903,13 +1924,13 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT( //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; double GeoFun; //geometric function from Guo's PRE 66, 036304 (2002) double porosity; - double perm; //voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0 / rlx_eff - 0.5) / 3.0; //kinematic viscosity + double perm; //voxel permeability + double c0, c1; //Guo's model parameters + double viscosity = (1.0 / rlx - 0.5) / 3.0; //kinematic viscosity double Fx, Fy, Fz; //The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double rlx_setA = rlx; - double rlx_setB = 8.f * (2.f - rlx_setA) / (8.f - rlx_setA); + double rlx_eff_setA = rlx_eff; + double rlx_eff_setB = 8.f * (2.f - rlx_eff_setA) / (8.f - rlx_eff_setA); const double mrt_V1 = 0.05263157894736842; const double mrt_V2 = 0.012531328320802; @@ -2254,10 +2275,13 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT( porosity = Poros[n]; perm = Perm[n]; - c0 = 0.5 * (1.0 + porosity * 0.5 * mu_eff / perm); + c0 = 0.5 * (1.0 + porosity * 0.5 * viscosity / perm); if (porosity == 1.0) c0 = 0.5; //i.e. apparent pore nodes - GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + if (Forchheimer) + GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + else + GeoFun = 0; c1 = porosity * 0.5 * GeoFun / sqrt(perm); if (porosity == 1.0) c1 = 0.0; //i.e. apparent pore nodes @@ -2273,13 +2297,13 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT( //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium Fx = rho0 * - (-porosity * mu_eff / perm * ux - + (-porosity * viscosity / perm * ux - porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx); Fy = rho0 * - (-porosity * mu_eff / perm * uy - + (-porosity * viscosity / perm * uy - porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy); Fz = rho0 * - (-porosity * mu_eff / perm * uz - + (-porosity * viscosity / perm * uz - porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz); if (porosity == 1.0) { Fx = rho0 * Gx; @@ -2293,36 +2317,38 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT( pressure = rho / 3.f; //-------------------- MRT collison where body force has NO higher-order terms -------------// - m1 = m1 + - rlx_setA * ((19 * (ux * ux + uy * uy + uz * uz) * rho0 / porosity - - 11 * rho) - - m1); - m2 = m2 + rlx_setA * ((3 * rho - 5.5 * (ux * ux + uy * uy + uz * uz) * - rho0 / porosity) - - m2); + m1 = m1 + rlx_eff_setA * + ((19 * (ux * ux + uy * uy + uz * uz) * rho0 / porosity - + 11 * rho) - + m1); + m2 = m2 + + rlx_eff_setA * ((3 * rho - 5.5 * (ux * ux + uy * uy + uz * uz) * + rho0 / porosity) - + m2); jx = jx + Fx; - m4 = m4 + rlx_setB * ((-0.6666666666666666 * ux * rho0) - m4) + - (1 - 0.5 * rlx_setB) * (-0.6666666666666666 * Fx); + m4 = m4 + rlx_eff_setB * ((-0.6666666666666666 * ux * rho0) - m4) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fx); jy = jy + Fy; - m6 = m6 + rlx_setB * ((-0.6666666666666666 * uy * rho0) - m6) + - (1 - 0.5 * rlx_setB) * (-0.6666666666666666 * Fy); + m6 = m6 + rlx_eff_setB * ((-0.6666666666666666 * uy * rho0) - m6) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fy); jz = jz + Fz; - m8 = m8 + rlx_setB * ((-0.6666666666666666 * uz * rho0) - m8) + - (1 - 0.5 * rlx_setB) * (-0.6666666666666666 * Fz); + m8 = m8 + rlx_eff_setB * ((-0.6666666666666666 * uz * rho0) - m8) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fz); m9 = m9 + - rlx_setA * + rlx_eff_setA * (((2 * ux * ux - uy * uy - uz * uz) * rho0 / porosity) - m9); - m10 = m10 + rlx_setA * (-m10); - //m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA * (((uy * uy - uz * uz) * rho0 / porosity) - m11); - m12 = m12 + rlx_setA * (-m12); - //m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA * ((ux * uy * rho0 / porosity) - m13); - m14 = m14 + rlx_setA * ((uy * uz * rho0 / porosity) - m14); - m15 = m15 + rlx_setA * ((ux * uz * rho0 / porosity) - m15); - m16 = m16 + rlx_setB * (-m16); - m17 = m17 + rlx_setB * (-m17); - m18 = m18 + rlx_setB * (-m18); + m10 = m10 + rlx_eff_setA * (-m10); + //m10 = m10 + rlx_eff_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + + rlx_eff_setA * (((uy * uy - uz * uz) * rho0 / porosity) - m11); + m12 = m12 + rlx_eff_setA * (-m12); + //m12 = m12 + rlx_eff_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_eff_setA * ((ux * uy * rho0 / porosity) - m13); + m14 = m14 + rlx_eff_setA * ((uy * uz * rho0 / porosity) - m14); + m15 = m15 + rlx_eff_setA * ((ux * uz * rho0 / porosity) - m15); + m16 = m16 + rlx_eff_setB * (-m16); + m17 = m17 + rlx_eff_setB * (-m17); + m18 = m18 + rlx_eff_setB * (-m18); //....................................................................................................... //.................inverse transformation...................................................... @@ -2461,9 +2487,9 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT( } extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT( - double *dist, int start, int finish, int Np, double rlx, double rlx_eff, + double *dist, int start, int finish, int Np, double rlx_eff, double rlx, double Gx, double Gy, double Gz, double *Poros, double *Perm, - double *Velocity, double rho0, double *Pressure) { + double *Velocity, double rho0, double *Pressure, bool Forchheimer) { double vx, vy, vz, v_mag; double ux, uy, uz, u_mag; @@ -2476,13 +2502,13 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT( //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; double GeoFun; //geometric function from Guo's PRE 66, 036304 (2002) double porosity; - double perm; //voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0 / rlx_eff - 0.5) / 3.0; //kinematic viscosity + double perm; //voxel permeability + double c0, c1; //Guo's model parameters + double viscosity = (1.0 / rlx - 0.5) / 3.0; //kinematic viscosity double Fx, Fy, Fz; //The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double rlx_setA = rlx; - double rlx_setB = 8.f * (2.f - rlx_setA) / (8.f - rlx_setA); + double rlx_eff_setA = rlx_eff; + double rlx_eff_setB = 8.f * (2.f - rlx_eff_setA) / (8.f - rlx_eff_setA); const double mrt_V1 = 0.05263157894736842; const double mrt_V2 = 0.012531328320802; @@ -2776,10 +2802,13 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT( porosity = Poros[n]; perm = Perm[n]; - c0 = 0.5 * (1.0 + porosity * 0.5 * mu_eff / perm); + c0 = 0.5 * (1.0 + porosity * 0.5 * viscosity / perm); if (porosity == 1.0) c0 = 0.5; //i.e. apparent pore nodes - GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + if (Forchheimer) + GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + else + GeoFun = 0; c1 = porosity * 0.5 * GeoFun / sqrt(perm); if (porosity == 1.0) c1 = 0.0; //i.e. apparent pore nodes @@ -2795,13 +2824,13 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT( //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium Fx = rho0 * - (-porosity * mu_eff / perm * ux - + (-porosity * viscosity / perm * ux - porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx); Fy = rho0 * - (-porosity * mu_eff / perm * uy - + (-porosity * viscosity / perm * uy - porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy); Fz = rho0 * - (-porosity * mu_eff / perm * uz - + (-porosity * viscosity / perm * uz - porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz); if (porosity == 1.0) { Fx = rho0 * Gx; @@ -2814,36 +2843,38 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT( pressure = rho / 3.f; //-------------------- IMRT collison where body force has NO higher-order terms -------------// - m1 = m1 + - rlx_setA * ((19 * (ux * ux + uy * uy + uz * uz) * rho0 / porosity - - 11 * rho) - - m1); - m2 = m2 + rlx_setA * ((3 * rho - 5.5 * (ux * ux + uy * uy + uz * uz) * - rho0 / porosity) - - m2); + m1 = m1 + rlx_eff_setA * + ((19 * (ux * ux + uy * uy + uz * uz) * rho0 / porosity - + 11 * rho) - + m1); + m2 = m2 + + rlx_eff_setA * ((3 * rho - 5.5 * (ux * ux + uy * uy + uz * uz) * + rho0 / porosity) - + m2); jx = jx + Fx; - m4 = m4 + rlx_setB * ((-0.6666666666666666 * ux * rho0) - m4) + - (1 - 0.5 * rlx_setB) * (-0.6666666666666666 * Fx); + m4 = m4 + rlx_eff_setB * ((-0.6666666666666666 * ux * rho0) - m4) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fx); jy = jy + Fy; - m6 = m6 + rlx_setB * ((-0.6666666666666666 * uy * rho0) - m6) + - (1 - 0.5 * rlx_setB) * (-0.6666666666666666 * Fy); + m6 = m6 + rlx_eff_setB * ((-0.6666666666666666 * uy * rho0) - m6) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fy); jz = jz + Fz; - m8 = m8 + rlx_setB * ((-0.6666666666666666 * uz * rho0) - m8) + - (1 - 0.5 * rlx_setB) * (-0.6666666666666666 * Fz); + m8 = m8 + rlx_eff_setB * ((-0.6666666666666666 * uz * rho0) - m8) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fz); m9 = m9 + - rlx_setA * + rlx_eff_setA * (((2 * ux * ux - uy * uy - uz * uz) * rho0 / porosity) - m9); - m10 = m10 + rlx_setA * (-m10); - //m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA * (((uy * uy - uz * uz) * rho0 / porosity) - m11); - m12 = m12 + rlx_setA * (-m12); - //m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA * ((ux * uy * rho0 / porosity) - m13); - m14 = m14 + rlx_setA * ((uy * uz * rho0 / porosity) - m14); - m15 = m15 + rlx_setA * ((ux * uz * rho0 / porosity) - m15); - m16 = m16 + rlx_setB * (-m16); - m17 = m17 + rlx_setB * (-m17); - m18 = m18 + rlx_setB * (-m18); + m10 = m10 + rlx_eff_setA * (-m10); + //m10 = m10 + rlx_eff_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + + rlx_eff_setA * (((uy * uy - uz * uz) * rho0 / porosity) - m11); + m12 = m12 + rlx_eff_setA * (-m12); + //m12 = m12 + rlx_eff_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_eff_setA * ((ux * uy * rho0 / porosity) - m13); + m14 = m14 + rlx_eff_setA * ((uy * uz * rho0 / porosity) - m14); + m15 = m15 + rlx_eff_setA * ((ux * uz * rho0 / porosity) - m15); + m16 = m16 + rlx_eff_setB * (-m16); + m17 = m17 + rlx_eff_setB * (-m17); + m18 = m18 + rlx_eff_setB * (-m18); //....................................................................................................... //.................inverse transformation...................................................... @@ -2987,4 +3018,4 @@ extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den) { dist[17 * Np + n] = 0.0277777777777778; //double(100*n)+17.f; dist[18 * Np + n] = 0.0277777777777778; //double(100*n)+18.f; } -} +} \ No newline at end of file diff --git a/cuda/Greyscale.cu b/cuda/Greyscale.cu index eecdd6bb..bf3fc5ce 100644 --- a/cuda/Greyscale.cu +++ b/cuda/Greyscale.cu @@ -19,608 +19,837 @@ #define NBLOCKS 1024 #define NTHREADS 256 -__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity, double *Pressure){ - int n; - // conserved momemnts - double rho,vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; +__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( + double *dist, int start, int finish, int Np, double rlx_eff, double rlx, + double Gx, double Gy, double Gz, double *Poros, double *Perm, + double *Velocity, double *Pressure, bool Forchheimer) { + int n; + // conserved momemnts + double rho, vx, vy, vz, v_mag; + double ux, uy, uz, u_mag; double pressure; //double uu; - // non-conserved moments - double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; - double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) + // non-conserved moments + double f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18; + double GeoFun; //geometric function from Guo's PRE 66, 036304 (2002) double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - - int S = Np/NBLOCKS/NTHREADS + 1; - for (int s=0; s 10Np => odd part of dist) - f1 = dist[nr1]; // reading the f1 data into register fq - - nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) - f2 = dist[nr2]; // reading the f2 data into register fq - - // q=3 - nr3 = neighborList[n+2*Np]; // neighbor 4 - f3 = dist[nr3]; - - // q = 4 - nr4 = neighborList[n+3*Np]; // neighbor 3 - f4 = dist[nr4]; - - // q=5 - nr5 = neighborList[n+4*Np]; - f5 = dist[nr5]; - - // q = 6 - nr6 = neighborList[n+5*Np]; - f6 = dist[nr6]; - - // q=7 - nr7 = neighborList[n+6*Np]; - f7 = dist[nr7]; - - // q = 8 - nr8 = neighborList[n+7*Np]; - f8 = dist[nr8]; - - // q=9 - nr9 = neighborList[n+8*Np]; - f9 = dist[nr9]; - - // q = 10 - nr10 = neighborList[n+9*Np]; - f10 = dist[nr10]; - - // q=11 - nr11 = neighborList[n+10*Np]; - f11 = dist[nr11]; - - // q=12 - nr12 = neighborList[n+11*Np]; - f12 = dist[nr12]; - - // q=13 - nr13 = neighborList[n+12*Np]; - f13 = dist[nr13]; - - // q=14 - nr14 = neighborList[n+13*Np]; - f14 = dist[nr14]; - - // q=15 - nr15 = neighborList[n+14*Np]; - f15 = dist[nr15]; - - // q=16 - nr16 = neighborList[n+15*Np]; - f16 = dist[nr16]; - - // q=17 - //fq = dist[18*Np+n]; - nr17 = neighborList[n+16*Np]; - f17 = dist[nr17]; - - // q=18 - nr18 = neighborList[n+17*Np]; - f18 = dist[nr18]; - - porosity = Poros[n]; - perm = Perm[n]; - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - rho = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; - pressure = rho/porosity/3.0; - vx = (f1-f2+f7-f8+f9-f10+f11-f12+f13-f14)/rho+0.5*porosity*Gx; - vy = (f3-f4+f7-f8-f9+f10+f15-f16+f17-f18)/rho+0.5*porosity*Gy; - vz = (f5-f6+f11-f12-f13+f14+f15-f16-f17+f18)/rho+0.5*porosity*Gz; - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the body force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = -porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx; - Fy = -porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy; - Fz = -porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz; - if (porosity==1.0){ - Fx=Gx; - Fy=Gy; - Fz=Gz; - } + double perm; //voxel permeability + double c0, c1; //Guo's model parameters + double viscosity = (1.0 / rlx - 0.5) / 3.0; //kinematic viscosity + double Fx, Fy, + Fz; //The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + + int S = Np / NBLOCKS / NTHREADS + 1; + for (int s = 0; s < S; s++) { + //........Get 1-D index for this thread.................... + n = S * blockIdx.x * blockDim.x + s * blockDim.x + threadIdx.x + start; + + if (n < finish) { + // q=0 + f0 = dist[n]; + // q=1 + nr1 = neighborList[n]; // neighbor 2 ( > 10Np => odd part of dist) + f1 = dist[nr1]; // reading the f1 data into register fq + + nr2 = neighborList[n + + Np]; // neighbor 1 ( < 10Np => even part of dist) + f2 = dist[nr2]; // reading the f2 data into register fq + + // q=3 + nr3 = neighborList[n + 2 * Np]; // neighbor 4 + f3 = dist[nr3]; + + // q = 4 + nr4 = neighborList[n + 3 * Np]; // neighbor 3 + f4 = dist[nr4]; + + // q=5 + nr5 = neighborList[n + 4 * Np]; + f5 = dist[nr5]; + + // q = 6 + nr6 = neighborList[n + 5 * Np]; + f6 = dist[nr6]; + + // q=7 + nr7 = neighborList[n + 6 * Np]; + f7 = dist[nr7]; + + // q = 8 + nr8 = neighborList[n + 7 * Np]; + f8 = dist[nr8]; + + // q=9 + nr9 = neighborList[n + 8 * Np]; + f9 = dist[nr9]; + + // q = 10 + nr10 = neighborList[n + 9 * Np]; + f10 = dist[nr10]; + + // q=11 + nr11 = neighborList[n + 10 * Np]; + f11 = dist[nr11]; + + // q=12 + nr12 = neighborList[n + 11 * Np]; + f12 = dist[nr12]; + + // q=13 + nr13 = neighborList[n + 12 * Np]; + f13 = dist[nr13]; + + // q=14 + nr14 = neighborList[n + 13 * Np]; + f14 = dist[nr14]; + + // q=15 + nr15 = neighborList[n + 14 * Np]; + f15 = dist[nr15]; + + // q=16 + nr16 = neighborList[n + 15 * Np]; + f16 = dist[nr16]; + + // q=17 + //fq = dist[18*Np+n]; + nr17 = neighborList[n + 16 * Np]; + f17 = dist[nr17]; + + // q=18 + nr18 = neighborList[n + 17 * Np]; + f18 = dist[nr18]; + + porosity = Poros[n]; + perm = Perm[n]; + + c0 = 0.5 * (1.0 + porosity * 0.5 * viscosity / perm); + if (porosity == 1.0) + c0 = 0.5; //i.e. apparent pore nodes + if (Forchheimer) + GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + else + GeoFun = 0; + c1 = porosity * 0.5 * GeoFun / sqrt(perm); + if (porosity == 1.0) + c1 = 0.0; //i.e. apparent pore nodes + + rho = f0 + f2 + f1 + f4 + f3 + f6 + f5 + f8 + f7 + f10 + f9 + f12 + + f11 + f14 + f13 + f16 + f15 + f18 + f17; + pressure = rho / porosity / 3.0; + vx = (f1 - f2 + f7 - f8 + f9 - f10 + f11 - f12 + f13 - f14) / rho + + 0.5 * porosity * Gx; + vy = (f3 - f4 + f7 - f8 - f9 + f10 + f15 - f16 + f17 - f18) / rho + + 0.5 * porosity * Gy; + vz = (f5 - f6 + f11 - f12 - f13 + f14 + f15 - f16 - f17 + f18) / + rho + + 0.5 * porosity * Gz; + v_mag = sqrt(vx * vx + vy * vy + vz * vz); + ux = vx / (c0 + sqrt(c0 * c0 + c1 * v_mag)); + uy = vy / (c0 + sqrt(c0 * c0 + c1 * v_mag)); + uz = vz / (c0 + sqrt(c0 * c0 + c1 * v_mag)); + u_mag = sqrt(ux * ux + uy * uy + uz * uz); + + //Update the body force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = -porosity * viscosity / perm * ux - + porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx; + Fy = -porosity * viscosity / perm * uy - + porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy; + Fz = -porosity * viscosity / perm * uz - + porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz; + if (porosity == 1.0) { + Fx = Gx; + Fy = Gy; + Fz = Gz; + } + + //------------------------ BGK collison where body force has higher-order terms ----------------------------------------------------------// + // // q=0 + // dist[n] = f0*(1.0-rlx_eff) + rlx_eff*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // + 0.3333333333333333*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // + // // q = 1 + // dist[nr2] = f1*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // + // // q=2 + // dist[nr1] = f2*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(-3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // + // // q = 3 + // dist[nr4] = f3*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // + // // q = 4 + // dist[nr3] = f4*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // + // // q = 5 + // dist[nr6] = f5*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(3. + (6.*uz)/porosity)); + // + // // q = 6 + // dist[nr5] = f6*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(-3. + (6.*uz)/porosity)); + // + // // q = 7 + // dist[nr8] = f7*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) + + // Fz*(0. - (3.*uz)/porosity)); + // + // // q = 8 + // dist[nr7] = f8*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + Fy*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) + + // Fz*(0. - (3.*uz)/porosity)); + // + // // q = 9 + // dist[nr10] = f9*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + Fy*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) + + // Fz*(0. - (3.*uz)/porosity)); + // + // // q = 10 + // dist[nr9] = f10*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) + + // Fz*(0. - (3.*uz)/porosity)); + // + // // q = 11 + // dist[nr12] = f11*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) + + // Fz*(3. - (3.*uz)/porosity + (9.*(ux + uz))/porosity)); + // + // // q = 12 + // dist[nr11] = f12*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) + + // Fz*(-3. - (9.*(-ux - uz))/porosity - (3.*uz)/porosity)); + // + // // q = 13 + // dist[nr14] = f13*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) + + // Fz*(-3. - (9.*(ux - uz))/porosity - (3.*uz)/porosity)); + // + // // q= 14 + // dist[nr13] = f14*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) + + // Fz*(3. - (3.*uz)/porosity + (9.*(-ux + uz))/porosity)); + // + // // q = 15 + // dist[nr16] = f15*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) + + // Fz*(3. - (3.*uz)/porosity + (9.*(uy + uz))/porosity)); + // + // // q = 16 + // dist[nr15] = f16*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) + + // Fz*(-3. - (9.*(-uy - uz))/porosity - (3.*uz)/porosity)); + // + // // q = 17 + // dist[nr18] = f17*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) + + // Fz*(-3. - (9.*(uy - uz))/porosity - (3.*uz)/porosity)); + // + // // q = 18 + // dist[nr17] = f18*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) + + // Fz*(3. - (3.*uz)/porosity + (9.*(-uy + uz))/porosity)); + //----------------------------------------------------------------------------------------------------------------------------------------// + + //------------------------ BGK collison where body force has NO higher-order terms ----------------------------------------------------------// + // q=0 + dist[n] = + f0 * (1.0 - rlx_eff) + + rlx_eff * 0.3333333333333333 * rho * + (1. - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity); + + // q = 1 + dist[nr2] = + f1 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 + 3. * ux + (4.5 * ux * ux) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fx * (3.)); + + // q=2 + dist[nr1] = + f2 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 - 3. * ux + (4.5 * ux * ux) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fx * (-3.)); + + // q = 3 + dist[nr4] = + f3 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 + 3. * uy + (4.5 * uy * uy) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fy * (3.)); + + // q = 4 + dist[nr3] = + f4 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 - 3. * uy + (4.5 * uy * uy) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fy * (-3.)); + + // q = 5 + dist[nr6] = + f5 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 + 3. * uz + (4.5 * uz * uz) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fz * (3.)); + + // q = 6 + dist[nr5] = + f6 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 - 3. * uz + (4.5 * uz * uz) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fz * (-3.)); + + // q = 7 + dist[nr8] = f7 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (ux + uy) + + (4.5 * (ux + uy) * (ux + uy)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (3.) + Fy * (3.)); + + // q = 8 + dist[nr7] = f8 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (-ux - uy) + + (4.5 * (-ux - uy) * (-ux - uy)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (-3.) + Fy * (-3.)); + + // q = 9 + dist[nr10] = + f9 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (ux - uy) + + (4.5 * (ux - uy) * (ux - uy)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (3.) + Fy * (-3.)); + + // q = 10 + dist[nr9] = f10 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (-ux + uy) + + (4.5 * (-ux + uy) * (-ux + uy)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (-3.) + Fy * (3.)); + + // q = 11 + dist[nr12] = + f11 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (ux + uz) + + (4.5 * (ux + uz) * (ux + uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (3.) + Fz * (3.)); + + // q = 12 + dist[nr11] = + f12 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (-ux - uz) + + (4.5 * (-ux - uz) * (-ux - uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (-3.) + Fz * (-3.)); + + // q = 13 + dist[nr14] = + f13 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (ux - uz) + + (4.5 * (ux - uz) * (ux - uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (3.) + Fz * (-3.)); + + // q= 14 + dist[nr13] = + f14 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (-ux + uz) + + (4.5 * (-ux + uz) * (-ux + uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (-3.) + Fz * (3.)); + + // q = 15 + dist[nr16] = + f15 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (uy + uz) + + (4.5 * (uy + uz) * (uy + uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fy * (3.) + Fz * (3.)); + + // q = 16 + dist[nr15] = + f16 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (-uy - uz) + + (4.5 * (-uy - uz) * (-uy - uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fy * (-3.) + Fz * (-3.)); + + // q = 17 + dist[nr18] = + f17 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (uy - uz) + + (4.5 * (uy - uz) * (uy - uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fy * (3.) + Fz * (-3.)); - //------------------------ BGK collison where body force has higher-order terms ----------------------------------------------------------// -// // q=0 -// dist[n] = f0*(1.0-rlx) + rlx*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// + 0.3333333333333333*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q = 1 -// dist[nr2] = f1*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q=2 -// dist[nr1] = f2*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(-3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q = 3 -// dist[nr4] = f3*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q = 4 -// dist[nr3] = f4*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q = 5 -// dist[nr6] = f5*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(3. + (6.*uz)/porosity)); -// -// // q = 6 -// dist[nr5] = f6*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(-3. + (6.*uz)/porosity)); -// -// // q = 7 -// dist[nr8] = f7*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) + -// Fz*(0. - (3.*uz)/porosity)); -// -// // q = 8 -// dist[nr7] = f8*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + Fy*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) + -// Fz*(0. - (3.*uz)/porosity)); -// -// // q = 9 -// dist[nr10] = f9*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + Fy*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) + -// Fz*(0. - (3.*uz)/porosity)); -// -// // q = 10 -// dist[nr9] = f10*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) + -// Fz*(0. - (3.*uz)/porosity)); -// -// // q = 11 -// dist[nr12] = f11*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) + -// Fz*(3. - (3.*uz)/porosity + (9.*(ux + uz))/porosity)); -// -// // q = 12 -// dist[nr11] = f12*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) + -// Fz*(-3. - (9.*(-ux - uz))/porosity - (3.*uz)/porosity)); -// -// // q = 13 -// dist[nr14] = f13*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) + -// Fz*(-3. - (9.*(ux - uz))/porosity - (3.*uz)/porosity)); -// -// // q= 14 -// dist[nr13] = f14*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) + -// Fz*(3. - (3.*uz)/porosity + (9.*(-ux + uz))/porosity)); -// -// // q = 15 -// dist[nr16] = f15*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) + -// Fz*(3. - (3.*uz)/porosity + (9.*(uy + uz))/porosity)); -// -// // q = 16 -// dist[nr15] = f16*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) + -// Fz*(-3. - (9.*(-uy - uz))/porosity - (3.*uz)/porosity)); -// -// // q = 17 -// dist[nr18] = f17*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) + -// Fz*(-3. - (9.*(uy - uz))/porosity - (3.*uz)/porosity)); -// -// // q = 18 -// dist[nr17] = f18*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) + -// Fz*(3. - (3.*uz)/porosity + (9.*(-uy + uz))/porosity)); - //----------------------------------------------------------------------------------------------------------------------------------------// - - - //------------------------ BGK collison where body force has NO higher-order terms ----------------------------------------------------------// - // q=0 - dist[n] = f0*(1.0-rlx) + rlx*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity); - - // q = 1 - dist[nr2] = f1*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(3.)); - - // q=2 - dist[nr1] = f2*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(-3.)); - - // q = 3 - dist[nr4] = f3*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fy*(3.)); - - // q = 4 - dist[nr3] = f4*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fy*(-3.)); - - // q = 5 - dist[nr6] = f5*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fz*(3.)); - - // q = 6 - dist[nr5] = f6*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fz*(-3.)); - - // q = 7 - dist[nr8] = f7*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fy*(3.)); - - // q = 8 - dist[nr7] = f8*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fy*(-3.)); - - // q = 9 - dist[nr10] = f9*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fy*(-3.)); - - // q = 10 - dist[nr9] = f10*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fy*(3.)); - - // q = 11 - dist[nr12] = f11*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fz*(3.)); - - // q = 12 - dist[nr11] = f12*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fz*(-3.)); - - // q = 13 - dist[nr14] = f13*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fz*(-3.)); - - // q= 14 - dist[nr13] = f14*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fz*(3.)); - - // q = 15 - dist[nr16] = f15*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(3.) + Fz*(3.)); - - // q = 16 - dist[nr15] = f16*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(-3.) + Fz*(-3.)); - - // q = 17 - dist[nr18] = f17*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(3.) + Fz*(-3.)); - - // q = 18 - dist[nr17] = f18*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(-3.) + Fz*(3.)); - //-------------------------------------------------------------------------------------------------------------------------------------------// - - - //Update velocity on device - Velocity[0*Np+n] = ux; - Velocity[1*Np+n] = uy; - Velocity[2*Np+n] = uz; - //Update pressure on device - Pressure[n] = pressure; - } - } + // q = 18 + dist[nr17] = + f18 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (-uy + uz) + + (4.5 * (-uy + uz) * (-uy + uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fy * (-3.) + Fz * (3.)); + //-------------------------------------------------------------------------------------------------------------------------------------------// + + //Update velocity on device + Velocity[0 * Np + n] = ux; + Velocity[1 * Np + n] = uy; + Velocity[2 * Np + n] = uz; + //Update pressure on device + Pressure[n] = pressure; + } + } } -__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity, double Den, double *Pressure){ - - int n; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; +__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT( + double *dist, int start, int finish, int Np, double rlx_eff, double rlx, + double Gx, double Gy, double Gz, double *Poros, double *Perm, + double *Velocity, double Den, double *Pressure, bool Forchheimer) { + + int n; + double vx, vy, vz, v_mag; + double ux, uy, uz, u_mag; + double pressure; //defined for this incompressible model + // conserved momemnts + double jx, jy, jz; + // non-conserved moments + double m1, m2, m4, m6, m8, m9, m10, m11, m12, m13, m14, m15, m16, m17, m18; double fq; - //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; - double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) + //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; + double GeoFun; //geometric function from Guo's PRE 66, 036304 (2002) double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double rlx_setA = rlx; - double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); - - const double mrt_V1=0.05263157894736842; - const double mrt_V2=0.012531328320802; - const double mrt_V3=0.04761904761904762; - const double mrt_V4=0.004594820384294068; - const double mrt_V5=0.01587301587301587; - const double mrt_V6=0.0555555555555555555555555; - const double mrt_V7=0.02777777777777778; - const double mrt_V8=0.08333333333333333; - const double mrt_V9=0.003341687552213868; - const double mrt_V10=0.003968253968253968; - const double mrt_V11=0.01388888888888889; - const double mrt_V12=0.04166666666666666; - - - int S = Np/NBLOCKS/NTHREADS + 1; - for (int s=0; s 10Np => odd part of dist) - fq = dist[nread]; // reading the f1 data into register fq + fq = dist[nread]; // reading the f1 data into register fq pressure = fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; jx = fq; - m4 = -4.0*fq; - m9 = 2.0*fq; - m10 = -4.0*fq; + m4 = -4.0 * fq; + m9 = 2.0 * fq; + m10 = -4.0 * fq; // q=2 - nread = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) - fq = dist[nread]; // reading the f2 data into register fq + nread = + neighborList[n + + Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nread]; // reading the f2 data into register fq pressure += fq; - m1 -= 11.0*(fq); - m2 -= 4.0*(fq); + m1 -= 11.0 * (fq); + m2 -= 4.0 * (fq); jx -= fq; - m4 += 4.0*(fq); - m9 += 2.0*(fq); - m10 -= 4.0*(fq); + m4 += 4.0 * (fq); + m9 += 2.0 * (fq); + m10 -= 4.0 * (fq); // q=3 - nread = neighborList[n+2*Np]; // neighbor 4 + nread = neighborList[n + 2 * Np]; // neighbor 4 fq = dist[nread]; pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; jy = fq; - m6 = -4.0*fq; + m6 = -4.0 * fq; m9 -= fq; - m10 += 2.0*fq; + m10 += 2.0 * fq; m11 = fq; - m12 = -2.0*fq; + m12 = -2.0 * fq; // q = 4 - nread = neighborList[n+3*Np]; // neighbor 3 + nread = neighborList[n + 3 * Np]; // neighbor 3 fq = dist[nread]; pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; jy -= fq; - m6 += 4.0*fq; + m6 += 4.0 * fq; m9 -= fq; - m10 += 2.0*fq; + m10 += 2.0 * fq; m11 += fq; - m12 -= 2.0*fq; + m12 -= 2.0 * fq; // q=5 - nread = neighborList[n+4*Np]; + nread = neighborList[n + 4 * Np]; fq = dist[nread]; pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; jz = fq; - m8 = -4.0*fq; + m8 = -4.0 * fq; m9 -= fq; - m10 += 2.0*fq; + m10 += 2.0 * fq; m11 -= fq; - m12 += 2.0*fq; + m12 += 2.0 * fq; // q = 6 - nread = neighborList[n+5*Np]; + nread = neighborList[n + 5 * Np]; fq = dist[nread]; pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; jz -= fq; - m8 += 4.0*fq; + m8 += 4.0 * fq; m9 -= fq; - m10 += 2.0*fq; + m10 += 2.0 * fq; m11 -= fq; - m12 += 2.0*fq; + m12 += 2.0 * fq; // q=7 - nread = neighborList[n+6*Np]; + nread = neighborList[n + 6 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx += fq; m4 += fq; jy += fq; m6 += fq; - m9 += fq; + m9 += fq; m10 += fq; m11 += fq; m12 += fq; @@ -1219,10 +1522,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m17 = -fq; // q = 8 - nread = neighborList[n+7*Np]; + nread = neighborList[n + 7 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx -= fq; m4 -= fq; @@ -1237,10 +1540,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m17 += fq; // q=9 - nread = neighborList[n+8*Np]; + nread = neighborList[n + 8 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx += fq; m4 += fq; @@ -1255,10 +1558,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m17 += fq; // q = 10 - nread = neighborList[n+9*Np]; + nread = neighborList[n + 9 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx -= fq; m4 -= fq; @@ -1273,10 +1576,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m17 -= fq; // q=11 - nread = neighborList[n+10*Np]; + nread = neighborList[n + 10 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx += fq; m4 += fq; @@ -1291,10 +1594,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m18 = fq; // q=12 - nread = neighborList[n+11*Np]; + nread = neighborList[n + 11 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx -= fq; m4 -= fq; @@ -1309,10 +1612,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m18 -= fq; // q=13 - nread = neighborList[n+12*Np]; + nread = neighborList[n + 12 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx += fq; m4 += fq; @@ -1327,10 +1630,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m18 -= fq; // q=14 - nread = neighborList[n+13*Np]; + nread = neighborList[n + 13 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx -= fq; m4 -= fq; @@ -1345,65 +1648,65 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m18 += fq; // q=15 - nread = neighborList[n+14*Np]; + nread = neighborList[n + 14 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jy += fq; m6 += fq; jz += fq; m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; + m9 -= 2.0 * fq; + m10 -= 2.0 * fq; m14 = fq; m17 += fq; m18 -= fq; // q=16 - nread = neighborList[n+15*Np]; + nread = neighborList[n + 15 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jy -= fq; m6 -= fq; jz -= fq; m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; + m9 -= 2.0 * fq; + m10 -= 2.0 * fq; m14 += fq; m17 -= fq; m18 += fq; // q=17 - nread = neighborList[n+16*Np]; + nread = neighborList[n + 16 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jy += fq; m6 += fq; jz -= fq; m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; + m9 -= 2.0 * fq; + m10 -= 2.0 * fq; m14 -= fq; m17 += fq; m18 += fq; // q=18 - nread = neighborList[n+17*Np]; + nread = neighborList[n + 17 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jy -= fq; m6 -= fq; jz += fq; m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; + m9 -= 2.0 * fq; + m10 -= 2.0 * fq; m14 -= fq; m17 -= fq; m18 -= fq; @@ -1412,1348 +1715,1525 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double porosity = Poros[n]; perm = Perm[n]; - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/Den+0.5*porosity*Gx; - vy = jy/Den+0.5*porosity*Gy; - vz = jz/Den+0.5*porosity*Gz; - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); + c0 = 0.5 * (1.0 + porosity * 0.5 * viscosity / perm); + if (porosity == 1.0) + c0 = 0.5; //i.e. apparent pore nodes + if (Forchheimer) + GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + else + GeoFun = 0; + c1 = porosity * 0.5 * GeoFun / sqrt(perm); + if (porosity == 1.0) + c1 = 0.0; //i.e. apparent pore nodes + + vx = jx / Den + 0.5 * porosity * Gx; + vy = jy / Den + 0.5 * porosity * Gy; + vz = jz / Den + 0.5 * porosity * Gz; + v_mag = sqrt(vx * vx + vy * vy + vz * vz); + ux = vx / (c0 + sqrt(c0 * c0 + c1 * v_mag)); + uy = vy / (c0 + sqrt(c0 * c0 + c1 * v_mag)); + uz = vz / (c0 + sqrt(c0 * c0 + c1 * v_mag)); + u_mag = sqrt(ux * ux + uy * uy + uz * uz); //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = Den*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx); - Fy = Den*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy); - Fz = Den*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz); - if (porosity==1.0){ - Fx=Den*Gx; - Fy=Den*Gy; - Fz=Den*Gz; + Fx = Den * + (-porosity * viscosity / perm * ux - + porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx); + Fy = Den * + (-porosity * viscosity / perm * uy - + porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy); + Fz = Den * + (-porosity * viscosity / perm * uz - + porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz); + if (porosity == 1.0) { + Fx = Den * Gx; + Fy = Den * Gy; + Fz = Den * Gz; } //Calculate pressure for Incompressible-MRT model - pressure=0.5/porosity*(pressure-0.5*Den*u_mag*u_mag/porosity); - -// //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) -// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) -// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; -// jx = jx + Fx; -// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -// jy = jy + Fy; -// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*Den) - m6) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -// jz = jz + Fz; -// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*Den) - m8) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -// m9 = m9 + rlx_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) -// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; -// m10 = m10 + rlx_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) -// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; -// m11 = m11 + rlx_setA*((Den*(uy*uy-uz*uz)/porosity) - m11) -// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; -// m12 = m12 + rlx_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12) -// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; -// m13 = m13 + rlx_setA*((Den*ux*uy/porosity) - m13) -// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; -// m14 = m14 + rlx_setA*((Den*uy*uz/porosity) - m14) -// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; -// m15 = m15 + rlx_setA*((Den*ux*uz/porosity) - m15) -// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); -// //....................................................................................................... - + pressure = 0.5 / porosity * + (pressure - 0.5 * Den * u_mag * u_mag / porosity); + + // //..............carry out relaxation process............................................... + // m1 = m1 + rlx_eff_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) + // + (1-0.5*rlx_eff_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; + // m2 = m2 + rlx_eff_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) + // + (1-0.5*rlx_eff_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; + // jx = jx + Fx; + // m4 = m4 + rlx_eff_setB*((-0.6666666666666666*ux*Den) - m4) + // + (1-0.5*rlx_eff_setB)*(-0.6666666666666666*Fx); + // jy = jy + Fy; + // m6 = m6 + rlx_eff_setB*((-0.6666666666666666*uy*Den) - m6) + // + (1-0.5*rlx_eff_setB)*(-0.6666666666666666*Fy); + // jz = jz + Fz; + // m8 = m8 + rlx_eff_setB*((-0.6666666666666666*uz*Den) - m8) + // + (1-0.5*rlx_eff_setB)*(-0.6666666666666666*Fz); + // m9 = m9 + rlx_eff_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) + // + (1-0.5*rlx_eff_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; + // m10 = m10 + rlx_eff_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) + // + (1-0.5*rlx_eff_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; + // m11 = m11 + rlx_eff_setA*((Den*(uy*uy-uz*uz)/porosity) - m11) + // + (1-0.5*rlx_eff_setA)*(2*Fy*uy-2*Fz*uz)/porosity; + // m12 = m12 + rlx_eff_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12) + // + (1-0.5*rlx_eff_setA)*(-Fy*uy+Fz*uz)/porosity; + // m13 = m13 + rlx_eff_setA*((Den*ux*uy/porosity) - m13) + // + (1-0.5*rlx_eff_setA)*(Fy*ux+Fx*uy)/porosity; + // m14 = m14 + rlx_eff_setA*((Den*uy*uz/porosity) - m14) + // + (1-0.5*rlx_eff_setA)*(Fz*uy+Fy*uz)/porosity; + // m15 = m15 + rlx_eff_setA*((Den*ux*uz/porosity) - m15) + // + (1-0.5*rlx_eff_setA)*(Fz*ux+Fx*uz)/porosity; + // m16 = m16 + rlx_eff_setB*( - m16); + // m17 = m17 + rlx_eff_setB*( - m17); + // m18 = m18 + rlx_eff_setB*( - m18); + // //....................................................................................................... + //-------------------- IMRT collison where body force has NO higher-order terms -------------// //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + m1 = + m1 + rlx_eff_setA * + ((-30 * Den + + 19 * Den * (ux * ux + uy * uy + uz * uz) / porosity + + 57 * pressure * porosity) - + m1); + m2 = m2 + + rlx_eff_setA * + ((12 * Den - + 5.5 * Den * (ux * ux + uy * uy + uz * uz) / porosity - + 27 * pressure * porosity) - + m2); jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + m4 = m4 + rlx_eff_setB * ((-0.6666666666666666 * ux * Den) - m4) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fx); jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*uy*Den) - m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + m6 = m6 + rlx_eff_setB * ((-0.6666666666666666 * uy * Den) - m6) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fy); jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*uz*Den) - m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); - m10 = m10 + rlx_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA*((Den*(uy*uy-uz*uz)/porosity) - m11); - m12 = m12 + rlx_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA*((Den*ux*uy/porosity) - m13); - m14 = m14 + rlx_setA*((Den*uy*uz/porosity) - m14); - m15 = m15 + rlx_setA*((Den*ux*uz/porosity) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); + m8 = m8 + rlx_eff_setB * ((-0.6666666666666666 * uz * Den) - m8) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fz); + m9 = + m9 + + rlx_eff_setA * + ((Den * (2 * ux * ux - uy * uy - uz * uz) / porosity) - m9); + m10 = + m10 + rlx_eff_setA * + (-0.5 * Den * + ((2 * ux * ux - uy * uy - uz * uz) / porosity) - + m10); + m11 = m11 + + rlx_eff_setA * ((Den * (uy * uy - uz * uz) / porosity) - m11); + m12 = + m12 + rlx_eff_setA * + (-0.5 * (Den * (uy * uy - uz * uz) / porosity) - m12); + m13 = m13 + rlx_eff_setA * ((Den * ux * uy / porosity) - m13); + m14 = m14 + rlx_eff_setA * ((Den * uy * uz / porosity) - m14); + m15 = m15 + rlx_eff_setA * ((Den * ux * uz / porosity) - m15); + m16 = m16 + rlx_eff_setB * (-m16); + m17 = m17 + rlx_eff_setB * (-m17); + m18 = m18 + rlx_eff_setB * (-m18); //....................................................................................................... - //.................inverse transformation...................................................... // q=0 - fq = mrt_V1*Den-mrt_V2*m1+mrt_V3*m2; + fq = mrt_V1 * Den - mrt_V2 * m1 + mrt_V3 * m2; dist[n] = fq; // q = 1 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - nread = neighborList[n+Np]; + fq = mrt_V1 * Den - mrt_V4 * m1 - mrt_V5 * m2 + 0.1 * (jx - m4) + + mrt_V6 * (m9 - m10); + nread = neighborList[n + Np]; dist[nread] = fq; // q=2 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + fq = mrt_V1 * Den - mrt_V4 * m1 - mrt_V5 * m2 + 0.1 * (m4 - jx) + + mrt_V6 * (m9 - m10); nread = neighborList[n]; dist[nread] = fq; // q = 3 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - nread = neighborList[n+3*Np]; + fq = mrt_V1 * Den - mrt_V4 * m1 - mrt_V5 * m2 + 0.1 * (jy - m6) + + mrt_V7 * (m10 - m9) + mrt_V8 * (m11 - m12); + nread = neighborList[n + 3 * Np]; dist[nread] = fq; // q = 4 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - nread = neighborList[n+2*Np]; + fq = mrt_V1 * Den - mrt_V4 * m1 - mrt_V5 * m2 + 0.1 * (m6 - jy) + + mrt_V7 * (m10 - m9) + mrt_V8 * (m11 - m12); + nread = neighborList[n + 2 * Np]; dist[nread] = fq; // q = 5 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - nread = neighborList[n+5*Np]; + fq = mrt_V1 * Den - mrt_V4 * m1 - mrt_V5 * m2 + 0.1 * (jz - m8) + + mrt_V7 * (m10 - m9) + mrt_V8 * (m12 - m11); + nread = neighborList[n + 5 * Np]; dist[nread] = fq; // q = 6 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - nread = neighborList[n+4*Np]; + fq = mrt_V1 * Den - mrt_V4 * m1 - mrt_V5 * m2 + 0.1 * (m8 - jz) + + mrt_V7 * (m10 - m9) + mrt_V8 * (m12 - m11); + nread = neighborList[n + 4 * Np]; dist[nread] = fq; // q = 7 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - nread = neighborList[n+7*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jx + jy) + + 0.025 * (m4 + m6) + mrt_V7 * m9 + mrt_V11 * m10 + + mrt_V8 * m11 + mrt_V12 * m12 + 0.25 * m13 + + 0.125 * (m16 - m17); + nread = neighborList[n + 7 * Np]; dist[nread] = fq; // q = 8 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); - nread = neighborList[n+6*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 - 0.1 * (jx + jy) - + 0.025 * (m4 + m6) + mrt_V7 * m9 + mrt_V11 * m10 + + mrt_V8 * m11 + mrt_V12 * m12 + 0.25 * m13 + + 0.125 * (m17 - m16); + nread = neighborList[n + 6 * Np]; dist[nread] = fq; // q = 9 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - nread = neighborList[n+9*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jx - jy) + + 0.025 * (m4 - m6) + mrt_V7 * m9 + mrt_V11 * m10 + + mrt_V8 * m11 + mrt_V12 * m12 - 0.25 * m13 + + 0.125 * (m16 + m17); + nread = neighborList[n + 9 * Np]; dist[nread] = fq; // q = 10 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - nread = neighborList[n+8*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jy - jx) + + 0.025 * (m6 - m4) + mrt_V7 * m9 + mrt_V11 * m10 + + mrt_V8 * m11 + mrt_V12 * m12 - 0.25 * m13 - + 0.125 * (m16 + m17); + nread = neighborList[n + 8 * Np]; dist[nread] = fq; // q = 11 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); - nread = neighborList[n+11*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jx + jz) + + 0.025 * (m4 + m8) + mrt_V7 * m9 + mrt_V11 * m10 - + mrt_V8 * m11 - mrt_V12 * m12 + 0.25 * m15 + + 0.125 * (m18 - m16); + nread = neighborList[n + 11 * Np]; dist[nread] = fq; // q = 12 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - nread = neighborList[n+10*Np]; - dist[nread]= fq; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 - 0.1 * (jx + jz) - + 0.025 * (m4 + m8) + mrt_V7 * m9 + mrt_V11 * m10 - + mrt_V8 * m11 - mrt_V12 * m12 + 0.25 * m15 + + 0.125 * (m16 - m18); + nread = neighborList[n + 10 * Np]; + dist[nread] = fq; // q = 13 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); - nread = neighborList[n+13*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jx - jz) + + 0.025 * (m4 - m8) + mrt_V7 * m9 + mrt_V11 * m10 - + mrt_V8 * m11 - mrt_V12 * m12 - 0.25 * m15 - + 0.125 * (m16 + m18); + nread = neighborList[n + 13 * Np]; dist[nread] = fq; // q= 14 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); - nread = neighborList[n+12*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jz - jx) + + 0.025 * (m8 - m4) + mrt_V7 * m9 + mrt_V11 * m10 - + mrt_V8 * m11 - mrt_V12 * m12 - 0.25 * m15 + + 0.125 * (m16 + m18); + nread = neighborList[n + 12 * Np]; dist[nread] = fq; // q = 15 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - nread = neighborList[n+15*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jy + jz) + + 0.025 * (m6 + m8) - mrt_V6 * m9 - mrt_V7 * m10 + 0.25 * m14 + + 0.125 * (m17 - m18); + nread = neighborList[n + 15 * Np]; dist[nread] = fq; // q = 16 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - nread = neighborList[n+14*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 - 0.1 * (jy + jz) - + 0.025 * (m6 + m8) - mrt_V6 * m9 - mrt_V7 * m10 + 0.25 * m14 + + 0.125 * (m18 - m17); + nread = neighborList[n + 14 * Np]; dist[nread] = fq; // q = 17 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - nread = neighborList[n+17*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jy - jz) + + 0.025 * (m6 - m8) - mrt_V6 * m9 - mrt_V7 * m10 - 0.25 * m14 + + 0.125 * (m17 + m18); + nread = neighborList[n + 17 * Np]; dist[nread] = fq; // q = 18 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - nread = neighborList[n+16*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jz - jy) + + 0.025 * (m8 - m6) - mrt_V6 * m9 - mrt_V7 * m10 - 0.25 * m14 - + 0.125 * (m17 + m18); + nread = neighborList[n + 16 * Np]; dist[nread] = fq; //........................................................................ //Update velocity on device - Velocity[0*Np+n] = ux; - Velocity[1*Np+n] = uy; - Velocity[2*Np+n] = uz; + Velocity[0 * Np + n] = ux; + Velocity[1 * Np + n] = uy; + Velocity[2 * Np + n] = uz; //Update pressure on device Pressure[n] = pressure; - - } - } + } + } } -__global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double rho0, double *Pressure){ - - int n, nread; - int nr1,nr2,nr3,nr4,nr5,nr6; - int nr7,nr8,nr9,nr10; - int nr11,nr12,nr13,nr14; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double rho,jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; +__global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT( + int *neighborList, double *dist, int start, int finish, int Np, + double rlx_eff, double rlx, double Gx, double Gy, double Gz, double *Poros, + double *Perm, double *Velocity, double rho0, double *Pressure, + bool Forchheimer) { + + int n, nread; + int nr1, nr2, nr3, nr4, nr5, nr6; + int nr7, nr8, nr9, nr10; + int nr11, nr12, nr13, nr14; + double vx, vy, vz, v_mag; + double ux, uy, uz, u_mag; + double pressure; //defined for this incompressible model + // conserved momemnts + double rho, jx, jy, jz; + // non-conserved moments + double m1, m2, m4, m6, m8, m9, m10, m11, m12, m13, m14, m15, m16, m17, m18; double fq; - //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; - double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) + //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; + double GeoFun; //geometric function from Guo's PRE 66, 036304 (2002) double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double rlx_setA = rlx; - double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); - - const double mrt_V1=0.05263157894736842; - const double mrt_V2=0.012531328320802; - const double mrt_V3=0.04761904761904762; - const double mrt_V4=0.004594820384294068; - const double mrt_V5=0.01587301587301587; - const double mrt_V6=0.0555555555555555555555555; - const double mrt_V7=0.02777777777777778; - const double mrt_V8=0.08333333333333333; - const double mrt_V9=0.003341687552213868; - const double mrt_V10=0.003968253968253968; - const double mrt_V11=0.01388888888888889; - const double mrt_V12=0.04166666666666666; - - int S = Np/NBLOCKS/NTHREADS + 1; - for (int s=0; s even part of dist) - //fq = dist[nread]; // reading the f2 data into register fq - nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) - fq = dist[nr2]; // reading the f2 data into register fq - rho += fq; - m1 -= 11.0*(fq); - m2 -= 4.0*(fq); - jx -= fq; - m4 += 4.0*(fq); - m9 += 2.0*(fq); - m10 -= 4.0*(fq); - - // q=3 - //nread = neighborList[n+2*Np]; // neighbor 4 - //fq = dist[nread]; - nr3 = neighborList[n+2*Np]; // neighbor 4 - fq = dist[nr3]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy = fq; - m6 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 = fq; - m12 = -2.0*fq; - - // q = 4 - //nread = neighborList[n+3*Np]; // neighbor 3 - //fq = dist[nread]; - nr4 = neighborList[n+3*Np]; // neighbor 3 - fq = dist[nr4]; - rho+= fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy -= fq; - m6 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 += fq; - m12 -= 2.0*fq; - - // q=5 - //nread = neighborList[n+4*Np]; - //fq = dist[nread]; - nr5 = neighborList[n+4*Np]; - fq = dist[nr5]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz = fq; - m8 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - - // q = 6 - //nread = neighborList[n+5*Np]; - //fq = dist[nread]; - nr6 = neighborList[n+5*Np]; - fq = dist[nr6]; - rho+= fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz -= fq; - m8 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q=7 - //nread = neighborList[n+6*Np]; - //fq = dist[nread]; - nr7 = neighborList[n+6*Np]; - fq = dist[nr7]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 = fq; - m16 = fq; - m17 = -fq; - - // q = 8 - //nread = neighborList[n+7*Np]; - //fq = dist[nread]; - nr8 = neighborList[n+7*Np]; - fq = dist[nr8]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 += fq; - m16 -= fq; - m17 += fq; - - // q=9 - //nread = neighborList[n+8*Np]; - //fq = dist[nread]; - nr9 = neighborList[n+8*Np]; - fq = dist[nr9]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 += fq; - m17 += fq; - - // q = 10 - //nread = neighborList[n+9*Np]; - //fq = dist[nread]; - nr10 = neighborList[n+9*Np]; - fq = dist[nr10]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 -= fq; - m17 -= fq; - - // q=11 - //nread = neighborList[n+10*Np]; - //fq = dist[nread]; - nr11 = neighborList[n+10*Np]; - fq = dist[nr11]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 = fq; - m16 -= fq; - m18 = fq; - - // q=12 - //nread = neighborList[n+11*Np]; - //fq = dist[nread]; - nr12 = neighborList[n+11*Np]; - fq = dist[nr12]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 += fq; - m16 += fq; - m18 -= fq; - - // q=13 - //nread = neighborList[n+12*Np]; - //fq = dist[nread]; - nr13 = neighborList[n+12*Np]; - fq = dist[nr13]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 -= fq; - m18 -= fq; - - // q=14 - //nread = neighborList[n+13*Np]; - //fq = dist[nread]; - nr14 = neighborList[n+13*Np]; - fq = dist[nr14]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 += fq; - m18 += fq; - - // q=15 - nread = neighborList[n+14*Np]; - fq = dist[nread]; - //fq = dist[17*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 = fq; - m17 += fq; - m18 -= fq; - - // q=16 - nread = neighborList[n+15*Np]; - fq = dist[nread]; - //fq = dist[8*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 += fq; - m17 -= fq; - m18 += fq; - - // q=17 - //fq = dist[18*Np+n]; - nread = neighborList[n+16*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 += fq; - m18 += fq; - - // q=18 - nread = neighborList[n+17*Np]; - fq = dist[nread]; - //fq = dist[9*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 -= fq; - m18 -= fq; - //---------------------------------------------------------------------// - - porosity = Poros[n]; - perm = Perm[n]; - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/rho0+0.5*porosity*Gx; - vy = jy/rho0+0.5*porosity*Gy; - vz = jz/rho0+0.5*porosity*Gz; - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx); - Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy); - Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz); - if (porosity==1.0){ - Fx=rho0*Gx; - Fy=rho0*Gy; - Fz=rho0*Gz; - } - - //Calculate pressure for MRT model - //pressure=rho/3.f/porosity; - pressure=rho/3.f; + fq = dist[n]; + rho = fq; + m1 = -30.0 * fq; + m2 = 12.0 * fq; - //-------------------- MRT collison where body force has NO higher-order terms -------------// - m1 = m1 + rlx_setA*((19*(ux*ux+uy*uy+uz*uz)*rho0/porosity - 11*rho) - m1); - m2 = m2 + rlx_setA*((3*rho - 5.5*(ux*ux+uy*uy+uz*uz)*rho0/porosity) - m2); - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0)- m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0)- m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0)- m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*(((2*ux*ux-uy*uy-uz*uz)*rho0/porosity) - m9); - m10 = m10 + rlx_setA*( - m10); - //m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA*(((uy*uy-uz*uz)*rho0/porosity) - m11); - m12 = m12 + rlx_setA*( - m12); - //m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA*( (ux*uy*rho0/porosity) - m13); - m14 = m14 + rlx_setA*( (uy*uz*rho0/porosity) - m14); - m15 = m15 + rlx_setA*( (ux*uz*rho0/porosity) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... + // q=1 + //nread = neighborList[n]; // neighbor 2 + //fq = dist[nread]; // reading the f1 data into register fq + nr1 = neighborList[n]; + fq = dist[nr1]; // reading the f1 data into register fq + rho += fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; + jx = fq; + m4 = -4.0 * fq; + m9 = 2.0 * fq; + m10 = -4.0 * fq; + // f2 = dist[10*Np+n]; + //nread = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + //fq = dist[nread]; // reading the f2 data into register fq + nr2 = neighborList[n + + Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nr2]; // reading the f2 data into register fq + rho += fq; + m1 -= 11.0 * (fq); + m2 -= 4.0 * (fq); + jx -= fq; + m4 += 4.0 * (fq); + m9 += 2.0 * (fq); + m10 -= 4.0 * (fq); - //.................inverse transformation...................................................... - // q=0 - fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; - dist[n] = fq; - - // q = 1 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - //nread = neighborList[n+Np]; - dist[nr2] = fq; - - // q=2 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); - //nread = neighborList[n]; - dist[nr1] = fq; - - // q = 3 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - //nread = neighborList[n+3*Np]; - dist[nr4] = fq; - - // q = 4 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - //nread = neighborList[n+2*Np]; - dist[nr3] = fq; - - // q = 5 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - //nread = neighborList[n+5*Np]; - dist[nr6] = fq; - - // q = 6 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - //nread = neighborList[n+4*Np]; - dist[nr5] = fq; - - // q = 7 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+ - mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - //nread = neighborList[n+7*Np]; - dist[nr8] = fq; - - // q = 8 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m17-m16); - //nread = neighborList[n+6*Np]; - dist[nr7] = fq; - - // q = 9 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+ - mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - //nread = neighborList[n+9*Np]; - dist[nr10] = fq; - - // q = 10 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+ - mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - //nread = neighborList[n+8*Np]; - dist[nr9] = fq; - - // q = 11 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) - +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m18-m16); - //nread = neighborList[n+11*Np]; - dist[nr12] = fq; - - // q = 12 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ - mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - //nread = neighborList[n+10*Np]; - dist[nr11]= fq; - - // q = 13 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) - +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15-0.125*(m16+m18); - //nread = neighborList[n+13*Np]; - dist[nr14] = fq; - - // q= 14 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) - +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15+0.125*(m16+m18); - //nread = neighborList[n+12*Np]; - dist[nr13] = fq; - - - // q = 15 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - nread = neighborList[n+15*Np]; - dist[nread] = fq; - - // q = 16 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - nread = neighborList[n+14*Np]; - dist[nread] = fq; - - - // q = 17 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) - -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - nread = neighborList[n+17*Np]; - dist[nread] = fq; - - // q = 18 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) - -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - nread = neighborList[n+16*Np]; - dist[nread] = fq; - //........................................................................ + // q=3 + //nread = neighborList[n+2*Np]; // neighbor 4 + //fq = dist[nread]; + nr3 = neighborList[n + 2 * Np]; // neighbor 4 + fq = dist[nr3]; + rho += fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; + jy = fq; + m6 = -4.0 * fq; + m9 -= fq; + m10 += 2.0 * fq; + m11 = fq; + m12 = -2.0 * fq; - //Update velocity on device - Velocity[0*Np+n] = ux; - Velocity[1*Np+n] = uy; - Velocity[2*Np+n] = uz; - //Update pressure on device - Pressure[n] = pressure; - } - } -} + // q = 4 + //nread = neighborList[n+3*Np]; // neighbor 3 + //fq = dist[nread]; + nr4 = neighborList[n + 3 * Np]; // neighbor 3 + fq = dist[nr4]; + rho += fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; + jy -= fq; + m6 += 4.0 * fq; + m9 -= fq; + m10 += 2.0 * fq; + m11 += fq; + m12 -= 2.0 * fq; -__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double rho0, double *Pressure){ - - int n; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double rho,jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; - double fq; - //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; - double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) - double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double rlx_setA = rlx; - double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); - - const double mrt_V1=0.05263157894736842; - const double mrt_V2=0.012531328320802; - const double mrt_V3=0.04761904761904762; - const double mrt_V4=0.004594820384294068; - const double mrt_V5=0.01587301587301587; - const double mrt_V6=0.0555555555555555555555555; - const double mrt_V7=0.02777777777777778; - const double mrt_V8=0.08333333333333333; - const double mrt_V9=0.003341687552213868; - const double mrt_V10=0.003968253968253968; - const double mrt_V11=0.01388888888888889; - const double mrt_V12=0.04166666666666666; - - - int S = Np/NBLOCKS/NTHREADS + 1; - for (int s=0; s>>(dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Pressure); + dvc_ScaLBL_D3Q19_AAeven_Greyscale<<>>( + dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, + Velocity, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAeven_Greyscale: %s \n",cudaGetErrorString(err)); - } + if (cudaSuccess != err) { + printf("CUDA error in ScaLBL_D3Q19_AAeven_Greyscale: %s \n", + cudaGetErrorString(err)); + } } -extern "C" void ScaLBL_D3Q19_AAodd_Greyscale(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double *Pressure){ +extern "C" void ScaLBL_D3Q19_AAodd_Greyscale( + int *neighborList, double *dist, int start, int finish, int Np, + double rlx_eff, double rlx, double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double *Pressure, bool Forchheimer) { - dvc_ScaLBL_D3Q19_AAodd_Greyscale<<>>(neighborList,dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Pressure); + dvc_ScaLBL_D3Q19_AAodd_Greyscale<<>>( + neighborList, dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, + Perm, Velocity, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAodd_Greyscale: %s \n",cudaGetErrorString(err)); - } + if (cudaSuccess != err) { + printf("CUDA error in ScaLBL_D3Q19_AAodd_Greyscale: %s \n", + cudaGetErrorString(err)); + } } -extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double Den,double *Pressure){ - - dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT<<>>(dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Den,Pressure); +extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT( + double *dist, int start, int finish, int Np, double rlx_eff, double rlx, + double Fx, double Fy, double Fz, double *Poros, double *Perm, + double *Velocity, double Den, double *Pressure, bool Forchheimer) { + + dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT<<>>( + dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, + Velocity, Den, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAeven_Greyscale_IMRT: %s \n",cudaGetErrorString(err)); - } + if (cudaSuccess != err) { + printf("CUDA error in ScaLBL_D3Q19_AAeven_Greyscale_IMRT: %s \n", + cudaGetErrorString(err)); + } } -extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double Den,double *Pressure){ +extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT( + int *neighborList, double *dist, int start, int finish, int Np, + double rlx_eff, double rlx, double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double Den, double *Pressure, + bool Forchheimer) { - dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT<<>>(neighborList,dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Den,Pressure); + dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT<<>>( + neighborList, dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, + Perm, Velocity, Den, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAodd_Greyscale_IMRT: %s \n",cudaGetErrorString(err)); - } + if (cudaSuccess != err) { + printf("CUDA error in ScaLBL_D3Q19_AAodd_Greyscale_IMRT: %s \n", + cudaGetErrorString(err)); + } } -extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double rho0,double *Pressure){ +extern "C" void +ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, + int finish, int Np, double rlx_eff, double rlx, + double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double rho0, + double *Pressure, bool Forchheimer) { - dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT<<>>(neighborList,dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,rho0,Pressure); + dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT<<>>( + neighborList, dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, + Perm, Velocity, rho0, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAodd_Greyscale_MRT: %s \n",cudaGetErrorString(err)); - } + if (cudaSuccess != err) { + printf("CUDA error in ScaLBL_D3Q19_AAodd_Greyscale_MRT: %s \n", + cudaGetErrorString(err)); + } } -extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double rho0,double *Pressure){ - - dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT<<>>(dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,rho0,Pressure); +extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT( + double *dist, int start, int finish, int Np, double rlx_eff, double rlx, + double Fx, double Fy, double Fz, double *Poros, double *Perm, + double *Velocity, double rho0, double *Pressure, bool Forchheimer) { + + dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT<<>>( + dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, + Velocity, rho0, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAeven_Greyscale_MRT: %s \n",cudaGetErrorString(err)); - } + if (cudaSuccess != err) { + printf("CUDA error in ScaLBL_D3Q19_AAeven_Greyscale_MRT: %s \n", + cudaGetErrorString(err)); + } } -extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den){ - dvc_ScaLBL_D3Q19_GreyIMRT_Init<<>>(dist, Np, Den); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyIMRT_Init: %s \n",cudaGetErrorString(err)); - } -} +extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den) { + dvc_ScaLBL_D3Q19_GreyIMRT_Init<<>>(dist, Np, Den); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err) { + printf("CUDA error in ScaLBL_D3Q19_GreyIMRT_Init: %s \n", + cudaGetErrorString(err)); + } +} \ No newline at end of file diff --git a/hip/Greyscale.hip b/hip/Greyscale.hip index c1b77235..8f27ce77 100644 --- a/hip/Greyscale.hip +++ b/hip/Greyscale.hip @@ -5,609 +5,837 @@ #define NBLOCKS 1024 #define NTHREADS 256 - -__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity, double *Pressure){ - int n; - // conserved momemnts - double rho,vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; +__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( + double *dist, int start, int finish, int Np, double rlx_eff, double rlx, + double Gx, double Gy, double Gz, double *Poros, double *Perm, + double *Velocity, double *Pressure, bool Forchheimer) { + int n; + // conserved momemnts + double rho, vx, vy, vz, v_mag; + double ux, uy, uz, u_mag; double pressure; //double uu; - // non-conserved moments - double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; - double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) + // non-conserved moments + double f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18; + double GeoFun; //geometric function from Guo's PRE 66, 036304 (2002) double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - - int S = Np/NBLOCKS/NTHREADS + 1; - for (int s=0; s 10Np => odd part of dist) - f1 = dist[nr1]; // reading the f1 data into register fq - - nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) - f2 = dist[nr2]; // reading the f2 data into register fq - - // q=3 - nr3 = neighborList[n+2*Np]; // neighbor 4 - f3 = dist[nr3]; - - // q = 4 - nr4 = neighborList[n+3*Np]; // neighbor 3 - f4 = dist[nr4]; - - // q=5 - nr5 = neighborList[n+4*Np]; - f5 = dist[nr5]; - - // q = 6 - nr6 = neighborList[n+5*Np]; - f6 = dist[nr6]; - - // q=7 - nr7 = neighborList[n+6*Np]; - f7 = dist[nr7]; - - // q = 8 - nr8 = neighborList[n+7*Np]; - f8 = dist[nr8]; - - // q=9 - nr9 = neighborList[n+8*Np]; - f9 = dist[nr9]; - - // q = 10 - nr10 = neighborList[n+9*Np]; - f10 = dist[nr10]; - - // q=11 - nr11 = neighborList[n+10*Np]; - f11 = dist[nr11]; - - // q=12 - nr12 = neighborList[n+11*Np]; - f12 = dist[nr12]; - - // q=13 - nr13 = neighborList[n+12*Np]; - f13 = dist[nr13]; - - // q=14 - nr14 = neighborList[n+13*Np]; - f14 = dist[nr14]; - - // q=15 - nr15 = neighborList[n+14*Np]; - f15 = dist[nr15]; - - // q=16 - nr16 = neighborList[n+15*Np]; - f16 = dist[nr16]; - - // q=17 - //fq = dist[18*Np+n]; - nr17 = neighborList[n+16*Np]; - f17 = dist[nr17]; - - // q=18 - nr18 = neighborList[n+17*Np]; - f18 = dist[nr18]; - - porosity = Poros[n]; - perm = Perm[n]; - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - rho = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; - pressure = rho/porosity/3.0; - vx = (f1-f2+f7-f8+f9-f10+f11-f12+f13-f14)/rho+0.5*porosity*Gx; - vy = (f3-f4+f7-f8-f9+f10+f15-f16+f17-f18)/rho+0.5*porosity*Gy; - vz = (f5-f6+f11-f12-f13+f14+f15-f16-f17+f18)/rho+0.5*porosity*Gz; - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the body force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = -porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx; - Fy = -porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy; - Fz = -porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz; - if (porosity==1.0){ - Fx=Gx; - Fy=Gy; - Fz=Gz; - } + double perm; //voxel permeability + double c0, c1; //Guo's model parameters + double viscosity = (1.0 / rlx - 0.5) / 3.0; //kinematic viscosity + double Fx, Fy, + Fz; //The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + + int S = Np / NBLOCKS / NTHREADS + 1; + for (int s = 0; s < S; s++) { + //........Get 1-D index for this thread.................... + n = S * blockIdx.x * blockDim.x + s * blockDim.x + threadIdx.x + start; + + if (n < finish) { + // q=0 + f0 = dist[n]; + // q=1 + nr1 = neighborList[n]; // neighbor 2 ( > 10Np => odd part of dist) + f1 = dist[nr1]; // reading the f1 data into register fq + + nr2 = neighborList[n + + Np]; // neighbor 1 ( < 10Np => even part of dist) + f2 = dist[nr2]; // reading the f2 data into register fq + + // q=3 + nr3 = neighborList[n + 2 * Np]; // neighbor 4 + f3 = dist[nr3]; + + // q = 4 + nr4 = neighborList[n + 3 * Np]; // neighbor 3 + f4 = dist[nr4]; + + // q=5 + nr5 = neighborList[n + 4 * Np]; + f5 = dist[nr5]; + + // q = 6 + nr6 = neighborList[n + 5 * Np]; + f6 = dist[nr6]; + + // q=7 + nr7 = neighborList[n + 6 * Np]; + f7 = dist[nr7]; + + // q = 8 + nr8 = neighborList[n + 7 * Np]; + f8 = dist[nr8]; + + // q=9 + nr9 = neighborList[n + 8 * Np]; + f9 = dist[nr9]; + + // q = 10 + nr10 = neighborList[n + 9 * Np]; + f10 = dist[nr10]; + + // q=11 + nr11 = neighborList[n + 10 * Np]; + f11 = dist[nr11]; + + // q=12 + nr12 = neighborList[n + 11 * Np]; + f12 = dist[nr12]; + + // q=13 + nr13 = neighborList[n + 12 * Np]; + f13 = dist[nr13]; + + // q=14 + nr14 = neighborList[n + 13 * Np]; + f14 = dist[nr14]; + + // q=15 + nr15 = neighborList[n + 14 * Np]; + f15 = dist[nr15]; + + // q=16 + nr16 = neighborList[n + 15 * Np]; + f16 = dist[nr16]; + + // q=17 + //fq = dist[18*Np+n]; + nr17 = neighborList[n + 16 * Np]; + f17 = dist[nr17]; + + // q=18 + nr18 = neighborList[n + 17 * Np]; + f18 = dist[nr18]; + + porosity = Poros[n]; + perm = Perm[n]; + + c0 = 0.5 * (1.0 + porosity * 0.5 * viscosity / perm); + if (porosity == 1.0) + c0 = 0.5; //i.e. apparent pore nodes + if (Forchheimer) + GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + else + GeoFun = 0; + c1 = porosity * 0.5 * GeoFun / sqrt(perm); + if (porosity == 1.0) + c1 = 0.0; //i.e. apparent pore nodes + + rho = f0 + f2 + f1 + f4 + f3 + f6 + f5 + f8 + f7 + f10 + f9 + f12 + + f11 + f14 + f13 + f16 + f15 + f18 + f17; + pressure = rho / porosity / 3.0; + vx = (f1 - f2 + f7 - f8 + f9 - f10 + f11 - f12 + f13 - f14) / rho + + 0.5 * porosity * Gx; + vy = (f3 - f4 + f7 - f8 - f9 + f10 + f15 - f16 + f17 - f18) / rho + + 0.5 * porosity * Gy; + vz = (f5 - f6 + f11 - f12 - f13 + f14 + f15 - f16 - f17 + f18) / + rho + + 0.5 * porosity * Gz; + v_mag = sqrt(vx * vx + vy * vy + vz * vz); + ux = vx / (c0 + sqrt(c0 * c0 + c1 * v_mag)); + uy = vy / (c0 + sqrt(c0 * c0 + c1 * v_mag)); + uz = vz / (c0 + sqrt(c0 * c0 + c1 * v_mag)); + u_mag = sqrt(ux * ux + uy * uy + uz * uz); + + //Update the body force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = -porosity * viscosity / perm * ux - + porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx; + Fy = -porosity * viscosity / perm * uy - + porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy; + Fz = -porosity * viscosity / perm * uz - + porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz; + if (porosity == 1.0) { + Fx = Gx; + Fy = Gy; + Fz = Gz; + } + + //------------------------ BGK collison where body force has higher-order terms ----------------------------------------------------------// + // // q=0 + // dist[n] = f0*(1.0-rlx_eff) + rlx_eff*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // + 0.3333333333333333*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // + // // q = 1 + // dist[nr2] = f1*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // + // // q=2 + // dist[nr1] = f2*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(-3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // + // // q = 3 + // dist[nr4] = f3*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // + // // q = 4 + // dist[nr3] = f4*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); + // + // // q = 5 + // dist[nr6] = f5*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(3. + (6.*uz)/porosity)); + // + // // q = 6 + // dist[nr5] = f6*(1.0-rlx_eff) + rlx_eff*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) + // +0.05555555555555555*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(-3. + (6.*uz)/porosity)); + // + // // q = 7 + // dist[nr8] = f7*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) + + // Fz*(0. - (3.*uz)/porosity)); + // + // // q = 8 + // dist[nr7] = f8*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + Fy*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) + + // Fz*(0. - (3.*uz)/porosity)); + // + // // q = 9 + // dist[nr10] = f9*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + Fy*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) + + // Fz*(0. - (3.*uz)/porosity)); + // + // // q = 10 + // dist[nr9] = f10*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) + + // Fz*(0. - (3.*uz)/porosity)); + // + // // q = 11 + // dist[nr12] = f11*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) + + // Fz*(3. - (3.*uz)/porosity + (9.*(ux + uz))/porosity)); + // + // // q = 12 + // dist[nr11] = f12*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) + + // Fz*(-3. - (9.*(-ux - uz))/porosity - (3.*uz)/porosity)); + // + // // q = 13 + // dist[nr14] = f13*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) + + // Fz*(-3. - (9.*(ux - uz))/porosity - (3.*uz)/porosity)); + // + // // q= 14 + // dist[nr13] = f14*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) + + // Fz*(3. - (3.*uz)/porosity + (9.*(-ux + uz))/porosity)); + // + // // q = 15 + // dist[nr16] = f15*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) + + // Fz*(3. - (3.*uz)/porosity + (9.*(uy + uz))/porosity)); + // + // // q = 16 + // dist[nr15] = f16*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) + + // Fz*(-3. - (9.*(-uy - uz))/porosity - (3.*uz)/porosity)); + // + // // q = 17 + // dist[nr18] = f17*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) + + // Fz*(-3. - (9.*(uy - uz))/porosity - (3.*uz)/porosity)); + // + // // q = 18 + // dist[nr17] = f18*(1.0-rlx_eff) + rlx_eff*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + // +0.027777777777777776*rho*(1. - 0.5*rlx_eff)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) + + // Fz*(3. - (3.*uz)/porosity + (9.*(-uy + uz))/porosity)); + //----------------------------------------------------------------------------------------------------------------------------------------// + + //------------------------ BGK collison where body force has NO higher-order terms ----------------------------------------------------------// + // q=0 + dist[n] = + f0 * (1.0 - rlx_eff) + + rlx_eff * 0.3333333333333333 * rho * + (1. - (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity); + + // q = 1 + dist[nr2] = + f1 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 + 3. * ux + (4.5 * ux * ux) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fx * (3.)); + + // q=2 + dist[nr1] = + f2 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 - 3. * ux + (4.5 * ux * ux) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fx * (-3.)); + + // q = 3 + dist[nr4] = + f3 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 + 3. * uy + (4.5 * uy * uy) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fy * (3.)); + + // q = 4 + dist[nr3] = + f4 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 - 3. * uy + (4.5 * uy * uy) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fy * (-3.)); + + // q = 5 + dist[nr6] = + f5 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 + 3. * uz + (4.5 * uz * uz) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fz * (3.)); + + // q = 6 + dist[nr5] = + f6 * (1.0 - rlx_eff) + + rlx_eff * 0.05555555555555555 * rho * + (1 - 3. * uz + (4.5 * uz * uz) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.05555555555555555 * rho * (1. - 0.5 * rlx_eff) * (Fz * (-3.)); + + // q = 7 + dist[nr8] = f7 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (ux + uy) + + (4.5 * (ux + uy) * (ux + uy)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (3.) + Fy * (3.)); + + // q = 8 + dist[nr7] = f8 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (-ux - uy) + + (4.5 * (-ux - uy) * (-ux - uy)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (-3.) + Fy * (-3.)); + + // q = 9 + dist[nr10] = + f9 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (ux - uy) + + (4.5 * (ux - uy) * (ux - uy)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (3.) + Fy * (-3.)); + + // q = 10 + dist[nr9] = f10 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (-ux + uy) + + (4.5 * (-ux + uy) * (-ux + uy)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (-3.) + Fy * (3.)); + + // q = 11 + dist[nr12] = + f11 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (ux + uz) + + (4.5 * (ux + uz) * (ux + uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (3.) + Fz * (3.)); + + // q = 12 + dist[nr11] = + f12 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (-ux - uz) + + (4.5 * (-ux - uz) * (-ux - uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (-3.) + Fz * (-3.)); + + // q = 13 + dist[nr14] = + f13 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (ux - uz) + + (4.5 * (ux - uz) * (ux - uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (3.) + Fz * (-3.)); + + // q= 14 + dist[nr13] = + f14 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (-ux + uz) + + (4.5 * (-ux + uz) * (-ux + uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fx * (-3.) + Fz * (3.)); + + // q = 15 + dist[nr16] = + f15 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (uy + uz) + + (4.5 * (uy + uz) * (uy + uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fy * (3.) + Fz * (3.)); + + // q = 16 + dist[nr15] = + f16 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (-uy - uz) + + (4.5 * (-uy - uz) * (-uy - uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fy * (-3.) + Fz * (-3.)); + + // q = 17 + dist[nr18] = + f17 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (uy - uz) + + (4.5 * (uy - uz) * (uy - uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fy * (3.) + Fz * (-3.)); + + // q = 18 + dist[nr17] = + f18 * (1.0 - rlx_eff) + + rlx_eff * 0.027777777777777776 * rho * + (1 + 3. * (-uy + uz) + + (4.5 * (-uy + uz) * (-uy + uz)) / porosity - + (1.5 * (ux * ux + uy * uy + uz * uz)) / porosity) + + 0.027777777777777776 * rho * (1. - 0.5 * rlx_eff) * + (Fy * (-3.) + Fz * (3.)); + //-------------------------------------------------------------------------------------------------------------------------------------------// - //------------------------ BGK collison where body force has higher-order terms ----------------------------------------------------------// -// // q=0 -// dist[n] = f0*(1.0-rlx) + rlx*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// + 0.3333333333333333*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q = 1 -// dist[nr2] = f1*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q=2 -// dist[nr1] = f2*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(-3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q = 3 -// dist[nr4] = f3*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q = 4 -// dist[nr3] = f4*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q = 5 -// dist[nr6] = f5*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(3. + (6.*uz)/porosity)); -// -// // q = 6 -// dist[nr5] = f6*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(-3. + (6.*uz)/porosity)); -// -// // q = 7 -// dist[nr8] = f7*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) + -// Fz*(0. - (3.*uz)/porosity)); -// -// // q = 8 -// dist[nr7] = f8*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + Fy*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) + -// Fz*(0. - (3.*uz)/porosity)); -// -// // q = 9 -// dist[nr10] = f9*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + Fy*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) + -// Fz*(0. - (3.*uz)/porosity)); -// -// // q = 10 -// dist[nr9] = f10*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) + -// Fz*(0. - (3.*uz)/porosity)); -// -// // q = 11 -// dist[nr12] = f11*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) + -// Fz*(3. - (3.*uz)/porosity + (9.*(ux + uz))/porosity)); -// -// // q = 12 -// dist[nr11] = f12*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) + -// Fz*(-3. - (9.*(-ux - uz))/porosity - (3.*uz)/porosity)); -// -// // q = 13 -// dist[nr14] = f13*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) + -// Fz*(-3. - (9.*(ux - uz))/porosity - (3.*uz)/porosity)); -// -// // q= 14 -// dist[nr13] = f14*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) + -// Fz*(3. - (3.*uz)/porosity + (9.*(-ux + uz))/porosity)); -// -// // q = 15 -// dist[nr16] = f15*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) + -// Fz*(3. - (3.*uz)/porosity + (9.*(uy + uz))/porosity)); -// -// // q = 16 -// dist[nr15] = f16*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) + -// Fz*(-3. - (9.*(-uy - uz))/porosity - (3.*uz)/porosity)); -// -// // q = 17 -// dist[nr18] = f17*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) + -// Fz*(-3. - (9.*(uy - uz))/porosity - (3.*uz)/porosity)); -// -// // q = 18 -// dist[nr17] = f18*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) + -// Fz*(3. - (3.*uz)/porosity + (9.*(-uy + uz))/porosity)); - //----------------------------------------------------------------------------------------------------------------------------------------// - - - //------------------------ BGK collison where body force has NO higher-order terms ----------------------------------------------------------// - // q=0 - dist[n] = f0*(1.0-rlx) + rlx*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity); - - // q = 1 - dist[nr2] = f1*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(3.)); - - // q=2 - dist[nr1] = f2*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(-3.)); - - // q = 3 - dist[nr4] = f3*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fy*(3.)); - - // q = 4 - dist[nr3] = f4*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fy*(-3.)); - - // q = 5 - dist[nr6] = f5*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fz*(3.)); - - // q = 6 - dist[nr5] = f6*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fz*(-3.)); - - // q = 7 - dist[nr8] = f7*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fy*(3.)); - - // q = 8 - dist[nr7] = f8*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fy*(-3.)); - - // q = 9 - dist[nr10] = f9*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fy*(-3.)); - - // q = 10 - dist[nr9] = f10*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fy*(3.)); - - // q = 11 - dist[nr12] = f11*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fz*(3.)); - - // q = 12 - dist[nr11] = f12*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fz*(-3.)); - - // q = 13 - dist[nr14] = f13*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fz*(-3.)); - - // q= 14 - dist[nr13] = f14*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fz*(3.)); - - // q = 15 - dist[nr16] = f15*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(3.) + Fz*(3.)); - - // q = 16 - dist[nr15] = f16*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(-3.) + Fz*(-3.)); - - // q = 17 - dist[nr18] = f17*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(3.) + Fz*(-3.)); - - // q = 18 - dist[nr17] = f18*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(-3.) + Fz*(3.)); - //-------------------------------------------------------------------------------------------------------------------------------------------// - - - //Update velocity on device - Velocity[0*Np+n] = ux; - Velocity[1*Np+n] = uy; - Velocity[2*Np+n] = uz; - //Update pressure on device - Pressure[n] = pressure; - } - } + //Update velocity on device + Velocity[0 * Np + n] = ux; + Velocity[1 * Np + n] = uy; + Velocity[2 * Np + n] = uz; + //Update pressure on device + Pressure[n] = pressure; + } + } } -__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity, double Den, double *Pressure){ - - int n; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; +__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT( + double *dist, int start, int finish, int Np, double rlx_eff, double rlx, + double Gx, double Gy, double Gz, double *Poros, double *Perm, + double *Velocity, double Den, double *Pressure, bool Forchheimer) { + + int n; + double vx, vy, vz, v_mag; + double ux, uy, uz, u_mag; + double pressure; //defined for this incompressible model + // conserved momemnts + double jx, jy, jz; + // non-conserved moments + double m1, m2, m4, m6, m8, m9, m10, m11, m12, m13, m14, m15, m16, m17, m18; double fq; - //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; - double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) + //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; + double GeoFun; //geometric function from Guo's PRE 66, 036304 (2002) double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double rlx_setA = rlx; - double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); - - const double mrt_V1=0.05263157894736842; - const double mrt_V2=0.012531328320802; - const double mrt_V3=0.04761904761904762; - const double mrt_V4=0.004594820384294068; - const double mrt_V5=0.01587301587301587; - const double mrt_V6=0.0555555555555555555555555; - const double mrt_V7=0.02777777777777778; - const double mrt_V8=0.08333333333333333; - const double mrt_V9=0.003341687552213868; - const double mrt_V10=0.003968253968253968; - const double mrt_V11=0.01388888888888889; - const double mrt_V12=0.04166666666666666; - - - int S = Np/NBLOCKS/NTHREADS + 1; - for (int s=0; s 10Np => odd part of dist) - fq = dist[nread]; // reading the f1 data into register fq + fq = dist[nread]; // reading the f1 data into register fq pressure = fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; jx = fq; - m4 = -4.0*fq; - m9 = 2.0*fq; - m10 = -4.0*fq; + m4 = -4.0 * fq; + m9 = 2.0 * fq; + m10 = -4.0 * fq; // q=2 - nread = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) - fq = dist[nread]; // reading the f2 data into register fq + nread = + neighborList[n + + Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nread]; // reading the f2 data into register fq pressure += fq; - m1 -= 11.0*(fq); - m2 -= 4.0*(fq); + m1 -= 11.0 * (fq); + m2 -= 4.0 * (fq); jx -= fq; - m4 += 4.0*(fq); - m9 += 2.0*(fq); - m10 -= 4.0*(fq); + m4 += 4.0 * (fq); + m9 += 2.0 * (fq); + m10 -= 4.0 * (fq); // q=3 - nread = neighborList[n+2*Np]; // neighbor 4 + nread = neighborList[n + 2 * Np]; // neighbor 4 fq = dist[nread]; pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; jy = fq; - m6 = -4.0*fq; + m6 = -4.0 * fq; m9 -= fq; - m10 += 2.0*fq; + m10 += 2.0 * fq; m11 = fq; - m12 = -2.0*fq; + m12 = -2.0 * fq; // q = 4 - nread = neighborList[n+3*Np]; // neighbor 3 + nread = neighborList[n + 3 * Np]; // neighbor 3 fq = dist[nread]; pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; jy -= fq; - m6 += 4.0*fq; + m6 += 4.0 * fq; m9 -= fq; - m10 += 2.0*fq; + m10 += 2.0 * fq; m11 += fq; - m12 -= 2.0*fq; + m12 -= 2.0 * fq; // q=5 - nread = neighborList[n+4*Np]; + nread = neighborList[n + 4 * Np]; fq = dist[nread]; pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; jz = fq; - m8 = -4.0*fq; + m8 = -4.0 * fq; m9 -= fq; - m10 += 2.0*fq; + m10 += 2.0 * fq; m11 -= fq; - m12 += 2.0*fq; + m12 += 2.0 * fq; // q = 6 - nread = neighborList[n+5*Np]; + nread = neighborList[n + 5 * Np]; fq = dist[nread]; pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; jz -= fq; - m8 += 4.0*fq; + m8 += 4.0 * fq; m9 -= fq; - m10 += 2.0*fq; + m10 += 2.0 * fq; m11 -= fq; - m12 += 2.0*fq; + m12 += 2.0 * fq; // q=7 - nread = neighborList[n+6*Np]; + nread = neighborList[n + 6 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx += fq; m4 += fq; jy += fq; m6 += fq; - m9 += fq; + m9 += fq; m10 += fq; m11 += fq; m12 += fq; @@ -1206,10 +1508,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m17 = -fq; // q = 8 - nread = neighborList[n+7*Np]; + nread = neighborList[n + 7 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx -= fq; m4 -= fq; @@ -1224,10 +1526,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m17 += fq; // q=9 - nread = neighborList[n+8*Np]; + nread = neighborList[n + 8 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx += fq; m4 += fq; @@ -1242,10 +1544,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m17 += fq; // q = 10 - nread = neighborList[n+9*Np]; + nread = neighborList[n + 9 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx -= fq; m4 -= fq; @@ -1260,10 +1562,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m17 -= fq; // q=11 - nread = neighborList[n+10*Np]; + nread = neighborList[n + 10 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx += fq; m4 += fq; @@ -1278,10 +1580,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m18 = fq; // q=12 - nread = neighborList[n+11*Np]; + nread = neighborList[n + 11 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx -= fq; m4 -= fq; @@ -1296,10 +1598,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m18 -= fq; // q=13 - nread = neighborList[n+12*Np]; + nread = neighborList[n + 12 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx += fq; m4 += fq; @@ -1314,10 +1616,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m18 -= fq; // q=14 - nread = neighborList[n+13*Np]; + nread = neighborList[n + 13 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jx -= fq; m4 -= fq; @@ -1332,65 +1634,65 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double m18 += fq; // q=15 - nread = neighborList[n+14*Np]; + nread = neighborList[n + 14 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jy += fq; m6 += fq; jz += fq; m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; + m9 -= 2.0 * fq; + m10 -= 2.0 * fq; m14 = fq; m17 += fq; m18 -= fq; // q=16 - nread = neighborList[n+15*Np]; + nread = neighborList[n + 15 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jy -= fq; m6 -= fq; jz -= fq; m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; + m9 -= 2.0 * fq; + m10 -= 2.0 * fq; m14 += fq; m17 -= fq; m18 += fq; // q=17 - nread = neighborList[n+16*Np]; + nread = neighborList[n + 16 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jy += fq; m6 += fq; jz -= fq; m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; + m9 -= 2.0 * fq; + m10 -= 2.0 * fq; m14 -= fq; m17 += fq; m18 += fq; // q=18 - nread = neighborList[n+17*Np]; + nread = neighborList[n + 17 * Np]; fq = dist[nread]; pressure += fq; - m1 += 8.0*fq; + m1 += 8.0 * fq; m2 += fq; jy -= fq; m6 -= fq; jz += fq; m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; + m9 -= 2.0 * fq; + m10 -= 2.0 * fq; m14 -= fq; m17 -= fq; m18 -= fq; @@ -1399,1348 +1701,1525 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double porosity = Poros[n]; perm = Perm[n]; - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/Den+0.5*porosity*Gx; - vy = jy/Den+0.5*porosity*Gy; - vz = jz/Den+0.5*porosity*Gz; - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); + c0 = 0.5 * (1.0 + porosity * 0.5 * viscosity / perm); + if (porosity == 1.0) + c0 = 0.5; //i.e. apparent pore nodes + if (Forchheimer) + GeoFun = 1.75 / sqrt(150.0 * porosity * porosity * porosity); + else + GeoFun = 0; + c1 = porosity * 0.5 * GeoFun / sqrt(perm); + if (porosity == 1.0) + c1 = 0.0; //i.e. apparent pore nodes + + vx = jx / Den + 0.5 * porosity * Gx; + vy = jy / Den + 0.5 * porosity * Gy; + vz = jz / Den + 0.5 * porosity * Gz; + v_mag = sqrt(vx * vx + vy * vy + vz * vz); + ux = vx / (c0 + sqrt(c0 * c0 + c1 * v_mag)); + uy = vy / (c0 + sqrt(c0 * c0 + c1 * v_mag)); + uz = vz / (c0 + sqrt(c0 * c0 + c1 * v_mag)); + u_mag = sqrt(ux * ux + uy * uy + uz * uz); //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = Den*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx); - Fy = Den*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy); - Fz = Den*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz); - if (porosity==1.0){ - Fx=Den*Gx; - Fy=Den*Gy; - Fz=Den*Gz; + Fx = Den * + (-porosity * viscosity / perm * ux - + porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx); + Fy = Den * + (-porosity * viscosity / perm * uy - + porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy); + Fz = Den * + (-porosity * viscosity / perm * uz - + porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz); + if (porosity == 1.0) { + Fx = Den * Gx; + Fy = Den * Gy; + Fz = Den * Gz; } //Calculate pressure for Incompressible-MRT model - pressure=0.5/porosity*(pressure-0.5*Den*u_mag*u_mag/porosity); - -// //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) -// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) -// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; -// jx = jx + Fx; -// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -// jy = jy + Fy; -// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*Den) - m6) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -// jz = jz + Fz; -// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*Den) - m8) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -// m9 = m9 + rlx_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) -// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; -// m10 = m10 + rlx_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) -// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; -// m11 = m11 + rlx_setA*((Den*(uy*uy-uz*uz)/porosity) - m11) -// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; -// m12 = m12 + rlx_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12) -// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; -// m13 = m13 + rlx_setA*((Den*ux*uy/porosity) - m13) -// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; -// m14 = m14 + rlx_setA*((Den*uy*uz/porosity) - m14) -// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; -// m15 = m15 + rlx_setA*((Den*ux*uz/porosity) - m15) -// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); -// //....................................................................................................... - + pressure = 0.5 / porosity * + (pressure - 0.5 * Den * u_mag * u_mag / porosity); + + // //..............carry out relaxation process............................................... + // m1 = m1 + rlx_eff_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) + // + (1-0.5*rlx_eff_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; + // m2 = m2 + rlx_eff_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) + // + (1-0.5*rlx_eff_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; + // jx = jx + Fx; + // m4 = m4 + rlx_eff_setB*((-0.6666666666666666*ux*Den) - m4) + // + (1-0.5*rlx_eff_setB)*(-0.6666666666666666*Fx); + // jy = jy + Fy; + // m6 = m6 + rlx_eff_setB*((-0.6666666666666666*uy*Den) - m6) + // + (1-0.5*rlx_eff_setB)*(-0.6666666666666666*Fy); + // jz = jz + Fz; + // m8 = m8 + rlx_eff_setB*((-0.6666666666666666*uz*Den) - m8) + // + (1-0.5*rlx_eff_setB)*(-0.6666666666666666*Fz); + // m9 = m9 + rlx_eff_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) + // + (1-0.5*rlx_eff_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; + // m10 = m10 + rlx_eff_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) + // + (1-0.5*rlx_eff_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; + // m11 = m11 + rlx_eff_setA*((Den*(uy*uy-uz*uz)/porosity) - m11) + // + (1-0.5*rlx_eff_setA)*(2*Fy*uy-2*Fz*uz)/porosity; + // m12 = m12 + rlx_eff_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12) + // + (1-0.5*rlx_eff_setA)*(-Fy*uy+Fz*uz)/porosity; + // m13 = m13 + rlx_eff_setA*((Den*ux*uy/porosity) - m13) + // + (1-0.5*rlx_eff_setA)*(Fy*ux+Fx*uy)/porosity; + // m14 = m14 + rlx_eff_setA*((Den*uy*uz/porosity) - m14) + // + (1-0.5*rlx_eff_setA)*(Fz*uy+Fy*uz)/porosity; + // m15 = m15 + rlx_eff_setA*((Den*ux*uz/porosity) - m15) + // + (1-0.5*rlx_eff_setA)*(Fz*ux+Fx*uz)/porosity; + // m16 = m16 + rlx_eff_setB*( - m16); + // m17 = m17 + rlx_eff_setB*( - m17); + // m18 = m18 + rlx_eff_setB*( - m18); + // //....................................................................................................... + //-------------------- IMRT collison where body force has NO higher-order terms -------------// //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + m1 = + m1 + rlx_eff_setA * + ((-30 * Den + + 19 * Den * (ux * ux + uy * uy + uz * uz) / porosity + + 57 * pressure * porosity) - + m1); + m2 = m2 + + rlx_eff_setA * + ((12 * Den - + 5.5 * Den * (ux * ux + uy * uy + uz * uz) / porosity - + 27 * pressure * porosity) - + m2); jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + m4 = m4 + rlx_eff_setB * ((-0.6666666666666666 * ux * Den) - m4) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fx); jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*uy*Den) - m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + m6 = m6 + rlx_eff_setB * ((-0.6666666666666666 * uy * Den) - m6) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fy); jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*uz*Den) - m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); - m10 = m10 + rlx_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA*((Den*(uy*uy-uz*uz)/porosity) - m11); - m12 = m12 + rlx_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA*((Den*ux*uy/porosity) - m13); - m14 = m14 + rlx_setA*((Den*uy*uz/porosity) - m14); - m15 = m15 + rlx_setA*((Den*ux*uz/porosity) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); + m8 = m8 + rlx_eff_setB * ((-0.6666666666666666 * uz * Den) - m8) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fz); + m9 = + m9 + + rlx_eff_setA * + ((Den * (2 * ux * ux - uy * uy - uz * uz) / porosity) - m9); + m10 = + m10 + rlx_eff_setA * + (-0.5 * Den * + ((2 * ux * ux - uy * uy - uz * uz) / porosity) - + m10); + m11 = m11 + + rlx_eff_setA * ((Den * (uy * uy - uz * uz) / porosity) - m11); + m12 = + m12 + rlx_eff_setA * + (-0.5 * (Den * (uy * uy - uz * uz) / porosity) - m12); + m13 = m13 + rlx_eff_setA * ((Den * ux * uy / porosity) - m13); + m14 = m14 + rlx_eff_setA * ((Den * uy * uz / porosity) - m14); + m15 = m15 + rlx_eff_setA * ((Den * ux * uz / porosity) - m15); + m16 = m16 + rlx_eff_setB * (-m16); + m17 = m17 + rlx_eff_setB * (-m17); + m18 = m18 + rlx_eff_setB * (-m18); //....................................................................................................... - //.................inverse transformation...................................................... // q=0 - fq = mrt_V1*Den-mrt_V2*m1+mrt_V3*m2; + fq = mrt_V1 * Den - mrt_V2 * m1 + mrt_V3 * m2; dist[n] = fq; // q = 1 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - nread = neighborList[n+Np]; + fq = mrt_V1 * Den - mrt_V4 * m1 - mrt_V5 * m2 + 0.1 * (jx - m4) + + mrt_V6 * (m9 - m10); + nread = neighborList[n + Np]; dist[nread] = fq; // q=2 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + fq = mrt_V1 * Den - mrt_V4 * m1 - mrt_V5 * m2 + 0.1 * (m4 - jx) + + mrt_V6 * (m9 - m10); nread = neighborList[n]; dist[nread] = fq; // q = 3 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - nread = neighborList[n+3*Np]; + fq = mrt_V1 * Den - mrt_V4 * m1 - mrt_V5 * m2 + 0.1 * (jy - m6) + + mrt_V7 * (m10 - m9) + mrt_V8 * (m11 - m12); + nread = neighborList[n + 3 * Np]; dist[nread] = fq; // q = 4 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - nread = neighborList[n+2*Np]; + fq = mrt_V1 * Den - mrt_V4 * m1 - mrt_V5 * m2 + 0.1 * (m6 - jy) + + mrt_V7 * (m10 - m9) + mrt_V8 * (m11 - m12); + nread = neighborList[n + 2 * Np]; dist[nread] = fq; // q = 5 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - nread = neighborList[n+5*Np]; + fq = mrt_V1 * Den - mrt_V4 * m1 - mrt_V5 * m2 + 0.1 * (jz - m8) + + mrt_V7 * (m10 - m9) + mrt_V8 * (m12 - m11); + nread = neighborList[n + 5 * Np]; dist[nread] = fq; // q = 6 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - nread = neighborList[n+4*Np]; + fq = mrt_V1 * Den - mrt_V4 * m1 - mrt_V5 * m2 + 0.1 * (m8 - jz) + + mrt_V7 * (m10 - m9) + mrt_V8 * (m12 - m11); + nread = neighborList[n + 4 * Np]; dist[nread] = fq; // q = 7 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - nread = neighborList[n+7*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jx + jy) + + 0.025 * (m4 + m6) + mrt_V7 * m9 + mrt_V11 * m10 + + mrt_V8 * m11 + mrt_V12 * m12 + 0.25 * m13 + + 0.125 * (m16 - m17); + nread = neighborList[n + 7 * Np]; dist[nread] = fq; // q = 8 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); - nread = neighborList[n+6*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 - 0.1 * (jx + jy) - + 0.025 * (m4 + m6) + mrt_V7 * m9 + mrt_V11 * m10 + + mrt_V8 * m11 + mrt_V12 * m12 + 0.25 * m13 + + 0.125 * (m17 - m16); + nread = neighborList[n + 6 * Np]; dist[nread] = fq; // q = 9 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - nread = neighborList[n+9*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jx - jy) + + 0.025 * (m4 - m6) + mrt_V7 * m9 + mrt_V11 * m10 + + mrt_V8 * m11 + mrt_V12 * m12 - 0.25 * m13 + + 0.125 * (m16 + m17); + nread = neighborList[n + 9 * Np]; dist[nread] = fq; // q = 10 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - nread = neighborList[n+8*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jy - jx) + + 0.025 * (m6 - m4) + mrt_V7 * m9 + mrt_V11 * m10 + + mrt_V8 * m11 + mrt_V12 * m12 - 0.25 * m13 - + 0.125 * (m16 + m17); + nread = neighborList[n + 8 * Np]; dist[nread] = fq; // q = 11 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); - nread = neighborList[n+11*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jx + jz) + + 0.025 * (m4 + m8) + mrt_V7 * m9 + mrt_V11 * m10 - + mrt_V8 * m11 - mrt_V12 * m12 + 0.25 * m15 + + 0.125 * (m18 - m16); + nread = neighborList[n + 11 * Np]; dist[nread] = fq; // q = 12 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - nread = neighborList[n+10*Np]; - dist[nread]= fq; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 - 0.1 * (jx + jz) - + 0.025 * (m4 + m8) + mrt_V7 * m9 + mrt_V11 * m10 - + mrt_V8 * m11 - mrt_V12 * m12 + 0.25 * m15 + + 0.125 * (m16 - m18); + nread = neighborList[n + 10 * Np]; + dist[nread] = fq; // q = 13 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); - nread = neighborList[n+13*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jx - jz) + + 0.025 * (m4 - m8) + mrt_V7 * m9 + mrt_V11 * m10 - + mrt_V8 * m11 - mrt_V12 * m12 - 0.25 * m15 - + 0.125 * (m16 + m18); + nread = neighborList[n + 13 * Np]; dist[nread] = fq; // q= 14 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); - nread = neighborList[n+12*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jz - jx) + + 0.025 * (m8 - m4) + mrt_V7 * m9 + mrt_V11 * m10 - + mrt_V8 * m11 - mrt_V12 * m12 - 0.25 * m15 + + 0.125 * (m16 + m18); + nread = neighborList[n + 12 * Np]; dist[nread] = fq; // q = 15 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - nread = neighborList[n+15*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jy + jz) + + 0.025 * (m6 + m8) - mrt_V6 * m9 - mrt_V7 * m10 + 0.25 * m14 + + 0.125 * (m17 - m18); + nread = neighborList[n + 15 * Np]; dist[nread] = fq; // q = 16 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - nread = neighborList[n+14*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 - 0.1 * (jy + jz) - + 0.025 * (m6 + m8) - mrt_V6 * m9 - mrt_V7 * m10 + 0.25 * m14 + + 0.125 * (m18 - m17); + nread = neighborList[n + 14 * Np]; dist[nread] = fq; // q = 17 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - nread = neighborList[n+17*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jy - jz) + + 0.025 * (m6 - m8) - mrt_V6 * m9 - mrt_V7 * m10 - 0.25 * m14 + + 0.125 * (m17 + m18); + nread = neighborList[n + 17 * Np]; dist[nread] = fq; // q = 18 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - nread = neighborList[n+16*Np]; + fq = mrt_V1 * Den + mrt_V9 * m1 + mrt_V10 * m2 + 0.1 * (jz - jy) + + 0.025 * (m8 - m6) - mrt_V6 * m9 - mrt_V7 * m10 - 0.25 * m14 - + 0.125 * (m17 + m18); + nread = neighborList[n + 16 * Np]; dist[nread] = fq; //........................................................................ //Update velocity on device - Velocity[0*Np+n] = ux; - Velocity[1*Np+n] = uy; - Velocity[2*Np+n] = uz; + Velocity[0 * Np + n] = ux; + Velocity[1 * Np + n] = uy; + Velocity[2 * Np + n] = uz; //Update pressure on device Pressure[n] = pressure; - - } - } + } + } } -__global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double rho0, double *Pressure){ - - int n, nread; - int nr1,nr2,nr3,nr4,nr5,nr6; - int nr7,nr8,nr9,nr10; - int nr11,nr12,nr13,nr14; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double rho,jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; +__global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT( + int *neighborList, double *dist, int start, int finish, int Np, + double rlx_eff, double rlx, double Gx, double Gy, double Gz, double *Poros, + double *Perm, double *Velocity, double rho0, double *Pressure, + bool Forchheimer) { + + int n, nread; + int nr1, nr2, nr3, nr4, nr5, nr6; + int nr7, nr8, nr9, nr10; + int nr11, nr12, nr13, nr14; + double vx, vy, vz, v_mag; + double ux, uy, uz, u_mag; + double pressure; //defined for this incompressible model + // conserved momemnts + double rho, jx, jy, jz; + // non-conserved moments + double m1, m2, m4, m6, m8, m9, m10, m11, m12, m13, m14, m15, m16, m17, m18; double fq; - //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; - double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) + //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; + double GeoFun; //geometric function from Guo's PRE 66, 036304 (2002) double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double rlx_setA = rlx; - double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); - - const double mrt_V1=0.05263157894736842; - const double mrt_V2=0.012531328320802; - const double mrt_V3=0.04761904761904762; - const double mrt_V4=0.004594820384294068; - const double mrt_V5=0.01587301587301587; - const double mrt_V6=0.0555555555555555555555555; - const double mrt_V7=0.02777777777777778; - const double mrt_V8=0.08333333333333333; - const double mrt_V9=0.003341687552213868; - const double mrt_V10=0.003968253968253968; - const double mrt_V11=0.01388888888888889; - const double mrt_V12=0.04166666666666666; - - int S = Np/NBLOCKS/NTHREADS + 1; - for (int s=0; s even part of dist) - //fq = dist[nread]; // reading the f2 data into register fq - nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) - fq = dist[nr2]; // reading the f2 data into register fq - rho += fq; - m1 -= 11.0*(fq); - m2 -= 4.0*(fq); - jx -= fq; - m4 += 4.0*(fq); - m9 += 2.0*(fq); - m10 -= 4.0*(fq); - - // q=3 - //nread = neighborList[n+2*Np]; // neighbor 4 - //fq = dist[nread]; - nr3 = neighborList[n+2*Np]; // neighbor 4 - fq = dist[nr3]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy = fq; - m6 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 = fq; - m12 = -2.0*fq; - - // q = 4 - //nread = neighborList[n+3*Np]; // neighbor 3 - //fq = dist[nread]; - nr4 = neighborList[n+3*Np]; // neighbor 3 - fq = dist[nr4]; - rho+= fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy -= fq; - m6 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 += fq; - m12 -= 2.0*fq; - - // q=5 - //nread = neighborList[n+4*Np]; - //fq = dist[nread]; - nr5 = neighborList[n+4*Np]; - fq = dist[nr5]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz = fq; - m8 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - - // q = 6 - //nread = neighborList[n+5*Np]; - //fq = dist[nread]; - nr6 = neighborList[n+5*Np]; - fq = dist[nr6]; - rho+= fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz -= fq; - m8 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q=7 - //nread = neighborList[n+6*Np]; - //fq = dist[nread]; - nr7 = neighborList[n+6*Np]; - fq = dist[nr7]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 = fq; - m16 = fq; - m17 = -fq; - - // q = 8 - //nread = neighborList[n+7*Np]; - //fq = dist[nread]; - nr8 = neighborList[n+7*Np]; - fq = dist[nr8]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 += fq; - m16 -= fq; - m17 += fq; - - // q=9 - //nread = neighborList[n+8*Np]; - //fq = dist[nread]; - nr9 = neighborList[n+8*Np]; - fq = dist[nr9]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 += fq; - m17 += fq; - - // q = 10 - //nread = neighborList[n+9*Np]; - //fq = dist[nread]; - nr10 = neighborList[n+9*Np]; - fq = dist[nr10]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 -= fq; - m17 -= fq; - - // q=11 - //nread = neighborList[n+10*Np]; - //fq = dist[nread]; - nr11 = neighborList[n+10*Np]; - fq = dist[nr11]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 = fq; - m16 -= fq; - m18 = fq; - - // q=12 - //nread = neighborList[n+11*Np]; - //fq = dist[nread]; - nr12 = neighborList[n+11*Np]; - fq = dist[nr12]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 += fq; - m16 += fq; - m18 -= fq; - - // q=13 - //nread = neighborList[n+12*Np]; - //fq = dist[nread]; - nr13 = neighborList[n+12*Np]; - fq = dist[nr13]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 -= fq; - m18 -= fq; - - // q=14 - //nread = neighborList[n+13*Np]; - //fq = dist[nread]; - nr14 = neighborList[n+13*Np]; - fq = dist[nr14]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 += fq; - m18 += fq; - - // q=15 - nread = neighborList[n+14*Np]; - fq = dist[nread]; - //fq = dist[17*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 = fq; - m17 += fq; - m18 -= fq; - - // q=16 - nread = neighborList[n+15*Np]; - fq = dist[nread]; - //fq = dist[8*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 += fq; - m17 -= fq; - m18 += fq; - - // q=17 - //fq = dist[18*Np+n]; - nread = neighborList[n+16*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 += fq; - m18 += fq; - - // q=18 - nread = neighborList[n+17*Np]; - fq = dist[nread]; - //fq = dist[9*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 -= fq; - m18 -= fq; - //---------------------------------------------------------------------// - - porosity = Poros[n]; - perm = Perm[n]; - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/rho0+0.5*porosity*Gx; - vy = jy/rho0+0.5*porosity*Gy; - vz = jz/rho0+0.5*porosity*Gz; - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx); - Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy); - Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz); - if (porosity==1.0){ - Fx=rho0*Gx; - Fy=rho0*Gy; - Fz=rho0*Gz; - } - - //Calculate pressure for MRT model - //pressure=rho/3.f/porosity; - pressure=rho/3.f; + fq = dist[n]; + rho = fq; + m1 = -30.0 * fq; + m2 = 12.0 * fq; - //-------------------- MRT collison where body force has NO higher-order terms -------------// - m1 = m1 + rlx_setA*((19*(ux*ux+uy*uy+uz*uz)*rho0/porosity - 11*rho) - m1); - m2 = m2 + rlx_setA*((3*rho - 5.5*(ux*ux+uy*uy+uz*uz)*rho0/porosity) - m2); - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0)- m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0)- m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0)- m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*(((2*ux*ux-uy*uy-uz*uz)*rho0/porosity) - m9); - m10 = m10 + rlx_setA*( - m10); - //m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA*(((uy*uy-uz*uz)*rho0/porosity) - m11); - m12 = m12 + rlx_setA*( - m12); - //m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA*( (ux*uy*rho0/porosity) - m13); - m14 = m14 + rlx_setA*( (uy*uz*rho0/porosity) - m14); - m15 = m15 + rlx_setA*( (ux*uz*rho0/porosity) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... + // q=1 + //nread = neighborList[n]; // neighbor 2 + //fq = dist[nread]; // reading the f1 data into register fq + nr1 = neighborList[n]; + fq = dist[nr1]; // reading the f1 data into register fq + rho += fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; + jx = fq; + m4 = -4.0 * fq; + m9 = 2.0 * fq; + m10 = -4.0 * fq; + // f2 = dist[10*Np+n]; + //nread = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + //fq = dist[nread]; // reading the f2 data into register fq + nr2 = neighborList[n + + Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nr2]; // reading the f2 data into register fq + rho += fq; + m1 -= 11.0 * (fq); + m2 -= 4.0 * (fq); + jx -= fq; + m4 += 4.0 * (fq); + m9 += 2.0 * (fq); + m10 -= 4.0 * (fq); - //.................inverse transformation...................................................... - // q=0 - fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; - dist[n] = fq; - - // q = 1 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - //nread = neighborList[n+Np]; - dist[nr2] = fq; - - // q=2 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); - //nread = neighborList[n]; - dist[nr1] = fq; - - // q = 3 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - //nread = neighborList[n+3*Np]; - dist[nr4] = fq; - - // q = 4 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - //nread = neighborList[n+2*Np]; - dist[nr3] = fq; - - // q = 5 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - //nread = neighborList[n+5*Np]; - dist[nr6] = fq; - - // q = 6 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - //nread = neighborList[n+4*Np]; - dist[nr5] = fq; - - // q = 7 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+ - mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - //nread = neighborList[n+7*Np]; - dist[nr8] = fq; - - // q = 8 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m17-m16); - //nread = neighborList[n+6*Np]; - dist[nr7] = fq; - - // q = 9 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+ - mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - //nread = neighborList[n+9*Np]; - dist[nr10] = fq; - - // q = 10 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+ - mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - //nread = neighborList[n+8*Np]; - dist[nr9] = fq; - - // q = 11 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) - +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m18-m16); - //nread = neighborList[n+11*Np]; - dist[nr12] = fq; - - // q = 12 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ - mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - //nread = neighborList[n+10*Np]; - dist[nr11]= fq; - - // q = 13 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) - +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15-0.125*(m16+m18); - //nread = neighborList[n+13*Np]; - dist[nr14] = fq; - - // q= 14 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) - +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15+0.125*(m16+m18); - //nread = neighborList[n+12*Np]; - dist[nr13] = fq; - - - // q = 15 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - nread = neighborList[n+15*Np]; - dist[nread] = fq; - - // q = 16 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - nread = neighborList[n+14*Np]; - dist[nread] = fq; - - - // q = 17 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) - -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - nread = neighborList[n+17*Np]; - dist[nread] = fq; - - // q = 18 - fq = mrt_V1*rho+mrt_V9*m1 - +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) - -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - nread = neighborList[n+16*Np]; - dist[nread] = fq; - //........................................................................ + // q=3 + //nread = neighborList[n+2*Np]; // neighbor 4 + //fq = dist[nread]; + nr3 = neighborList[n + 2 * Np]; // neighbor 4 + fq = dist[nr3]; + rho += fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; + jy = fq; + m6 = -4.0 * fq; + m9 -= fq; + m10 += 2.0 * fq; + m11 = fq; + m12 = -2.0 * fq; - //Update velocity on device - Velocity[0*Np+n] = ux; - Velocity[1*Np+n] = uy; - Velocity[2*Np+n] = uz; - //Update pressure on device - Pressure[n] = pressure; - } - } -} + // q = 4 + //nread = neighborList[n+3*Np]; // neighbor 3 + //fq = dist[nread]; + nr4 = neighborList[n + 3 * Np]; // neighbor 3 + fq = dist[nr4]; + rho += fq; + m1 -= 11.0 * fq; + m2 -= 4.0 * fq; + jy -= fq; + m6 += 4.0 * fq; + m9 -= fq; + m10 += 2.0 * fq; + m11 += fq; + m12 -= 2.0 * fq; -__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double rho0, double *Pressure){ - - int n; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double rho,jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; - double fq; - //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; - double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) - double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double rlx_setA = rlx; - double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); - - const double mrt_V1=0.05263157894736842; - const double mrt_V2=0.012531328320802; - const double mrt_V3=0.04761904761904762; - const double mrt_V4=0.004594820384294068; - const double mrt_V5=0.01587301587301587; - const double mrt_V6=0.0555555555555555555555555; - const double mrt_V7=0.02777777777777778; - const double mrt_V8=0.08333333333333333; - const double mrt_V9=0.003341687552213868; - const double mrt_V10=0.003968253968253968; - const double mrt_V11=0.01388888888888889; - const double mrt_V12=0.04166666666666666; - - - int S = Np/NBLOCKS/NTHREADS + 1; - for (int s=0; s>>(dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Pressure); + dvc_ScaLBL_D3Q19_AAeven_Greyscale<<>>( + dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, + Velocity, Pressure, Forchheimer); hipError_t err = hipGetLastError(); - if (hipSuccess != err){ - printf("hip error in ScaLBL_D3Q19_AAeven_Greyscale: %s \n",hipGetErrorString(err)); - } + if (hipSuccess != err) { + printf("hip error in ScaLBL_D3Q19_AAeven_Greyscale: %s \n", + hipGetErrorString(err)); + } } -extern "C" void ScaLBL_D3Q19_AAodd_Greyscale(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double *Pressure){ +extern "C" void ScaLBL_D3Q19_AAodd_Greyscale( + int *neighborList, double *dist, int start, int finish, int Np, + double rlx_eff, double rlx, double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double *Pressure, bool Forchheimer) { - dvc_ScaLBL_D3Q19_AAodd_Greyscale<<>>(neighborList,dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Pressure); + dvc_ScaLBL_D3Q19_AAodd_Greyscale<<>>( + neighborList, dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, + Perm, Velocity, Pressure, Forchheimer); hipError_t err = hipGetLastError(); - if (hipSuccess != err){ - printf("hip error in ScaLBL_D3Q19_AAodd_Greyscale: %s \n",hipGetErrorString(err)); - } + if (hipSuccess != err) { + printf("hip error in ScaLBL_D3Q19_AAodd_Greyscale: %s \n", + hipGetErrorString(err)); + } } -extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double Den,double *Pressure){ - - dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT<<>>(dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Den,Pressure); +extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT( + double *dist, int start, int finish, int Np, double rlx_eff, double rlx, + double Fx, double Fy, double Fz, double *Poros, double *Perm, + double *Velocity, double Den, double *Pressure, bool Forchheimer) { + + dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT<<>>( + dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, + Velocity, Den, Pressure, Forchheimer); hipError_t err = hipGetLastError(); - if (hipSuccess != err){ - printf("hip error in ScaLBL_D3Q19_AAeven_Greyscale_IMRT: %s \n",hipGetErrorString(err)); - } + if (hipSuccess != err) { + printf("hip error in ScaLBL_D3Q19_AAeven_Greyscale_IMRT: %s \n", + hipGetErrorString(err)); + } } -extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double Den,double *Pressure){ +extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT( + int *neighborList, double *dist, int start, int finish, int Np, + double rlx_eff, double rlx, double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double Den, double *Pressure, + bool Forchheimer) { - dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT<<>>(neighborList,dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Den,Pressure); + dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT<<>>( + neighborList, dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, + Perm, Velocity, Den, Pressure, Forchheimer); hipError_t err = hipGetLastError(); - if (hipSuccess != err){ - printf("hip error in ScaLBL_D3Q19_AAodd_Greyscale_IMRT: %s \n",hipGetErrorString(err)); - } + if (hipSuccess != err) { + printf("hip error in ScaLBL_D3Q19_AAodd_Greyscale_IMRT: %s \n", + hipGetErrorString(err)); + } } -extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double rho0,double *Pressure){ +extern "C" void +ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, + int finish, int Np, double rlx_eff, double rlx, + double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double rho0, + double *Pressure, bool Forchheimer) { - dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT<<>>(neighborList,dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,rho0,Pressure); + dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT<<>>( + neighborList, dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, + Perm, Velocity, rho0, Pressure, Forchheimer); hipError_t err = hipGetLastError(); - if (hipSuccess != err){ - printf("hip error in ScaLBL_D3Q19_AAodd_Greyscale_MRT: %s \n",hipGetErrorString(err)); - } + if (hipSuccess != err) { + printf("hip error in ScaLBL_D3Q19_AAodd_Greyscale_MRT: %s \n", + hipGetErrorString(err)); + } } -extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double rho0,double *Pressure){ - - dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT<<>>(dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,rho0,Pressure); +extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT( + double *dist, int start, int finish, int Np, double rlx_eff, double rlx, + double Fx, double Fy, double Fz, double *Poros, double *Perm, + double *Velocity, double rho0, double *Pressure, bool Forchheimer) { + + dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT<<>>( + dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, + Velocity, rho0, Pressure, Forchheimer); hipError_t err = hipGetLastError(); - if (hipSuccess != err){ - printf("hip error in ScaLBL_D3Q19_AAeven_Greyscale_MRT: %s \n",hipGetErrorString(err)); - } + if (hipSuccess != err) { + printf("hip error in ScaLBL_D3Q19_AAeven_Greyscale_MRT: %s \n", + hipGetErrorString(err)); + } } -extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den){ - dvc_ScaLBL_D3Q19_GreyIMRT_Init<<>>(dist, Np, Den); - hipError_t err = hipGetLastError(); - if (hipSuccess != err){ - printf("hip error in ScaLBL_D3Q19_GreyIMRT_Init: %s \n",hipGetErrorString(err)); - } -} +extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den) { + dvc_ScaLBL_D3Q19_GreyIMRT_Init<<>>(dist, Np, Den); + hipError_t err = hipGetLastError(); + if (hipSuccess != err) { + printf("hip error in ScaLBL_D3Q19_GreyIMRT_Init: %s \n", + hipGetErrorString(err)); + } +} \ No newline at end of file diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index f1df0809..c5cface4 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -29,7 +29,8 @@ ScaLBL_GreyscaleModel::ScaLBL_GreyscaleModel(int RANK, int NP, : rank(RANK), nprocs(NP), Restart(0), timestep(0), timestepMax(0), tau(0), tau_eff(0), Den(0), Fx(0), Fy(0), Fz(0), flux(0), din(0), dout(0), GreyPorosity(0), Nx(0), Ny(0), Nz(0), N(0), Np(0), nprocx(0), nprocy(0), - nprocz(0), BoundaryCondition(0), Lx(0), Ly(0), Lz(0), comm(COMM) { + nprocz(0), BoundaryCondition(0), Lx(0), Ly(0), Lz(0), comm(COMM), + Forchheimer(0), viscosity_ratio(0) { SignDist.resize(Nx, Ny, Nz); SignDist.fill(0); } @@ -46,7 +47,8 @@ void ScaLBL_GreyscaleModel::ReadParams(string filename) { // set defaults timestepMax = 100000; tau = 1.0; - tau_eff = tau; + viscosity_ratio = 1.0; + tau_eff = viscosity_ratio * (tau - 0.5) + 0.5; Den = 1.0; //constant density tolerance = 0.01; Fx = Fy = Fz = 0.0; @@ -54,7 +56,8 @@ void ScaLBL_GreyscaleModel::ReadParams(string filename) { din = dout = 1.0; flux = 0.0; dp = 10.0; //unit of 'dp': voxel - CollisionType = 1; //1: IMRT; 2: BGK; 3: MRT + CollisionType = 3; //1: IMRT; 2: BGK; 3: MRT + Forchheimer = false; // ---------------------- Greyscale Model parameters -----------------------// if (greyscale_db->keyExists("timestepMax")) { @@ -63,7 +66,11 @@ void ScaLBL_GreyscaleModel::ReadParams(string filename) { if (greyscale_db->keyExists("tau")) { tau = greyscale_db->getScalar("tau"); } - tau_eff = greyscale_db->getWithDefault("tau_eff", tau); + if (greyscale_db->keyExists("ViscosityRatio")) { + viscosity_ratio = greyscale_db->getScalar("ViscosityRatio"); + } + tau_eff = greyscale_db->getWithDefault( + "tau_eff", viscosity_ratio * (tau - 0.5) + 0.5); if (greyscale_db->keyExists("Den")) { Den = greyscale_db->getScalar("Den"); } @@ -78,6 +85,9 @@ void ScaLBL_GreyscaleModel::ReadParams(string filename) { if (greyscale_db->keyExists("Restart")) { Restart = greyscale_db->getScalar("Restart"); } + if (greyscale_db->keyExists("Forchheimer")) { + Forchheimer = greyscale_db->getScalar("Forchheimer"); + } if (greyscale_db->keyExists("din")) { din = greyscale_db->getScalar("din"); } @@ -204,82 +214,61 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, double *Permeability) { size_t NLABELS = 0; signed char VALUE = 0; - double POROSITY = 0.f; - double PERMEABILITY = 0.f; auto LabelList = greyscale_db->getVector("ComponentLabels"); auto PorosityList = greyscale_db->getVector("PorosityList"); auto PermeabilityList = greyscale_db->getVector("PermeabilityList"); NLABELS = LabelList.size(); - if (NLABELS != PorosityList.size()) { - ERROR("Error: ComponentLabels and PorosityList must be the same " - "length! \n"); + if ((NLABELS != PorosityList.size()) || + (NLABELS != PermeabilityList.size())) { + ERROR("Error: ComponentLabels, PorosityList and PermeabilityList " + "must be the same length! \n"); } - // Assign the labels - double *label_count; - double *label_count_global; - label_count = new double[NLABELS]; - label_count_global = new double[NLABELS]; + for (size_t idx_label = 0; idx_label < NLABELS; idx_label++) { + if ((PorosityList[idx_label] <= 0.0) || + (PorosityList[idx_label] > 1.0)) { + ERROR("Error: Porosity for grey voxels must be 0.0 < " + "Porosity <= 1.0 !\n"); + } + if (PermeabilityList[idx_label] <= 0.0) { + ERROR("Error: Permeability for grey voxel must be > " + "0.0 ! \n"); + } + } - for (size_t idx = 0; idx < NLABELS; idx++) - label_count[idx] = 0; + // Assign the labels + std::vector label_count(NLABELS, 0.0); + std::vector label_count_global(NLABELS, 0.0); for (int k = 0; k < Nz; k++) { for (int j = 0; j < Ny; j++) { for (int i = 0; i < Nx; i++) { int n = k * Nx * Ny + j * Nx + i; VALUE = id[n]; - // Assign the affinity from the paired list - for (size_t idx = 0; idx < NLABELS; idx++) { - //printf("idx=%i, value=%i, %i, \n",idx, VALUE,LabelList[idx]); - if (VALUE == LabelList[idx]) { - POROSITY = PorosityList[idx]; - label_count[idx] += 1.0; - idx = NLABELS; - //Mask->id[n] = 0; // set mask to zero since this is an immobile component - } - } int idx = Map(i, j, k); - if (!(idx < 0)) { - if (POROSITY <= 0.0) { - ERROR("Error: Porosity for grey voxels must be 0.0 < " - "Porosity <= 1.0 !\n"); - } else { - Porosity[idx] = POROSITY; - } - } - } - } - } - if (NLABELS != PermeabilityList.size()) { - ERROR("Error: ComponentLabels and PermeabilityList must be the same " - "length! \n"); - } - for (int k = 0; k < Nz; k++) { - for (int j = 0; j < Ny; j++) { - for (int i = 0; i < Nx; i++) { - int n = k * Nx * Ny + j * Nx + i; - VALUE = id[n]; - // Assign the affinity from the paired list - for (size_t idx = 0; idx < NLABELS; idx++) { - //printf("idx=%i, value=%i, %i, \n",idx, VALUE,LabelList[idx]); - if (VALUE == LabelList[idx]) { - PERMEABILITY = PermeabilityList[idx]; - idx = NLABELS; - //Mask->id[n] = 0; // set mask to zero since this is an immobile component + if (idx >= 0) { + // Assign the affinity from the paired list + bool label_found = false; + + for (size_t idx_label = 0; idx_label < NLABELS; + idx_label++) { + if (VALUE == LabelList[idx_label]) { + Porosity[idx] = PorosityList[idx_label]; + Permeability[idx] = PermeabilityList[idx_label] / + Dm->voxel_length / + Dm->voxel_length; + label_count[idx_label] += 1.0; + label_found = true; + break; + } } - } - int idx = Map(i, j, k); - if (!(idx < 0)) { - if (PERMEABILITY <= 0.0) { - ERROR("Error: Permeability for grey voxel must be > " - "0.0 ! \n"); - } else { - Permeability[idx] = - PERMEABILITY / Dm->voxel_length / Dm->voxel_length; + + if (!label_found) { + ERROR("Error: Voxel value not found in ComponentLabels " + "list!\n"); } } } @@ -292,25 +281,33 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, for (size_t idx = 0; idx < NLABELS; idx++) label_count_global[idx] = Dm->Comm.sumReduce(label_count[idx]); + //Initialize a weighted porosity after considering grey voxels GreyPorosity = 0.0; - for (unsigned int idx = 0; idx < NLABELS; idx++) { + + for (unsigned int idx_label = 0; idx_label < NLABELS; idx_label++) { double volume_fraction = - double(label_count_global[idx]) / + double(label_count_global[idx_label]) / double((Nx - 2) * (Ny - 2) * (Nz - 2) * nprocs); - GreyPorosity += volume_fraction * PorosityList[idx]; + GreyPorosity += volume_fraction * PorosityList[idx_label]; } + double POROSITY = 0.f; + double PERMEABILITY = 0.f; + if (rank == 0) { printf("Image resolution: %.5g [um/voxel]\n", Dm->voxel_length); printf("Number of component labels: %lu \n", NLABELS); - for (unsigned int idx = 0; idx < NLABELS; idx++) { - VALUE = LabelList[idx]; - POROSITY = PorosityList[idx]; - PERMEABILITY = PermeabilityList[idx]; + + for (unsigned int idx_label = 0; idx_label < NLABELS; idx_label++) { + VALUE = LabelList[idx_label]; + POROSITY = PorosityList[idx_label]; + PERMEABILITY = PermeabilityList[idx_label]; + double volume_fraction = - double(label_count_global[idx]) / + double(label_count_global[idx_label]) / double((Nx - 2) * (Ny - 2) * (Nz - 2) * nprocs); + printf(" label=%d: porosity=%.3g, permeability=%.3g [um^2] " "(=%.3g [voxel^2]), volume fraction=%.3g\n", VALUE, POROSITY, PERMEABILITY, @@ -329,29 +326,30 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels( double *Porosity, double *Permeability, const vector &File_poro, const vector &File_perm) { - double *Porosity_host, *Permeability_host; - Porosity_host = new double[N]; - Permeability_host = new double[N]; + double POROSITY = 0.f; double PERMEABILITY = 0.f; + //Initialize a weighted porosity after considering grey voxels double GreyPorosity_loc = 0.0; GreyPorosity = 0.0; - //double label_count_loc = 0.0; - //double label_count_glb = 0.0; - Mask->ReadFromFile(File_poro[0], File_poro[1], Porosity_host); - Mask->ReadFromFile(File_perm[0], File_perm[1], Permeability_host); + std::vector Porosity_host(N, 0.0); + std::vector Permeability_host(N, 0.0); + + Mask->ReadFromFile(File_poro[0], File_poro[1], Porosity_host.data()); + Mask->ReadFromFile(File_perm[0], File_perm[1], Permeability_host.data()); for (int k = 0; k < Nz; k++) { for (int j = 0; j < Ny; j++) { for (int i = 0; i < Nx; i++) { int idx = Map(i, j, k); - if (!(idx < 0)) { + if (idx >= 0) { int n = k * Nx * Ny + j * Nx + i; POROSITY = Porosity_host[n]; PERMEABILITY = Permeability_host[n]; - if (POROSITY <= 0.0) { + + if (POROSITY <= 0.0 || POROSITY > 1.0) { ERROR("Error: Porosity for grey voxels must be 0.0 < " "Porosity <= 1.0 !\n"); } else if (PERMEABILITY <= 0.0) { @@ -359,15 +357,19 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels( "0.0 ! \n"); } else { Porosity[idx] = POROSITY; - Permeability[idx] = PERMEABILITY; + + Permeability[idx] = + PERMEABILITY / Dm->voxel_length / Dm->voxel_length; + GreyPorosity_loc += POROSITY; - //label_count_loc += 1.0; } } } } } + GreyPorosity = Dm->Comm.sumReduce(GreyPorosity_loc); + GreyPorosity = GreyPorosity / double((Nx - 2) * (Ny - 2) * (Nz - 2) * nprocs); @@ -377,8 +379,6 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels( "is %.3g\n", GreyPorosity); } - delete[] Porosity_host; - delete[] Permeability_host; } void ScaLBL_GreyscaleModel::Create() { @@ -536,6 +536,9 @@ void ScaLBL_GreyscaleModel::Run() { } if (rank == 0) { + printf("Viscosity Ratio: %.5g\n", viscosity_ratio); + printf("tau: %.5g\n", tau); + printf("Effective tau: %.5g\n", tau_eff); printf("********************************************************\n"); printf("No. of timesteps: %i \n", timestepMax); fflush(stdout); @@ -565,26 +568,29 @@ void ScaLBL_GreyscaleModel::Run() { case 1: ScaLBL_D3Q19_AAodd_Greyscale_IMRT( NeighborList, fq, ScaLBL_Comm->FirstInterior(), - ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz, - Porosity, Permeability, Velocity, Den, Pressure_dvc); + ScaLBL_Comm->LastInterior(), Np, rlx_eff, rlx, Fx, Fy, Fz, + Porosity, Permeability, Velocity, Den, Pressure_dvc, + Forchheimer); break; case 2: ScaLBL_D3Q19_AAodd_Greyscale( NeighborList, fq, ScaLBL_Comm->FirstInterior(), - ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz, - Porosity, Permeability, Velocity, Pressure_dvc); + ScaLBL_Comm->LastInterior(), Np, rlx_eff, rlx, Fx, Fy, Fz, + Porosity, Permeability, Velocity, Pressure_dvc, Forchheimer); break; case 3: ScaLBL_D3Q19_AAodd_Greyscale_MRT( NeighborList, fq, ScaLBL_Comm->FirstInterior(), - ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz, - Porosity, Permeability, Velocity, Den, Pressure_dvc); + ScaLBL_Comm->LastInterior(), Np, rlx_eff, rlx, Fx, Fy, Fz, + Porosity, Permeability, Velocity, Den, Pressure_dvc, + Forchheimer); break; default: ScaLBL_D3Q19_AAodd_Greyscale_IMRT( NeighborList, fq, ScaLBL_Comm->FirstInterior(), - ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz, - Porosity, Permeability, Velocity, Den, Pressure_dvc); + ScaLBL_Comm->LastInterior(), Np, rlx_eff, rlx, Fx, Fy, Fz, + Porosity, Permeability, Velocity, Den, Pressure_dvc, + Forchheimer); break; } ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE @@ -597,27 +603,27 @@ void ScaLBL_GreyscaleModel::Run() { switch (CollisionType) { case 1: ScaLBL_D3Q19_AAodd_Greyscale_IMRT( - NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, - rlx_eff, Fx, Fy, Fz, Porosity, Permeability, Velocity, Den, - Pressure_dvc); + NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx_eff, + rlx, Fx, Fy, Fz, Porosity, Permeability, Velocity, Den, + Pressure_dvc, Forchheimer); break; case 2: - ScaLBL_D3Q19_AAodd_Greyscale(NeighborList, fq, 0, - ScaLBL_Comm->LastExterior(), Np, rlx, - rlx_eff, Fx, Fy, Fz, Porosity, - Permeability, Velocity, Pressure_dvc); + ScaLBL_D3Q19_AAodd_Greyscale( + NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx_eff, + rlx, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc, + Forchheimer); break; case 3: ScaLBL_D3Q19_AAodd_Greyscale_MRT( - NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, - rlx_eff, Fx, Fy, Fz, Porosity, Permeability, Velocity, Den, - Pressure_dvc); + NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx_eff, + rlx, Fx, Fy, Fz, Porosity, Permeability, Velocity, Den, + Pressure_dvc, Forchheimer); break; default: ScaLBL_D3Q19_AAodd_Greyscale_IMRT( - NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, - rlx_eff, Fx, Fy, Fz, Porosity, Permeability, Velocity, Den, - Pressure_dvc); + NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx_eff, + rlx, Fx, Fy, Fz, Porosity, Permeability, Velocity, Den, + Pressure_dvc, Forchheimer); break; } ScaLBL_DeviceBarrier(); @@ -630,26 +636,26 @@ void ScaLBL_GreyscaleModel::Run() { case 1: ScaLBL_D3Q19_AAeven_Greyscale_IMRT( fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), - Np, rlx, rlx_eff, Fx, Fy, Fz, Porosity, Permeability, Velocity, - Den, Pressure_dvc); + Np, rlx_eff, rlx, Fx, Fy, Fz, Porosity, Permeability, Velocity, + Den, Pressure_dvc, Forchheimer); break; case 2: - ScaLBL_D3Q19_AAeven_Greyscale(fq, ScaLBL_Comm->FirstInterior(), - ScaLBL_Comm->LastInterior(), Np, rlx, - rlx_eff, Fx, Fy, Fz, Porosity, - Permeability, Velocity, Pressure_dvc); + ScaLBL_D3Q19_AAeven_Greyscale( + fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), + Np, rlx_eff, rlx, Fx, Fy, Fz, Porosity, Permeability, Velocity, + Pressure_dvc, Forchheimer); break; case 3: ScaLBL_D3Q19_AAeven_Greyscale_MRT( fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), - Np, rlx, rlx_eff, Fx, Fy, Fz, Porosity, Permeability, Velocity, - Den, Pressure_dvc); + Np, rlx_eff, rlx, Fx, Fy, Fz, Porosity, Permeability, Velocity, + Den, Pressure_dvc, Forchheimer); break; default: ScaLBL_D3Q19_AAeven_Greyscale_IMRT( fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), - Np, rlx, rlx_eff, Fx, Fy, Fz, Porosity, Permeability, Velocity, - Den, Pressure_dvc); + Np, rlx_eff, rlx, Fx, Fy, Fz, Porosity, Permeability, Velocity, + Den, Pressure_dvc, Forchheimer); break; } ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE @@ -662,23 +668,27 @@ void ScaLBL_GreyscaleModel::Run() { switch (CollisionType) { case 1: ScaLBL_D3Q19_AAeven_Greyscale_IMRT( - fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, - Fz, Porosity, Permeability, Velocity, Den, Pressure_dvc); + fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx_eff, rlx, Fx, Fy, + Fz, Porosity, Permeability, Velocity, Den, Pressure_dvc, + Forchheimer); break; case 2: - ScaLBL_D3Q19_AAeven_Greyscale( - fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, - Fz, Porosity, Permeability, Velocity, Pressure_dvc); + ScaLBL_D3Q19_AAeven_Greyscale(fq, 0, ScaLBL_Comm->LastExterior(), + Np, rlx_eff, rlx, Fx, Fy, Fz, + Porosity, Permeability, Velocity, + Pressure_dvc, Forchheimer); break; case 3: ScaLBL_D3Q19_AAeven_Greyscale_MRT( - fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, - Fz, Porosity, Permeability, Velocity, Den, Pressure_dvc); + fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx_eff, rlx, Fx, Fy, + Fz, Porosity, Permeability, Velocity, Den, Pressure_dvc, + Forchheimer); break; default: ScaLBL_D3Q19_AAeven_Greyscale_IMRT( - fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, - Fz, Porosity, Permeability, Velocity, Den, Pressure_dvc); + fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx_eff, rlx, Fx, Fy, + Fz, Porosity, Permeability, Velocity, Den, Pressure_dvc, + Forchheimer); break; } ScaLBL_DeviceBarrier(); @@ -692,8 +702,6 @@ void ScaLBL_GreyscaleModel::Run() { //ScaLBL_Comm->RegularLayout(Map,Porosity,PorosityMap); //ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); - double count_loc = 0; - double count; double vax, vay, vaz; double vax_loc, vay_loc, vaz_loc; //double px_loc,py_loc,pz_loc; @@ -730,7 +738,6 @@ void ScaLBL_GreyscaleModel::Run() { vax_loc += Velocity_x(i, j, k); vay_loc += Velocity_y(i, j, k); vaz_loc += Velocity_z(i, j, k); - count_loc += 1.0; } } } @@ -738,11 +745,10 @@ void ScaLBL_GreyscaleModel::Run() { vax = Dm->Comm.sumReduce(vax_loc); vay = Dm->Comm.sumReduce(vay_loc); vaz = Dm->Comm.sumReduce(vaz_loc); - count = Dm->Comm.sumReduce(count_loc); - vax /= count; - vay /= count; - vaz /= count; + vax /= double((Nx - 2) * (Ny - 2) * (Nz - 2) * nprocs); + vay /= double((Nx - 2) * (Ny - 2) * (Nz - 2) * nprocs); + vaz /= double((Nx - 2) * (Ny - 2) * (Nz - 2) * nprocs); double force_mag = sqrt(Fx * Fx + Fy * Fy + Fz * Fz); double dir_x = Fx / force_mag; @@ -776,10 +782,12 @@ void ScaLBL_GreyscaleModel::Run() { double h = Dm->voxel_length; //double absperm = h*h*mu*Mask->Porosity()*flow_rate / force_mag; - double absperm = h * h * mu * GreyPorosity * flow_rate / force_mag; + double absperm = h * h * mu * flow_rate / force_mag; if (rank == 0) { - printf(" AbsPerm = %.5g [micron^2]\n", absperm); + printf(" timestep %d - error %.0e:" + "AbsPerm = %.5g [um^2] = %.5g [mD^2]\n", + timestep, error, absperm, absperm / 0.0009869233); bool WriteHeader = false; FILE *log_file = fopen("Permeability.csv", "r"); if (log_file != NULL) @@ -872,7 +880,8 @@ void ScaLBL_GreyscaleModel::VelocityField() { auto SignDistVar = std::make_shared(); auto PressureVar = std::make_shared(); - IO::initialize("", "silo", "false"); + std::string format = vis_db->getWithDefault("format", "silo"); + IO::initialize("", format, false); // Create the MeshDataStruct visData.resize(1); visData[0].meshName = "domain"; @@ -1000,4 +1009,4 @@ void ScaLBL_GreyscaleModel::WriteDebug() { PERM_FILE = fopen(LocalRankFilename, "wb"); fwrite(PhaseField.data(), 8, N, PERM_FILE); fclose(PERM_FILE); -} +} \ No newline at end of file diff --git a/models/GreyscaleModel.h b/models/GreyscaleModel.h index c61b1746..84642a3a 100644 --- a/models/GreyscaleModel.h +++ b/models/GreyscaleModel.h @@ -59,6 +59,8 @@ class ScaLBL_GreyscaleModel { double din, dout; double dp; //solid particle diameter, unit in voxel double GreyPorosity; + bool Forchheimer; + double viscosity_ratio; int Nx, Ny, Nz, N, Np; int rank, nprocx, nprocy, nprocz, nprocs; @@ -104,4 +106,4 @@ class ScaLBL_GreyscaleModel { void AssignComponentLabels(double *Porosity, double *Permeability, const vector &File_poro, const vector &File_perm); -}; +}; \ No newline at end of file diff --git a/tests/lbpm_greyscale_simulator.cpp b/tests/lbpm_greyscale_simulator.cpp index e6166116..d59965de 100644 --- a/tests/lbpm_greyscale_simulator.cpp +++ b/tests/lbpm_greyscale_simulator.cpp @@ -16,52 +16,54 @@ using namespace std; +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 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(); + { // Limit scope so variables that contain communicators will free before MPI_Finialize - { // Limit scope so variables that contain communicators will free before MPI_Finialize + if (rank == 0) { + printf( + "********************************************************\n"); + printf( + "Running Greyscale Single Phase Permeability Calculation \n"); + printf( + "********************************************************\n"); + } + // Initialize compute device + int device = ScaLBL_SetDevice(rank); + NULL_USE(device); + ScaLBL_DeviceBarrier(); + comm.barrier(); - if (rank == 0){ - printf("********************************************************\n"); - printf("Running Greyscale Single Phase Permeability Calculation \n"); - printf("********************************************************\n"); - } - // Initialize compute device - int device=ScaLBL_SetDevice(rank); - NULL_USE( device ); - ScaLBL_DeviceBarrier(); - comm.barrier(); - - PROFILE_ENABLE(1); - //PROFILE_ENABLE_TRACE(); - //PROFILE_ENABLE_MEMORY(); - PROFILE_SYNCHRONIZE(); - PROFILE_START("Main"); - Utilities::setErrorHandlers(); + PROFILE_ENABLE(1); + //PROFILE_ENABLE_TRACE(); + //PROFILE_ENABLE_MEMORY(); + PROFILE_SYNCHRONIZE(); + PROFILE_START("Main"); + Utilities::setErrorHandlers(); - auto filename = argv[1]; - ScaLBL_GreyscaleModel Greyscale(rank,nprocs,comm); - Greyscale.ReadParams(filename); - Greyscale.SetDomain(); - Greyscale.ReadInput(); - Greyscale.Create(); // creating the model will create data structure to match the pore structure and allocate variables - Greyscale.Initialize(); // initializing the model will set initial conditions for variables - Greyscale.Run(); - Greyscale.VelocityField(); - //Greyscale.WriteDebug(); + auto filename = argv[1]; + ScaLBL_GreyscaleModel Greyscale(rank, nprocs, comm); + Greyscale.ReadParams(filename); + Greyscale.SetDomain(); + Greyscale.ReadInput(); + Greyscale + .Create(); // creating the model will create data structure to match the pore structure and allocate variables + Greyscale + .Initialize(); // initializing the model will set initial conditions for variables + Greyscale.Run(); + Greyscale.VelocityField(); + //Greyscale.WriteDebug(); - PROFILE_STOP("Main"); - PROFILE_SAVE("lbpm_greyscale_simulator",1); - // **************************************************** + PROFILE_STOP("Main"); + PROFILE_SAVE("lbpm_greyscale_simulator", 1); + // **************************************************** - } // Limit scope so variables that contain communicators will free before MPI_Finialize - - Utilities::shutdown(); + } // Limit scope so variables that contain communicators will free before MPI_Finialize + Utilities::shutdown(); }