Files
LBPM/cpu/GreyscaleSC.cpp

3626 lines
132 KiB
C++

#include <stdio.h>
#include <math.h>
//__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList,int *Map, double *distA, double *distB, double *DenA,double *DenB, double *DenGradA, double *DenGradB,
// double *SolidForceA, double *SolidForceB, double *Poros,double *Perm, double *Velocity,double *Pressure,
// double tauA,double tauB,double tauA_eff,double tauB_eff, double Gsc, double Gx, double Gy, double Gz,
// int start, int finish, int Np){
//
// int ijk;
// int n, nread;
// double vx,vy,vz,v_mag;
// double ux_A,uy_A,uz_A,ux_B,uy_B,uz_B,u_mag;
// double ux,uy,uz;
// // conserved momemnts
// double jxA,jyA,jzA;
// double jxB,jyB,jzB;
// double rhoA,rhoB;
// double nA,nB;
// // non-conserved moments
// double m1A,m2A,m4A,m6A,m8A,m9A,m10A,m11A,m12A,m13A,m14A,m15A,m16A,m17A,m18A;
// double m1B,m2B,m4B,m6B,m8B,m9B,m10B,m11B,m12B,m13B,m14B,m15B,m16B,m17B,m18B;
// double fq;
// //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18;
// double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002)
// double porosity;
// double perm;//voxel permeability
// double permA,permB;//effective relative perm
// double c0, c1; //Guo's model parameters
// double muA_eff = (tauA_eff-0.5)/3.0;//kinematic viscosity
// double muB_eff = (tauB_eff-0.5)/3.0;//kinematic viscosity
// double FxA, FyA, FzA;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz)
// double FxB, FyB, FzB;
// double rlx_setA,rlx_setB;
// double nA_gradx,nA_grady,nA_gradz;
// double nB_gradx,nB_grady,nB_gradz;
// double GffA_x,GffA_y,GffA_z;
// double GfsA_x,GfsA_y,GfsA_z;
// double GffB_x,GffB_y,GffB_z;
// double GfsB_x,GfsB_y,GfsB_z;
//
// 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<S; s++){
// //........Get 1-D index for this thread....................
// n = S*blockIdx.x*blockDim.x + s*blockDim.x + threadIdx.x + start;
//
// if ( n<finish ){
//
// // Load common parameters shared by two fluid components
// ijk = Map[n];
// nA = DenA[ijk];
// nB = DenB[ijk];
// porosity = Poros[n];
// perm = Perm[n];
// permA = perm*nA/(nA+nB);//effective relative perm
// permB = perm*nB/(nA+nB);
// nA_gradx = DenGradA[n+0*Np];
// nA_grady = DenGradA[n+1*Np];
// nA_gradz = DenGradA[n+2*Np];
// nB_gradx = DenGradB[n+0*Np];
// nB_grady = DenGradB[n+1*Np];
// nB_gradz = DenGradB[n+2*Np];
//
// // ------------------- Fluid component A ---------------------------------//
// //........................................................................
// // READ THE DISTRIBUTIONS
// // (read from opposite array due to previous swap operation)
// //........................................................................
// // q=0
// fq = distA[n];
// rhoA = fq;
// m1A = -30.0*fq;
// m2A = 12.0*fq;
//
// // q=1
// nread = neighborList[n]; // neighbor 2
// fq = distA[nread]; // reading the f1 data into register fq
// rhoA += fq;
// m1A -= 11.0*fq;
// m2A -= 4.0*fq;
// jxA = fq;
// m4A = -4.0*fq;
// m9A = 2.0*fq;
// m10A = -4.0*fq;
//
// // q=2
// nread = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist)
// fq = distA[nread]; // reading the f2 data into register fq
// rhoA += fq;
// m1A -= 11.0*(fq);
// m2A -= 4.0*(fq);
// jxA -= fq;
// m4A += 4.0*(fq);
// m9A += 2.0*(fq);
// m10A -= 4.0*(fq);
//
// // q=3
// nread = neighborList[n+2*Np]; // neighbor 4
// fq = distA[nread];
// rhoA += fq;
// m1A -= 11.0*fq;
// m2A -= 4.0*fq;
// jyA = fq;
// m6A = -4.0*fq;
// m9A -= fq;
// m10A += 2.0*fq;
// m11A = fq;
// m12A = -2.0*fq;
//
// // q = 4
// nread = neighborList[n+3*Np]; // neighbor 3
// fq = distA[nread];
// rhoA += fq;
// m1A -= 11.0*fq;
// m2A -= 4.0*fq;
// jyA -= fq;
// m6A += 4.0*fq;
// m9A -= fq;
// m10A += 2.0*fq;
// m11A += fq;
// m12A -= 2.0*fq;
//
// // q=5
// nread = neighborList[n+4*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A -= 11.0*fq;
// m2A -= 4.0*fq;
// jzA = fq;
// m8A = -4.0*fq;
// m9A -= fq;
// m10A += 2.0*fq;
// m11A -= fq;
// m12A += 2.0*fq;
//
//
// // q = 6
// nread = neighborList[n+5*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A -= 11.0*fq;
// m2A -= 4.0*fq;
// jzA -= fq;
// m8A += 4.0*fq;
// m9A -= fq;
// m10A += 2.0*fq;
// m11A -= fq;
// m12A += 2.0*fq;
//
// // q=7
// nread = neighborList[n+6*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA += fq;
// m4A += fq;
// jyA += fq;
// m6A += fq;
// m9A += fq;
// m10A += fq;
// m11A += fq;
// m12A += fq;
// m13A = fq;
// m16A = fq;
// m17A = -fq;
//
// // q = 8
// nread = neighborList[n+7*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA -= fq;
// m4A -= fq;
// jyA -= fq;
// m6A -= fq;
// m9A += fq;
// m10A += fq;
// m11A += fq;
// m12A += fq;
// m13A += fq;
// m16A -= fq;
// m17A += fq;
//
// // q=9
// nread = neighborList[n+8*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA += fq;
// m4A += fq;
// jyA -= fq;
// m6A -= fq;
// m9A += fq;
// m10A += fq;
// m11A += fq;
// m12A += fq;
// m13A -= fq;
// m16A += fq;
// m17A += fq;
//
// // q = 10
// nread = neighborList[n+9*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA -= fq;
// m4A -= fq;
// jyA += fq;
// m6A += fq;
// m9A += fq;
// m10A += fq;
// m11A += fq;
// m12A += fq;
// m13A -= fq;
// m16A -= fq;
// m17A -= fq;
//
// // q=11
// nread = neighborList[n+10*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA += fq;
// m4A += fq;
// jzA += fq;
// m8A += fq;
// m9A += fq;
// m10A += fq;
// m11A -= fq;
// m12A -= fq;
// m15A = fq;
// m16A -= fq;
// m18A = fq;
//
// // q=12
// nread = neighborList[n+11*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA -= fq;
// m4A -= fq;
// jzA -= fq;
// m8A -= fq;
// m9A += fq;
// m10A += fq;
// m11A -= fq;
// m12A -= fq;
// m15A += fq;
// m16A += fq;
// m18A -= fq;
//
// // q=13
// nread = neighborList[n+12*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA += fq;
// m4A += fq;
// jzA -= fq;
// m8A -= fq;
// m9A += fq;
// m10A += fq;
// m11A -= fq;
// m12A -= fq;
// m15A -= fq;
// m16A -= fq;
// m18A -= fq;
//
// // q=14
// nread = neighborList[n+13*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA -= fq;
// m4A -= fq;
// jzA += fq;
// m8A += fq;
// m9A += fq;
// m10A += fq;
// m11A -= fq;
// m12A -= fq;
// m15A -= fq;
// m16A += fq;
// m18A += fq;
//
// // q=15
// nread = neighborList[n+14*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jyA += fq;
// m6A += fq;
// jzA += fq;
// m8A += fq;
// m9A -= 2.0*fq;
// m10A -= 2.0*fq;
// m14A = fq;
// m17A += fq;
// m18A -= fq;
//
// // q=16
// nread = neighborList[n+15*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jyA -= fq;
// m6A -= fq;
// jzA -= fq;
// m8A -= fq;
// m9A -= 2.0*fq;
// m10A -= 2.0*fq;
// m14A += fq;
// m17A -= fq;
// m18A += fq;
//
// // q=17
// nread = neighborList[n+16*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jyA += fq;
// m6A += fq;
// jzA -= fq;
// m8A -= fq;
// m9A -= 2.0*fq;
// m10A -= 2.0*fq;
// m14A -= fq;
// m17A += fq;
// m18A += fq;
//
// // q=18
// nread = neighborList[n+17*Np];
// fq = distA[nread];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jyA -= fq;
// m6A -= fq;
// jzA += fq;
// m8A += fq;
// m9A -= 2.0*fq;
// m10A -= 2.0*fq;
// m14A -= fq;
// m17A -= fq;
// m18A -= fq;
// //---------------------------------------------------------------------//
//
// // ------------------- Fluid component B ---------------------------------//
// //........................................................................
// // READ THE DISTRIBUTIONS
// // (read from opposite array due to previous swap operation)
// //........................................................................
// // q=0
// fq = distB[n];
// rhoB = fq;
// m1B = -30.0*fq;
// m2B = 12.0*fq;
//
// // q=1
// nread = neighborList[n]; // neighbor 2
// fq = distB[nread]; // reading the f1 data into register fq
// rhoB += fq;
// m1B -= 11.0*fq;
// m2B -= 4.0*fq;
// jxB = fq;
// m4B = -4.0*fq;
// m9B = 2.0*fq;
// m10B = -4.0*fq;
//
// // q=2
// nread = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist)
// fq = distB[nread]; // reading the f2 data into register fq
// rhoB += fq;
// m1B -= 11.0*(fq);
// m2B -= 4.0*(fq);
// jxB -= fq;
// m4B += 4.0*(fq);
// m9B += 2.0*(fq);
// m10B -= 4.0*(fq);
//
// // q=3
// nread = neighborList[n+2*Np]; // neighbor 4
// fq = distB[nread];
// rhoB += fq;
// m1B -= 11.0*fq;
// m2B -= 4.0*fq;
// jyB = fq;
// m6B = -4.0*fq;
// m9B -= fq;
// m10B += 2.0*fq;
// m11B = fq;
// m12B = -2.0*fq;
//
// // q = 4
// nread = neighborList[n+3*Np]; // neighbor 3
// fq = distB[nread];
// rhoB += fq;
// m1B -= 11.0*fq;
// m2B -= 4.0*fq;
// jyB -= fq;
// m6B += 4.0*fq;
// m9B -= fq;
// m10B += 2.0*fq;
// m11B += fq;
// m12B -= 2.0*fq;
//
// // q=5
// nread = neighborList[n+4*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B -= 11.0*fq;
// m2B -= 4.0*fq;
// jzB = fq;
// m8B = -4.0*fq;
// m9B -= fq;
// m10B += 2.0*fq;
// m11B -= fq;
// m12B += 2.0*fq;
//
//
// // q = 6
// nread = neighborList[n+5*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B -= 11.0*fq;
// m2B -= 4.0*fq;
// jzB -= fq;
// m8B += 4.0*fq;
// m9B -= fq;
// m10B += 2.0*fq;
// m11B -= fq;
// m12B += 2.0*fq;
//
// // q=7
// nread = neighborList[n+6*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB += fq;
// m4B += fq;
// jyB += fq;
// m6B += fq;
// m9B += fq;
// m10B += fq;
// m11B += fq;
// m12B += fq;
// m13B = fq;
// m16B = fq;
// m17B = -fq;
//
// // q = 8
// nread = neighborList[n+7*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB -= fq;
// m4B -= fq;
// jyB -= fq;
// m6B -= fq;
// m9B += fq;
// m10B += fq;
// m11B += fq;
// m12B += fq;
// m13B += fq;
// m16B -= fq;
// m17B += fq;
//
// // q=9
// nread = neighborList[n+8*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB += fq;
// m4B += fq;
// jyB -= fq;
// m6B -= fq;
// m9B += fq;
// m10B += fq;
// m11B += fq;
// m12B += fq;
// m13B -= fq;
// m16B += fq;
// m17B += fq;
//
// // q = 10
// nread = neighborList[n+9*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB -= fq;
// m4B -= fq;
// jyB += fq;
// m6B += fq;
// m9B += fq;
// m10B += fq;
// m11B += fq;
// m12B += fq;
// m13B -= fq;
// m16B -= fq;
// m17B -= fq;
//
// // q=11
// nread = neighborList[n+10*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB += fq;
// m4B += fq;
// jzB += fq;
// m8B += fq;
// m9B += fq;
// m10B += fq;
// m11B -= fq;
// m12B -= fq;
// m15B = fq;
// m16B -= fq;
// m18B = fq;
//
// // q=12
// nread = neighborList[n+11*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB -= fq;
// m4B -= fq;
// jzB -= fq;
// m8B -= fq;
// m9B += fq;
// m10B += fq;
// m11B -= fq;
// m12B -= fq;
// m15B += fq;
// m16B += fq;
// m18B -= fq;
//
// // q=13
// nread = neighborList[n+12*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB += fq;
// m4B += fq;
// jzB -= fq;
// m8B -= fq;
// m9B += fq;
// m10B += fq;
// m11B -= fq;
// m12B -= fq;
// m15B -= fq;
// m16B -= fq;
// m18B -= fq;
//
// // q=14
// nread = neighborList[n+13*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB -= fq;
// m4B -= fq;
// jzB += fq;
// m8B += fq;
// m9B += fq;
// m10B += fq;
// m11B -= fq;
// m12B -= fq;
// m15B -= fq;
// m16B += fq;
// m18B += fq;
//
// // q=15
// nread = neighborList[n+14*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jyB += fq;
// m6B += fq;
// jzB += fq;
// m8B += fq;
// m9B -= 2.0*fq;
// m10B -= 2.0*fq;
// m14B = fq;
// m17B += fq;
// m18B -= fq;
//
// // q=16
// nread = neighborList[n+15*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jyB -= fq;
// m6B -= fq;
// jzB -= fq;
// m8B -= fq;
// m9B -= 2.0*fq;
// m10B -= 2.0*fq;
// m14B += fq;
// m17B -= fq;
// m18B += fq;
//
// // q=17
// nread = neighborList[n+16*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jyB += fq;
// m6B += fq;
// jzB -= fq;
// m8B -= fq;
// m9B -= 2.0*fq;
// m10B -= 2.0*fq;
// m14B -= fq;
// m17B += fq;
// m18B += fq;
//
// // q=18
// nread = neighborList[n+17*Np];
// fq = distB[nread];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jyB -= fq;
// m6B -= fq;
// jzB += fq;
// m8B += fq;
// m9B -= 2.0*fq;
// m10B -= 2.0*fq;
// m14B -= fq;
// m17B -= fq;
// m18B -= fq;
// //---------------------------------------------------------------------//
//
//
// // Compute SC fluid-fluid interaction force
// GffA_x = -Gsc*nB_gradx;
// GffA_y = -Gsc*nB_grady;
// GffA_z = -Gsc*nB_gradz;
// GffB_x = -Gsc*nA_gradx;
// GffB_y = -Gsc*nA_grady;
// GffB_z = -Gsc*nA_gradz;
// // Compute SC fluid-solid force
// GfsA_x = SolidForceA[n+0*Np];
// GfsA_y = SolidForceA[n+1*Np];
// GfsA_z = SolidForceA[n+2*Np];
// GfsB_x = SolidForceB[n+0*Np];
// GfsB_y = SolidForceB[n+1*Np];
// GfsB_z = SolidForceB[n+2*Np];
//
// // Compute greyscale related parameters
// // ------------------- Fluid Component A -----------------------//
// c0 = 0.5*(1.0+porosity*0.5*muA_eff/permA);
// 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(permA);
// if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes
//
// vx = jxA/rhoA+0.5*(porosity*Gx+GffA_x+GfsA_x);
// vy = jyA/rhoA+0.5*(porosity*Gy+GffA_y+GfsA_y);
// vz = jzA/rhoA+0.5*(porosity*Gz+GffA_z+GfsA_z);
// v_mag=sqrt(vx*vx+vy*vy+vz*vz);
// ux_A = vx/(c0+sqrt(c0*c0+c1*v_mag));
// uy_A = vy/(c0+sqrt(c0*c0+c1*v_mag));
// uz_A = vz/(c0+sqrt(c0*c0+c1*v_mag));
// u_mag=sqrt(ux_A*ux_A+uy_A*uy_A+uz_A*uz_A);
//
// //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium
// FxA = nA*(-porosity*muA_eff/permA*ux_A - porosity*GeoFun/sqrt(permA)*u_mag*ux_A + porosity*Gx + GffA_x + GfsA_x);
// FyA = nA*(-porosity*muA_eff/permA*uy_A - porosity*GeoFun/sqrt(permA)*u_mag*uy_A + porosity*Gy + GffA_y + GfsA_y);
// FzA = nA*(-porosity*muA_eff/permA*uz_A - porosity*GeoFun/sqrt(permA)*u_mag*uz_A + porosity*Gz + GffA_z + GfsA_z);
// if (porosity==1.0){
// FxA=nA*(Gx + GffA_x + GfsA_x);
// FyA=nA*(Gy + GffA_y + GfsA_y);
// FzA=nA*(Gz + GffA_z + GfsA_z);
// }
// // ------------------- Fluid Component B -----------------------//
// // Compute greyscale related parameters
// c0 = 0.5*(1.0+porosity*0.5*muB_eff/permB);
// 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(permB);
// if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes
//
// vx = jxB/rhoB+0.5*(porosity*Gx+GffB_x+GfsB_x);
// vy = jyB/rhoB+0.5*(porosity*Gy+GffB_y+GfsB_y);
// vz = jzB/rhoB+0.5*(porosity*Gz+GffB_z+GfsB_z);
// v_mag=sqrt(vx*vx+vy*vy+vz*vz);
// ux_B = vx/(c0+sqrt(c0*c0+c1*v_mag));
// uy_B = vy/(c0+sqrt(c0*c0+c1*v_mag));
// uz_B = vz/(c0+sqrt(c0*c0+c1*v_mag));
// u_mag=sqrt(ux_B*ux_B+uy_B*uy_B+uz_B*uz_B);
//
// //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium
// FxB = nB*(-porosity*muB_eff/permB*ux_B - porosity*GeoFun/sqrt(permB)*u_mag*ux_B + porosity*Gx + GffB_x + GfsB_x);
// FyB = nB*(-porosity*muB_eff/permB*uy_B - porosity*GeoFun/sqrt(permB)*u_mag*uy_B + porosity*Gy + GffB_y + GfsB_y);
// FzB = nB*(-porosity*muB_eff/permB*uz_B - porosity*GeoFun/sqrt(permB)*u_mag*uz_B + porosity*Gz + GffB_z + GfsB_z);
// if (porosity==1.0){
// FxB=nB*(Gx + GffB_x + GfsB_x);
// FyB=nB*(Gy + GffB_y + GfsB_y);
// FzB=nB*(Gz + GffB_z + GfsB_z);
// }
//
// // Calculate barycentric velocity of the fluid mixture
// ux = (nA*ux_A+nB*ux_B)/(nA+nB);
// uy = (nA*uy_A+nB*uy_B)/(nA+nB);
// uz = (nA*uz_A+nB*uz_B)/(nA+nB);
//
// // ------------------- Fluid Component A -----------------------//
// rlx_setA = 1.0/tauA;
// rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA);
// //-------------------- MRT collison where body force has NO higher-order terms -------------//
// //..............carry out relaxation process...............................................
// //TODO need to incoporate porosity
// m1A = m1A + rlx_setA*((19*rhoA*(ux*ux+uy*uy+uz*uz) - 11*rhoA) - m1A)
// + (1-0.5*rlx_setA)*38*(FxA*ux+FyA*uy+FzA*uz);
// m2A = m2A + rlx_setA*((3*rhoA - 5.5*rhoA*(ux*ux+uy*uy+uz*uz))- m2A)
// + (1-0.5*rlx_setA)*11*(-FxA*ux-FyA*uy-FzA*uz);
// jxA = jxA + FxA;
// m4A = m4A + rlx_setB*((-0.6666666666666666*ux*rhoA)- m4A)
// + (1-0.5*rlx_setB)*(-0.6666666666666666*FxA);
// jyA = jyA + FyA;
// m6A = m6A + rlx_setB*((-0.6666666666666666*uy*rhoA)- m6A)
// + (1-0.5*rlx_setB)*(-0.6666666666666666*FyA);
// jzA = jzA + FzA;
// m8A = m8A + rlx_setB*((-0.6666666666666666*uz*rhoA)- m8A)
// + (1-0.5*rlx_setB)*(-0.6666666666666666*FzA);
// m9A = m9A + rlx_setA*((rhoA*(2*ux*ux-uy*uy-uz*uz)) - m9A)
// + (1-0.5*rlx_setA)*(4*FxA*ux-2*FyA*uy-2*FzA*uz);
// //m10A = m10A + rlx_setA*( - m10A)
// // + (1-0.5*rlx_setA)*(-2*FxA*ux+FyA*uy+FzA*uz);
// m10A = m10A + rlx_setA*( -0.5*(rhoA*(2*ux*ux-uy*uy-uz*uz))- m10A)
// + (1-0.5*rlx_setA)*(-2*FxA*ux+FyA*uy+FzA*uz);
// m11A = m11A + rlx_setA*((rhoA*(uy*uy-uz*uz)) - m11A)
// + (1-0.5*rlx_setA)*(2*FyA*uy-2*FzA*uz);
// //m12A = m12A + rlx_setA*( - m12A)
// // + (1-0.5*rlx_setA)*(-FyA*uy+FzA*uz);
// m12A = m12A + rlx_setA*( -0.5*(rhoA*(uy*uy-uz*uz))- m12A)
// + (1-0.5*rlx_setA)*(-FyA*uy+FzA*uz);
// m13A = m13A + rlx_setA*( rhoA*(ux*uy) - m13A)
// + (1-0.5*rlx_setA)*(FyA*ux+FxA*uy);
// m14A = m14A + rlx_setA*( rhoA*(uy*uz) - m14A)
// + (1-0.5*rlx_setA)*(FzA*uy+FyA*uz);
// m15A = m15A + rlx_setA*( rhoA*(ux*uz) - m15A)
// + (1-0.5*rlx_setA)*(FzA*ux+FxA*uz);
// m16A = m16A + rlx_setB*( - m16A);
// m17A = m17A + rlx_setB*( - m17A);
// m18A = m18A + rlx_setB*( - m18A);
// //.......................................................................................................
//
//
// // ------------------- Fluid Component A -----------------------//
// //.................inverse transformation......................................................
// // q=0
// fq = mrt_V1*rhoA-mrt_V2*m1A+mrt_V3*m2A;
// distA[n] = fq;
//
// // q = 1
// fq = mrt_V1*rhoA-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A);
// nread = neighborList[n+Np];
// distA[nread] = fq;
//
// // q=2
// fq = mrt_V1*rhoA-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A);
// nread = neighborList[n];
// distA[nread] = fq;
//
// // q = 3
// fq = mrt_V1*rhoA-mrt_V4*m1A-mrt_V5*m2A+0.1*(jyA-m6A)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A);
// nread = neighborList[n+3*Np];
// distA[nread] = fq;
//
// // q = 4
// fq = mrt_V1*rhoA-mrt_V4*m1A-mrt_V5*m2A+0.1*(m6A-jyA)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A);
// nread = neighborList[n+2*Np];
// distA[nread] = fq;
//
// // q = 5
// fq = mrt_V1*rhoA-mrt_V4*m1A-mrt_V5*m2A+0.1*(jzA-m8A)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A);
// nread = neighborList[n+5*Np];
// distA[nread] = fq;
//
// // q = 6
// fq = mrt_V1*rhoA-mrt_V4*m1A-mrt_V5*m2A+0.1*(m8A-jzA)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A);
// nread = neighborList[n+4*Np];
// distA[nread] = fq;
//
// // q = 7
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jxA+jyA)+0.025*(m4A+m6A)+mrt_V7*m9A+mrt_V11*m10A+mrt_V8*m11A+mrt_V12*m12A+0.25*m13A+0.125*(m16A-m17A);
// nread = neighborList[n+7*Np];
// distA[nread] = fq;
//
// // q = 8
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A-0.1*(jxA+jyA)-0.025*(m4A+m6A) +mrt_V7*m9A+mrt_V11*m10A+mrt_V8*m11A+mrt_V12*m12A+0.25*m13A+0.125*(m17A-m16A);
// nread = neighborList[n+6*Np];
// distA[nread] = fq;
//
// // q = 9
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jxA-jyA)+0.025*(m4A-m6A)+mrt_V7*m9A+mrt_V11*m10A+mrt_V8*m11A+mrt_V12*m12A-0.25*m13A+0.125*(m16A+m17A);
// nread = neighborList[n+9*Np];
// distA[nread] = fq;
//
// // q = 10
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jyA-jxA)+0.025*(m6A-m4A)+mrt_V7*m9A+mrt_V11*m10A+mrt_V8*m11A+mrt_V12*m12A-0.25*m13A-0.125*(m16A+m17A);
// nread = neighborList[n+8*Np];
// distA[nread] = fq;
//
// // q = 11
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jxA+jzA)+0.025*(m4A+m8A)+mrt_V7*m9A+mrt_V11*m10A-mrt_V8*m11A-mrt_V12*m12A+0.25*m15A+0.125*(m18A-m16A);
// nread = neighborList[n+11*Np];
// distA[nread] = fq;
//
// // q = 12
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A-0.1*(jxA+jzA)-0.025*(m4A+m8A)+mrt_V7*m9A+mrt_V11*m10A-mrt_V8*m11A-mrt_V12*m12A+0.25*m15A+0.125*(m16A-m18A);
// nread = neighborList[n+10*Np];
// distA[nread]= fq;
//
// // q = 13
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jxA-jzA)+0.025*(m4A-m8A)+mrt_V7*m9A+mrt_V11*m10A-mrt_V8*m11A-mrt_V12*m12A-0.25*m15A-0.125*(m16A+m18A);
// nread = neighborList[n+13*Np];
// distA[nread] = fq;
//
// // q= 14
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jzA-jxA)+0.025*(m8A-m4A)+mrt_V7*m9A+mrt_V11*m10A-mrt_V8*m11A-mrt_V12*m12A-0.25*m15A+0.125*(m16A+m18A);
// nread = neighborList[n+12*Np];
// distA[nread] = fq;
//
// // q = 15
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jyA+jzA)+0.025*(m6A+m8A)-mrt_V6*m9A-mrt_V7*m10A+0.25*m14A+0.125*(m17A-m18A);
// nread = neighborList[n+15*Np];
// distA[nread] = fq;
//
// // q = 16
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A-0.1*(jyA+jzA)-0.025*(m6A+m8A)-mrt_V6*m9A-mrt_V7*m10A+0.25*m14A+0.125*(m18A-m17A);
// nread = neighborList[n+14*Np];
// distA[nread] = fq;
//
// // q = 17
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jyA-jzA)+0.025*(m6A-m8A)-mrt_V6*m9A-mrt_V7*m10A-0.25*m14A+0.125*(m17A+m18A);
// nread = neighborList[n+17*Np];
// distA[nread] = fq;
//
// // q = 18
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jzA-jyA)+0.025*(m8A-m6A)-mrt_V6*m9A-mrt_V7*m10A-0.25*m14A-0.125*(m17A+m18A);
// nread = neighborList[n+16*Np];
// distA[nread] = fq;
// //........................................................................
//
// // ------------------- Fluid Component B -----------------------//
// rlx_setA = 1.0/tauB;
// rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA);
// //-------------------- MRT collison where body force has NO higher-order terms -------------//
// //..............carry out relaxation process...............................................
// //TODO need to incoporate porosity
// m1B = m1B + rlx_setA*((19*rhoB*(ux*ux+uy*uy+uz*uz) - 11*rhoB) - m1B)
// + (1-0.5*rlx_setA)*38*(FxB*ux+FyB*uy+FzB*uz);
// m2B = m2B + rlx_setA*((3*rhoB - 5.5*rhoB*(ux*ux+uy*uy+uz*uz))- m2B)
// + (1-0.5*rlx_setA)*11*(-FxB*ux-FyB*uy-FzB*uz);
// jxB = jxB + FxB;
// m4B = m4B + rlx_setB*((-0.6666666666666666*ux*rhoB)- m4B)
// + (1-0.5*rlx_setB)*(-0.6666666666666666*FxB);
// jyB = jyB + FyB;
// m6B = m6B + rlx_setB*((-0.6666666666666666*uy*rhoB)- m6B)
// + (1-0.5*rlx_setB)*(-0.6666666666666666*FyB);
// jzB = jzB + FzB;
// m8B = m8B + rlx_setB*((-0.6666666666666666*uz*rhoB)- m8B)
// + (1-0.5*rlx_setB)*(-0.6666666666666666*FzB);
// m9B = m9B + rlx_setA*((rhoB*(2*ux*ux-uy*uy-uz*uz)) - m9B)
// + (1-0.5*rlx_setA)*(4*FxB*ux-2*FyB*uy-2*FzB*uz);
// //m10B = m10B + rlx_setA*( - m10B)
// // + (1-0.5*rlx_setA)*(-2*FxB*ux+FyB*uy+FzB*uz);
// m10B = m10B + rlx_setA*( -0.5*(rhoB*(2*ux*ux-uy*uy-uz*uz))- m10B)
// + (1-0.5*rlx_setA)*(-2*FxB*ux+FyB*uy+FzB*uz);
// m11B = m11B + rlx_setA*((rhoB*(uy*uy-uz*uz)) - m11B)
// + (1-0.5*rlx_setA)*(2*FyB*uy-2*FzB*uz);
// //m12B = m12B + rlx_setA*( - m12B)
// // + (1-0.5*rlx_setA)*(-FyB*uy+FzB*uz);
// m12B = m12B + rlx_setA*( -0.5*(rhoB*(uy*uy-uz*uz))- m12B)
// + (1-0.5*rlx_setA)*(-FyB*uy+FzB*uz);
// m13B = m13B + rlx_setA*( rhoB*(ux*uy) - m13B)
// + (1-0.5*rlx_setA)*(FyB*ux+FxB*uy);
// m14B = m14B + rlx_setA*( rhoB*(uy*uz) - m14B)
// + (1-0.5*rlx_setA)*(FzB*uy+FyB*uz);
// m15B = m15B + rlx_setA*( rhoB*(ux*uz) - m15B)
// + (1-0.5*rlx_setA)*(FzB*ux+FxB*uz);
// m16B = m16B + rlx_setB*( - m16B);
// m17B = m17B + rlx_setB*( - m17B);
// m18B = m18B + rlx_setB*( - m18B);
// //.......................................................................................................
//
//
// // ------------------- Fluid Component B -----------------------//
// //.................inverse transformation......................................................
// // q=0
// fq = mrt_V1*rhoB-mrt_V2*m1B+mrt_V3*m2B;
// distB[n] = fq;
//
// // q = 1
// fq = mrt_V1*rhoB-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B);
// nread = neighborList[n+Np];
// distB[nread] = fq;
//
// // q=2
// fq = mrt_V1*rhoB-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B);
// nread = neighborList[n];
// distB[nread] = fq;
//
// // q = 3
// fq = mrt_V1*rhoB-mrt_V4*m1B-mrt_V5*m2B+0.1*(jyB-m6B)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B);
// nread = neighborList[n+3*Np];
// distB[nread] = fq;
//
// // q = 4
// fq = mrt_V1*rhoB-mrt_V4*m1B-mrt_V5*m2B+0.1*(m6B-jyB)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B);
// nread = neighborList[n+2*Np];
// distB[nread] = fq;
//
// // q = 5
// fq = mrt_V1*rhoB-mrt_V4*m1B-mrt_V5*m2B+0.1*(jzB-m8B)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B);
// nread = neighborList[n+5*Np];
// distB[nread] = fq;
//
// // q = 6
// fq = mrt_V1*rhoB-mrt_V4*m1B-mrt_V5*m2B+0.1*(m8B-jzB)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B);
// nread = neighborList[n+4*Np];
// distB[nread] = fq;
//
// // q = 7
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jxB+jyB)+0.025*(m4B+m6B)+mrt_V7*m9B+mrt_V11*m10B+mrt_V8*m11B+mrt_V12*m12B+0.25*m13B+0.125*(m16B-m17B);
// nread = neighborList[n+7*Np];
// distB[nread] = fq;
//
// // q = 8
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B-0.1*(jxB+jyB)-0.025*(m4B+m6B) +mrt_V7*m9B+mrt_V11*m10B+mrt_V8*m11B+mrt_V12*m12B+0.25*m13B+0.125*(m17B-m16B);
// nread = neighborList[n+6*Np];
// distB[nread] = fq;
//
// // q = 9
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jxB-jyB)+0.025*(m4B-m6B)+mrt_V7*m9B+mrt_V11*m10B+mrt_V8*m11B+mrt_V12*m12B-0.25*m13B+0.125*(m16B+m17B);
// nread = neighborList[n+9*Np];
// distB[nread] = fq;
//
// // q = 10
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jyB-jxB)+0.025*(m6B-m4B)+mrt_V7*m9B+mrt_V11*m10B+mrt_V8*m11B+mrt_V12*m12B-0.25*m13B-0.125*(m16B+m17B);
// nread = neighborList[n+8*Np];
// distB[nread] = fq;
//
// // q = 11
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jxB+jzB)+0.025*(m4B+m8B)+mrt_V7*m9B+mrt_V11*m10B-mrt_V8*m11B-mrt_V12*m12B+0.25*m15B+0.125*(m18B-m16B);
// nread = neighborList[n+11*Np];
// distB[nread] = fq;
//
// // q = 12
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B-0.1*(jxB+jzB)-0.025*(m4B+m8B)+mrt_V7*m9B+mrt_V11*m10B-mrt_V8*m11B-mrt_V12*m12B+0.25*m15B+0.125*(m16B-m18B);
// nread = neighborList[n+10*Np];
// distB[nread]= fq;
//
// // q = 13
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jxB-jzB)+0.025*(m4B-m8B)+mrt_V7*m9B+mrt_V11*m10B-mrt_V8*m11B-mrt_V12*m12B-0.25*m15B-0.125*(m16B+m18B);
// nread = neighborList[n+13*Np];
// distB[nread] = fq;
//
// // q= 14
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jzB-jxB)+0.025*(m8B-m4B)+mrt_V7*m9B+mrt_V11*m10B-mrt_V8*m11B-mrt_V12*m12B-0.25*m15B+0.125*(m16B+m18B);
// nread = neighborList[n+12*Np];
// distB[nread] = fq;
//
// // q = 15
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jyB+jzB)+0.025*(m6B+m8B)-mrt_V6*m9B-mrt_V7*m10B+0.25*m14B+0.125*(m17B-m18B);
// nread = neighborList[n+15*Np];
// distB[nread] = fq;
//
// // q = 16
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B-0.1*(jyB+jzB)-0.025*(m6B+m8B)-mrt_V6*m9B-mrt_V7*m10B+0.25*m14B+0.125*(m18B-m17B);
// nread = neighborList[n+14*Np];
// distB[nread] = fq;
//
// // q = 17
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jyB-jzB)+0.025*(m6B-m8B)-mrt_V6*m9B-mrt_V7*m10B-0.25*m14B+0.125*(m17B+m18B);
// nread = neighborList[n+17*Np];
// distB[nread] = fq;
//
// // q = 18
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jzB-jyB)+0.025*(m8B-m6B)-mrt_V6*m9B-mrt_V7*m10B-0.25*m14B-0.125*(m17B+m18B);
// nread = neighborList[n+16*Np];
// distB[nread] = 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] = (nA+nB+Gsc*nA*nB)/3.0;
// }
// }
//}
//__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(int *Map,double *distA, double *distB, double *DenA,double *DenB, double *DenGradA, double *DenGradB,
// double *SolidForceA, double *SolidForceB, double *Poros,double *Perm, double *Velocity,double *Pressure,
// double tauA,double tauB,double tauA_eff,double tauB_eff, double Gsc, double Gx, double Gy, double Gz,
// int start, int finish, int Np){
//
// int ijk;
// int n;
// double vx,vy,vz,v_mag;
// double ux_A,uy_A,uz_A,ux_B,uy_B,uz_B,u_mag;
// double ux,uy,uz;
// // conserved momemnts
// double jxA,jyA,jzA;
// double jxB,jyB,jzB;
// double rhoA,rhoB;
// double nA,nB;
// // non-conserved moments
// double m1A,m2A,m4A,m6A,m8A,m9A,m10A,m11A,m12A,m13A,m14A,m15A,m16A,m17A,m18A;
// double m1B,m2B,m4B,m6B,m8B,m9B,m10B,m11B,m12B,m13B,m14B,m15B,m16B,m17B,m18B;
// double fq;
// //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18;
// double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002)
// double porosity;
// double perm;//voxel permeability
// double permA,permB;//effective relative perm
// double c0, c1; //Guo's model parameters
// double muA_eff = (tauA_eff-0.5)/3.0;//kinematic viscosity
// double muB_eff = (tauB_eff-0.5)/3.0;//kinematic viscosity
// double FxA, FyA, FzA;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz)
// double FxB, FyB, FzB;
// double rlx_setA,rlx_setB;
// double nA_gradx,nA_grady,nA_gradz;
// double nB_gradx,nB_grady,nB_gradz;
// double GffA_x,GffA_y,GffA_z;
// double GfsA_x,GfsA_y,GfsA_z;
// double GffB_x,GffB_y,GffB_z;
// double GfsB_x,GfsB_y,GfsB_z;
//
// 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<S; s++){
// //........Get 1-D index for this thread....................
// n = S*blockIdx.x*blockDim.x + s*blockDim.x + threadIdx.x + start;
//
// if ( n<finish ){
//
// // Load common parameters shared by two fluid components
// ijk = Map[n];
// nA = DenA[ijk];
// nB = DenB[ijk];
// porosity = Poros[n];
// perm = Perm[n];
// permA = perm*nA/(nA+nB);//effective relative perm
// permB = perm*nB/(nA+nB);
// nA_gradx = DenGradA[n+0*Np];
// nA_grady = DenGradA[n+1*Np];
// nA_gradz = DenGradA[n+2*Np];
// nB_gradx = DenGradB[n+0*Np];
// nB_grady = DenGradB[n+1*Np];
// nB_gradz = DenGradB[n+2*Np];
//
// // ------------------- Fluid component A ---------------------------------//
// //........................................................................
// // READ THE DISTRIBUTIONS
// // (read from opposite array due to previous swap operation)
// //........................................................................
// // q=0
// fq = distA[n];
// rhoA = fq;
// m1A = -30.0*fq;
// m2A = 12.0*fq;
//
// // q=1
// fq = distA[2*Np+n];
// rhoA += fq;
// m1A -= 11.0*fq;
// m2A -= 4.0*fq;
// jxA = fq;
// m4A = -4.0*fq;
// m9A = 2.0*fq;
// m10A = -4.0*fq;
//
// // q=2
// fq = distA[1*Np+n];
// rhoA += fq;
// m1A -= 11.0*(fq);
// m2A -= 4.0*(fq);
// jxA -= fq;
// m4A += 4.0*(fq);
// m9A += 2.0*(fq);
// m10A -= 4.0*(fq);
//
// // q=3
// fq = distA[4*Np+n];
// rhoA += fq;
// m1A -= 11.0*fq;
// m2A -= 4.0*fq;
// jyA = fq;
// m6A = -4.0*fq;
// m9A -= fq;
// m10A += 2.0*fq;
// m11A = fq;
// m12A = -2.0*fq;
//
// // q = 4
// fq = distA[3*Np+n];
// rhoA += fq;
// m1A -= 11.0*fq;
// m2A -= 4.0*fq;
// jyA -= fq;
// m6A += 4.0*fq;
// m9A -= fq;
// m10A += 2.0*fq;
// m11A += fq;
// m12A -= 2.0*fq;
//
// // q=5
// fq = distA[6*Np+n];
// rhoA += fq;
// m1A -= 11.0*fq;
// m2A -= 4.0*fq;
// jzA = fq;
// m8A = -4.0*fq;
// m9A -= fq;
// m10A += 2.0*fq;
// m11A -= fq;
// m12A += 2.0*fq;
//
//
// // q = 6
// fq = distA[5*Np+n];
// rhoA += fq;
// m1A -= 11.0*fq;
// m2A -= 4.0*fq;
// jzA -= fq;
// m8A += 4.0*fq;
// m9A -= fq;
// m10A += 2.0*fq;
// m11A -= fq;
// m12A += 2.0*fq;
//
// // q=7
// fq = distA[8*Np+n];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA += fq;
// m4A += fq;
// jyA += fq;
// m6A += fq;
// m9A += fq;
// m10A += fq;
// m11A += fq;
// m12A += fq;
// m13A = fq;
// m16A = fq;
// m17A = -fq;
//
// // q = 8
// fq = distA[7*Np+n];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA -= fq;
// m4A -= fq;
// jyA -= fq;
// m6A -= fq;
// m9A += fq;
// m10A += fq;
// m11A += fq;
// m12A += fq;
// m13A += fq;
// m16A -= fq;
// m17A += fq;
//
// // q=9
// fq = distA[10*Np+n];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA += fq;
// m4A += fq;
// jyA -= fq;
// m6A -= fq;
// m9A += fq;
// m10A += fq;
// m11A += fq;
// m12A += fq;
// m13A -= fq;
// m16A += fq;
// m17A += fq;
//
// // q = 10
// fq = distA[9*Np+n];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA -= fq;
// m4A -= fq;
// jyA += fq;
// m6A += fq;
// m9A += fq;
// m10A += fq;
// m11A += fq;
// m12A += fq;
// m13A -= fq;
// m16A -= fq;
// m17A -= fq;
//
// // q=11
// fq = distA[12*Np+n];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA += fq;
// m4A += fq;
// jzA += fq;
// m8A += fq;
// m9A += fq;
// m10A += fq;
// m11A -= fq;
// m12A -= fq;
// m15A = fq;
// m16A -= fq;
// m18A = fq;
//
// // q=12
// fq = distA[11*Np+n];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA -= fq;
// m4A -= fq;
// jzA -= fq;
// m8A -= fq;
// m9A += fq;
// m10A += fq;
// m11A -= fq;
// m12A -= fq;
// m15A += fq;
// m16A += fq;
// m18A -= fq;
//
// // q=13
// fq = distA[14*Np+n];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA += fq;
// m4A += fq;
// jzA -= fq;
// m8A -= fq;
// m9A += fq;
// m10A += fq;
// m11A -= fq;
// m12A -= fq;
// m15A -= fq;
// m16A -= fq;
// m18A -= fq;
//
// // q=14
// fq = distA[13*Np+n];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jxA -= fq;
// m4A -= fq;
// jzA += fq;
// m8A += fq;
// m9A += fq;
// m10A += fq;
// m11A -= fq;
// m12A -= fq;
// m15A -= fq;
// m16A += fq;
// m18A += fq;
//
// // q=15
// fq = distA[16*Np+n];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jyA += fq;
// m6A += fq;
// jzA += fq;
// m8A += fq;
// m9A -= 2.0*fq;
// m10A -= 2.0*fq;
// m14A = fq;
// m17A += fq;
// m18A -= fq;
//
// // q=16
// fq = distA[15*Np+n];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jyA -= fq;
// m6A -= fq;
// jzA -= fq;
// m8A -= fq;
// m9A -= 2.0*fq;
// m10A -= 2.0*fq;
// m14A += fq;
// m17A -= fq;
// m18A += fq;
//
// // q=17
// fq = distA[18*Np+n];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jyA += fq;
// m6A += fq;
// jzA -= fq;
// m8A -= fq;
// m9A -= 2.0*fq;
// m10A -= 2.0*fq;
// m14A -= fq;
// m17A += fq;
// m18A += fq;
//
// // q=18
// fq = distA[17*Np+n];
// rhoA += fq;
// m1A += 8.0*fq;
// m2A += fq;
// jyA -= fq;
// m6A -= fq;
// jzA += fq;
// m8A += fq;
// m9A -= 2.0*fq;
// m10A -= 2.0*fq;
// m14A -= fq;
// m17A -= fq;
// m18A -= fq;
// //---------------------------------------------------------------------//
//
// // ------------------- Fluid component B ---------------------------------//
// //........................................................................
// // READ THE DISTRIBUTIONS
// // (read from opposite array due to previous swap operation)
// //........................................................................
// // q=0
// fq = distB[n];
// rhoB = fq;
// m1B = -30.0*fq;
// m2B = 12.0*fq;
//
// // q=1
// fq = distB[2*Np+n];
// rhoB += fq;
// m1B -= 11.0*fq;
// m2B -= 4.0*fq;
// jxB = fq;
// m4B = -4.0*fq;
// m9B = 2.0*fq;
// m10B = -4.0*fq;
//
// // q=2
// fq = distB[1*Np+n];
// rhoB += fq;
// m1B -= 11.0*(fq);
// m2B -= 4.0*(fq);
// jxB -= fq;
// m4B += 4.0*(fq);
// m9B += 2.0*(fq);
// m10B -= 4.0*(fq);
//
// // q=3
// fq = distB[4*Np+n];
// rhoB += fq;
// m1B -= 11.0*fq;
// m2B -= 4.0*fq;
// jyB = fq;
// m6B = -4.0*fq;
// m9B -= fq;
// m10B += 2.0*fq;
// m11B = fq;
// m12B = -2.0*fq;
//
// // q = 4
// fq = distB[3*Np+n];
// rhoB += fq;
// m1B -= 11.0*fq;
// m2B -= 4.0*fq;
// jyB -= fq;
// m6B += 4.0*fq;
// m9B -= fq;
// m10B += 2.0*fq;
// m11B += fq;
// m12B -= 2.0*fq;
//
// // q=5
// fq = distB[6*Np+n];
// rhoB += fq;
// m1B -= 11.0*fq;
// m2B -= 4.0*fq;
// jzB = fq;
// m8B = -4.0*fq;
// m9B -= fq;
// m10B += 2.0*fq;
// m11B -= fq;
// m12B += 2.0*fq;
//
//
// // q = 6
// fq = distB[5*Np+n];
// rhoB += fq;
// m1B -= 11.0*fq;
// m2B -= 4.0*fq;
// jzB -= fq;
// m8B += 4.0*fq;
// m9B -= fq;
// m10B += 2.0*fq;
// m11B -= fq;
// m12B += 2.0*fq;
//
// // q=7
// fq = distB[8*Np+n];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB += fq;
// m4B += fq;
// jyB += fq;
// m6B += fq;
// m9B += fq;
// m10B += fq;
// m11B += fq;
// m12B += fq;
// m13B = fq;
// m16B = fq;
// m17B = -fq;
//
// // q = 8
// fq = distB[7*Np+n];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB -= fq;
// m4B -= fq;
// jyB -= fq;
// m6B -= fq;
// m9B += fq;
// m10B += fq;
// m11B += fq;
// m12B += fq;
// m13B += fq;
// m16B -= fq;
// m17B += fq;
//
// // q=9
// fq = distB[10*Np+n];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB += fq;
// m4B += fq;
// jyB -= fq;
// m6B -= fq;
// m9B += fq;
// m10B += fq;
// m11B += fq;
// m12B += fq;
// m13B -= fq;
// m16B += fq;
// m17B += fq;
//
// // q = 10
// fq = distB[9*Np+n];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB -= fq;
// m4B -= fq;
// jyB += fq;
// m6B += fq;
// m9B += fq;
// m10B += fq;
// m11B += fq;
// m12B += fq;
// m13B -= fq;
// m16B -= fq;
// m17B -= fq;
//
// // q=11
// fq = distB[12*Np+n];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB += fq;
// m4B += fq;
// jzB += fq;
// m8B += fq;
// m9B += fq;
// m10B += fq;
// m11B -= fq;
// m12B -= fq;
// m15B = fq;
// m16B -= fq;
// m18B = fq;
//
// // q=12
// fq = distB[11*Np+n];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB -= fq;
// m4B -= fq;
// jzB -= fq;
// m8B -= fq;
// m9B += fq;
// m10B += fq;
// m11B -= fq;
// m12B -= fq;
// m15B += fq;
// m16B += fq;
// m18B -= fq;
//
// // q=13
// fq = distB[14*Np+n];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB += fq;
// m4B += fq;
// jzB -= fq;
// m8B -= fq;
// m9B += fq;
// m10B += fq;
// m11B -= fq;
// m12B -= fq;
// m15B -= fq;
// m16B -= fq;
// m18B -= fq;
//
// // q=14
// fq = distB[13*Np+n];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jxB -= fq;
// m4B -= fq;
// jzB += fq;
// m8B += fq;
// m9B += fq;
// m10B += fq;
// m11B -= fq;
// m12B -= fq;
// m15B -= fq;
// m16B += fq;
// m18B += fq;
//
// // q=15
// fq = distB[16*Np+n];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jyB += fq;
// m6B += fq;
// jzB += fq;
// m8B += fq;
// m9B -= 2.0*fq;
// m10B -= 2.0*fq;
// m14B = fq;
// m17B += fq;
// m18B -= fq;
//
// // q=16
// fq = distB[15*Np+n];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jyB -= fq;
// m6B -= fq;
// jzB -= fq;
// m8B -= fq;
// m9B -= 2.0*fq;
// m10B -= 2.0*fq;
// m14B += fq;
// m17B -= fq;
// m18B += fq;
//
// // q=17
// fq = distB[18*Np+n];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jyB += fq;
// m6B += fq;
// jzB -= fq;
// m8B -= fq;
// m9B -= 2.0*fq;
// m10B -= 2.0*fq;
// m14B -= fq;
// m17B += fq;
// m18B += fq;
//
// // q=18
// fq = distB[17*Np+n];
// rhoB += fq;
// m1B += 8.0*fq;
// m2B += fq;
// jyB -= fq;
// m6B -= fq;
// jzB += fq;
// m8B += fq;
// m9B -= 2.0*fq;
// m10B -= 2.0*fq;
// m14B -= fq;
// m17B -= fq;
// m18B -= fq;
// //---------------------------------------------------------------------//
//
//
// // Compute SC fluid-fluid interaction force
// GffA_x = -Gsc*nB_gradx;
// GffA_y = -Gsc*nB_grady;
// GffA_z = -Gsc*nB_gradz;
// GffB_x = -Gsc*nA_gradx;
// GffB_y = -Gsc*nA_grady;
// GffB_z = -Gsc*nA_gradz;
// // Compute SC fluid-solid force
// GfsA_x = SolidForceA[n+0*Np];
// GfsA_y = SolidForceA[n+1*Np];
// GfsA_z = SolidForceA[n+2*Np];
// GfsB_x = SolidForceB[n+0*Np];
// GfsB_y = SolidForceB[n+1*Np];
// GfsB_z = SolidForceB[n+2*Np];
//
// // Compute greyscale related parameters
// // ------------------- Fluid Component A -----------------------//
// c0 = 0.5*(1.0+porosity*0.5*muA_eff/permA);
// 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(permA);
// if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes
//
// vx = jxA/rhoA+0.5*(porosity*Gx+GffA_x+GfsA_x);
// vy = jyA/rhoA+0.5*(porosity*Gy+GffA_y+GfsA_y);
// vz = jzA/rhoA+0.5*(porosity*Gz+GffA_z+GfsA_z);
// v_mag=sqrt(vx*vx+vy*vy+vz*vz);
// ux_A = vx/(c0+sqrt(c0*c0+c1*v_mag));
// uy_A = vy/(c0+sqrt(c0*c0+c1*v_mag));
// uz_A = vz/(c0+sqrt(c0*c0+c1*v_mag));
// u_mag=sqrt(ux_A*ux_A+uy_A*uy_A+uz_A*uz_A);
//
// //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium
// FxA = nA*(-porosity*muA_eff/permA*ux_A - porosity*GeoFun/sqrt(permA)*u_mag*ux_A + porosity*Gx + GffA_x + GfsA_x);
// FyA = nA*(-porosity*muA_eff/permA*uy_A - porosity*GeoFun/sqrt(permA)*u_mag*uy_A + porosity*Gy + GffA_y + GfsA_y);
// FzA = nA*(-porosity*muA_eff/permA*uz_A - porosity*GeoFun/sqrt(permA)*u_mag*uz_A + porosity*Gz + GffA_z + GfsA_z);
// if (porosity==1.0){
// FxA=nA*(Gx + GffA_x + GfsA_x);
// FyA=nA*(Gy + GffA_y + GfsA_y);
// FzA=nA*(Gz + GffA_z + GfsA_z);
// }
// // ------------------- Fluid Component B -----------------------//
// // Compute greyscale related parameters
// c0 = 0.5*(1.0+porosity*0.5*muB_eff/permB);
// 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(permB);
// if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes
//
// vx = jxB/rhoB+0.5*(porosity*Gx+GffB_x+GfsB_x);
// vy = jyB/rhoB+0.5*(porosity*Gy+GffB_y+GfsB_y);
// vz = jzB/rhoB+0.5*(porosity*Gz+GffB_z+GfsB_z);
// v_mag=sqrt(vx*vx+vy*vy+vz*vz);
// ux_B = vx/(c0+sqrt(c0*c0+c1*v_mag));
// uy_B = vy/(c0+sqrt(c0*c0+c1*v_mag));
// uz_B = vz/(c0+sqrt(c0*c0+c1*v_mag));
// u_mag=sqrt(ux_B*ux_B+uy_B*uy_B+uz_B*uz_B);
//
// //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium
// FxB = nB*(-porosity*muB_eff/permB*ux_B - porosity*GeoFun/sqrt(permB)*u_mag*ux_B + porosity*Gx + GffB_x + GfsB_x);
// FyB = nB*(-porosity*muB_eff/permB*uy_B - porosity*GeoFun/sqrt(permB)*u_mag*uy_B + porosity*Gy + GffB_y + GfsB_y);
// FzB = nB*(-porosity*muB_eff/permB*uz_B - porosity*GeoFun/sqrt(permB)*u_mag*uz_B + porosity*Gz + GffB_z + GfsB_z);
// if (porosity==1.0){
// FxB=nB*(Gx + GffB_x + GfsB_x);
// FyB=nB*(Gy + GffB_y + GfsB_y);
// FzB=nB*(Gz + GffB_z + GfsB_z);
// }
//
// // Calculate barycentric velocity of the fluid mixture
// ux = (nA*ux_A+nB*ux_B)/(nA+nB);
// uy = (nA*uy_A+nB*uy_B)/(nA+nB);
// uz = (nA*uz_A+nB*uz_B)/(nA+nB);
//
//
// // ------------------- Fluid Component A -----------------------//
// rlx_setA = 1.0/tauA;
// rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA);
// //-------------------- MRT collison where body force has NO higher-order terms -------------//
// //..............carry out relaxation process...............................................
// //TODO need to incoporate porosity
// m1A = m1A + rlx_setA*((19*rhoA*(ux*ux+uy*uy+uz*uz) - 11*rhoA) - m1A)
// + (1-0.5*rlx_setA)*38*(FxA*ux+FyA*uy+FzA*uz);
// m2A = m2A + rlx_setA*((3*rhoA - 5.5*rhoA*(ux*ux+uy*uy+uz*uz))- m2A)
// + (1-0.5*rlx_setA)*11*(-FxA*ux-FyA*uy-FzA*uz);
// jxA = jxA + FxA;
// m4A = m4A + rlx_setB*((-0.6666666666666666*ux*rhoA)- m4A)
// + (1-0.5*rlx_setB)*(-0.6666666666666666*FxA);
// jyA = jyA + FyA;
// m6A = m6A + rlx_setB*((-0.6666666666666666*uy*rhoA)- m6A)
// + (1-0.5*rlx_setB)*(-0.6666666666666666*FyA);
// jzA = jzA + FzA;
// m8A = m8A + rlx_setB*((-0.6666666666666666*uz*rhoA)- m8A)
// + (1-0.5*rlx_setB)*(-0.6666666666666666*FzA);
// m9A = m9A + rlx_setA*((rhoA*(2*ux*ux-uy*uy-uz*uz)) - m9A)
// + (1-0.5*rlx_setA)*(4*FxA*ux-2*FyA*uy-2*FzA*uz);
// //m10A = m10A + rlx_setA*( - m10A)
// // + (1-0.5*rlx_setA)*(-2*FxA*ux+FyA*uy+FzA*uz);
// m10A = m10A + rlx_setA*( -0.5*(rhoA*(2*ux*ux-uy*uy-uz*uz))- m10A)
// + (1-0.5*rlx_setA)*(-2*FxA*ux+FyA*uy+FzA*uz);
// m11A = m11A + rlx_setA*((rhoA*(uy*uy-uz*uz)) - m11A)
// + (1-0.5*rlx_setA)*(2*FyA*uy-2*FzA*uz);
// //m12A = m12A + rlx_setA*( - m12A)
// // + (1-0.5*rlx_setA)*(-FyA*uy+FzA*uz);
// m12A = m12A + rlx_setA*( -0.5*(rhoA*(uy*uy-uz*uz))- m12A)
// + (1-0.5*rlx_setA)*(-FyA*uy+FzA*uz);
// m13A = m13A + rlx_setA*( rhoA*(ux*uy) - m13A)
// + (1-0.5*rlx_setA)*(FyA*ux+FxA*uy);
// m14A = m14A + rlx_setA*( rhoA*(uy*uz) - m14A)
// + (1-0.5*rlx_setA)*(FzA*uy+FyA*uz);
// m15A = m15A + rlx_setA*( rhoA*(ux*uz) - m15A)
// + (1-0.5*rlx_setA)*(FzA*ux+FxA*uz);
// m16A = m16A + rlx_setB*( - m16A);
// m17A = m17A + rlx_setB*( - m17A);
// m18A = m18A + rlx_setB*( - m18A);
// //.......................................................................................................
//
//
// // ------------------- Fluid Component A -----------------------//
// //.................inverse transformation......................................................
// // q=0
// fq = mrt_V1*rhoA-mrt_V2*m1A+mrt_V3*m2A;
// distA[n] = fq;
//
// // q = 1
// fq = mrt_V1*rhoA-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A);
// distA[1*Np+n] = fq;
//
// // q=2
// fq = mrt_V1*rhoA-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A);
// distA[2*Np+n] = fq;
//
// // q = 3
// fq = mrt_V1*rhoA-mrt_V4*m1A-mrt_V5*m2A+0.1*(jyA-m6A)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A);
// distA[3*Np+n] = fq;
//
// // q = 4
// fq = mrt_V1*rhoA-mrt_V4*m1A-mrt_V5*m2A+0.1*(m6A-jyA)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A);
// distA[4*Np+n] = fq;
//
// // q = 5
// fq = mrt_V1*rhoA-mrt_V4*m1A-mrt_V5*m2A+0.1*(jzA-m8A)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A);
// distA[5*Np+n] = fq;
//
// // q = 6
// fq = mrt_V1*rhoA-mrt_V4*m1A-mrt_V5*m2A+0.1*(m8A-jzA)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A);
// distA[6*Np+n] = fq;
//
// // q = 7
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jxA+jyA)+0.025*(m4A+m6A)+mrt_V7*m9A+mrt_V11*m10A+mrt_V8*m11A+mrt_V12*m12A+0.25*m13A+0.125*(m16A-m17A);
// distA[7*Np+n] = fq;
//
// // q = 8
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A-0.1*(jxA+jyA)-0.025*(m4A+m6A) +mrt_V7*m9A+mrt_V11*m10A+mrt_V8*m11A+mrt_V12*m12A+0.25*m13A+0.125*(m17A-m16A);
// distA[8*Np+n] = fq;
//
// // q = 9
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jxA-jyA)+0.025*(m4A-m6A)+mrt_V7*m9A+mrt_V11*m10A+mrt_V8*m11A+mrt_V12*m12A-0.25*m13A+0.125*(m16A+m17A);
// distA[9*Np+n] = fq;
//
// // q = 10
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jyA-jxA)+0.025*(m6A-m4A)+mrt_V7*m9A+mrt_V11*m10A+mrt_V8*m11A+mrt_V12*m12A-0.25*m13A-0.125*(m16A+m17A);
// distA[10*Np+n] = fq;
//
// // q = 11
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jxA+jzA)+0.025*(m4A+m8A)+mrt_V7*m9A+mrt_V11*m10A-mrt_V8*m11A-mrt_V12*m12A+0.25*m15A+0.125*(m18A-m16A);
// distA[11*Np+n] = fq;
//
// // q = 12
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A-0.1*(jxA+jzA)-0.025*(m4A+m8A)+mrt_V7*m9A+mrt_V11*m10A-mrt_V8*m11A-mrt_V12*m12A+0.25*m15A+0.125*(m16A-m18A);
// distA[12*Np+n] = fq;
//
// // q = 13
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jxA-jzA)+0.025*(m4A-m8A)+mrt_V7*m9A+mrt_V11*m10A-mrt_V8*m11A-mrt_V12*m12A-0.25*m15A-0.125*(m16A+m18A);
// distA[13*Np+n] = fq;
//
// // q= 14
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jzA-jxA)+0.025*(m8A-m4A)+mrt_V7*m9A+mrt_V11*m10A-mrt_V8*m11A-mrt_V12*m12A-0.25*m15A+0.125*(m16A+m18A);
// distA[14*Np+n] = fq;
//
// // q = 15
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jyA+jzA)+0.025*(m6A+m8A)-mrt_V6*m9A-mrt_V7*m10A+0.25*m14A+0.125*(m17A-m18A);
// distA[15*Np+n] = fq;
//
// // q = 16
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A-0.1*(jyA+jzA)-0.025*(m6A+m8A)-mrt_V6*m9A-mrt_V7*m10A+0.25*m14A+0.125*(m18A-m17A);
// distA[16*Np+n] = fq;
//
// // q = 17
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jyA-jzA)+0.025*(m6A-m8A)-mrt_V6*m9A-mrt_V7*m10A-0.25*m14A+0.125*(m17A+m18A);
// distA[17*Np+n] = fq;
//
// // q = 18
// fq = mrt_V1*rhoA+mrt_V9*m1A+mrt_V10*m2A+0.1*(jzA-jyA)+0.025*(m8A-m6A)-mrt_V6*m9A-mrt_V7*m10A-0.25*m14A-0.125*(m17A+m18A);
// distA[18*Np+n] = fq;
// //........................................................................
//
//
// // ------------------- Fluid Component B -----------------------//
// rlx_setA = 1.0/tauB;
// rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA);
// //-------------------- MRT collison where body force has NO higher-order terms -------------//
// //..............carry out relaxation process...............................................
// //TODO need to incoporate porosity
// m1B = m1B + rlx_setA*((19*rhoB*(ux*ux+uy*uy+uz*uz) - 11*rhoB) - m1B)
// + (1-0.5*rlx_setA)*38*(FxB*ux+FyB*uy+FzB*uz);
// m2B = m2B + rlx_setA*((3*rhoB - 5.5*rhoB*(ux*ux+uy*uy+uz*uz))- m2B)
// + (1-0.5*rlx_setA)*11*(-FxB*ux-FyB*uy-FzB*uz);
// jxB = jxB + FxB;
// m4B = m4B + rlx_setB*((-0.6666666666666666*ux*rhoB)- m4B)
// + (1-0.5*rlx_setB)*(-0.6666666666666666*FxB);
// jyB = jyB + FyB;
// m6B = m6B + rlx_setB*((-0.6666666666666666*uy*rhoB)- m6B)
// + (1-0.5*rlx_setB)*(-0.6666666666666666*FyB);
// jzB = jzB + FzB;
// m8B = m8B + rlx_setB*((-0.6666666666666666*uz*rhoB)- m8B)
// + (1-0.5*rlx_setB)*(-0.6666666666666666*FzB);
// m9B = m9B + rlx_setA*((rhoB*(2*ux*ux-uy*uy-uz*uz)) - m9B)
// + (1-0.5*rlx_setA)*(4*FxB*ux-2*FyB*uy-2*FzB*uz);
// //m10B = m10B + rlx_setA*( - m10B)
// // + (1-0.5*rlx_setA)*(-2*FxB*ux+FyB*uy+FzB*uz);
// m10B = m10B + rlx_setA*( -0.5*(rhoB*(2*ux*ux-uy*uy-uz*uz))- m10B)
// + (1-0.5*rlx_setA)*(-2*FxB*ux+FyB*uy+FzB*uz);
// m11B = m11B + rlx_setA*((rhoB*(uy*uy-uz*uz)) - m11B)
// + (1-0.5*rlx_setA)*(2*FyB*uy-2*FzB*uz);
// //m12B = m12B + rlx_setA*( - m12B)
// // + (1-0.5*rlx_setA)*(-FyB*uy+FzB*uz);
// m12B = m12B + rlx_setA*( -0.5*(rhoB*(uy*uy-uz*uz))- m12B)
// + (1-0.5*rlx_setA)*(-FyB*uy+FzB*uz);
// m13B = m13B + rlx_setA*( rhoB*(ux*uy) - m13B)
// + (1-0.5*rlx_setA)*(FyB*ux+FxB*uy);
// m14B = m14B + rlx_setA*( rhoB*(uy*uz) - m14B)
// + (1-0.5*rlx_setA)*(FzB*uy+FyB*uz);
// m15B = m15B + rlx_setA*( rhoB*(ux*uz) - m15B)
// + (1-0.5*rlx_setA)*(FzB*ux+FxB*uz);
// m16B = m16B + rlx_setB*( - m16B);
// m17B = m17B + rlx_setB*( - m17B);
// m18B = m18B + rlx_setB*( - m18B);
// //.......................................................................................................
//
//
// // ------------------- Fluid Component B -----------------------//
// //.................inverse transformation......................................................
// // q=0
// fq = mrt_V1*rhoB-mrt_V2*m1B+mrt_V3*m2B;
// distB[n] = fq;
//
// // q = 1
// fq = mrt_V1*rhoB-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B);
// distB[1*Np+n] = fq;
//
// // q=2
// fq = mrt_V1*rhoB-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B);
// distB[2*Np+n] = fq;
//
// // q = 3
// fq = mrt_V1*rhoB-mrt_V4*m1B-mrt_V5*m2B+0.1*(jyB-m6B)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B);
// distB[3*Np+n] = fq;
//
// // q = 4
// fq = mrt_V1*rhoB-mrt_V4*m1B-mrt_V5*m2B+0.1*(m6B-jyB)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B);
// distB[4*Np+n] = fq;
//
// // q = 5
// fq = mrt_V1*rhoB-mrt_V4*m1B-mrt_V5*m2B+0.1*(jzB-m8B)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B);
// distB[5*Np+n] = fq;
//
// // q = 6
// fq = mrt_V1*rhoB-mrt_V4*m1B-mrt_V5*m2B+0.1*(m8B-jzB)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B);
// distB[6*Np+n] = fq;
//
// // q = 7
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jxB+jyB)+0.025*(m4B+m6B)+mrt_V7*m9B+mrt_V11*m10B+mrt_V8*m11B+mrt_V12*m12B+0.25*m13B+0.125*(m16B-m17B);
// distB[7*Np+n] = fq;
//
// // q = 8
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B-0.1*(jxB+jyB)-0.025*(m4B+m6B) +mrt_V7*m9B+mrt_V11*m10B+mrt_V8*m11B+mrt_V12*m12B+0.25*m13B+0.125*(m17B-m16B);
// distB[8*Np+n] = fq;
//
// // q = 9
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jxB-jyB)+0.025*(m4B-m6B)+mrt_V7*m9B+mrt_V11*m10B+mrt_V8*m11B+mrt_V12*m12B-0.25*m13B+0.125*(m16B+m17B);
// distB[9*Np+n] = fq;
//
// // q = 10
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jyB-jxB)+0.025*(m6B-m4B)+mrt_V7*m9B+mrt_V11*m10B+mrt_V8*m11B+mrt_V12*m12B-0.25*m13B-0.125*(m16B+m17B);
// distB[10*Np+n] = fq;
//
// // q = 11
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jxB+jzB)+0.025*(m4B+m8B)+mrt_V7*m9B+mrt_V11*m10B-mrt_V8*m11B-mrt_V12*m12B+0.25*m15B+0.125*(m18B-m16B);
// distB[11*Np+n] = fq;
//
// // q = 12
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B-0.1*(jxB+jzB)-0.025*(m4B+m8B)+mrt_V7*m9B+mrt_V11*m10B-mrt_V8*m11B-mrt_V12*m12B+0.25*m15B+0.125*(m16B-m18B);
// distB[12*Np+n] = fq;
//
// // q = 13
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jxB-jzB)+0.025*(m4B-m8B)+mrt_V7*m9B+mrt_V11*m10B-mrt_V8*m11B-mrt_V12*m12B-0.25*m15B-0.125*(m16B+m18B);
// distB[13*Np+n] = fq;
//
// // q= 14
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jzB-jxB)+0.025*(m8B-m4B)+mrt_V7*m9B+mrt_V11*m10B-mrt_V8*m11B-mrt_V12*m12B-0.25*m15B+0.125*(m16B+m18B);
// distB[14*Np+n] = fq;
//
// // q = 15
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jyB+jzB)+0.025*(m6B+m8B)-mrt_V6*m9B-mrt_V7*m10B+0.25*m14B+0.125*(m17B-m18B);
// distB[15*Np+n] = fq;
//
// // q = 16
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B-0.1*(jyB+jzB)-0.025*(m6B+m8B)-mrt_V6*m9B-mrt_V7*m10B+0.25*m14B+0.125*(m18B-m17B);
// distB[16*Np+n] = fq;
//
// // q = 17
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jyB-jzB)+0.025*(m6B-m8B)-mrt_V6*m9B-mrt_V7*m10B-0.25*m14B+0.125*(m17B+m18B);
// distB[17*Np+n] = fq;
//
// // q = 18
// fq = mrt_V1*rhoB+mrt_V9*m1B+mrt_V10*m2B+0.1*(jzB-jyB)+0.025*(m8B-m6B)-mrt_V6*m9B-mrt_V7*m10B-0.25*m14B-0.125*(m17B+m18B);
// distB[18*Np+n] = 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] = (nA+nB+Gsc*nA*nB)/3.0;
// }
// }
//}
extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(int *neighborList, int *Map, double *distA, double *distB, double *DenA, double *DenB, double *DenGradA, double *DenGradB,
double *SolidForceA, double *SolidForceB, double *Poros,double *Perm, double *Velocity,double *Pressure,
double tauA,double tauB,double tauA_eff,double tauB_eff, double Gsc, double Gx, double Gy, double Gz,
int start, int finish, int Np){
int n;
int ijk;
int nr1,nr2,nr3,nr4,nr5,nr6,nr7,nr8,nr9,nr10,nr11,nr12,nr13,nr14,nr15,nr16,nr17,nr18;
double vx,vy,vz,v_mag;
double ux_A,uy_A,uz_A,ux_B,uy_B,uz_B,u_mag;
double ux,uy,uz;
double rhoA,rhoB;
double jxA,jyA,jzA;
double jxB,jyB,jzB;
// distribution functions
double f0A,f1A,f2A,f3A,f4A,f5A,f6A,f7A,f8A,f9A,f10A,f11A,f12A,f13A,f14A,f15A,f16A,f17A,f18A;
double f0B,f1B,f2B,f3B,f4B,f5B,f6B,f7B,f8B,f9B,f10B,f11B,f12B,f13B,f14B,f15B,f16B,f17B,f18B;
double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002)
double porosity;
double perm;//voxel permeability
double permA,permB;//effective relative perm
double c0, c1; //Guo's model parameters
double muA_eff = (tauA_eff-0.5)/3.0;//kinematic viscosity
double muB_eff = (tauB_eff-0.5)/3.0;//kinematic viscosity
double FxA, FyA, FzA;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz)
double FxB, FyB, FzB;
double tau,rlx;
double phi;//phase field indicator
double rhoA_gradx,rhoA_grady,rhoA_gradz;
double rhoB_gradx,rhoB_grady,rhoB_gradz;
double GffA_x,GffA_y,GffA_z;
double GfsA_x,GfsA_y,GfsA_z;
double GffB_x,GffB_y,GffB_z;
double GfsB_x,GfsB_y,GfsB_z;
for (n=start; n<finish; n++){
// Load common parameters shared by two fluid components
ijk = Map[n];
rhoA = DenA[ijk];
rhoB = DenB[ijk];
porosity = Poros[n];
perm = Perm[n];
permA = perm*rhoA/(rhoA+rhoB);//effective relative perm
permB = perm*rhoB/(rhoA+rhoB);
rhoA_gradx = DenGradA[n+0*Np];
rhoA_grady = DenGradA[n+1*Np];
rhoA_gradz = DenGradA[n+2*Np];
rhoB_gradx = DenGradB[n+0*Np];
rhoB_grady = DenGradB[n+1*Np];
rhoB_gradz = DenGradB[n+2*Np];
phi = (rhoA-rhoB)/(rhoA+rhoB);
tau = tauA+0.5*(1.0-phi)*(tauB-tauA);
rlx = 1.0/tau;
//........................................................................
// READ THE DISTRIBUTIONS
// (read from opposite array due to previous swap operation)
//........................................................................
// q=0
f0A = distA[n];
f0B = distB[n];
// q=1
nr1 = neighborList[n]; // neighbor 2 ( > 10Np => odd part of dist)
f1A = distA[nr1]; // reading the f1 data into register fq
f1B = distB[nr1]; // reading the f1 data into register fq
nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist)
f2A = distA[nr2]; // reading the f2 data into register fq
f2B = distB[nr2]; // reading the f2 data into register fq
// q=3
nr3 = neighborList[n+2*Np]; // neighbor 4
f3A = distA[nr3];
f3B = distB[nr3];
// q = 4
nr4 = neighborList[n+3*Np]; // neighbor 3
f4A = distA[nr4];
f4B = distB[nr4];
// q=5
nr5 = neighborList[n+4*Np];
f5A = distA[nr5];
f5B = distB[nr5];
// q = 6
nr6 = neighborList[n+5*Np];
f6A = distA[nr6];
f6B = distB[nr6];
// q=7
nr7 = neighborList[n+6*Np];
f7A = distA[nr7];
f7B = distB[nr7];
// q = 8
nr8 = neighborList[n+7*Np];
f8A = distA[nr8];
f8B = distB[nr8];
// q=9
nr9 = neighborList[n+8*Np];
f9A = distA[nr9];
f9B = distB[nr9];
// q = 10
nr10 = neighborList[n+9*Np];
f10A = distA[nr10];
f10B = distB[nr10];
// q=11
nr11 = neighborList[n+10*Np];
f11A = distA[nr11];
f11B = distB[nr11];
// q=12
nr12 = neighborList[n+11*Np];
f12A = distA[nr12];
f12B = distB[nr12];
// q=13
nr13 = neighborList[n+12*Np];
f13A = distA[nr13];
f13B = distB[nr13];
// q=14
nr14 = neighborList[n+13*Np];
f14A = distA[nr14];
f14B = distB[nr14];
// q=15
nr15 = neighborList[n+14*Np];
f15A = distA[nr15];
f15B = distB[nr15];
// q=16
nr16 = neighborList[n+15*Np];
f16A = distA[nr16];
f16B = distB[nr16];
// q=17
//fq = dist[18*Np+n];
nr17 = neighborList[n+16*Np];
f17A = distA[nr17];
f17B = distB[nr17];
// q=18
nr18 = neighborList[n+17*Np];
f18A = distA[nr18];
f18B = distB[nr18];
//---------------------------------------------------------------------//
// Compute SC fluid-fluid interaction force
GffA_x = -Gsc*rhoB_gradx;
GffA_y = -Gsc*rhoB_grady;
GffA_z = -Gsc*rhoB_gradz;
GffB_x = -Gsc*rhoA_gradx;
GffB_y = -Gsc*rhoA_grady;
GffB_z = -Gsc*rhoA_gradz;
// Compute SC fluid-solid force
GfsA_x = SolidForceA[n+0*Np];
GfsA_y = SolidForceA[n+1*Np];
GfsA_z = SolidForceA[n+2*Np];
GfsB_x = SolidForceB[n+0*Np];
GfsB_y = SolidForceB[n+1*Np];
GfsB_z = SolidForceB[n+2*Np];
// Compute greyscale related parameters
// ------------------- Fluid Component A -----------------------//
jxA = f1A-f2A+f7A-f8A+f9A-f10A+f11A-f12A+f13A-f14A;
jyA = f3A-f4A+f7A-f8A-f9A+f10A+f15A-f16A+f17A-f18A;
jzA = f5A-f6A+f11A-f12A-f13A+f14A+f15A-f16A-f17A+f18A;
c0 = 0.5*(1.0+porosity*0.5*muA_eff/permA);
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(permA);
if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes
vx = jxA/rhoA+0.5*(porosity*Gx+GffA_x+GfsA_x);
vy = jyA/rhoA+0.5*(porosity*Gy+GffA_y+GfsA_y);
vz = jzA/rhoA+0.5*(porosity*Gz+GffA_z+GfsA_z);
v_mag=sqrt(vx*vx+vy*vy+vz*vz);
ux_A = vx/(c0+sqrt(c0*c0+c1*v_mag));
uy_A = vy/(c0+sqrt(c0*c0+c1*v_mag));
uz_A = vz/(c0+sqrt(c0*c0+c1*v_mag));
u_mag=sqrt(ux_A*ux_A+uy_A*uy_A+uz_A*uz_A);
//Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium
FxA = rhoA*(-porosity*muA_eff/permA*ux_A - porosity*GeoFun/sqrt(permA)*u_mag*ux_A + porosity*Gx + GffA_x + GfsA_x);
FyA = rhoA*(-porosity*muA_eff/permA*uy_A - porosity*GeoFun/sqrt(permA)*u_mag*uy_A + porosity*Gy + GffA_y + GfsA_y);
FzA = rhoA*(-porosity*muA_eff/permA*uz_A - porosity*GeoFun/sqrt(permA)*u_mag*uz_A + porosity*Gz + GffA_z + GfsA_z);
if (porosity==1.0){
FxA=rhoA*(Gx + GffA_x + GfsA_x);
FyA=rhoA*(Gy + GffA_y + GfsA_y);
FzA=rhoA*(Gz + GffA_z + GfsA_z);
}
// ------------------- Fluid Component B -----------------------//
// Compute greyscale related parameters
jxB = f1B-f2B+f7B-f8B+f9B-f10B+f11B-f12B+f13B-f14B;
jyB = f3B-f4B+f7B-f8B-f9B+f10B+f15B-f16B+f17B-f18B;
jzB = f5B-f6B+f11B-f12B-f13B+f14B+f15B-f16B-f17B+f18B;
c0 = 0.5*(1.0+porosity*0.5*muB_eff/permB);
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(permB);
if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes
vx = jxB/rhoB+0.5*(porosity*Gx+GffB_x+GfsB_x);
vy = jyB/rhoB+0.5*(porosity*Gy+GffB_y+GfsB_y);
vz = jzB/rhoB+0.5*(porosity*Gz+GffB_z+GfsB_z);
v_mag=sqrt(vx*vx+vy*vy+vz*vz);
ux_B = vx/(c0+sqrt(c0*c0+c1*v_mag));
uy_B = vy/(c0+sqrt(c0*c0+c1*v_mag));
uz_B = vz/(c0+sqrt(c0*c0+c1*v_mag));
u_mag=sqrt(ux_B*ux_B+uy_B*uy_B+uz_B*uz_B);
//Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium
FxB = rhoB*(-porosity*muB_eff/permB*ux_B - porosity*GeoFun/sqrt(permB)*u_mag*ux_B + porosity*Gx + GffB_x + GfsB_x);
FyB = rhoB*(-porosity*muB_eff/permB*uy_B - porosity*GeoFun/sqrt(permB)*u_mag*uy_B + porosity*Gy + GffB_y + GfsB_y);
FzB = rhoB*(-porosity*muB_eff/permB*uz_B - porosity*GeoFun/sqrt(permB)*u_mag*uz_B + porosity*Gz + GffB_z + GfsB_z);
if (porosity==1.0){
FxB=rhoB*(Gx + GffB_x + GfsB_x);
FyB=rhoB*(Gy + GffB_y + GfsB_y);
FzB=rhoB*(Gz + GffB_z + GfsB_z);
}
// Calculate barycentric velocity of the fluid mixture
ux = (rhoA*ux_A+rhoB*ux_B)/(rhoA+rhoB);
uy = (rhoA*uy_A+rhoB*uy_B)/(rhoA+rhoB);
uz = (rhoA*uz_A+rhoB*uz_B)/(rhoA+rhoB);
//..............carry out relaxation process...............................................
// ------------------- Fluid Component A -----------------------//
// q=0
distA[n] = f0A*(1.0-rlx) + rlx*0.3333333333333333*rhoA*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+ 0.3333333333333333*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(0. - (3.*uy)/porosity) + FzA*(0. - (3.*uz)/porosity));
// q = 1
distA[nr2] = f1A*(1.0-rlx) + rlx*0.05555555555555555*rhoA*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxA*(3. + (6.*ux)/porosity) + FyA*(0. - (3.*uy)/porosity) + FzA*(0. - (3.*uz)/porosity));
// q=2
distA[nr1] = f2A*(1.0-rlx) + rlx*0.05555555555555555*rhoA*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxA*(-3. + (6.*ux)/porosity) + FyA*(0. - (3.*uy)/porosity) + FzA*(0. - (3.*uz)/porosity));
// q = 3
distA[nr4] = f3A*(1.0-rlx) + rlx*0.05555555555555555*rhoA*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(3. + (6.*uy)/porosity) + FzA*(0. - (3.*uz)/porosity));
// q = 4
distA[nr3] = f4A*(1.0-rlx) + rlx*0.05555555555555555*rhoA*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(-3. + (6.*uy)/porosity) + FzA*(0. - (3.*uz)/porosity));
// q = 5
distA[nr6] = f5A*(1.0-rlx) + rlx*0.05555555555555555*rhoA*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(0. - (3.*uy)/porosity) + FzA*(3. + (6.*uz)/porosity));
// q = 6
distA[nr5] = f6A*(1.0-rlx) + rlx*0.05555555555555555*rhoA*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(0. - (3.*uy)/porosity) + FzA*(-3. + (6.*uz)/porosity));
// q = 7
distA[nr8] = f7A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + FyA*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) +
FzA*(0. - (3.*uz)/porosity));
// q = 8
distA[nr7] = f8A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + FyA*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) +
FzA*(0. - (3.*uz)/porosity));
// q = 9
distA[nr10] = f9A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + FyA*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) +
FzA*(0. - (3.*uz)/porosity));
// q = 10
distA[nr9] = f10A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + FyA*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) +
FzA*(0. - (3.*uz)/porosity));
// q = 11
distA[nr12] = f11A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyA*(0. - (3.*uy)/porosity) + FxA*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) +
FzA*(3. - (3.*uz)/porosity + (9.*(ux + uz))/porosity));
// q = 12
distA[nr11] = f12A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyA*(0. - (3.*uy)/porosity) + FxA*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) +
FzA*(-3. - (9.*(-ux - uz))/porosity - (3.*uz)/porosity));
// q = 13
distA[nr14] = f13A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyA*(0. - (3.*uy)/porosity) + FxA*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) +
FzA*(-3. - (9.*(ux - uz))/porosity - (3.*uz)/porosity));
// q= 14
distA[nr13] = f14A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyA*(0. - (3.*uy)/porosity) + FxA*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) +
FzA*(3. - (3.*uz)/porosity + (9.*(-ux + uz))/porosity));
// q = 15
distA[nr16] = f15A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) +
FzA*(3. - (3.*uz)/porosity + (9.*(uy + uz))/porosity));
// q = 16
distA[nr15] = f16A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) +
FzA*(-3. - (9.*(-uy - uz))/porosity - (3.*uz)/porosity));
// q = 17
distA[nr18] = f17A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) +
FzA*(-3. - (9.*(uy - uz))/porosity - (3.*uz)/porosity));
// q = 18
distA[nr17] = f18A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) +
FzA*(3. - (3.*uz)/porosity + (9.*(-uy + uz))/porosity));
// ------------------- Fluid Component B -----------------------//
// q=0
distB[n] = f0B*(1.0-rlx) + rlx*0.3333333333333333*rhoB*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+ 0.3333333333333333*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(0. - (3.*uy)/porosity) + FzB*(0. - (3.*uz)/porosity));
// q = 1
distB[nr2] = f1B*(1.0-rlx) + rlx*0.05555555555555555*rhoB*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxB*(3. + (6.*ux)/porosity) + FyB*(0. - (3.*uy)/porosity) + FzB*(0. - (3.*uz)/porosity));
// q=2
distB[nr1] = f2B*(1.0-rlx) + rlx*0.05555555555555555*rhoB*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxB*(-3. + (6.*ux)/porosity) + FyB*(0. - (3.*uy)/porosity) + FzB*(0. - (3.*uz)/porosity));
// q = 3
distB[nr4] = f3B*(1.0-rlx) + rlx*0.05555555555555555*rhoB*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(3. + (6.*uy)/porosity) + FzB*(0. - (3.*uz)/porosity));
// q = 4
distB[nr3] = f4B*(1.0-rlx) + rlx*0.05555555555555555*rhoB*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(-3. + (6.*uy)/porosity) + FzB*(0. - (3.*uz)/porosity));
// q = 5
distB[nr6] = f5B*(1.0-rlx) + rlx*0.05555555555555555*rhoB*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(0. - (3.*uy)/porosity) + FzB*(3. + (6.*uz)/porosity));
// q = 6
distB[nr5] = f6B*(1.0-rlx) + rlx*0.05555555555555555*rhoB*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(0. - (3.*uy)/porosity) + FzB*(-3. + (6.*uz)/porosity));
// q = 7
distB[nr8] = f7B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + FyB*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) +
FzB*(0. - (3.*uz)/porosity));
// q = 8
distB[nr7] = f8B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + FyB*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) +
FzB*(0. - (3.*uz)/porosity));
// q = 9
distB[nr10] = f9B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + FyB*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) +
FzB*(0. - (3.*uz)/porosity));
// q = 10
distB[nr9] = f10B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + FyB*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) +
FzB*(0. - (3.*uz)/porosity));
// q = 11
distB[nr12] = f11B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyB*(0. - (3.*uy)/porosity) + FxB*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) +
FzB*(3. - (3.*uz)/porosity + (9.*(ux + uz))/porosity));
// q = 12
distB[nr11] = f12B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyB*(0. - (3.*uy)/porosity) + FxB*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) +
FzB*(-3. - (9.*(-ux - uz))/porosity - (3.*uz)/porosity));
// q = 13
distB[nr14] = f13B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyB*(0. - (3.*uy)/porosity) + FxB*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) +
FzB*(-3. - (9.*(ux - uz))/porosity - (3.*uz)/porosity));
// q= 14
distB[nr13] = f14B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyB*(0. - (3.*uy)/porosity) + FxB*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) +
FzB*(3. - (3.*uz)/porosity + (9.*(-ux + uz))/porosity));
// q = 15
distB[nr16] = f15B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) +
FzB*(3. - (3.*uz)/porosity + (9.*(uy + uz))/porosity));
// q = 16
distB[nr15] = f16B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) +
FzB*(-3. - (9.*(-uy - uz))/porosity - (3.*uz)/porosity));
// q = 17
distB[nr18] = f17B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) +
FzB*(-3. - (9.*(uy - uz))/porosity - (3.*uz)/porosity));
// q = 18
distB[nr17] = f18B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) +
FzB*(3. - (3.*uz)/porosity + (9.*(-uy + uz))/porosity));
//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] = (rhoA+rhoB+Gsc*rhoA*rhoB)/3.0;
}
}
extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(int *Map,double *distA, double *distB, double *DenA, double *DenB, double *DenGradA, double *DenGradB,
double *SolidForceA, double *SolidForceB, double *Poros,double *Perm, double *Velocity,double *Pressure,
double tauA,double tauB,double tauA_eff,double tauB_eff, double Gsc, double Gx, double Gy, double Gz,
int start, int finish, int Np){
int n;
int ijk;
double vx,vy,vz,v_mag;
double ux_A,uy_A,uz_A,ux_B,uy_B,uz_B,u_mag;
double ux,uy,uz;
double rhoA,rhoB;
double jxA,jyA,jzA;
double jxB,jyB,jzB;
// distribution functions
double f0A,f1A,f2A,f3A,f4A,f5A,f6A,f7A,f8A,f9A,f10A,f11A,f12A,f13A,f14A,f15A,f16A,f17A,f18A;
double f0B,f1B,f2B,f3B,f4B,f5B,f6B,f7B,f8B,f9B,f10B,f11B,f12B,f13B,f14B,f15B,f16B,f17B,f18B;
double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002)
double porosity;
double perm;//voxel permeability
double permA,permB;//effective relative perm
double c0, c1; //Guo's model parameters
double muA_eff = (tauA_eff-0.5)/3.0;//kinematic viscosity
double muB_eff = (tauB_eff-0.5)/3.0;//kinematic viscosity
double FxA, FyA, FzA;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz)
double FxB, FyB, FzB;
double tau,rlx;
double phi;//phase field indicator
double rhoA_gradx,rhoA_grady,rhoA_gradz;
double rhoB_gradx,rhoB_grady,rhoB_gradz;
double GffA_x,GffA_y,GffA_z;
double GfsA_x,GfsA_y,GfsA_z;
double GffB_x,GffB_y,GffB_z;
double GfsB_x,GfsB_y,GfsB_z;
for (n=start; n<finish; n++){
// Load common parameters shared by two fluid components
ijk = Map[n];
rhoA = DenA[ijk];
rhoB = DenB[ijk];
porosity = Poros[n];
perm = Perm[n];
permA = perm*rhoA/(rhoA+rhoB);//effective relative perm
permB = perm*rhoB/(rhoA+rhoB);
rhoA_gradx = DenGradA[n+0*Np];
rhoA_grady = DenGradA[n+1*Np];
rhoA_gradz = DenGradA[n+2*Np];
rhoB_gradx = DenGradB[n+0*Np];
rhoB_grady = DenGradB[n+1*Np];
rhoB_gradz = DenGradB[n+2*Np];
phi = (rhoA-rhoB)/(rhoA+rhoB);
tau = tauA+0.5*(1.0-phi)*(tauB-tauA);
rlx = 1.0/tau;
//........................................................................
// READ THE DISTRIBUTIONS
// (read from opposite array due to previous swap operation)
//........................................................................
// fluid component A
f0A = distA[n];
f1A = distA[2*Np+n];
f2A = distA[1*Np+n];
f3A = distA[4*Np+n];
f4A = distA[3*Np+n];
f5A = distA[6*Np+n];
f6A = distA[5*Np+n];
f7A = distA[8*Np+n];
f8A = distA[7*Np+n];
f9A = distA[10*Np+n];
f10A = distA[9*Np+n];
f11A = distA[12*Np+n];
f12A = distA[11*Np+n];
f13A = distA[14*Np+n];
f14A = distA[13*Np+n];
f15A = distA[16*Np+n];
f16A = distA[15*Np+n];
f17A = distA[18*Np+n];
f18A = distA[17*Np+n];
// fluid component B
f0B = distB[n];
f1B = distB[2*Np+n];
f2B = distB[1*Np+n];
f3B = distB[4*Np+n];
f4B = distB[3*Np+n];
f5B = distB[6*Np+n];
f6B = distB[5*Np+n];
f7B = distB[8*Np+n];
f8B = distB[7*Np+n];
f9B = distB[10*Np+n];
f10B = distB[9*Np+n];
f11B = distB[12*Np+n];
f12B = distB[11*Np+n];
f13B = distB[14*Np+n];
f14B = distB[13*Np+n];
f15B = distB[16*Np+n];
f16B = distB[15*Np+n];
f17B = distB[18*Np+n];
f18B = distB[17*Np+n];
//---------------------------------------------------------------------//
// Compute SC fluid-fluid interaction force
GffA_x = -Gsc*rhoB_gradx;
GffA_y = -Gsc*rhoB_grady;
GffA_z = -Gsc*rhoB_gradz;
GffB_x = -Gsc*rhoA_gradx;
GffB_y = -Gsc*rhoA_grady;
GffB_z = -Gsc*rhoA_gradz;
// Compute SC fluid-solid force
GfsA_x = SolidForceA[n+0*Np];
GfsA_y = SolidForceA[n+1*Np];
GfsA_z = SolidForceA[n+2*Np];
GfsB_x = SolidForceB[n+0*Np];
GfsB_y = SolidForceB[n+1*Np];
GfsB_z = SolidForceB[n+2*Np];
// Compute greyscale related parameters
// ------------------- Fluid Component A -----------------------//
jxA = f1A-f2A+f7A-f8A+f9A-f10A+f11A-f12A+f13A-f14A;
jyA = f3A-f4A+f7A-f8A-f9A+f10A+f15A-f16A+f17A-f18A;
jzA = f5A-f6A+f11A-f12A-f13A+f14A+f15A-f16A-f17A+f18A;
c0 = 0.5*(1.0+porosity*0.5*muA_eff/permA);
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(permA);
if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes
vx = jxA/rhoA+0.5*(porosity*Gx+GffA_x+GfsA_x);
vy = jyA/rhoA+0.5*(porosity*Gy+GffA_y+GfsA_y);
vz = jzA/rhoA+0.5*(porosity*Gz+GffA_z+GfsA_z);
v_mag=sqrt(vx*vx+vy*vy+vz*vz);
ux_A = vx/(c0+sqrt(c0*c0+c1*v_mag));
uy_A = vy/(c0+sqrt(c0*c0+c1*v_mag));
uz_A = vz/(c0+sqrt(c0*c0+c1*v_mag));
u_mag=sqrt(ux_A*ux_A+uy_A*uy_A+uz_A*uz_A);
//Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium
FxA = rhoA*(-porosity*muA_eff/permA*ux_A - porosity*GeoFun/sqrt(permA)*u_mag*ux_A + porosity*Gx + GffA_x + GfsA_x);
FyA = rhoA*(-porosity*muA_eff/permA*uy_A - porosity*GeoFun/sqrt(permA)*u_mag*uy_A + porosity*Gy + GffA_y + GfsA_y);
FzA = rhoA*(-porosity*muA_eff/permA*uz_A - porosity*GeoFun/sqrt(permA)*u_mag*uz_A + porosity*Gz + GffA_z + GfsA_z);
if (porosity==1.0){
FxA=rhoA*(Gx + GffA_x + GfsA_x);
FyA=rhoA*(Gy + GffA_y + GfsA_y);
FzA=rhoA*(Gz + GffA_z + GfsA_z);
}
// ------------------- Fluid Component B -----------------------//
// Compute greyscale related parameters
jxB = f1B-f2B+f7B-f8B+f9B-f10B+f11B-f12B+f13B-f14B;
jyB = f3B-f4B+f7B-f8B-f9B+f10B+f15B-f16B+f17B-f18B;
jzB = f5B-f6B+f11B-f12B-f13B+f14B+f15B-f16B-f17B+f18B;
c0 = 0.5*(1.0+porosity*0.5*muB_eff/permB);
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(permB);
if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes
vx = jxB/rhoB+0.5*(porosity*Gx+GffB_x+GfsB_x);
vy = jyB/rhoB+0.5*(porosity*Gy+GffB_y+GfsB_y);
vz = jzB/rhoB+0.5*(porosity*Gz+GffB_z+GfsB_z);
v_mag=sqrt(vx*vx+vy*vy+vz*vz);
ux_B = vx/(c0+sqrt(c0*c0+c1*v_mag));
uy_B = vy/(c0+sqrt(c0*c0+c1*v_mag));
uz_B = vz/(c0+sqrt(c0*c0+c1*v_mag));
u_mag=sqrt(ux_B*ux_B+uy_B*uy_B+uz_B*uz_B);
//Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium
FxB = rhoB*(-porosity*muB_eff/permB*ux_B - porosity*GeoFun/sqrt(permB)*u_mag*ux_B + porosity*Gx + GffB_x + GfsB_x);
FyB = rhoB*(-porosity*muB_eff/permB*uy_B - porosity*GeoFun/sqrt(permB)*u_mag*uy_B + porosity*Gy + GffB_y + GfsB_y);
FzB = rhoB*(-porosity*muB_eff/permB*uz_B - porosity*GeoFun/sqrt(permB)*u_mag*uz_B + porosity*Gz + GffB_z + GfsB_z);
if (porosity==1.0){
FxB=rhoB*(Gx + GffB_x + GfsB_x);
FyB=rhoB*(Gy + GffB_y + GfsB_y);
FzB=rhoB*(Gz + GffB_z + GfsB_z);
}
// Calculate barycentric velocity of the fluid mixture
ux = (rhoA*ux_A+rhoB*ux_B)/(rhoA+rhoB);
uy = (rhoA*uy_A+rhoB*uy_B)/(rhoA+rhoB);
uz = (rhoA*uz_A+rhoB*uz_B)/(rhoA+rhoB);
//..............carry out relaxation process...............................................
// ------------------- Fluid Component A -----------------------//
// q=0
distA[n] = f0A*(1.0-rlx) + rlx*0.3333333333333333*rhoA*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+ 0.3333333333333333*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(0. - (3.*uy)/porosity) + FzA*(0. - (3.*uz)/porosity));
// q = 1
distA[1*Np+n] = f1A*(1.0-rlx) + rlx*0.05555555555555555*rhoA*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxA*(3. + (6.*ux)/porosity) + FyA*(0. - (3.*uy)/porosity) + FzA*(0. - (3.*uz)/porosity));
// q=2
distA[2*Np+n] = f2A*(1.0-rlx) + rlx*0.05555555555555555*rhoA*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxA*(-3. + (6.*ux)/porosity) + FyA*(0. - (3.*uy)/porosity) + FzA*(0. - (3.*uz)/porosity));
// q = 3
distA[3*Np+n] = f3A*(1.0-rlx) + rlx*0.05555555555555555*rhoA*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(3. + (6.*uy)/porosity) + FzA*(0. - (3.*uz)/porosity));
// q = 4
distA[4*Np+n] = f4A*(1.0-rlx) + rlx*0.05555555555555555*rhoA*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(-3. + (6.*uy)/porosity) + FzA*(0. - (3.*uz)/porosity));
// q = 5
distA[5*Np+n] = f5A*(1.0-rlx) + rlx*0.05555555555555555*rhoA*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(0. - (3.*uy)/porosity) + FzA*(3. + (6.*uz)/porosity));
// q = 6
distA[6*Np+n] = f6A*(1.0-rlx) + rlx*0.05555555555555555*rhoA*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(0. - (3.*uy)/porosity) + FzA*(-3. + (6.*uz)/porosity));
// q = 7
distA[7*Np+n] = f7A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + FyA*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) +
FzA*(0. - (3.*uz)/porosity));
// q = 8
distA[8*Np+n] = f8A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + FyA*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) +
FzA*(0. - (3.*uz)/porosity));
// q = 9
distA[9*Np+n] = f9A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + FyA*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) +
FzA*(0. - (3.*uz)/porosity));
// q = 10
distA[10*Np+n] = f10A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + FyA*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) +
FzA*(0. - (3.*uz)/porosity));
// q = 11
distA[11*Np+n] = f11A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyA*(0. - (3.*uy)/porosity) + FxA*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) +
FzA*(3. - (3.*uz)/porosity + (9.*(ux + uz))/porosity));
// q = 12
distA[12*Np+n] = f12A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyA*(0. - (3.*uy)/porosity) + FxA*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) +
FzA*(-3. - (9.*(-ux - uz))/porosity - (3.*uz)/porosity));
// q = 13
distA[13*Np+n] = f13A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyA*(0. - (3.*uy)/porosity) + FxA*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) +
FzA*(-3. - (9.*(ux - uz))/porosity - (3.*uz)/porosity));
// q= 14
distA[14*Np+n] = f14A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyA*(0. - (3.*uy)/porosity) + FxA*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) +
FzA*(3. - (3.*uz)/porosity + (9.*(-ux + uz))/porosity));
// q = 15
distA[15*Np+n] = f15A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) +
FzA*(3. - (3.*uz)/porosity + (9.*(uy + uz))/porosity));
// q = 16
distA[16*Np+n] = f16A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) +
FzA*(-3. - (9.*(-uy - uz))/porosity - (3.*uz)/porosity));
// q = 17
distA[17*Np+n] = f17A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) +
FzA*(-3. - (9.*(uy - uz))/porosity - (3.*uz)/porosity));
// q = 18
distA[18*Np+n] = f18A*(1.0-rlx) + rlx*0.027777777777777776*rhoA*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxA*(0. - (3.*ux)/porosity) + FyA*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) +
FzA*(3. - (3.*uz)/porosity + (9.*(-uy + uz))/porosity));
// ------------------- Fluid Component B -----------------------//
// q=0
distB[n] = f0B*(1.0-rlx) + rlx*0.3333333333333333*rhoB*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+ 0.3333333333333333*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(0. - (3.*uy)/porosity) + FzB*(0. - (3.*uz)/porosity));
// q = 1
distB[1*Np+n] = f1B*(1.0-rlx) + rlx*0.05555555555555555*rhoB*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxB*(3. + (6.*ux)/porosity) + FyB*(0. - (3.*uy)/porosity) + FzB*(0. - (3.*uz)/porosity));
// q=2
distB[2*Np+n] = f2B*(1.0-rlx) + rlx*0.05555555555555555*rhoB*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxB*(-3. + (6.*ux)/porosity) + FyB*(0. - (3.*uy)/porosity) + FzB*(0. - (3.*uz)/porosity));
// q = 3
distB[3*Np+n] = f3B*(1.0-rlx) + rlx*0.05555555555555555*rhoB*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(3. + (6.*uy)/porosity) + FzB*(0. - (3.*uz)/porosity));
// q = 4
distB[4*Np+n] = f4B*(1.0-rlx) + rlx*0.05555555555555555*rhoB*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(-3. + (6.*uy)/porosity) + FzB*(0. - (3.*uz)/porosity));
// q = 5
distB[5*Np+n] = f5B*(1.0-rlx) + rlx*0.05555555555555555*rhoB*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(0. - (3.*uy)/porosity) + FzB*(3. + (6.*uz)/porosity));
// q = 6
distB[6*Np+n] = f6B*(1.0-rlx) + rlx*0.05555555555555555*rhoB*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity)
+0.05555555555555555*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(0. - (3.*uy)/porosity) + FzB*(-3. + (6.*uz)/porosity));
// q = 7
distB[7*Np+n] = f7B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + FyB*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) +
FzB*(0. - (3.*uz)/porosity));
// q = 8
distB[8*Np+n] = f8B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + FyB*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) +
FzB*(0. - (3.*uz)/porosity));
// q = 9
distB[9*Np+n] = f9B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + FyB*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) +
FzB*(0. - (3.*uz)/porosity));
// q = 10
distB[10*Np+n] = f10B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + FyB*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) +
FzB*(0. - (3.*uz)/porosity));
// q = 11
distB[11*Np+n] = f11B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyB*(0. - (3.*uy)/porosity) + FxB*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) +
FzB*(3. - (3.*uz)/porosity + (9.*(ux + uz))/porosity));
// q = 12
distB[12*Np+n] = f12B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyB*(0. - (3.*uy)/porosity) + FxB*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) +
FzB*(-3. - (9.*(-ux - uz))/porosity - (3.*uz)/porosity));
// q = 13
distB[13*Np+n] = f13B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyB*(0. - (3.*uy)/porosity) + FxB*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) +
FzB*(-3. - (9.*(ux - uz))/porosity - (3.*uz)/porosity));
// q= 14
distB[14*Np+n] = f14B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FyB*(0. - (3.*uy)/porosity) + FxB*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) +
FzB*(3. - (3.*uz)/porosity + (9.*(-ux + uz))/porosity));
// q = 15
distB[15*Np+n] = f15B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) +
FzB*(3. - (3.*uz)/porosity + (9.*(uy + uz))/porosity));
// q = 16
distB[16*Np+n] = f16B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) +
FzB*(-3. - (9.*(-uy - uz))/porosity - (3.*uz)/porosity));
// q = 17
distB[17*Np+n] = f17B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) +
FzB*(-3. - (9.*(uy - uz))/porosity - (3.*uz)/porosity));
// q = 18
distB[18*Np+n] = f18B*(1.0-rlx) + rlx*0.027777777777777776*rhoB*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity)
+0.027777777777777776*(1. - 0.5*rlx)*(FxB*(0. - (3.*ux)/porosity) + FyB*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) +
FzB*(3. - (3.*uz)/porosity + (9.*(-uy + uz))/porosity));
//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] = (rhoA+rhoB+Gsc*rhoA*rhoB)/3.0;
}
}
extern "C" void ScaLBL_D3Q19_GreyscaleSC_Init(int *Map, double *distA,double *distB, double *DenA, double *DenB, int Np){
int n;
int ijk;
for (n=0; n<Np; n++){
ijk = Map[n];
distA[0*Np+n] = DenA[ijk]*0.3333333333333333;
distA[1*Np+n] = DenA[ijk]*0.055555555555555555; //double(100*n)+1.f;
distA[2*Np+n] = DenA[ijk]*0.055555555555555555; //double(100*n)+2.f;
distA[3*Np+n] = DenA[ijk]*0.055555555555555555; //double(100*n)+3.f;
distA[4*Np+n] = DenA[ijk]*0.055555555555555555; //double(100*n)+4.f;
distA[5*Np+n] = DenA[ijk]*0.055555555555555555; //double(100*n)+5.f;
distA[6*Np+n] = DenA[ijk]*0.055555555555555555; //double(100*n)+6.f;
distA[7*Np+n] = DenA[ijk]*0.0277777777777778; //double(100*n)+7.f;
distA[8*Np+n] = DenA[ijk]*0.0277777777777778; //double(100*n)+8.f;
distA[9*Np+n] = DenA[ijk]*0.0277777777777778; //double(100*n)+9.f;
distA[10*Np+n] = DenA[ijk]*0.0277777777777778; //double(100*n)+10.f;
distA[11*Np+n] = DenA[ijk]*0.0277777777777778; //double(100*n)+11.f;
distA[12*Np+n] = DenA[ijk]*0.0277777777777778; //double(100*n)+12.f;
distA[13*Np+n] = DenA[ijk]*0.0277777777777778; //double(100*n)+13.f;
distA[14*Np+n] = DenA[ijk]*0.0277777777777778; //double(100*n)+14.f;
distA[15*Np+n] = DenA[ijk]*0.0277777777777778; //double(100*n)+15.f;
distA[16*Np+n] = DenA[ijk]*0.0277777777777778; //double(100*n)+16.f;
distA[17*Np+n] = DenA[ijk]*0.0277777777777778; //double(100*n)+17.f;
distA[18*Np+n] = DenA[ijk]*0.0277777777777778; //double(100*n)+18.f;
distB[0*Np+n] = DenB[ijk]*0.3333333333333333;
distB[1*Np+n] = DenB[ijk]*0.055555555555555555; //double(100*n)+1.f;
distB[2*Np+n] = DenB[ijk]*0.055555555555555555; //double(100*n)+2.f;
distB[3*Np+n] = DenB[ijk]*0.055555555555555555; //double(100*n)+3.f;
distB[4*Np+n] = DenB[ijk]*0.055555555555555555; //double(100*n)+4.f;
distB[5*Np+n] = DenB[ijk]*0.055555555555555555; //double(100*n)+5.f;
distB[6*Np+n] = DenB[ijk]*0.055555555555555555; //double(100*n)+6.f;
distB[7*Np+n] = DenB[ijk]*0.0277777777777778; //double(100*n)+7.f;
distB[8*Np+n] = DenB[ijk]*0.0277777777777778; //double(100*n)+8.f;
distB[9*Np+n] = DenB[ijk]*0.0277777777777778; //double(100*n)+9.f;
distB[10*Np+n] = DenB[ijk]*0.0277777777777778; //double(100*n)+10.f;
distB[11*Np+n] = DenB[ijk]*0.0277777777777778; //double(100*n)+11.f;
distB[12*Np+n] = DenB[ijk]*0.0277777777777778; //double(100*n)+12.f;
distB[13*Np+n] = DenB[ijk]*0.0277777777777778; //double(100*n)+13.f;
distB[14*Np+n] = DenB[ijk]*0.0277777777777778; //double(100*n)+14.f;
distB[15*Np+n] = DenB[ijk]*0.0277777777777778; //double(100*n)+15.f;
distB[16*Np+n] = DenB[ijk]*0.0277777777777778; //double(100*n)+16.f;
distB[17*Np+n] = DenB[ijk]*0.0277777777777778; //double(100*n)+17.f;
distB[18*Np+n] = DenB[ijk]*0.0277777777777778; //double(100*n)+18.f;
}
}
extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(int *neighborList, int *Map, double *distA, double *distB, double *DenA, double *DenB, int start, int finish, int Np){
int n,nread;
double fq,nA,nB;
int idx;
for (n=start; n<finish; n++){
//..........Compute the number density for each component ............
// q=0
fq = distA[n];
nA = fq;
fq = distB[n];
nB = fq;
// q=1
nread = neighborList[n];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=2
nread = neighborList[n+Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=3
nread = neighborList[n+2*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=4
nread = neighborList[n+3*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=5
nread = neighborList[n+4*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=6
nread = neighborList[n+5*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=7
nread = neighborList[n+6*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=8
nread = neighborList[n+7*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=9
nread = neighborList[n+8*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=10
nread = neighborList[n+9*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=11
nread = neighborList[n+10*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=12
nread = neighborList[n+11*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=13
nread = neighborList[n+12*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=14
nread = neighborList[n+13*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=15
nread = neighborList[n+14*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=16
nread = neighborList[n+15*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=17
nread = neighborList[n+16*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// q=18
nread = neighborList[n+17*Np];
fq = distA[nread];
nA += fq;
fq = distB[nread];
nB += fq;
// save the number densities
idx = Map[n];
DenA[idx] = nA;
DenB[idx] = nB;
}
}
extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(int *Map, double *distA, double *distB, double *DenA, double *DenB, int start, int finish, int Np){
int n,nread;
double fq,nA,nB;
int idx;
for (n=start; n<finish; n++){
//..........Compute the number density for each component ............
// q=0
fq = distA[n];
nA = fq;
fq = distB[n];
nB = fq;
// q=1
fq = distA[2*Np+n];
nA += fq;
fq = distB[2*Np+n];
nB += fq;
// q=2
fq = distA[1*Np+n];
nA += fq;
fq = distB[1*Np+n];
nB += fq;
// q=3
fq = distA[4*Np+n];
nA += fq;
fq = distB[4*Np+n];
nB += fq;
// q = 4
fq = distA[3*Np+n];
nA += fq;
fq = distB[3*Np+n];
nB += fq;
// q=5
fq = distA[6*Np+n];
nA += fq;
fq = distB[6*Np+n];
nB += fq;
// q = 6
fq = distA[5*Np+n];
nA += fq;
fq = distB[5*Np+n];
nB += fq;
// q=7
fq = distA[8*Np+n];
nA += fq;
fq = distB[8*Np+n];
nB += fq;
// q = 8
fq = distA[7*Np+n];
nA += fq;
fq = distB[7*Np+n];
nB += fq;
// q=9
fq = distA[10*Np+n];
nA += fq;
fq = distB[10*Np+n];
nB += fq;
// q = 10
fq = distA[9*Np+n];
nA += fq;
fq = distB[9*Np+n];
nB += fq;
// q=11
fq = distA[12*Np+n];
nA += fq;
fq = distB[12*Np+n];
nB += fq;
// q=12
fq = distA[11*Np+n];
nA += fq;
fq = distB[11*Np+n];
nB += fq;
// q=13
fq = distA[14*Np+n];
nA += fq;
fq = distB[14*Np+n];
nB += fq;
// q=14
fq = distA[13*Np+n];
nA += fq;
fq = distB[13*Np+n];
nB += fq;
// q=15
fq = distA[16*Np+n];
nA += fq;
fq = distB[16*Np+n];
nB += fq;
// q=16
fq = distA[15*Np+n];
nA += fq;
fq = distB[15*Np+n];
nB += fq;
// q=17
fq = distA[18*Np+n];
nA += fq;
fq = distB[18*Np+n];
nB += fq;
// q=18
fq = distA[17*Np+n];
nA += fq;
fq = distB[17*Np+n];
nB += fq;
// save the number densities
idx = Map[n];
DenA[idx] = nA;
DenB[idx] = nB;
}
}
extern "C" void ScaLBL_D3Q19_GreyscaleSC_Gradient(int *neighborList, int *Map, double *Den, double *DenGrad, int strideY, int strideZ,int start, int finish, int Np){
int n,nn;
int ijk;
// distributions
double m1,m2,m3,m4,m5,m6,m7,m8,m9;
double m10,m11,m12,m13,m14,m15,m16,m17,m18;
double nx,ny,nz;
for (n=start; n<finish; n++){
// Get the 1D index based on regular data layout
ijk = Map[n];
// COMPUTE THE COLOR GRADIENT
//........................................................................
//.................Read Phase Indicator Values............................
//........................................................................
nn = ijk-1; // neighbor index (get convention)
m1 = Den[nn]; // get neighbor for phi - 1
//........................................................................
nn = ijk+1; // neighbor index (get convention)
m2 = Den[nn]; // get neighbor for phi - 2
//........................................................................
nn = ijk-strideY; // neighbor index (get convention)
m3 = Den[nn]; // get neighbor for phi - 3
//........................................................................
nn = ijk+strideY; // neighbor index (get convention)
m4 = Den[nn]; // get neighbor for phi - 4
//........................................................................
nn = ijk-strideZ; // neighbor index (get convention)
m5 = Den[nn]; // get neighbor for phi - 5
//........................................................................
nn = ijk+strideZ; // neighbor index (get convention)
m6 = Den[nn]; // get neighbor for phi - 6
//........................................................................
nn = ijk-strideY-1; // neighbor index (get convention)
m7 = Den[nn]; // get neighbor for phi - 7
//........................................................................
nn = ijk+strideY+1; // neighbor index (get convention)
m8 = Den[nn]; // get neighbor for phi - 8
//........................................................................
nn = ijk+strideY-1; // neighbor index (get convention)
m9 = Den[nn]; // get neighbor for phi - 9
//........................................................................
nn = ijk-strideY+1; // neighbor index (get convention)
m10 = Den[nn]; // get neighbor for phi - 10
//........................................................................
nn = ijk-strideZ-1; // neighbor index (get convention)
m11 = Den[nn]; // get neighbor for phi - 11
//........................................................................
nn = ijk+strideZ+1; // neighbor index (get convention)
m12 = Den[nn]; // get neighbor for phi - 12
//........................................................................
nn = ijk+strideZ-1; // neighbor index (get convention)
m13 = Den[nn]; // get neighbor for phi - 13
//........................................................................
nn = ijk-strideZ+1; // neighbor index (get convention)
m14 = Den[nn]; // get neighbor for phi - 14
//........................................................................
nn = ijk-strideZ-strideY; // neighbor index (get convention)
m15 = Den[nn]; // get neighbor for phi - 15
//........................................................................
nn = ijk+strideZ+strideY; // neighbor index (get convention)
m16 = Den[nn]; // get neighbor for phi - 16
//........................................................................
nn = ijk+strideZ-strideY; // neighbor index (get convention)
m17 = Den[nn]; // get neighbor for phi - 17
//........................................................................
nn = ijk-strideZ+strideY; // neighbor index (get convention)
m18 = Den[nn]; // get neighbor for phi - 18
//............Compute the Color Gradient...................................
nx = -1.f/18.f*(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14));
ny = -1.f/18.f*(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18));
nz = -1.f/18.f*(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18));
DenGrad[n] = nx;
DenGrad[Np+n] = ny;
DenGrad[2*Np+n] = nz;
}
}
extern "C" void ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count){
int idx,n,nm;
// Fill the outlet with component b
for (idx=0; idx<count; idx++){
n = list[idx];
nm = Map[n];
DenA[nm] = vA;
DenB[nm] = vB;
}
}
extern "C" void ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count){
int idx,n,nm;
// Fill the outlet with component b
for (idx=0; idx<count; idx++){
n = list[idx];
nm = Map[n];
DenA[nm] = vA;
DenB[nm] = vB;
}
}
extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z(int *list, double *distA, double *distB, double dinA, double dinB, int count, int Np){
int idx, n;
// distributions
double f0A,f1A,f2A,f3A,f4A,f5A,f6A,f7A,f8A,f9A;
double f10A,f11A,f12A,f13A,f14A,f15A,f16A,f17A,f18A;
double f0B,f1B,f2B,f3B,f4B,f5B,f6B,f7B,f8B,f9B;
double f10B,f11B,f12B,f13B,f14B,f15B,f16B,f17B,f18B;
double uxA,uyA,uzA,CyzA,CxzA;
double uxB,uyB,uzB,CyzB,CxzB;
uxA = uyA = 0.0;
uxB = uyB = 0.0;
for (idx=0; idx<count; idx++){
n = list[idx];
//........................................................................
// Read distributions
//........................................................................
f0A = distA[n];
f1A = distA[2*Np+n];
f2A = distA[1*Np+n];
f3A = distA[4*Np+n];
f4A = distA[3*Np+n];
f6A = distA[5*Np+n];
f7A = distA[8*Np+n];
f8A = distA[7*Np+n];
f9A = distA[10*Np+n];
f10A = distA[9*Np+n];
f12A = distA[11*Np+n];
f13A = distA[14*Np+n];
f16A = distA[15*Np+n];
f17A = distA[18*Np+n];
f0B = distB[n];
f1B = distB[2*Np+n];
f2B = distB[1*Np+n];
f3B = distB[4*Np+n];
f4B = distB[3*Np+n];
f6B = distB[5*Np+n];
f7B = distB[8*Np+n];
f8B = distB[7*Np+n];
f9B = distB[10*Np+n];
f10B = distB[9*Np+n];
f12B = distB[11*Np+n];
f13B = distB[14*Np+n];
f16B = distB[15*Np+n];
f17B = distB[18*Np+n];
//...................................................
// Determine the inlet flow velocity
//ux = (f1-f2+f7-f8+f9-f10+f11-f12+f13-f14);
//uy = (f3-f4+f7-f8-f9+f10+f15-f16+f17-f18);
uzA = dinA - (f0A+f1A+f2A+f3A+f4A+f7A+f8A+f9A+f10A + 2*(f6A+f12A+f13A+f16A+f17A));
uzB = dinB - (f0B+f1B+f2B+f3B+f4B+f7B+f8B+f9B+f10B + 2*(f6B+f12B+f13B+f16B+f17B));
CxzA = 0.5*(f1A+f7A+f9A-f2A-f10A-f8A) - 0.3333333333333333*uxA;
CyzA = 0.5*(f3A+f7A+f10A-f4A-f9A-f8A) - 0.3333333333333333*uyA;
CxzB = 0.5*(f1B+f7B+f9B-f2B-f10B-f8B) - 0.3333333333333333*uxB;
CyzB = 0.5*(f3B+f7B+f10B-f4B-f9B-f8B) - 0.3333333333333333*uyB;
f5A = f6A + 0.33333333333333338*uzA;
f11A = f12A + 0.16666666666666678*(uzA+uxA)-CxzA;
f14A = f13A + 0.16666666666666678*(uzA-uxA)+CxzA;
f15A = f16A + 0.16666666666666678*(uyA+uzA)-CyzA;
f18A = f17A + 0.16666666666666678*(uzA-uyA)+CyzA;
f5B = f6B + 0.33333333333333338*uzB;
f11B = f12B + 0.16666666666666678*(uzB+uxB)-CxzB;
f14B = f13B + 0.16666666666666678*(uzB-uxB)+CxzB;
f15B = f16B + 0.16666666666666678*(uyB+uzB)-CyzB;
f18B = f17B + 0.16666666666666678*(uzB-uyB)+CyzB;
//........Store in "opposite" memory location..........
distA[6*Np+n] = f5A;
distA[12*Np+n] = f11A;
distA[13*Np+n] = f14A;
distA[16*Np+n] = f15A;
distA[17*Np+n] = f18A;
distB[6*Np+n] = f5B;
distB[12*Np+n] = f11B;
distB[13*Np+n] = f14B;
distB[16*Np+n] = f15B;
distB[17*Np+n] = f18B;
}
}
extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_Z(int *list, double *distA, double *distB, double doutA, double doutB, int count, int Np){
int idx,n;
// distributions
double f0A,f1A,f2A,f3A,f4A,f5A,f6A,f7A,f8A,f9A;
double f10A,f11A,f12A,f13A,f14A,f15A,f16A,f17A,f18A;
double f0B,f1B,f2B,f3B,f4B,f5B,f6B,f7B,f8B,f9B;
double f10B,f11B,f12B,f13B,f14B,f15B,f16B,f17B,f18B;
double uxA,uyA,uzA,CyzA,CxzA;
double uxB,uyB,uzB,CyzB,CxzB;
uxA = uyA = 0.0;
uxB = uyB = 0.0;
// Loop over the boundary - threadblocks delineated by start...finish
for (idx=0; idx<count; idx++){
n = list[idx];
//........................................................................
// Read distributions
//........................................................................
f0A = distA[n];
f1A = distA[2*Np+n];
f2A = distA[1*Np+n];
f3A = distA[4*Np+n];
f4A = distA[3*Np+n];
f5A = distA[6*Np+n];
f7A = distA[8*Np+n];
f8A = distA[7*Np+n];
f9A = distA[10*Np+n];
f10A = distA[9*Np+n];
f11A = distA[12*Np+n];
f14A = distA[13*Np+n];
f15A = distA[16*Np+n];
f18A = distA[17*Np+n];
f0B = distB[n];
f1B = distB[2*Np+n];
f2B = distB[1*Np+n];
f3B = distB[4*Np+n];
f4B = distB[3*Np+n];
f5B = distB[6*Np+n];
f7B = distB[8*Np+n];
f8B = distB[7*Np+n];
f9B = distB[10*Np+n];
f10B = distB[9*Np+n];
f11B = distB[12*Np+n];
f14B = distB[13*Np+n];
f15B = distB[16*Np+n];
f18B = distB[17*Np+n];
// Determine the outlet flow velocity
//ux = f1-f2+f7-f8+f9-f10+f11-f12+f13-f14;
//uy = f3-f4+f7-f8-f9+f10+f15-f16+f17-f18;
uzA = -doutA + (f0A+f1A+f2A+f3A+f4A+f7A+f8A+f9A+f10A + 2*(f5A+f11A+f14A+f15A+f18A));
uzB = -doutB + (f0B+f1B+f2B+f3B+f4B+f7B+f8B+f9B+f10B + 2*(f5B+f11B+f14B+f15B+f18B));
CxzA = 0.5*(f1A+f7A+f9A-f2A-f10A-f8A) - 0.3333333333333333*uxA;
CyzA = 0.5*(f3A+f7A+f10A-f4A-f9A-f8A) - 0.3333333333333333*uyA;
CxzB = 0.5*(f1B+f7B+f9B-f2B-f10B-f8B) - 0.3333333333333333*uxB;
CyzB = 0.5*(f3B+f7B+f10B-f4B-f9B-f8B) - 0.3333333333333333*uyB;
f6A = f5A - 0.33333333333333338*uzA;
f12A = f11A - 0.16666666666666678*(uzA+uxA)+CxzA;
f13A = f14A - 0.16666666666666678*(uzA-uxA)-CxzA;
f16A = f15A - 0.16666666666666678*(uyA+uzA)+CyzA;
f17A = f18A - 0.16666666666666678*(uzA-uyA)-CyzA;
f6B = f5B - 0.33333333333333338*uzB;
f12B = f11B - 0.16666666666666678*(uzB+uxB)+CxzB;
f13B = f14B - 0.16666666666666678*(uzB-uxB)-CxzB;
f16B = f15B - 0.16666666666666678*(uyB+uzB)+CyzB;
f17B = f18B - 0.16666666666666678*(uzB-uyB)-CyzB;
distA[5*Np+n] = f6A;
distA[11*Np+n] = f12A;
distA[14*Np+n] = f13A;
distA[15*Np+n] = f16A;
distA[18*Np+n] = f17A;
distB[5*Np+n] = f6B;
distB[11*Np+n] = f12B;
distB[14*Np+n] = f13B;
distB[15*Np+n] = f16B;
distB[18*Np+n] = f17B;
//...................................................
}
}
extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z(int *neighborList, int *list, double *distA, double *distB, double dinA, double dinB, int count, int Np){
int idx, n;
int nread;
int nr5,nr11,nr14,nr15,nr18;
// distributions
double f0A,f1A,f2A,f3A,f4A,f5A,f6A,f7A,f8A,f9A;
double f10A,f11A,f12A,f13A,f14A,f15A,f16A,f17A,f18A;
double f0B,f1B,f2B,f3B,f4B,f5B,f6B,f7B,f8B,f9B;
double f10B,f11B,f12B,f13B,f14B,f15B,f16B,f17B,f18B;
double uxA,uyA,uzA,CyzA,CxzA;
double uxB,uyB,uzB,CyzB,CxzB;
uxA = uyA = 0.0;
uxB = uyB = 0.0;
for (idx=0; idx<count; idx++){
n = list[idx];
//........................................................................
// Read distributions
//........................................................................
f0A = distA[n];
f0B = distB[n];
nread = neighborList[n];
f1A = distA[nread];
f1B = distB[nread];
nread = neighborList[n+2*Np];
f3A = distA[nread];
f3B = distB[nread];
nread = neighborList[n+6*Np];
f7A = distA[nread];
f7B = distB[nread];
nread = neighborList[n+8*Np];
f9A = distA[nread];
f9B = distB[nread];
nread = neighborList[n+12*Np];
f13A = distA[nread];
f13B = distB[nread];
nread = neighborList[n+16*Np];
f17A = distA[nread];
f17B = distB[nread];
nread = neighborList[n+Np];
f2A = distA[nread];
f2B = distB[nread];
nread = neighborList[n+3*Np];
f4A = distA[nread];
f4B = distB[nread];
nread = neighborList[n+5*Np];
f6A = distA[nread];
f6B = distB[nread];
nread = neighborList[n+7*Np];
f8A = distA[nread];
f8B = distB[nread];
nread = neighborList[n+9*Np];
f10A = distA[nread];
f10B = distB[nread];
nread = neighborList[n+11*Np];
f12A = distA[nread];
f12B = distB[nread];
nread = neighborList[n+15*Np];
f16A = distA[nread];
f16B = distB[nread];
// Unknown distributions
nr5 = neighborList[n+4*Np];
nr11 = neighborList[n+10*Np];
nr15 = neighborList[n+14*Np];
nr14 = neighborList[n+13*Np];
nr18 = neighborList[n+17*Np];
//...................................................
//........Determine the inlet flow velocity.........
//ux = (f1-f2+f7-f8+f9-f10+f11-f12+f13-f14);
//uy = (f3-f4+f7-f8-f9+f10+f15-f16+f17-f18);
uzA = dinA - (f0A+f1A+f2A+f3A+f4A+f7A+f8A+f9A+f10A + 2*(f6A+f12A+f13A+f16A+f17A));
uzB = dinB - (f0B+f1B+f2B+f3B+f4B+f7B+f8B+f9B+f10B + 2*(f6B+f12B+f13B+f16B+f17B));
CxzA = 0.5*(f1A+f7A+f9A-f2A-f10A-f8A) - 0.3333333333333333*uxA;
CyzA = 0.5*(f3A+f7A+f10A-f4A-f9A-f8A) - 0.3333333333333333*uyA;
CxzB = 0.5*(f1B+f7B+f9B-f2B-f10B-f8B) - 0.3333333333333333*uxB;
CyzB = 0.5*(f3B+f7B+f10B-f4B-f9B-f8B) - 0.3333333333333333*uyB;
f5A = f6A + 0.33333333333333338*uzA;
f11A = f12A + 0.16666666666666678*(uzA+uxA)-CxzA;
f14A = f13A + 0.16666666666666678*(uzA-uxA)+CxzA;
f15A = f16A + 0.16666666666666678*(uyA+uzA)-CyzA;
f18A = f17A + 0.16666666666666678*(uzA-uyA)+CyzA;
f5B = f6B + 0.33333333333333338*uzB;
f11B = f12B + 0.16666666666666678*(uzB+uxB)-CxzB;
f14B = f13B + 0.16666666666666678*(uzB-uxB)+CxzB;
f15B = f16B + 0.16666666666666678*(uyB+uzB)-CyzB;
f18B = f17B + 0.16666666666666678*(uzB-uyB)+CyzB;
//........Store in "opposite" memory location..........
distA[nr5] = f5A;
distA[nr11] = f11A;
distA[nr14] = f14A;
distA[nr15] = f15A;
distA[nr18] = f18A;
distB[nr5] = f5B;
distB[nr11] = f11B;
distB[nr14] = f14B;
distB[nr15] = f15B;
distB[nr18] = f18B;
}
}
extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z(int *neighborList, int *list, double *distA, double *distB, double doutA, double doutB, int count, int Np){
int idx,n,nread;
int nr6,nr12,nr13,nr16,nr17;
// distributions
double f0A,f1A,f2A,f3A,f4A,f5A,f6A,f7A,f8A,f9A;
double f10A,f11A,f12A,f13A,f14A,f15A,f16A,f17A,f18A;
double f0B,f1B,f2B,f3B,f4B,f5B,f6B,f7B,f8B,f9B;
double f10B,f11B,f12B,f13B,f14B,f15B,f16B,f17B,f18B;
double uxA,uyA,uzA,CyzA,CxzA;
double uxB,uyB,uzB,CyzB,CxzB;
uxA = uyA = 0.0;
uxB = uyB = 0.0;
// Loop over the boundary - threadblocks delineated by start...finish
for (idx=0; idx<count; idx++){
n = list[idx];
//........................................................................
// Read distributions
//........................................................................
f0A = distA[n];
f0B = distB[n];
nread = neighborList[n];
f1A = distA[nread];
f1B = distB[nread];
nread = neighborList[n+2*Np];
f3A = distA[nread];
f3B = distB[nread];
nread = neighborList[n+4*Np];
f5A = distA[nread];
f5B = distB[nread];
nread = neighborList[n+6*Np];
f7A = distA[nread];
f7B = distB[nread];
nread = neighborList[n+8*Np];
f9A = distA[nread];
f9B = distB[nread];
nread = neighborList[n+10*Np];
f11A = distA[nread];
f11B = distB[nread];
nread = neighborList[n+14*Np];
f15A = distA[nread];
f15B = distB[nread];
nread = neighborList[n+Np];
f2A = distA[nread];
f2B = distB[nread];
nread = neighborList[n+3*Np];
f4A = distA[nread];
f4B = distB[nread];
nread = neighborList[n+7*Np];
f8A = distA[nread];
f8B = distB[nread];
nread = neighborList[n+9*Np];
f10A = distA[nread];
f10B = distB[nread];
nread = neighborList[n+13*Np];
f14A = distA[nread];
f14B = distB[nread];
nread = neighborList[n+17*Np];
f18A = distA[nread];
f18B = distB[nread];
// unknown distributions
nr6 = neighborList[n+5*Np];
nr12 = neighborList[n+11*Np];
nr16 = neighborList[n+15*Np];
nr17 = neighborList[n+16*Np];
nr13 = neighborList[n+12*Np];
//........Determine the outlet flow velocity.........
//ux = f1-f2+f7-f8+f9-f10+f11-f12+f13-f14;
//uy = f3-f4+f7-f8-f9+f10+f15-f16+f17-f18;
uzA = -doutA + (f0A+f1A+f2A+f3A+f4A+f7A+f8A+f9A+f10A + 2*(f5A+f11A+f14A+f15A+f18A));
uzB = -doutB + (f0B+f1B+f2B+f3B+f4B+f7B+f8B+f9B+f10B + 2*(f5B+f11B+f14B+f15B+f18B));
CxzA = 0.5*(f1A+f7A+f9A-f2A-f10A-f8A) - 0.3333333333333333*uxA;
CyzA = 0.5*(f3A+f7A+f10A-f4A-f9A-f8A) - 0.3333333333333333*uyA;
CxzB = 0.5*(f1B+f7B+f9B-f2B-f10B-f8B) - 0.3333333333333333*uxB;
CyzB = 0.5*(f3B+f7B+f10B-f4B-f9B-f8B) - 0.3333333333333333*uyB;
f6A = f5A - 0.33333333333333338*uzA;
f12A = f11A - 0.16666666666666678*(uzA+uxA)+CxzA;
f13A = f14A - 0.16666666666666678*(uzA-uxA)-CxzA;
f16A = f15A - 0.16666666666666678*(uyA+uzA)+CyzA;
f17A = f18A - 0.16666666666666678*(uzA-uyA)-CyzA;
f6B = f5B - 0.33333333333333338*uzB;
f12B = f11B - 0.16666666666666678*(uzB+uxB)+CxzB;
f13B = f14B - 0.16666666666666678*(uzB-uxB)-CxzB;
f16B = f15B - 0.16666666666666678*(uyB+uzB)+CyzB;
f17B = f18B - 0.16666666666666678*(uzB-uyB)-CyzB;
//........Store in "opposite" memory location..........
distA[nr6] = f6A;
distA[nr12] = f12A;
distA[nr13] = f13A;
distA[nr16] = f16A;
distA[nr17] = f17A;
distB[nr6] = f6B;
distB[nr12] = f12B;
distB[nr13] = f13B;
distB[nr16] = f16B;
distB[nr17] = f17B;
//...................................................
}
}