From 4f483b0f6cd497bc5237d0546963c897235ee921 Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 15:09:38 -0300 Subject: [PATCH 01/15] style: apply clang-format to greyscale files Formatted specific C++, CUDA, and HIP source files related to the greyscale fix to establish a clean baseline. --- common/ScaLBL.h | 19 +- cuda/Greyscale.cu | 4609 +++++++++++++++------------- hip/Greyscale.hip | 4608 ++++++++++++++------------- tests/lbpm_greyscale_simulator.cpp | 84 +- 4 files changed, 5119 insertions(+), 4201 deletions(-) diff --git a/common/ScaLBL.h b/common/ScaLBL.h index 521bda87..eb479d0d 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 @@ -628,10 +630,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 +662,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 diff --git a/cuda/Greyscale.cu b/cuda/Greyscale.cu index eecdd6bb..224826d0 100644 --- a/cuda/Greyscale.cu +++ b/cuda/Greyscale.cu @@ -19,608 +19,831 @@ #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, 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; 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 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 < 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 - //------------------------ 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; - } - } -} + nr2 = neighborList[n + + Np]; // neighbor 1 ( < 10Np => even part of dist) + f2 = dist[nr2]; // reading the f2 data into register fq -__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; - 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); + // 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; + } + + //------------------------ 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.)); - 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; + // 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.)); + //-------------------------------------------------------------------------------------------------------------------------------------------// - 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 +1511,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 +1529,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 +1547,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 +1565,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 +1583,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 +1601,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 +1619,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 +1637,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 +1704,1513 @@ __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 * 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); //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 * 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; } //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_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); + // //....................................................................................................... + //-------------------- 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_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); jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*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); + 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); - 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_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); //....................................................................................................... - //.................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, + 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; 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 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); + // 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; - 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; + // 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; - 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, rlx_eff, Fx, Fy, Fz, Poros, Perm, + Velocity, Pressure); 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, double rlx_eff, + double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double *Pressure) { - 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, rlx_eff, Fx, Fy, Fz, Poros, + Perm, Velocity, Pressure); 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, 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); 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, + double rlx_eff, double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double Den, double *Pressure) { - 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, rlx_eff, Fx, Fy, Fz, Poros, + Perm, Velocity, Den, Pressure); 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, + double rlx_eff, double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double rho0, double *Pressure) { - 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, rlx_eff, Fx, Fy, Fz, Poros, + Perm, Velocity, rho0, Pressure); 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, 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); 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)); + } } diff --git a/hip/Greyscale.hip b/hip/Greyscale.hip index c1b77235..483e1f3f 100644 --- a/hip/Greyscale.hip +++ b/hip/Greyscale.hip @@ -5,609 +5,831 @@ #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, 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; 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 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 < 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 - //------------------------ 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; - } - } -} + nr2 = neighborList[n + + Np]; // neighbor 1 ( < 10Np => even part of dist) + f2 = dist[nr2]; // reading the f2 data into register fq -__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; - 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); + // 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; + } + + //------------------------ 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.)); - 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; + // 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.)); + //-------------------------------------------------------------------------------------------------------------------------------------------// - 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 +1497,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 +1515,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 +1533,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 +1551,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 +1569,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 +1587,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 +1605,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 +1623,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 +1690,1513 @@ __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 * 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); //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 * 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; } //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_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); + // //....................................................................................................... + //-------------------- 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_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); jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*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); + 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); - 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_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); //....................................................................................................... - //.................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, + 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; 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 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; - } + fq = dist[n]; + rho = fq; + m1 = -30.0 * fq; + m2 = 12.0 * fq; - //Calculate pressure for MRT model - //pressure=rho/3.f/porosity; - pressure=rho/3.f; + // 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; - //-------------------- 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); - //....................................................................................................... + // 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); + // 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; - //.................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 = 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; - //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=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; -__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); + // 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; - 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; + // 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; - 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, rlx_eff, Fx, Fy, Fz, Poros, Perm, + Velocity, Pressure); 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, double rlx_eff, + double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double *Pressure) { - 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, rlx_eff, Fx, Fy, Fz, Poros, + Perm, Velocity, Pressure); 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, 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); 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, + double rlx_eff, double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double Den, double *Pressure) { - 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, rlx_eff, Fx, Fy, Fz, Poros, + Perm, Velocity, Den, Pressure); 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, + double rlx_eff, double Fx, double Fy, double Fz, double *Poros, + double *Perm, double *Velocity, double rho0, double *Pressure) { - 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, rlx_eff, Fx, Fy, Fz, Poros, + Perm, Velocity, rho0, Pressure); 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, 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); 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)); + } } 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(); } From 4b6e20523100df53837a9dbddb18eb5d501abdfb Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 15:27:49 -0300 Subject: [PATCH 02/15] fix: resolve variable shadowing for 'idx' Differentiated 'idx' (voxel map index) from the new 'idx_labels' (label loop index). Both were previously named 'idx'. --- models/GreyscaleModel.cpp | 47 ++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index f1df0809..43e5b0eb 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -223,8 +223,8 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, label_count = new double[NLABELS]; label_count_global = new double[NLABELS]; - for (size_t idx = 0; idx < NLABELS; idx++) - label_count[idx] = 0; + for (size_t idx_label = 0; idx_label < NLABELS; idx_label++) + label_count[idx_label] = 0; for (int k = 0; k < Nz; k++) { for (int j = 0; j < Ny; j++) { @@ -232,12 +232,12 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, 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; + for (size_t idx_label = 0; idx_label < NLABELS; idx_label++) { + //printf("idx_label=%i, value=%i, %i, \n",idx_label, VALUE,LabelList[idx_label]); + if (VALUE == LabelList[idx_label]) { + POROSITY = PorosityList[idx_label]; + label_count[idx_label] += 1.0; + idx_label = NLABELS; //Mask->id[n] = 0; // set mask to zero since this is an immobile component } } @@ -264,11 +264,11 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, 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; + for (size_t idx_label = 0; idx_label < NLABELS; idx_label++) { + //printf("idx_label=%i, value=%i, %i, \n",idx_label, VALUE,LabelList[idx_label]); + if (VALUE == LabelList[idx_label]) { + PERMEABILITY = PermeabilityList[idx_label]; + idx_label = NLABELS; //Mask->id[n] = 0; // set mask to zero since this is an immobile component } } @@ -290,26 +290,27 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, for (int i = 0; i < Nx * Ny * Nz; i++) Dm->id[i] = Mask->id[i]; - for (size_t idx = 0; idx < NLABELS; idx++) - label_count_global[idx] = Dm->Comm.sumReduce(label_count[idx]); + for (size_t idx_label = 0; idx_label < NLABELS; idx_label++) + label_count_global[idx_label] = + Dm->Comm.sumReduce(label_count[idx_label]); //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]; } 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", From a0512a1ec20bd8bfceb5e03052235cc7ed32dbea Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 15:34:55 -0300 Subject: [PATCH 03/15] refactor: enhance error handling and validation checks - Combined length checks for ComponentLabels, PorosityList, and PermeabilityList into a single error handler at the beginning of the code. - Moved porosity (0 < porosity <= 1) and permeability (permeability > 0) boundary checks from the main domain loop to a list evaluation loop. --- models/GreyscaleModel.cpp | 41 ++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index 43e5b0eb..0513db37 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -212,9 +212,22 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, 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"); + } + + 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"); + } } // Assign the labels @@ -243,21 +256,13 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, } 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; - } + + 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++) { @@ -274,13 +279,9 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, } 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; - } + + Permeability[idx] = + PERMEABILITY / Dm->voxel_length / Dm->voxel_length; } } } From 411f64ddb6db0eb7e97625c0305f0870089203e5 Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 15:47:13 -0300 Subject: [PATCH 04/15] refactor: unify porosity and permeability assignment loops Porosity and permeability were each assigned in a separate 'for' loop with the same structure. Unifying them improves both performance and readability. --- models/GreyscaleModel.cpp | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index 0513db37..58632f50 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -225,8 +225,7 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, "Porosity <= 1.0 !\n"); } if (PermeabilityList[idx_label] <= 0.0) { - ERROR("Error: Permeability for grey voxel must be > " - "0.0 ! \n"); + ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); } } @@ -249,6 +248,7 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, //printf("idx_label=%i, value=%i, %i, \n",idx_label, VALUE,LabelList[idx_label]); if (VALUE == LabelList[idx_label]) { POROSITY = PorosityList[idx_label]; + PERMEABILITY = PermeabilityList[idx_label]; label_count[idx_label] += 1.0; idx_label = NLABELS; //Mask->id[n] = 0; // set mask to zero since this is an immobile component @@ -256,30 +256,7 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, } int idx = Map(i, j, k); if (!(idx < 0)) { - Porosity[idx] = POROSITY; - } - } - } - } - - 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_label = 0; idx_label < NLABELS; idx_label++) { - //printf("idx_label=%i, value=%i, %i, \n",idx_label, VALUE,LabelList[idx_label]); - if (VALUE == LabelList[idx_label]) { - PERMEABILITY = PermeabilityList[idx_label]; - idx_label = NLABELS; - //Mask->id[n] = 0; // set mask to zero since this is an immobile component - } - } - int idx = Map(i, j, k); - if (!(idx < 0)) { - Permeability[idx] = PERMEABILITY / Dm->voxel_length / Dm->voxel_length; } From 8f1122b764015baac8a604b70f02e150fee7b7cf Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 15:59:09 -0300 Subject: [PATCH 05/15] fix: resolve memory leak Replaced raw array allocations with 'std::vector'. The previous implementation was more verbose to declare and caused a memory leak due to a missing 'delete[]' statement at the end of the scope. This change ensures automatic memory cleanup. --- models/GreyscaleModel.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index 58632f50..437f8c2a 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -230,13 +230,8 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, } // 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++) - label_count[idx_label] = 0; + 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++) { @@ -271,6 +266,7 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, for (size_t idx_label = 0; idx_label < NLABELS; idx_label++) label_count_global[idx_label] = Dm->Comm.sumReduce(label_count[idx_label]); + //Initialize a weighted porosity after considering grey voxels GreyPorosity = 0.0; for (unsigned int idx_label = 0; idx_label < NLABELS; idx_label++) { From 1b9e2ba1730253d3d82383e35d14ea9700cb9212 Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 16:06:16 -0300 Subject: [PATCH 06/15] fix: correct 'GreyPorosity' calculation - Fixed porosity bug: Moved the 'label_count' increment inside the 'idx >= 0' check to properly exclude communication halo cells. - Optimized performance: Moved the entire label lookup loop inside the 'idx >= 0' condition to avoid redundant searches for halo cells. - Cleaned logic: Removed unnecessary temporary variables and replaced the 'idx_label = NLABELS' loop hack with a proper 'break' statement. --- models/GreyscaleModel.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index 437f8c2a..46d2a8e4 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -238,22 +238,23 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, 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_label = 0; idx_label < NLABELS; idx_label++) { - //printf("idx_label=%i, value=%i, %i, \n",idx_label, VALUE,LabelList[idx_label]); - if (VALUE == LabelList[idx_label]) { - POROSITY = PorosityList[idx_label]; - PERMEABILITY = PermeabilityList[idx_label]; - label_count[idx_label] += 1.0; - idx_label = NLABELS; - //Mask->id[n] = 0; // set mask to zero since this is an immobile component - } - } int idx = Map(i, j, k); - if (!(idx < 0)) { - Porosity[idx] = POROSITY; - Permeability[idx] = - PERMEABILITY / Dm->voxel_length / Dm->voxel_length; + + 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; + break; + } + } } } } From 1e6d955749b50cf2e8daea651b120c6e3fdff9c7 Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 16:10:25 -0300 Subject: [PATCH 07/15] feat: add exception for undeclared voxel labels Added an explicit exception to handle voxels containing undeclared labels. --- models/GreyscaleModel.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index 46d2a8e4..fdd106ed 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -252,9 +252,14 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, Dm->voxel_length / Dm->voxel_length; label_count[idx_label] += 1.0; + label_found = true; break; } } + if (!label_found) { + ERROR("Error: Voxel value not found in ComponentLabels " + "list!\n"); + } } } } From ab89880c702cc4eaba03d5f2b234f1915038ef68 Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 16:16:12 -0300 Subject: [PATCH 08/15] fix: replace raw arrays with std::vector for file assignments Replaced raw host array allocations ('new double[N]') with 'std::vector' to prevent memory leaks, aligning the implementation with the label-based assignment logic. --- models/GreyscaleModel.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index fdd106ed..b2f41bec 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -310,16 +310,13 @@ 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]; + std::vector Porosity_host(N, 0.0); + std::vector Permeability_host(N, 0.0); 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); @@ -342,7 +339,6 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels( Porosity[idx] = POROSITY; Permeability[idx] = PERMEABILITY; GreyPorosity_loc += POROSITY; - //label_count_loc += 1.0; } } } @@ -358,8 +354,6 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels( "is %.3g\n", GreyPorosity); } - delete[] Porosity_host; - delete[] Permeability_host; } void ScaLBL_GreyscaleModel::Create() { From 19585b1af7a98fe4557039ebfff48a44bc5bd47a Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 16:24:22 -0300 Subject: [PATCH 09/15] fix: correct permeability scaling in file assignment Added the missing lattice unit conversion for permeability read from files, ensuring consistency with the label-based assignment. --- models/GreyscaleModel.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index b2f41bec..2e50c2ee 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -329,7 +329,7 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels( 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) { @@ -337,7 +337,8 @@ 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; } } From b099eef7a56ae63829b83f4b1f38d613d770ec78 Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 16:27:50 -0300 Subject: [PATCH 10/15] feat: enhanced log output Updated the log statement to display the current timestep, convergence error, and absolute permeability in both square micrometers (um^2) and milliDarcys (mD). --- models/GreyscaleModel.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index 2e50c2ee..ec8af55e 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -755,7 +755,9 @@ void ScaLBL_GreyscaleModel::Run() { double absperm = h * h * mu * GreyPorosity * 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) From fa37a9f1d8566eb7aa9bb827cdd04ca3ddd05c83 Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 16:44:14 -0300 Subject: [PATCH 11/15] fix: correct absolute permeability calculation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Corrected macroscopic velocity averaging: Replaced the dynamic 'count' variable with the total active domain size. - Simplified permeability formulation: Removed the 'GreyPorosity' factor from the final absolute permeability equation. - Physical context: Permeability calculation relies on Darcy velocity (volumetric average velocity over the entire domain, including pores and solids). The original method—dividing the velocity sum by pore count and later multiplying by total porosity—works for binary media but fails for greyscale, where pore volume depends on local partial porosities. Dividing the velocities directly by the total domain volume correctly yields the Darcy velocity in a single step, and removing the 'GreyPorosity' factor from the permeability calculation avoids redundant porosity scaling. --- models/GreyscaleModel.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index ec8af55e..d289a192 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -668,8 +668,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; @@ -706,7 +704,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; } } } @@ -714,11 +711,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; @@ -752,7 +748,7 @@ 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(" timestep %d - error %.0e:" From c91582654c3d4751f54bf482aae9db85c0093072 Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 16:52:34 -0300 Subject: [PATCH 12/15] feat: add VTK (.vti/.pvti) output support --- models/GreyscaleModel.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index d289a192..d20dcef0 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -846,7 +846,9 @@ 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"; From ec7cd794a80275c6ce0cd274e203bb8076b74ccd Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 17:13:11 -0300 Subject: [PATCH 13/15] feat: add boolean toggle for Forchheimer non-linear drag term Introduced the 'Forchheimer' boolean flag to control the inclusion of the non-linear drag force, modeled based on the empirical Ergun equation, in the flow calculations. --- common/ScaLBL.h | 37 ++++++++-------- cpu/Greyscale.cpp | 69 ++++++++++++++++++----------- cuda/Greyscale.cu | 91 ++++++++++++++++++++++++--------------- hip/Greyscale.hip | 91 ++++++++++++++++++++++++--------------- models/GreyscaleModel.cpp | 56 ++++++++++++++---------- models/GreyscaleModel.h | 1 + 6 files changed, 211 insertions(+), 134 deletions(-) diff --git a/common/ScaLBL.h b/common/ScaLBL.h index eb479d0d..cb89858c 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -297,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, @@ -1254,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..a1e08d5d 100644 --- a/cpu/Greyscale.cpp +++ b/cpu/Greyscale.cpp @@ -16,11 +16,11 @@ */ #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, double rlx_eff, + 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; @@ -65,7 +65,10 @@ ScaLBL_D3Q19_AAeven_Greyscale(double *dist, int start, int finish, int Np, 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); + 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 @@ -366,11 +369,11 @@ 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, + double rlx_eff, 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; @@ -471,7 +474,10 @@ ScaLBL_D3Q19_AAodd_Greyscale(int *neighborList, double *dist, int start, 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); + 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 @@ -763,7 +769,7 @@ 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 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 @@ -1078,7 +1084,10 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT( 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); + 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 @@ -1305,7 +1314,8 @@ 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) { + double *Perm, double *Velocity, double Den, double *Pressure, + bool Forchheimer) { int nread; double vx, vy, vz, v_mag; double ux, uy, uz, u_mag; @@ -1641,7 +1651,10 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT( 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); + 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 @@ -1883,10 +1896,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, double rlx_eff, + 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; @@ -2257,7 +2272,10 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT( 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); + 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 @@ -2463,7 +2481,7 @@ 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 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; @@ -2779,7 +2797,10 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT( 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); + 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 @@ -2987,4 +3008,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 224826d0..081d6994 100644 --- a/cuda/Greyscale.cu +++ b/cuda/Greyscale.cu @@ -22,7 +22,7 @@ __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) { + double *Velocity, double *Pressure, bool Forchheimer) { int n; // conserved momemnts double rho, vx, vy, vz, v_mag; @@ -73,7 +73,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( 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); + 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 @@ -386,7 +389,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( __global__ void dvc_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) { + double *Perm, double *Velocity, double *Pressure, bool Forchheimer) { int n; // conserved momemnts double rho, vx, vy, vz, v_mag; @@ -493,7 +496,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( 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); + 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 @@ -803,7 +809,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( __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) { + double *Velocity, double Den, double *Pressure, bool Forchheimer) { int n; double vx, vy, vz, v_mag; @@ -1125,7 +1131,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT( 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); + 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 @@ -1365,7 +1374,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT( __global__ void dvc_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) { + double *Perm, double *Velocity, double Den, double *Pressure, + bool Forchheimer) { int n, nread; double vx, vy, vz, v_mag; @@ -1707,7 +1717,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT( 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); + 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 @@ -1965,7 +1978,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT( __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) { + double *Perm, double *Velocity, double rho0, double *Pressure, + bool Forchheimer) { int n, nread; int nr1, nr2, nr3, nr4, nr5, nr6; @@ -2342,7 +2356,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT( 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); + 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 @@ -2558,7 +2575,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT( __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) { + double *Velocity, double rho0, double *Pressure, bool Forchheimer) { int n; double vx, vy, vz, v_mag; @@ -2881,7 +2898,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT( 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); + 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 @@ -3108,15 +3128,14 @@ __global__ void dvc_ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, } } -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) { dvc_ScaLBL_D3Q19_AAeven_Greyscale<<>>( dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, Perm, - Velocity, Pressure); + Velocity, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err) { @@ -3125,15 +3144,14 @@ 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 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) { dvc_ScaLBL_D3Q19_AAodd_Greyscale<<>>( neighborList, dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, - Perm, Velocity, Pressure); + Perm, Velocity, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err) { @@ -3145,11 +3163,11 @@ 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 Fx, double Fy, double Fz, double *Poros, double *Perm, - double *Velocity, double Den, double *Pressure) { + double *Velocity, double Den, double *Pressure, bool Forchheimer) { dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT<<>>( dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, Perm, - Velocity, Den, Pressure); + Velocity, Den, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err) { @@ -3161,11 +3179,12 @@ 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 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) { dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT<<>>( neighborList, dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, - Perm, Velocity, Den, Pressure); + Perm, Velocity, Den, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err) { @@ -3174,14 +3193,16 @@ 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 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, double rlx_eff, + 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); + Perm, Velocity, rho0, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err) { @@ -3193,11 +3214,11 @@ 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 Fx, double Fy, double Fz, double *Poros, double *Perm, - double *Velocity, double rho0, double *Pressure) { + double *Velocity, double rho0, double *Pressure, bool Forchheimer) { dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT<<>>( dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, Perm, - Velocity, rho0, Pressure); + Velocity, rho0, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err) { diff --git a/hip/Greyscale.hip b/hip/Greyscale.hip index 483e1f3f..0f4c7611 100644 --- a/hip/Greyscale.hip +++ b/hip/Greyscale.hip @@ -8,7 +8,7 @@ __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) { + double *Velocity, double *Pressure, bool Forchheimer) { int n; // conserved momemnts double rho, vx, vy, vz, v_mag; @@ -59,7 +59,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( 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); + 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 @@ -372,7 +375,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( __global__ void dvc_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) { + double *Perm, double *Velocity, double *Pressure, bool Forchheimer) { int n; // conserved momemnts double rho, vx, vy, vz, v_mag; @@ -479,7 +482,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( 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); + 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 @@ -789,7 +795,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( __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) { + double *Velocity, double Den, double *Pressure, bool Forchheimer) { int n; double vx, vy, vz, v_mag; @@ -1111,7 +1117,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT( 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); + 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 @@ -1351,7 +1360,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT( __global__ void dvc_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) { + double *Perm, double *Velocity, double Den, double *Pressure, + bool Forchheimer) { int n, nread; double vx, vy, vz, v_mag; @@ -1693,7 +1703,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT( 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); + 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 @@ -1951,7 +1964,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT( __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) { + double *Perm, double *Velocity, double rho0, double *Pressure, + bool Forchheimer) { int n, nread; int nr1, nr2, nr3, nr4, nr5, nr6; @@ -2328,7 +2342,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT( 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); + 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 @@ -2544,7 +2561,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT( __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) { + double *Velocity, double rho0, double *Pressure, bool Forchheimer) { int n; double vx, vy, vz, v_mag; @@ -2867,7 +2884,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT( 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); + 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 @@ -3094,15 +3114,14 @@ __global__ void dvc_ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, } } -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) { dvc_ScaLBL_D3Q19_AAeven_Greyscale<<>>( dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, Perm, - Velocity, Pressure); + Velocity, Pressure, Forchheimer); hipError_t err = hipGetLastError(); if (hipSuccess != err) { @@ -3111,15 +3130,14 @@ 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 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) { dvc_ScaLBL_D3Q19_AAodd_Greyscale<<>>( neighborList, dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, - Perm, Velocity, Pressure); + Perm, Velocity, Pressure, Forchheimer); hipError_t err = hipGetLastError(); if (hipSuccess != err) { @@ -3131,11 +3149,11 @@ 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 Fx, double Fy, double Fz, double *Poros, double *Perm, - double *Velocity, double Den, double *Pressure) { + double *Velocity, double Den, double *Pressure, bool Forchheimer) { dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT<<>>( dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, Perm, - Velocity, Den, Pressure); + Velocity, Den, Pressure, Forchheimer); hipError_t err = hipGetLastError(); if (hipSuccess != err) { @@ -3147,11 +3165,12 @@ 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 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) { dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT<<>>( neighborList, dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, - Perm, Velocity, Den, Pressure); + Perm, Velocity, Den, Pressure, Forchheimer); hipError_t err = hipGetLastError(); if (hipSuccess != err) { @@ -3160,14 +3179,16 @@ 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 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, double rlx_eff, + 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); + Perm, Velocity, rho0, Pressure, Forchheimer); hipError_t err = hipGetLastError(); if (hipSuccess != err) { @@ -3179,11 +3200,11 @@ 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 Fx, double Fy, double Fz, double *Poros, double *Perm, - double *Velocity, double rho0, double *Pressure) { + double *Velocity, double rho0, double *Pressure, bool Forchheimer) { dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT<<>>( dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, Perm, - Velocity, rho0, Pressure); + Velocity, rho0, Pressure, Forchheimer); hipError_t err = hipGetLastError(); if (hipSuccess != err) { diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index d20dcef0..597e7657 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) { SignDist.resize(Nx, Ny, Nz); SignDist.fill(0); } @@ -55,6 +56,7 @@ void ScaLBL_GreyscaleModel::ReadParams(string filename) { flux = 0.0; dp = 10.0; //unit of 'dp': voxel CollisionType = 1; //1: IMRT; 2: BGK; 3: MRT + Forchheimer = false; // ---------------------- Greyscale Model parameters -----------------------// if (greyscale_db->keyExists("timestepMax")) { @@ -78,6 +80,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"); } @@ -542,25 +547,28 @@ void ScaLBL_GreyscaleModel::Run() { 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); + 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); + 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); + 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); + Porosity, Permeability, Velocity, Den, Pressure_dvc, + Forchheimer); break; } ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE @@ -578,10 +586,10 @@ void ScaLBL_GreyscaleModel::Run() { Pressure_dvc); 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, + rlx_eff, Fx, Fy, Fz, Porosity, Permeability, Velocity, + Pressure_dvc, Forchheimer); break; case 3: ScaLBL_D3Q19_AAodd_Greyscale_MRT( @@ -607,25 +615,25 @@ void ScaLBL_GreyscaleModel::Run() { 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); + 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, rlx_eff, 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); + 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); + Den, Pressure_dvc, Forchheimer); break; } ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE @@ -639,22 +647,26 @@ void ScaLBL_GreyscaleModel::Run() { 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); + 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, rlx_eff, 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); + 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); + Fz, Porosity, Permeability, Velocity, Den, Pressure_dvc, + Forchheimer); break; } ScaLBL_DeviceBarrier(); diff --git a/models/GreyscaleModel.h b/models/GreyscaleModel.h index c61b1746..d866cc60 100644 --- a/models/GreyscaleModel.h +++ b/models/GreyscaleModel.h @@ -59,6 +59,7 @@ class ScaLBL_GreyscaleModel { double din, dout; double dp; //solid particle diameter, unit in voxel double GreyPorosity; + bool Forchheimer; int Nx, Ny, Nz, N, Np; int rank, nprocx, nprocy, nprocz, nprocs; From 5ad81152d5973fa1c78267ae1249ded101b25e8f Mon Sep 17 00:00:00 2001 From: Joao Bento Neto Date: Wed, 7 Oct 2026 17:18:55 -0300 Subject: [PATCH 14/15] feat: add ViscosityRatio parameter - Introduced the 'ViscosityRatio' scalar float variable. - Clarified viscosity nomenclature: 'viscosity'/'rlx'/'tau' represents the thermodynamic/original viscosity and is strictly used for force calculations (Darcy drag). - Clarified effective viscosity nomenclature: 'viscosity_eff'/'rlx_eff'/'tau_eff' represents the Brinkman effective viscosity and is applied exclusively to viscous momentum diffusion. --- cpu/Greyscale.cpp | 830 ++++++++++++++++++------------------- cuda/Greyscale.cu | 840 +++++++++++++++++++------------------- hip/Greyscale.hip | 840 +++++++++++++++++++------------------- models/GreyscaleModel.cpp | 66 ++- models/GreyscaleModel.h | 3 +- 5 files changed, 1309 insertions(+), 1270 deletions(-) diff --git a/cpu/Greyscale.cpp b/cpu/Greyscale.cpp index a1e08d5d..f2d4ef18 100644 --- a/cpu/Greyscale.cpp +++ b/cpu/Greyscale.cpp @@ -20,7 +20,6 @@ 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, bool Forchheimer) { - // conserved momemnts double rho, vx, vy, vz, v_mag; double ux, uy, uz, u_mag; @@ -31,9 +30,9 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( 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,7 +61,7 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( 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 if (Forchheimer) @@ -89,11 +88,11 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( 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; @@ -103,260 +102,260 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( //------------------------ 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.)); //-------------------------------------------------------------------------------------------------------------------------------------------// @@ -373,7 +372,6 @@ 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, bool Forchheimer) { - // conserved momemnts double rho, vx, vy, vz, v_mag; double ux, uy, uz, u_mag; @@ -386,9 +384,9 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale( 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) @@ -471,7 +469,7 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale( 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 if (Forchheimer) @@ -498,11 +496,11 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale( 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; @@ -512,248 +510,254 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale( //------------------------ 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.)); //-------------------------------------------------------------------------------------------------------------------------------------------// @@ -781,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; @@ -1081,7 +1085,7 @@ 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 if (Forchheimer) @@ -1103,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; @@ -1123,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...................................................... @@ -1328,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; @@ -1648,7 +1653,7 @@ 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 if (Forchheimer) @@ -1670,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; @@ -1690,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...................................................... @@ -1918,13 +1924,13 @@ ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, //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; @@ -2269,7 +2275,7 @@ ScaLBL_D3Q19_AAodd_Greyscale_MRT(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 if (Forchheimer) @@ -2291,13 +2297,13 @@ ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, //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; @@ -2311,36 +2317,38 @@ ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, 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...................................................... @@ -2494,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; @@ -2794,7 +2802,7 @@ 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 if (Forchheimer) @@ -2816,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; @@ -2835,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...................................................... diff --git a/cuda/Greyscale.cu b/cuda/Greyscale.cu index 081d6994..d9940d7b 100644 --- a/cuda/Greyscale.cu +++ b/cuda/Greyscale.cu @@ -34,9 +34,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( 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) @@ -70,7 +70,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( 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 if (Forchheimer) @@ -98,11 +98,11 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( 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; @@ -112,267 +112,267 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( //------------------------ 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 * + 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.)); //-------------------------------------------------------------------------------------------------------------------------------------------// @@ -387,8 +387,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( } __global__ void dvc_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, + 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) { int n; // conserved momemnts @@ -403,9 +403,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( 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) @@ -493,7 +493,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( 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 if (Forchheimer) @@ -521,11 +521,11 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( 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 - + 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; @@ -535,264 +535,264 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( //------------------------ 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 * + 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 * + 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[nr1] = - 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[nr4] = - 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[nr3] = - 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[nr6] = - 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[nr5] = - 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[nr8] = f7 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + 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) * + 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 * + 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 * + 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 * + 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 * + 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.)); //-------------------------------------------------------------------------------------------------------------------------------------------// @@ -823,13 +823,13 @@ __global__ void dvc_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; @@ -1128,7 +1128,7 @@ __global__ void dvc_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 if (Forchheimer) @@ -1150,13 +1150,13 @@ __global__ void dvc_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 - + (-porosity * viscosity / perm * ux - porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx); Fy = Den * - (-porosity * mu_eff / perm * uy - + (-porosity * viscosity / perm * uy - porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy); Fz = Den * - (-porosity * mu_eff / perm * uz - + (-porosity * viscosity / perm * uz - porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz); if (porosity == 1.0) { Fx = Den * Gx; @@ -1169,80 +1169,81 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT( (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; + // 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 * + m1 + rlx_eff_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); + 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 * (-0.5 * Den * - ((2 * ux * ux - uy * uy - uz * uz) / porosity) - - m10); - m11 = - m11 + rlx_setA * ((Den * (uy * uy - uz * uz) / porosity) - m11); + 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_setA * + m12 + rlx_eff_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); + 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...................................................... @@ -1372,8 +1373,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT( } __global__ void dvc_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, + 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) { @@ -1389,13 +1390,13 @@ __global__ void dvc_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; @@ -1714,7 +1715,7 @@ __global__ void dvc_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 if (Forchheimer) @@ -1736,13 +1737,13 @@ __global__ void dvc_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 - + (-porosity * viscosity / perm * ux - porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx); Fy = Den * - (-porosity * mu_eff / perm * uy - + (-porosity * viscosity / perm * uy - porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy); Fz = Den * - (-porosity * mu_eff / perm * uz - + (-porosity * viscosity / perm * uz - porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz); if (porosity == 1.0) { Fx = Den * Gx; @@ -1755,80 +1756,81 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT( (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; + // 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 * + m1 + rlx_eff_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); + 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 * (-0.5 * Den * - ((2 * ux * ux - uy * uy - uz * uz) / porosity) - - m10); - m11 = - m11 + rlx_setA * ((Den * (uy * uy - uz * uz) / porosity) - m11); + 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_setA * + m12 + rlx_eff_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); + 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...................................................... @@ -1976,8 +1978,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT( } __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, + 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) { @@ -1996,13 +1998,13 @@ __global__ void dvc_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; @@ -2353,7 +2355,7 @@ __global__ void dvc_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 if (Forchheimer) @@ -2375,13 +2377,13 @@ __global__ void dvc_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; @@ -2394,38 +2396,38 @@ __global__ void dvc_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); - 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); + m8 = m8 + rlx_eff_setB * ((-0.6666666666666666 * uz * rho0) - m8) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fz); + m9 = m9 + rlx_eff_setA * (((2 * ux * ux - uy * uy - uz * uz) * + rho0 / porosity) - + m9); + 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...................................................... @@ -2589,13 +2591,13 @@ __global__ void dvc_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; @@ -2895,7 +2897,7 @@ __global__ void dvc_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 if (Forchheimer) @@ -2917,13 +2919,13 @@ __global__ void dvc_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; @@ -2936,38 +2938,38 @@ __global__ void dvc_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); - 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); + m8 = m8 + rlx_eff_setB * ((-0.6666666666666666 * uz * rho0) - m8) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fz); + m9 = m9 + rlx_eff_setA * (((2 * ux * ux - uy * uy - uz * uz) * + rho0 / porosity) - + m9); + 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...................................................... @@ -3134,7 +3136,7 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( double *Velocity, double *Pressure, bool Forchheimer) { dvc_ScaLBL_D3Q19_AAeven_Greyscale<<>>( - dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, Perm, + dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, Velocity, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); @@ -3145,12 +3147,12 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( } 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, + 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, + neighborList, dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, Velocity, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); @@ -3166,7 +3168,7 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT( double *Velocity, double Den, double *Pressure, bool Forchheimer) { dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT<<>>( - dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, Perm, + dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, Velocity, Den, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); @@ -3177,13 +3179,13 @@ 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 Fx, double Fy, double Fz, double *Poros, + 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, + neighborList, dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, Velocity, Den, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); @@ -3201,7 +3203,7 @@ ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, double *Pressure, bool Forchheimer) { dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT<<>>( - neighborList, dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, + neighborList, dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, Velocity, rho0, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); @@ -3217,7 +3219,7 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT( double *Velocity, double rho0, double *Pressure, bool Forchheimer) { dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT<<>>( - dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, Perm, + dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, Velocity, rho0, Pressure, Forchheimer); cudaError_t err = cudaGetLastError(); @@ -3234,4 +3236,4 @@ extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den) { 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 0f4c7611..6c37eef9 100644 --- a/hip/Greyscale.hip +++ b/hip/Greyscale.hip @@ -20,9 +20,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( 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) @@ -56,7 +56,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( 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 if (Forchheimer) @@ -84,11 +84,11 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( 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; @@ -98,267 +98,267 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( //------------------------ 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 * + 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.)); //-------------------------------------------------------------------------------------------------------------------------------------------// @@ -373,8 +373,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( } __global__ void dvc_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, + 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) { int n; // conserved momemnts @@ -389,9 +389,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( 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) @@ -479,7 +479,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( 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 if (Forchheimer) @@ -507,11 +507,11 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( 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 - + 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; @@ -521,264 +521,264 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( //------------------------ 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 * + 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 * + 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[nr1] = - 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[nr4] = - 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[nr3] = - 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[nr6] = - 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[nr5] = - 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[nr8] = f7 * (1.0 - rlx) + - rlx * 0.027777777777777776 * rho * + 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) * + 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 * + 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 * + 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 * + 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 * + 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.)); //-------------------------------------------------------------------------------------------------------------------------------------------// @@ -809,13 +809,13 @@ __global__ void dvc_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; @@ -1114,7 +1114,7 @@ __global__ void dvc_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 if (Forchheimer) @@ -1136,13 +1136,13 @@ __global__ void dvc_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 - + (-porosity * viscosity / perm * ux - porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx); Fy = Den * - (-porosity * mu_eff / perm * uy - + (-porosity * viscosity / perm * uy - porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy); Fz = Den * - (-porosity * mu_eff / perm * uz - + (-porosity * viscosity / perm * uz - porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz); if (porosity == 1.0) { Fx = Den * Gx; @@ -1155,80 +1155,81 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT( (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; + // 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 * + m1 + rlx_eff_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); + 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 * (-0.5 * Den * - ((2 * ux * ux - uy * uy - uz * uz) / porosity) - - m10); - m11 = - m11 + rlx_setA * ((Den * (uy * uy - uz * uz) / porosity) - m11); + 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_setA * + m12 + rlx_eff_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); + 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...................................................... @@ -1358,8 +1359,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT( } __global__ void dvc_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, + 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) { @@ -1375,13 +1376,13 @@ __global__ void dvc_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; @@ -1700,7 +1701,7 @@ __global__ void dvc_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 if (Forchheimer) @@ -1722,13 +1723,13 @@ __global__ void dvc_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 - + (-porosity * viscosity / perm * ux - porosity * GeoFun / sqrt(perm) * u_mag * ux + porosity * Gx); Fy = Den * - (-porosity * mu_eff / perm * uy - + (-porosity * viscosity / perm * uy - porosity * GeoFun / sqrt(perm) * u_mag * uy + porosity * Gy); Fz = Den * - (-porosity * mu_eff / perm * uz - + (-porosity * viscosity / perm * uz - porosity * GeoFun / sqrt(perm) * u_mag * uz + porosity * Gz); if (porosity == 1.0) { Fx = Den * Gx; @@ -1741,80 +1742,81 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT( (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; + // 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 * + m1 + rlx_eff_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); + 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 * (-0.5 * Den * - ((2 * ux * ux - uy * uy - uz * uz) / porosity) - - m10); - m11 = - m11 + rlx_setA * ((Den * (uy * uy - uz * uz) / porosity) - m11); + 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_setA * + m12 + rlx_eff_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); + 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...................................................... @@ -1962,8 +1964,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT( } __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, + 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) { @@ -1982,13 +1984,13 @@ __global__ void dvc_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; @@ -2339,7 +2341,7 @@ __global__ void dvc_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 if (Forchheimer) @@ -2361,13 +2363,13 @@ __global__ void dvc_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; @@ -2380,38 +2382,38 @@ __global__ void dvc_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); - 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); + m8 = m8 + rlx_eff_setB * ((-0.6666666666666666 * uz * rho0) - m8) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fz); + m9 = m9 + rlx_eff_setA * (((2 * ux * ux - uy * uy - uz * uz) * + rho0 / porosity) - + m9); + 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...................................................... @@ -2575,13 +2577,13 @@ __global__ void dvc_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; @@ -2881,7 +2883,7 @@ __global__ void dvc_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 if (Forchheimer) @@ -2903,13 +2905,13 @@ __global__ void dvc_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; @@ -2922,38 +2924,38 @@ __global__ void dvc_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); - 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); + m8 = m8 + rlx_eff_setB * ((-0.6666666666666666 * uz * rho0) - m8) + + (1 - 0.5 * rlx_eff_setB) * (-0.6666666666666666 * Fz); + m9 = m9 + rlx_eff_setA * (((2 * ux * ux - uy * uy - uz * uz) * + rho0 / porosity) - + m9); + 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...................................................... @@ -3120,7 +3122,7 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( double *Velocity, double *Pressure, bool Forchheimer) { dvc_ScaLBL_D3Q19_AAeven_Greyscale<<>>( - dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, Perm, + dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, Velocity, Pressure, Forchheimer); hipError_t err = hipGetLastError(); @@ -3131,12 +3133,12 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( } 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, + 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, + neighborList, dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, Velocity, Pressure, Forchheimer); hipError_t err = hipGetLastError(); @@ -3152,7 +3154,7 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT( double *Velocity, double Den, double *Pressure, bool Forchheimer) { dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT<<>>( - dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, Perm, + dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, Velocity, Den, Pressure, Forchheimer); hipError_t err = hipGetLastError(); @@ -3163,13 +3165,13 @@ 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 Fx, double Fy, double Fz, double *Poros, + 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, + neighborList, dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, Velocity, Den, Pressure, Forchheimer); hipError_t err = hipGetLastError(); @@ -3187,7 +3189,7 @@ ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, double *Pressure, bool Forchheimer) { dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT<<>>( - neighborList, dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, + neighborList, dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, Velocity, rho0, Pressure, Forchheimer); hipError_t err = hipGetLastError(); @@ -3203,7 +3205,7 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT( double *Velocity, double rho0, double *Pressure, bool Forchheimer) { dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT<<>>( - dist, start, finish, Np, rlx, rlx_eff, Fx, Fy, Fz, Poros, Perm, + dist, start, finish, Np, rlx_eff, rlx, Fx, Fy, Fz, Poros, Perm, Velocity, rho0, Pressure, Forchheimer); hipError_t err = hipGetLastError(); @@ -3220,4 +3222,4 @@ extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den) { 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 597e7657..621f4fc4 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -30,7 +30,7 @@ ScaLBL_GreyscaleModel::ScaLBL_GreyscaleModel(int RANK, int NP, 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), - Forchheimer(0) { + Forchheimer(0), viscosity_ratio(0) { SignDist.resize(Nx, Ny, Nz); SignDist.fill(0); } @@ -47,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; @@ -55,7 +56,7 @@ 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 -----------------------// @@ -65,7 +66,16 @@ 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 (rank == 0) { + printf("Viscosity Ratio: %.5g\n", viscosity_ratio); + printf("tau: %.5g\n", tau); + printf("Effective tau: %.5g\n", tau_eff); + } if (greyscale_db->keyExists("Den")) { Den = greyscale_db->getScalar("Den"); } @@ -209,8 +219,6 @@ 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"); @@ -230,7 +238,8 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, "Porosity <= 1.0 !\n"); } if (PermeabilityList[idx_label] <= 0.0) { - ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); + ERROR("Error: Permeability for grey voxel must be > " + "0.0 ! \n"); } } @@ -261,6 +270,7 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, break; } } + if (!label_found) { ERROR("Error: Voxel value not found in ComponentLabels " "list!\n"); @@ -274,12 +284,12 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, for (int i = 0; i < Nx * Ny * Nz; i++) Dm->id[i] = Mask->id[i]; - for (size_t idx_label = 0; idx_label < NLABELS; idx_label++) - label_count_global[idx_label] = - Dm->Comm.sumReduce(label_count[idx_label]); + 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_label = 0; idx_label < NLABELS; idx_label++) { double volume_fraction = double(label_count_global[idx_label]) / @@ -287,16 +297,22 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, 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_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_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, @@ -315,26 +331,31 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels( double *Porosity, double *Permeability, const vector &File_poro, const vector &File_perm) { - std::vector Porosity_host(N, 0.0); - std::vector Permeability_host(N, 0.0); + double POROSITY = 0.f; double PERMEABILITY = 0.f; + //Initialize a weighted porosity after considering grey voxels double GreyPorosity_loc = 0.0; GreyPorosity = 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) || (POROSITY > 1.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) { @@ -342,15 +363,19 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels( "0.0 ! \n"); } else { Porosity[idx] = POROSITY; + Permeability[idx] = PERMEABILITY / Dm->voxel_length / Dm->voxel_length; + GreyPorosity_loc += POROSITY; } } } } } + GreyPorosity = Dm->Comm.sumReduce(GreyPorosity_loc); + GreyPorosity = GreyPorosity / double((Nx - 2) * (Ny - 2) * (Nz - 2) * nprocs); @@ -583,7 +608,7 @@ void ScaLBL_GreyscaleModel::Run() { ScaLBL_D3Q19_AAodd_Greyscale_IMRT( NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz, Porosity, Permeability, Velocity, Den, - Pressure_dvc); + Pressure_dvc, Forchheimer); break; case 2: ScaLBL_D3Q19_AAodd_Greyscale( @@ -595,13 +620,13 @@ void ScaLBL_GreyscaleModel::Run() { ScaLBL_D3Q19_AAodd_Greyscale_MRT( NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz, Porosity, Permeability, Velocity, Den, - Pressure_dvc); + 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); + Pressure_dvc, Forchheimer); break; } ScaLBL_DeviceBarrier(); @@ -860,7 +885,6 @@ void ScaLBL_GreyscaleModel::VelocityField() { std::string format = vis_db->getWithDefault("format", "silo"); IO::initialize("", format, false); - // Create the MeshDataStruct visData.resize(1); visData[0].meshName = "domain"; @@ -988,4 +1012,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 d866cc60..84642a3a 100644 --- a/models/GreyscaleModel.h +++ b/models/GreyscaleModel.h @@ -60,6 +60,7 @@ class ScaLBL_GreyscaleModel { 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; @@ -105,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 From 42063b4cf857743a6aff193ef9e1fb9097a81963 Mon Sep 17 00:00:00 2001 From: JoaoBentoNeto Date: Fri, 30 Oct 2026 16:13:31 -0300 Subject: [PATCH 15/15] fix: correct viscosity ratio implementation - Addressed missing replacements for 'rlx' and 'rlx_eff' that were overlooked in the previous viscosity ratio implementation. - Moved 'ViscosityRatio', 'tau', and 'tau_eff' initialization prints to the main execution block alongside other simulation logs to improve code organization. --- cpu/Greyscale.cpp | 16 ++++++------ cuda/Greyscale.cu | 14 +++++------ hip/Greyscale.hip | 14 +++++------ models/GreyscaleModel.cpp | 51 ++++++++++++++++++--------------------- 4 files changed, 46 insertions(+), 49 deletions(-) diff --git a/cpu/Greyscale.cpp b/cpu/Greyscale.cpp index f2d4ef18..4c43614d 100644 --- a/cpu/Greyscale.cpp +++ b/cpu/Greyscale.cpp @@ -17,7 +17,7 @@ #include extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( - 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 *Pressure, bool Forchheimer) { // conserved momemnts @@ -369,8 +369,8 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( } 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, + 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; @@ -771,7 +771,7 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale( } 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, bool Forchheimer) { double vx, vy, vz, v_mag; @@ -1317,8 +1317,8 @@ 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, + 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; @@ -1904,7 +1904,7 @@ 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, + 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) { @@ -2487,7 +2487,7 @@ ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, } 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, bool Forchheimer) { diff --git a/cuda/Greyscale.cu b/cuda/Greyscale.cu index d9940d7b..bf3fc5ce 100644 --- a/cuda/Greyscale.cu +++ b/cuda/Greyscale.cu @@ -20,7 +20,7 @@ #define NTHREADS 256 __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( - 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 *Pressure, bool Forchheimer) { int n; @@ -807,7 +807,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( } __global__ void dvc_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, bool Forchheimer) { @@ -2575,7 +2575,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT( } __global__ void dvc_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, bool Forchheimer) { @@ -3131,7 +3131,7 @@ __global__ void dvc_ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, } extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( - 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 Fx, double Fy, double Fz, double *Poros, double *Perm, double *Velocity, double *Pressure, bool Forchheimer) { @@ -3163,7 +3163,7 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale( } 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 Fx, double Fy, double Fz, double *Poros, double *Perm, double *Velocity, double Den, double *Pressure, bool Forchheimer) { @@ -3197,7 +3197,7 @@ 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, + 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) { @@ -3214,7 +3214,7 @@ ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, } 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 Fx, double Fy, double Fz, double *Poros, double *Perm, double *Velocity, double rho0, double *Pressure, bool Forchheimer) { diff --git a/hip/Greyscale.hip b/hip/Greyscale.hip index 6c37eef9..8f27ce77 100644 --- a/hip/Greyscale.hip +++ b/hip/Greyscale.hip @@ -6,7 +6,7 @@ #define NTHREADS 256 __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale( - 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 *Pressure, bool Forchheimer) { int n; @@ -793,7 +793,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale( } __global__ void dvc_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, bool Forchheimer) { @@ -2561,7 +2561,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT( } __global__ void dvc_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, bool Forchheimer) { @@ -3117,7 +3117,7 @@ __global__ void dvc_ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, } extern "C" void ScaLBL_D3Q19_AAeven_Greyscale( - 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 Fx, double Fy, double Fz, double *Poros, double *Perm, double *Velocity, double *Pressure, bool Forchheimer) { @@ -3149,7 +3149,7 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale( } 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 Fx, double Fy, double Fz, double *Poros, double *Perm, double *Velocity, double Den, double *Pressure, bool Forchheimer) { @@ -3183,7 +3183,7 @@ 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, + 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) { @@ -3200,7 +3200,7 @@ ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, } 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 Fx, double Fy, double Fz, double *Poros, double *Perm, double *Velocity, double rho0, double *Pressure, bool Forchheimer) { diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index 621f4fc4..c5cface4 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -71,11 +71,6 @@ void ScaLBL_GreyscaleModel::ReadParams(string filename) { } tau_eff = greyscale_db->getWithDefault( "tau_eff", viscosity_ratio * (tau - 0.5) + 0.5); - if (rank == 0) { - printf("Viscosity Ratio: %.5g\n", viscosity_ratio); - printf("tau: %.5g\n", tau); - printf("Effective tau: %.5g\n", tau_eff); - } if (greyscale_db->keyExists("Den")) { Den = greyscale_db->getScalar("Den"); } @@ -349,7 +344,6 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels( for (int j = 0; j < Ny; j++) { for (int i = 0; i < Nx; i++) { int idx = Map(i, j, k); - if (idx >= 0) { int n = k * Nx * Ny + j * Nx + i; POROSITY = Porosity_host[n]; @@ -542,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); @@ -571,27 +568,27 @@ 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, + 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, + 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, + 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, + ScaLBL_Comm->LastInterior(), Np, rlx_eff, rlx, Fx, Fy, Fz, Porosity, Permeability, Velocity, Den, Pressure_dvc, Forchheimer); break; @@ -606,26 +603,26 @@ 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, + 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, Forchheimer); + 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, + 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, + NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx_eff, + rlx, Fx, Fy, Fz, Porosity, Permeability, Velocity, Den, Pressure_dvc, Forchheimer); break; } @@ -639,25 +636,25 @@ 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, + 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, + 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, + 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, + Np, rlx_eff, rlx, Fx, Fy, Fz, Porosity, Permeability, Velocity, Den, Pressure_dvc, Forchheimer); break; } @@ -671,25 +668,25 @@ void ScaLBL_GreyscaleModel::Run() { switch (CollisionType) { case 1: ScaLBL_D3Q19_AAeven_Greyscale_IMRT( - fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, + 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, + 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, + 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, + fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx_eff, rlx, Fx, Fy, Fz, Porosity, Permeability, Velocity, Den, Pressure_dvc, Forchheimer); break;