From fa4a20ddf0c8e156d40dae2e3818a54ee54186de Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Mon, 24 Feb 2020 17:24:11 -0500 Subject: [PATCH 01/75] GPU standard MRT absperm simulator: move the body force execution from normal space to moment space --- gpu/D3Q19.cu | 231 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 181 insertions(+), 50 deletions(-) diff --git a/gpu/D3Q19.cu b/gpu/D3Q19.cu index ccd125b2..62212a17 100644 --- a/gpu/D3Q19.cu +++ b/gpu/D3Q19.cu @@ -786,11 +786,36 @@ dvc_ScaLBL_AAodd_MRT(int *neighborList, double *dist, int start, int finish, int //..............incorporate external force................................................ //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); - m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); - m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); - m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); - m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); +// m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); +// m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); +// m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); +// m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); +// m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); +// m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); +// m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); +// m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); +// m12 = m12 + rlx_setA*(-0.5*((jy*jy-jz*jz)/rho) - m12); +// m13 = m13 + rlx_setA*((jx*jy/rho) - m13); +// m14 = m14 + rlx_setA*((jy*jz/rho) - m14); +// m15 = m15 + rlx_setA*((jx*jz/rho) - m15); +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); + + //Body force is executed in the moment space + m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1) + + (1-0.5*rlx_setA)*38*(Fx*jx+Fy*jy+Fz*jz)/rho; + m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2) + + (1-0.5*rlx_setA)*11*(-Fx*jx-Fy*jy-Fz*jz)/rho; + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); @@ -809,117 +834,157 @@ dvc_ScaLBL_AAodd_MRT(int *neighborList, double *dist, int start, int finish, int dist[n] = fq; // q = 1 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10)+0.16666666*Fx; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10)+0.16666666*Fx; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); nread = neighborList[n+Np]; dist[nread] = fq; // q=2 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); nread = neighborList[n]; dist[nread] = fq; // q = 3 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); nread = neighborList[n+3*Np]; dist[nread] = fq; // q = 4 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); nread = neighborList[n+2*Np]; dist[nread] = fq; // q = 5 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); nread = neighborList[n+5*Np]; dist[nread] = fq; // q = 6 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); nread = neighborList[n+4*Np]; dist[nread] = fq; // q = 7 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+ +// mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17) + 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+ - mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17) + 0.08333333333*(Fx+Fy); + mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); nread = neighborList[n+7*Np]; dist[nread] = fq; // q = 8 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 +// +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); + +mrt_V12*m12+0.25*m13+0.125*(m17-m16); nread = neighborList[n+6*Np]; dist[nread] = fq; // q = 9 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+ +// mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17) + 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+ - mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17) + 0.08333333333*(Fx-Fy); + mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); nread = neighborList[n+9*Np]; dist[nread] = fq; // q = 10 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+ +// mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17)- 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+ - mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17)- 0.08333333333*(Fx-Fy); + mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); nread = neighborList[n+8*Np]; dist[nread] = fq; // q = 11 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); + -mrt_V12*m12+0.25*m15+0.125*(m18-m16); nread = neighborList[n+11*Np]; dist[nread] = fq; // q = 12 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ +// mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18) - 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ - mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18) - 0.08333333333*(Fx+Fz); + mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); nread = neighborList[n+10*Np]; dist[nread]= fq; // q = 13 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); + -mrt_V12*m12-0.25*m15-0.125*(m16+m18); nread = neighborList[n+13*Np]; dist[nread] = fq; // q= 14 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); + -mrt_V12*m12-0.25*m15+0.125*(m16+m18); nread = neighborList[n+12*Np]; dist[nread] = fq; // q = 15 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) +// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); nread = neighborList[n+15*Np]; dist[nread] = fq; // q = 16 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) +// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); nread = neighborList[n+14*Np]; dist[nread] = fq; // q = 17 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) +// -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) - -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); + -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); nread = neighborList[n+17*Np]; dist[nread] = fq; // q = 18 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) +// -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) - -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); + -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); nread = neighborList[n+16*Np]; dist[nread] = fq; @@ -1222,11 +1287,36 @@ dvc_ScaLBL_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_se //..............incorporate external force................................................ //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); - m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); - m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); - m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); - m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); +// m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); +// m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); +// m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); +// m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); +// m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); +// m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); +// m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); +// m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); +// m12 = m12 + rlx_setA*(-0.5*((jy*jy-jz*jz)/rho) - m12); +// m13 = m13 + rlx_setA*((jx*jy/rho) - m13); +// m14 = m14 + rlx_setA*((jy*jz/rho) - m14); +// m15 = m15 + rlx_setA*((jx*jz/rho) - m15); +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); + + //Body force is executed in the moment space + m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1) + + (1-0.5*rlx_setA)*38*(Fx*jx+Fy*jy+Fz*jz)/rho; + m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2) + + (1-0.5*rlx_setA)*11*(-Fx*jx-Fy*jy-Fz*jz)/rho; + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); @@ -1237,6 +1327,7 @@ dvc_ScaLBL_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_se m16 = m16 + rlx_setB*( - m16); m17 = m17 + rlx_setB*( - m17); m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... //.................inverse transformation...................................................... @@ -1245,105 +1336,145 @@ dvc_ScaLBL_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_se dist[n] = fq; // q = 1 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10) + 0.16666666*Fx; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10) + 0.16666666*Fx; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); dist[1*Np+n] = fq; // q=2 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); dist[2*Np+n] = fq; // q = 3 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); dist[3*Np+n] = fq; // q = 4 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); dist[4*Np+n] = fq; // q = 5 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); dist[5*Np+n] = fq; // q = 6 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); dist[6*Np+n] = fq; // q = 7 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+ +// mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17) + +// 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+ - mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17) + - 0.08333333333*(Fx+Fy); + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); dist[7*Np+n] = fq; // q = 8 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 +// +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); + +mrt_V12*m12+0.25*m13+0.125*(m17-m16); dist[8*Np+n] = fq; // q = 9 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+ +// mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17)+ +// 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+ - mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17)+ - 0.08333333333*(Fx-Fy); + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); dist[9*Np+n] = fq; // q = 10 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+ +// mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17)- +// 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+ - mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17)- - 0.08333333333*(Fx-Fy); + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); dist[10*Np+n] = fq; // q = 11 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); + -mrt_V12*m12+0.25*m15+0.125*(m18-m16); dist[11*Np+n] = fq; // q = 12 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ +// mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18)- +// 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ - mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18)- - 0.08333333333*(Fx+Fz); + mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); dist[12*Np+n] = fq; // q = 13 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); + -mrt_V12*m12-0.25*m15-0.125*(m16+m18); dist[13*Np+n] = fq; // q= 14 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); + -mrt_V12*m12-0.25*m15+0.125*(m16+m18); dist[14*Np+n] = fq; // q = 15 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) +// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); dist[15*Np+n] = fq; // q = 16 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) +// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); dist[16*Np+n] = fq; // q = 17 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) +// -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) - -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); + -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); dist[17*Np+n] = fq; // q = 18 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) +// -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) - -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); + -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); dist[18*Np+n] = fq; //........................................................................ } From 7405344dac2a59513e4434497dd17dd578502f5a Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Tue, 25 Feb 2020 14:19:23 -0500 Subject: [PATCH 02/75] CPU standard MRT absperm simulator: move the body force execution from normal space to moment space --- cpu/D3Q19.cpp | 231 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 185 insertions(+), 46 deletions(-) diff --git a/cpu/D3Q19.cpp b/cpu/D3Q19.cpp index 2c0e686d..5bfe305f 100644 --- a/cpu/D3Q19.cpp +++ b/cpu/D3Q19.cpp @@ -1197,11 +1197,35 @@ extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int //..............incorporate external force................................................ //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); - m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); - m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); - m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); - m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); +// m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); +// m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); +// m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); +// m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); +// m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); +// m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); +// m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); +// m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); +// m12 = m12 + rlx_setA*(-0.5*((jy*jy-jz*jz)/rho) - m12); +// m13 = m13 + rlx_setA*((jx*jy/rho) - m13); +// m14 = m14 + rlx_setA*((jy*jz/rho) - m14); +// m15 = m15 + rlx_setA*((jx*jz/rho) - m15); +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); + + m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1) + + (1-0.5*rlx_setA)*38*(Fx*jx+Fy*jy+Fz*jz)/rho; + m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2) + + (1-0.5*rlx_setA)*11*(-Fx*jx-Fy*jy-Fz*jz)/rho; + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); @@ -1212,6 +1236,7 @@ extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int m16 = m16 + rlx_setB*( - m16); m17 = m17 + rlx_setB*( - m17); m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... //.................inverse transformation...................................................... @@ -1220,105 +1245,149 @@ extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int dist[n] = fq; // q = 1 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10) + 0.16666666*Fx; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10) + 0.16666666*Fx; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); dist[1*Np+n] = fq; // q=2 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); dist[2*Np+n] = fq; // q = 3 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); dist[3*Np+n] = fq; // q = 4 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); dist[4*Np+n] = fq; // q = 5 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); dist[5*Np+n] = fq; // q = 6 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); dist[6*Np+n] = fq; // q = 7 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6) +// +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 +// +mrt_V12*m12+0.25*m13+0.125*(m16-m17) + 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m16-m17) + 0.08333333333*(Fx+Fy); + +mrt_V12*m12+0.25*m13+0.125*(m16-m17); dist[7*Np+n] = fq; // q = 8 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 +// +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); + +mrt_V12*m12+0.25*m13+0.125*(m17-m16); dist[8*Np+n] = fq; // q = 9 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6) +// +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 +// +mrt_V12*m12-0.25*m13+0.125*(m16+m17) + 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12-0.25*m13+0.125*(m16+m17) + 0.08333333333*(Fx-Fy); + +mrt_V12*m12-0.25*m13+0.125*(m16+m17); dist[9*Np+n] = fq; // q = 10 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4) +// +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 +// +mrt_V12*m12-0.25*m13-0.125*(m16+m17)- 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12-0.25*m13-0.125*(m16+m17)- 0.08333333333*(Fx-Fy); + +mrt_V12*m12-0.25*m13-0.125*(m16+m17); dist[10*Np+n] = fq; // q = 11 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); + -mrt_V12*m12+0.25*m15+0.125*(m18-m16); dist[11*Np+n] = fq; // q = 12 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12+0.25*m15+0.125*(m16-m18) - 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m16-m18) - 0.08333333333*(Fx+Fz); + -mrt_V12*m12+0.25*m15+0.125*(m16-m18); dist[12*Np+n] = fq; // q = 13 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); + -mrt_V12*m12-0.25*m15-0.125*(m16+m18); dist[13*Np+n] = fq; // q= 14 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); + -mrt_V12*m12-0.25*m15+0.125*(m16+m18); dist[14*Np+n] = fq; // q = 15 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) +// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); dist[15*Np+n] = fq; // q = 16 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) +// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); dist[16*Np+n] = fq; // q = 17 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) +// -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) - -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); + -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); dist[17*Np+n] = fq; // q = 18 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) +// -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) - -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); + -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); dist[18*Np+n] = fq; //........................................................................ @@ -1657,11 +1726,36 @@ extern "C" void ScaLBL_D3Q19_AAodd_MRT(int *neighborList, double *dist, int star //..............incorporate external force................................................ //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); - m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); - m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); - m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); - m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); +// m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); +// m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); +// m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); +// m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); +// m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); +// m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); +// m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); +// m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); +// m12 = m12 + rlx_setA*(-0.5*((jy*jy-jz*jz)/rho) - m12); +// m13 = m13 + rlx_setA*((jx*jy/rho) - m13); +// m14 = m14 + rlx_setA*((jy*jz/rho) - m14); +// m15 = m15 + rlx_setA*((jx*jz/rho) - m15); +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); + + //Body force is executed in the moment space + m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1) + + (1-0.5*rlx_setA)*38*(Fx*jx+Fy*jy+Fz*jz)/rho; + m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2) + + (1-0.5*rlx_setA)*11*(-Fx*jx-Fy*jy-Fz*jz)/rho; + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); @@ -1672,6 +1766,7 @@ extern "C" void ScaLBL_D3Q19_AAodd_MRT(int *neighborList, double *dist, int star m16 = m16 + rlx_setB*( - m16); m17 = m17 + rlx_setB*( - m17); m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... //.................inverse transformation...................................................... @@ -1680,120 +1775,164 @@ extern "C" void ScaLBL_D3Q19_AAodd_MRT(int *neighborList, double *dist, int star dist[n] = fq; // q = 1 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10)+0.16666666*Fx; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10)+0.16666666*Fx; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); nread = neighborList[n+Np]; dist[nread] = fq; // q=2 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); nread = neighborList[n]; dist[nread] = fq; // q = 3 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); nread = neighborList[n+3*Np]; dist[nread] = fq; // q = 4 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); nread = neighborList[n+2*Np]; dist[nread] = fq; // q = 5 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); nread = neighborList[n+5*Np]; dist[nread] = fq; // q = 6 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; + //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); nread = neighborList[n+4*Np]; dist[nread] = fq; // q = 7 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6) +// +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 +// +mrt_V12*m12+0.25*m13+0.125*(m16-m17) + 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m16-m17) + 0.08333333333*(Fx+Fy); + +mrt_V12*m12+0.25*m13+0.125*(m16-m17); nread = neighborList[n+7*Np]; dist[nread] = fq; // q = 8 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 +// +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); + +mrt_V12*m12+0.25*m13+0.125*(m17-m16); nread = neighborList[n+6*Np]; dist[nread] = fq; // q = 9 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6) +// +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 +// +mrt_V12*m12-0.25*m13+0.125*(m16+m17) + 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12-0.25*m13+0.125*(m16+m17) + 0.08333333333*(Fx-Fy); + +mrt_V12*m12-0.25*m13+0.125*(m16+m17); nread = neighborList[n+9*Np]; dist[nread] = fq; // q = 10 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4) +// +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 +// +mrt_V12*m12-0.25*m13-0.125*(m16+m17)- 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12-0.25*m13-0.125*(m16+m17)- 0.08333333333*(Fx-Fy); + +mrt_V12*m12-0.25*m13-0.125*(m16+m17); nread = neighborList[n+8*Np]; dist[nread] = fq; // q = 11 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); + -mrt_V12*m12+0.25*m15+0.125*(m18-m16); nread = neighborList[n+11*Np]; dist[nread] = fq; // q = 12 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12+0.25*m15+0.125*(m16-m18) - 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m16-m18) - 0.08333333333*(Fx+Fz); + -mrt_V12*m12+0.25*m15+0.125*(m16-m18); nread = neighborList[n+10*Np]; dist[nread]= fq; // q = 13 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); + -mrt_V12*m12-0.25*m15-0.125*(m16+m18); nread = neighborList[n+13*Np]; dist[nread] = fq; // q= 14 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); + -mrt_V12*m12-0.25*m15+0.125*(m16+m18); nread = neighborList[n+12*Np]; dist[nread] = fq; // q = 15 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) +// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); nread = neighborList[n+15*Np]; dist[nread] = fq; // q = 16 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) +// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); nread = neighborList[n+14*Np]; dist[nread] = fq; // q = 17 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) +// -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) - -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); + -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); nread = neighborList[n+17*Np]; dist[nread] = fq; // q = 18 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) +// -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) - -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); + -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); nread = neighborList[n+16*Np]; dist[nread] = fq; From 6e065f3fe32308d4376578ac50cfe4919dc81229 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sat, 4 Apr 2020 10:30:56 -0400 Subject: [PATCH 03/75] Revert "CPU standard MRT absperm simulator: move the body force execution from normal space to moment space" This reverts commit 7405344dac2a59513e4434497dd17dd578502f5a. --- cpu/D3Q19.cpp | 231 ++++++++++---------------------------------------- 1 file changed, 46 insertions(+), 185 deletions(-) diff --git a/cpu/D3Q19.cpp b/cpu/D3Q19.cpp index 5bfe305f..2c0e686d 100644 --- a/cpu/D3Q19.cpp +++ b/cpu/D3Q19.cpp @@ -1197,35 +1197,11 @@ extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int //..............incorporate external force................................................ //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); -// m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); -// m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); -// m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); -// m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); -// m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); -// m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); -// m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); -// m12 = m12 + rlx_setA*(-0.5*((jy*jy-jz*jz)/rho) - m12); -// m13 = m13 + rlx_setA*((jx*jy/rho) - m13); -// m14 = m14 + rlx_setA*((jy*jz/rho) - m14); -// m15 = m15 + rlx_setA*((jx*jz/rho) - m15); -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); - - m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1) - + (1-0.5*rlx_setA)*38*(Fx*jx+Fy*jy+Fz*jz)/rho; - m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2) - + (1-0.5*rlx_setA)*11*(-Fx*jx-Fy*jy-Fz*jz)/rho; - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); + m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); + m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); + m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); + m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); @@ -1236,7 +1212,6 @@ extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int m16 = m16 + rlx_setB*( - m16); m17 = m17 + rlx_setB*( - m17); m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... //.................inverse transformation...................................................... @@ -1245,149 +1220,105 @@ extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int dist[n] = fq; // q = 1 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10) + 0.16666666*Fx; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10) + 0.16666666*Fx; dist[1*Np+n] = fq; // q=2 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; dist[2*Np+n] = fq; // q = 3 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; dist[3*Np+n] = fq; // q = 4 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; dist[4*Np+n] = fq; // q = 5 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; dist[5*Np+n] = fq; // q = 6 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; dist[6*Np+n] = fq; // q = 7 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6) -// +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 -// +mrt_V12*m12+0.25*m13+0.125*(m16-m17) + 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m16-m17); + +mrt_V12*m12+0.25*m13+0.125*(m16-m17) + 0.08333333333*(Fx+Fy); dist[7*Np+n] = fq; // q = 8 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 -// +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m17-m16); + +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); dist[8*Np+n] = fq; // q = 9 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6) -// +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 -// +mrt_V12*m12-0.25*m13+0.125*(m16+m17) + 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12-0.25*m13+0.125*(m16+m17); + +mrt_V12*m12-0.25*m13+0.125*(m16+m17) + 0.08333333333*(Fx-Fy); dist[9*Np+n] = fq; // q = 10 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4) -// +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 -// +mrt_V12*m12-0.25*m13-0.125*(m16+m17)- 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12-0.25*m13-0.125*(m16+m17); + +mrt_V12*m12-0.25*m13-0.125*(m16+m17)- 0.08333333333*(Fx-Fy); dist[10*Np+n] = fq; // q = 11 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m18-m16); + -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); dist[11*Np+n] = fq; // q = 12 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12+0.25*m15+0.125*(m16-m18) - 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m16-m18); + -mrt_V12*m12+0.25*m15+0.125*(m16-m18) - 0.08333333333*(Fx+Fz); dist[12*Np+n] = fq; // q = 13 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15-0.125*(m16+m18); + -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); dist[13*Np+n] = fq; // q= 14 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15+0.125*(m16+m18); + -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); dist[14*Np+n] = fq; // q = 15 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) -// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); dist[15*Np+n] = fq; // q = 16 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) -// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); dist[16*Np+n] = fq; // q = 17 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) -// -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) - -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); dist[17*Np+n] = fq; // q = 18 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) -// -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) - -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); dist[18*Np+n] = fq; //........................................................................ @@ -1726,36 +1657,11 @@ extern "C" void ScaLBL_D3Q19_AAodd_MRT(int *neighborList, double *dist, int star //..............incorporate external force................................................ //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); -// m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); -// m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); -// m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); -// m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); -// m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); -// m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); -// m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); -// m12 = m12 + rlx_setA*(-0.5*((jy*jy-jz*jz)/rho) - m12); -// m13 = m13 + rlx_setA*((jx*jy/rho) - m13); -// m14 = m14 + rlx_setA*((jy*jz/rho) - m14); -// m15 = m15 + rlx_setA*((jx*jz/rho) - m15); -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); - - //Body force is executed in the moment space - m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1) - + (1-0.5*rlx_setA)*38*(Fx*jx+Fy*jy+Fz*jz)/rho; - m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2) - + (1-0.5*rlx_setA)*11*(-Fx*jx-Fy*jy-Fz*jz)/rho; - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); + m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); + m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); + m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); + m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); @@ -1766,7 +1672,6 @@ extern "C" void ScaLBL_D3Q19_AAodd_MRT(int *neighborList, double *dist, int star m16 = m16 + rlx_setB*( - m16); m17 = m17 + rlx_setB*( - m17); m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... //.................inverse transformation...................................................... @@ -1775,164 +1680,120 @@ extern "C" void ScaLBL_D3Q19_AAodd_MRT(int *neighborList, double *dist, int star dist[n] = fq; // q = 1 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10)+0.16666666*Fx; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10)+0.16666666*Fx; nread = neighborList[n+Np]; dist[nread] = fq; // q=2 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; nread = neighborList[n]; dist[nread] = fq; // q = 3 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; nread = neighborList[n+3*Np]; dist[nread] = fq; // q = 4 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; nread = neighborList[n+2*Np]; dist[nread] = fq; // q = 5 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; nread = neighborList[n+5*Np]; dist[nread] = fq; // q = 6 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; nread = neighborList[n+4*Np]; dist[nread] = fq; // q = 7 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6) -// +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 -// +mrt_V12*m12+0.25*m13+0.125*(m16-m17) + 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m16-m17); + +mrt_V12*m12+0.25*m13+0.125*(m16-m17) + 0.08333333333*(Fx+Fy); nread = neighborList[n+7*Np]; dist[nread] = fq; // q = 8 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 -// +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m17-m16); + +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); nread = neighborList[n+6*Np]; dist[nread] = fq; // q = 9 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6) -// +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 -// +mrt_V12*m12-0.25*m13+0.125*(m16+m17) + 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12-0.25*m13+0.125*(m16+m17); + +mrt_V12*m12-0.25*m13+0.125*(m16+m17) + 0.08333333333*(Fx-Fy); nread = neighborList[n+9*Np]; dist[nread] = fq; // q = 10 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4) -// +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 -// +mrt_V12*m12-0.25*m13-0.125*(m16+m17)- 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12-0.25*m13-0.125*(m16+m17); + +mrt_V12*m12-0.25*m13-0.125*(m16+m17)- 0.08333333333*(Fx-Fy); nread = neighborList[n+8*Np]; dist[nread] = fq; // q = 11 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m18-m16); + -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); nread = neighborList[n+11*Np]; dist[nread] = fq; // q = 12 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12+0.25*m15+0.125*(m16-m18) - 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m16-m18); + -mrt_V12*m12+0.25*m15+0.125*(m16-m18) - 0.08333333333*(Fx+Fz); nread = neighborList[n+10*Np]; dist[nread]= fq; // q = 13 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15-0.125*(m16+m18); + -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); nread = neighborList[n+13*Np]; dist[nread] = fq; // q= 14 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15+0.125*(m16+m18); + -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); nread = neighborList[n+12*Np]; dist[nread] = fq; // q = 15 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) -// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); nread = neighborList[n+15*Np]; dist[nread] = fq; // q = 16 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) -// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); nread = neighborList[n+14*Np]; dist[nread] = fq; // q = 17 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) -// -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) - -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); nread = neighborList[n+17*Np]; dist[nread] = fq; // q = 18 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) -// -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) - -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); nread = neighborList[n+16*Np]; dist[nread] = fq; From fcbacd76de942f68766a2277816c8fc13bb504e5 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sat, 4 Apr 2020 10:31:07 -0400 Subject: [PATCH 04/75] Revert "GPU standard MRT absperm simulator: move the body force execution from normal space to moment space" This reverts commit fa4a20ddf0c8e156d40dae2e3818a54ee54186de. --- gpu/D3Q19.cu | 231 +++++++++++---------------------------------------- 1 file changed, 50 insertions(+), 181 deletions(-) diff --git a/gpu/D3Q19.cu b/gpu/D3Q19.cu index 62212a17..ccd125b2 100644 --- a/gpu/D3Q19.cu +++ b/gpu/D3Q19.cu @@ -786,36 +786,11 @@ dvc_ScaLBL_AAodd_MRT(int *neighborList, double *dist, int start, int finish, int //..............incorporate external force................................................ //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); -// m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); -// m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); -// m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); -// m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); -// m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); -// m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); -// m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); -// m12 = m12 + rlx_setA*(-0.5*((jy*jy-jz*jz)/rho) - m12); -// m13 = m13 + rlx_setA*((jx*jy/rho) - m13); -// m14 = m14 + rlx_setA*((jy*jz/rho) - m14); -// m15 = m15 + rlx_setA*((jx*jz/rho) - m15); -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); - - //Body force is executed in the moment space - m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1) - + (1-0.5*rlx_setA)*38*(Fx*jx+Fy*jy+Fz*jz)/rho; - m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2) - + (1-0.5*rlx_setA)*11*(-Fx*jx-Fy*jy-Fz*jz)/rho; - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); + m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); + m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); + m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); + m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); @@ -834,157 +809,117 @@ dvc_ScaLBL_AAodd_MRT(int *neighborList, double *dist, int start, int finish, int dist[n] = fq; // q = 1 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10)+0.16666666*Fx; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10)+0.16666666*Fx; nread = neighborList[n+Np]; dist[nread] = fq; // q=2 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; nread = neighborList[n]; dist[nread] = fq; // q = 3 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; nread = neighborList[n+3*Np]; dist[nread] = fq; // q = 4 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; nread = neighborList[n+2*Np]; dist[nread] = fq; // q = 5 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; nread = neighborList[n+5*Np]; dist[nread] = fq; // q = 6 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; nread = neighborList[n+4*Np]; dist[nread] = fq; // q = 7 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+ -// mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17) + 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+ - mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17) + 0.08333333333*(Fx+Fy); nread = neighborList[n+7*Np]; dist[nread] = fq; // q = 8 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 -// +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m17-m16); + +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); nread = neighborList[n+6*Np]; dist[nread] = fq; // q = 9 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+ -// mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17) + 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+ - mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17) + 0.08333333333*(Fx-Fy); nread = neighborList[n+9*Np]; dist[nread] = fq; // q = 10 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+ -// mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17)- 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+ - mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17)- 0.08333333333*(Fx-Fy); nread = neighborList[n+8*Np]; dist[nread] = fq; // q = 11 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m18-m16); + -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); nread = neighborList[n+11*Np]; dist[nread] = fq; // q = 12 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ -// mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18) - 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ - mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18) - 0.08333333333*(Fx+Fz); nread = neighborList[n+10*Np]; dist[nread]= fq; // q = 13 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15-0.125*(m16+m18); + -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); nread = neighborList[n+13*Np]; dist[nread] = fq; // q= 14 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15+0.125*(m16+m18); + -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); nread = neighborList[n+12*Np]; dist[nread] = fq; // q = 15 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) -// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); nread = neighborList[n+15*Np]; dist[nread] = fq; // q = 16 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) -// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); nread = neighborList[n+14*Np]; dist[nread] = fq; // q = 17 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) -// -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) - -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); nread = neighborList[n+17*Np]; dist[nread] = fq; // q = 18 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) -// -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) - -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); nread = neighborList[n+16*Np]; dist[nread] = fq; @@ -1287,36 +1222,11 @@ dvc_ScaLBL_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_se //..............incorporate external force................................................ //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); -// m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); -// m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); -// m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); -// m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); -// m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); -// m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); -// m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); -// m12 = m12 + rlx_setA*(-0.5*((jy*jy-jz*jz)/rho) - m12); -// m13 = m13 + rlx_setA*((jx*jy/rho) - m13); -// m14 = m14 + rlx_setA*((jy*jz/rho) - m14); -// m15 = m15 + rlx_setA*((jx*jz/rho) - m15); -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); - - //Body force is executed in the moment space - m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1) - + (1-0.5*rlx_setA)*38*(Fx*jx+Fy*jy+Fz*jz)/rho; - m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2) - + (1-0.5*rlx_setA)*11*(-Fx*jx-Fy*jy-Fz*jz)/rho; - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho - 11*rho) - m1); + m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho) - m2); + m4 = m4 + rlx_setB*((-0.6666666666666666*jx) - m4); + m6 = m6 + rlx_setB*((-0.6666666666666666*jy) - m6); + m8 = m8 + rlx_setB*((-0.6666666666666666*jz) - m8); m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho) - m9); m10 = m10 + rlx_setA*(-0.5*((2*jx*jx-jy*jy-jz*jz)/rho) - m10); m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho) - m11); @@ -1327,7 +1237,6 @@ dvc_ScaLBL_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_se m16 = m16 + rlx_setB*( - m16); m17 = m17 + rlx_setB*( - m17); m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... //.................inverse transformation...................................................... @@ -1336,145 +1245,105 @@ dvc_ScaLBL_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_se dist[n] = fq; // q = 1 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10) + 0.16666666*Fx; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10) + 0.16666666*Fx; dist[1*Np+n] = fq; // q=2 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10) - 0.16666666*Fx; dist[2*Np+n] = fq; // q = 3 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) + 0.16666666*Fy; dist[3*Np+n] = fq; // q = 4 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12) - 0.16666666*Fy; dist[4*Np+n] = fq; // q = 5 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) + 0.16666666*Fz; dist[5*Np+n] = fq; // q = 6 - //fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11) - 0.16666666*Fz; dist[6*Np+n] = fq; // q = 7 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+ -// mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17) + -// 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+ - mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17) + + 0.08333333333*(Fx+Fy); dist[7*Np+n] = fq; // q = 8 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 -// +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 - +mrt_V12*m12+0.25*m13+0.125*(m17-m16); + +mrt_V12*m12+0.25*m13+0.125*(m17-m16) - 0.08333333333*(Fx+Fy); dist[8*Np+n] = fq; // q = 9 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+ -// mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17)+ -// 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+ - mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17)+ + 0.08333333333*(Fx-Fy); dist[9*Np+n] = fq; // q = 10 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+ -// mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17)- -// 0.08333333333*(Fx-Fy); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+ - mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17)- + 0.08333333333*(Fx-Fy); dist[10*Np+n] = fq; // q = 11 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12+0.25*m15+0.125*(m18-m16); + -mrt_V12*m12+0.25*m15+0.125*(m18-m16) + 0.08333333333*(Fx+Fz); dist[11*Np+n] = fq; // q = 12 -// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ -// mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18)- -// 0.08333333333*(Fx+Fz); fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ - mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18)- + 0.08333333333*(Fx+Fz); dist[12*Np+n] = fq; // q = 13 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15-0.125*(m16+m18); + -mrt_V12*m12-0.25*m15-0.125*(m16+m18) + 0.08333333333*(Fx-Fz); dist[13*Np+n] = fq; // q= 14 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) -// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 -// -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 - -mrt_V12*m12-0.25*m15+0.125*(m16+m18); + -mrt_V12*m12-0.25*m15+0.125*(m16+m18) - 0.08333333333*(Fx-Fz); dist[14*Np+n] = fq; // q = 15 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) -// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18) + 0.08333333333*(Fy+Fz); dist[15*Np+n] = fq; // q = 16 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) -// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) - -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17)- 0.08333333333*(Fy+Fz); dist[16*Np+n] = fq; // q = 17 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) -// -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) - -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18) + 0.08333333333*(Fy-Fz); dist[17*Np+n] = fq; // q = 18 -// fq = mrt_V1*rho+mrt_V9*m1 -// +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) -// -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); fq = mrt_V1*rho+mrt_V9*m1 +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) - -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18) - 0.08333333333*(Fy-Fz); dist[18*Np+n] = fq; //........................................................................ } From 5b45c3216c9f8653fc99616770bd1dde063dea4e Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sat, 4 Apr 2020 10:34:50 -0400 Subject: [PATCH 05/75] initialize multicomponent greyscale model --- models/GreyscaleColorModel.cpp | 898 +++++++++++++++++++++++++++++++++ models/GreyscaleColorModel.h | 92 ++++ 2 files changed, 990 insertions(+) create mode 100644 models/GreyscaleColorModel.cpp create mode 100644 models/GreyscaleColorModel.h diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp new file mode 100644 index 00000000..11d92c80 --- /dev/null +++ b/models/GreyscaleColorModel.cpp @@ -0,0 +1,898 @@ +/* +Greyscale lattice boltzmann model + */ +#include "models/GreyscaleModel.h" +#include "analysis/distance.h" +#include "analysis/morphology.h" +#include +#include + +template +void DeleteArray( const TYPE *p ) +{ + delete [] p; +} + +ScaLBL_GreyscaleModel::ScaLBL_GreyscaleModel(int RANK, int NP, MPI_Comm COMM): +rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tau(0),tau_eff(0),Den(0),Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),GreyPorosity(0), +Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) +{ + SignDist.resize(Nx,Ny,Nz); + SignDist.fill(0); + +} +ScaLBL_GreyscaleModel::~ScaLBL_GreyscaleModel(){ + +} + +void ScaLBL_GreyscaleModel::ReadParams(string filename){ + // read the input database + db = std::make_shared( filename ); + domain_db = db->getDatabase( "Domain" ); + greyscale_db = db->getDatabase( "Greyscale" ); + analysis_db = db->getDatabase( "Analysis" ); + vis_db = db->getDatabase( "Visualization" ); + + // set defaults + timestepMax = 100000; + tau = 1.0; + tau_eff = tau; + Den = 1.0;//constant density + tolerance = 0.01; + Fx = Fy = Fz = 0.0; + Restart=false; + din=dout=1.0; + flux=0.0; + dp = 10.0; //unit of 'dp': voxel + CollisionType = 1; //1: IMRT; 2: BGK + + // ---------------------- Greyscale Model parameters -----------------------// + if (greyscale_db->keyExists( "timestepMax" )){ + timestepMax = greyscale_db->getScalar( "timestepMax" ); + } + if (greyscale_db->keyExists( "tau" )){ + tau = greyscale_db->getScalar( "tau" ); + } + tau_eff = greyscale_db->getWithDefault( "tau_eff", tau ); + if (greyscale_db->keyExists( "Den" )){ + Den = greyscale_db->getScalar( "Den" ); + } + if (greyscale_db->keyExists( "dp" )){ + dp = greyscale_db->getScalar( "dp" ); + } + if (greyscale_db->keyExists( "F" )){ + Fx = greyscale_db->getVector( "F" )[0]; + Fy = greyscale_db->getVector( "F" )[1]; + Fz = greyscale_db->getVector( "F" )[2]; + } + if (greyscale_db->keyExists( "Restart" )){ + Restart = greyscale_db->getScalar( "Restart" ); + } + if (greyscale_db->keyExists( "din" )){ + din = greyscale_db->getScalar( "din" ); + } + if (greyscale_db->keyExists( "dout" )){ + dout = greyscale_db->getScalar( "dout" ); + } + if (greyscale_db->keyExists( "flux" )){ + flux = greyscale_db->getScalar( "flux" ); + } + if (greyscale_db->keyExists( "tolerance" )){ + tolerance = greyscale_db->getScalar( "tolerance" ); + } + auto collision = greyscale_db->getWithDefault( "collision", "IMRT" ); + if (collision == "BGK"){ + CollisionType=2; + } + // ------------------------------------------------------------------------// + + //------------------------ Other Domain parameters ------------------------// + BoundaryCondition = 0; + if (domain_db->keyExists( "BC" )){ + BoundaryCondition = domain_db->getScalar( "BC" ); + } + // ------------------------------------------------------------------------// +} + +void ScaLBL_GreyscaleModel::SetDomain(){ + Dm = std::shared_ptr(new Domain(domain_db,comm)); // full domain for analysis + Mask = std::shared_ptr(new Domain(domain_db,comm)); // mask domain removes immobile phases + // domain parameters + Nx = Dm->Nx; + Ny = Dm->Ny; + Nz = Dm->Nz; + Lx = Dm->Lx; + Ly = Dm->Ly; + Lz = Dm->Lz; + N = Nx*Ny*Nz; + + SignDist.resize(Nx,Ny,Nz); + Velocity_x.resize(Nx,Ny,Nz); + Velocity_y.resize(Nx,Ny,Nz); + Velocity_z.resize(Nx,Ny,Nz); + PorosityMap.resize(Nx,Ny,Nz); + Pressure.resize(Nx,Ny,Nz); + + id = new signed char [N]; + for (int i=0; iid[i] = 1; // initialize this way + MPI_Barrier(comm); + Dm->CommInit(); + MPI_Barrier(comm); + // Read domain parameters + rank = Dm->rank(); + nprocx = Dm->nprocx(); + nprocy = Dm->nprocy(); + nprocz = Dm->nprocz(); +} + +void ScaLBL_GreyscaleModel::ReadInput(){ + + sprintf(LocalRankString,"%05d",rank); + sprintf(LocalRankFilename,"%s%s","ID.",LocalRankString); + sprintf(LocalRestartFile,"%s%s","Restart.",LocalRankString); + + if (domain_db->keyExists( "Filename" )){ + auto Filename = domain_db->getScalar( "Filename" ); + Mask->Decomp(Filename); + } + else{ + if (rank==0) printf("Filename of input image is not found, reading ID.0* instead."); + Mask->ReadIDs(); + } + for (int i=0; iid[i]; // save what was read + + // Generate the signed distance map + // Initialize the domain and communication + Array id_solid(Nx,Ny,Nz); + int count = 0; + // Solve for the position of the solid phase + for (int k=0;kid[n]; + if (label > 0) id_solid(i,j,k) = 1; + else id_solid(i,j,k) = 0; + } + } + } + // Initialize the signed distance function + for (int k=0;kgetVector( "ComponentLabels" ); + auto PorosityList = greyscale_db->getVector( "PorosityList" ); + auto PermeabilityList = greyscale_db->getVector( "PermeabilityList" ); + + NLABELS=LabelList.size(); + if (NLABELS != PorosityList.size()){ + ERROR("Error: ComponentLabels and PorosityList must be the same length! \n"); + } + + double label_count[NLABELS]; + double label_count_global[NLABELS]; + // Assign the labels + + for (int idx=0; idxid[n] = 0; // set mask to zero since this is an immobile component + } + } + int idx = Map(i,j,k); + if (!(idx < 0)){ + if (POROSITY<=0.0){ + ERROR("Error: Porosity for grey voxels must be 0.0 < Porosity <= 1.0 !\n"); + } + else{ + Porosity[idx] = POROSITY; + } + } + } + } + } + + if (NLABELS != PermeabilityList.size()){ + ERROR("Error: ComponentLabels and PermeabilityList must be the same length! \n"); + } + for (int k=1;kid[n] = 0; // set mask to zero since this is an immobile component + } + } + int idx = Map(i,j,k); + if (!(idx < 0)){ + if (PERMEABILITY<=0.0){ + ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); + } + else{ + Permeability[idx] = PERMEABILITY/Dm->voxel_length/Dm->voxel_length; + } + } + } + } + } + + + // Set Dm to match Mask + for (int i=0; iid[i] = Mask->id[i]; + + for (int idx=0; idxComm.sumReduce(label_count[idx]); + + //Initialize a weighted porosity after considering grey voxels + GreyPorosity=0.0; + for (unsigned int idx=0; idxvoxel_length); + printf("Component labels: %lu \n",NLABELS); + for (unsigned int idx=0; idxvoxel_length/Dm->voxel_length,volume_fraction); + printf(" effective porosity=%.3g\n",volume_fraction*POROSITY); + } + printf("The weighted porosity, considering both open and grey voxels, is %.3g\n",GreyPorosity); + } +} + + +void ScaLBL_GreyscaleModel::Create(){ + /* + * This function creates the variables needed to run a LBM + */ + //......................................................... + // don't perform computations at the eight corners + //id[0] = id[Nx-1] = id[(Ny-1)*Nx] = id[(Ny-1)*Nx + Nx-1] = 0; + //id[(Nz-1)*Nx*Ny] = id[(Nz-1)*Nx*Ny+Nx-1] = id[(Nz-1)*Nx*Ny+(Ny-1)*Nx] = id[(Nz-1)*Nx*Ny+(Ny-1)*Nx + Nx-1] = 0; + + //......................................................... + // Initialize communication structures in averaging domain + for (int i=0; iid[i] = Mask->id[i]; + Mask->CommInit(); + Np=Mask->PoreCount(); + //........................................................................... + if (rank==0) printf ("Create ScaLBL_Communicator \n"); + // Create a communicator for the device (will use optimized layout) + // ScaLBL_Communicator ScaLBL_Comm(Mask); // original + ScaLBL_Comm = std::shared_ptr(new ScaLBL_Communicator(Mask)); + + int Npad=(Np/16 + 2)*16; + if (rank==0) printf ("Set up memory efficient layout, %i | %i | %i \n", Np, Npad, N); + Map.resize(Nx,Ny,Nz); Map.fill(-2); + auto neighborList= new int[18*Npad]; + Np = ScaLBL_Comm->MemoryOptimizedLayoutAA(Map,neighborList,Mask->id,Np); + MPI_Barrier(comm); + + //........................................................................... + // MAIN VARIABLES ALLOCATED HERE + //........................................................................... + // LBM variables + if (rank==0) printf ("Allocating distributions \n"); + //......................device distributions................................. + dist_mem_size = Np*sizeof(double); + neighborSize=18*(Np*sizeof(int)); + //........................................................................... + ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); + ScaLBL_AllocateDeviceMemory((void **) &dvcMap, sizeof(int)*Np); + ScaLBL_AllocateDeviceMemory((void **) &fq, 19*dist_mem_size); + ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); + //........................................................................... + // Update GPU data structures + if (rank==0) printf ("Setting up device map and neighbor list \n"); + fflush(stdout); + int *TmpMap; + TmpMap=new int[Np]; + for (int k=1; kLastExterior(); idx++){ + int n = TmpMap[idx]; + if (n > Nx*Ny*Nz){ + printf("Bad value! idx=%i \n"); + TmpMap[idx] = Nx*Ny*Nz-1; + } + } + for (int idx=ScaLBL_Comm->FirstInterior(); idxLastInterior(); idx++){ + int n = TmpMap[idx]; + if (n > Nx*Ny*Nz){ + printf("Bad value! idx=%i \n"); + TmpMap[idx] = Nx*Ny*Nz-1; + } + } + ScaLBL_CopyToDevice(dvcMap, TmpMap, sizeof(int)*Np); + ScaLBL_DeviceBarrier(); + delete [] TmpMap; + + // copy the neighbor list + ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); + // initialize phi based on PhaseLabel (include solid component labels) + double *Poros, *Perm; + Poros = new double[Np]; + Perm = new double[Np]; + AssignComponentLabels(Poros,Perm); + ScaLBL_CopyToDevice(Porosity, Poros, Np*sizeof(double)); + ScaLBL_CopyToDevice(Permeability, Perm, Np*sizeof(double)); +} + + +void ScaLBL_GreyscaleModel::Initialize(){ + if (rank==0) printf ("Initializing distributions \n"); + //TODO: for BGK, you need to consider voxel porosity + // for IMRT, the whole set of feq is different + // if in the future you have different collison mode, need to write two set of initialization functions + if (CollisionType==1){ + ScaLBL_D3Q19_GreyIMRT_Init(fq, Np, Den); + if (rank==0) printf("Collision model: Incompressible MRT.\n"); + } + else if (CollisionType==2){ + ScaLBL_D3Q19_Init(fq, Np); + if (rank==0) printf("Collision model: BGK.\n"); + } + else{ + if (rank==0) printf("Unknown collison type! IMRT collision is used.\n"); + ScaLBL_D3Q19_GreyIMRT_Init(fq, Np, Den); + CollisionType=1; + greyscale_db->putScalar( "collision", "IMRT" ); + } + + if (Restart == true){ + if (rank==0){ + printf("Initializing distributions from Restart! \n"); + } + // Read in the restart file to CPU buffers + std::shared_ptr cfq; + cfq = std::shared_ptr(new double[19*Np],DeleteArray); + FILE *File; + File=fopen(LocalRestartFile,"rb"); + fread(cfq.get(),sizeof(double),19*Np,File); + fclose(File); + + // Copy the restart data to the GPU + ScaLBL_CopyToDevice(fq,cfq.get(),19*Np*sizeof(double)); + ScaLBL_DeviceBarrier(); + + MPI_Barrier(comm); + } +} + +void ScaLBL_GreyscaleModel::Run(){ + int nprocs=nprocx*nprocy*nprocz; + const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); + + int analysis_interval = 1000; // number of timesteps in between in situ analysis + int visualization_interval = 1000; + int restart_interval = 10000; // number of timesteps in between in saving distributions for restart + if (analysis_db->keyExists( "analysis_interval" )){ + analysis_interval = analysis_db->getScalar( "analysis_interval" ); + } + if (analysis_db->keyExists( "visualization_interval" )){ + visualization_interval = analysis_db->getScalar( "visualization_interval" ); + } + if (analysis_db->keyExists( "restart_interval" )){ + restart_interval = analysis_db->getScalar( "restart_interval" ); + } + if (greyscale_db->keyExists( "timestep" )){ + timestep = greyscale_db->getScalar( "timestep" ); + } + + if (rank==0){ + printf("********************************************************\n"); + printf("No. of timesteps: %i \n", timestepMax); + fflush(stdout); + } + + //.......create and start timer............ + double starttime,stoptime,cputime; + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); + starttime = MPI_Wtime(); + //......................................... + + Minkowski Morphology(Mask); + + //************ MAIN ITERATION LOOP ***************************************/ + PROFILE_START("Loop"); + auto current_db = db->cloneDatabase(); + double rlx = 1.0/tau; + double rlx_eff = 1.0/tau_eff; + double error = 1.0; + double flow_rate_previous = 0.0; + while (timestep < timestepMax && error > tolerance) { + //************************************************************************/ + // *************ODD TIMESTEP*************// + timestep++; + ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL + switch (CollisionType){ + case 1: + ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + case 2: + ScaLBL_D3Q19_AAodd_Greyscale(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); + break; + default: + ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + } + ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + // Set BCs + if (BoundaryCondition == 3){ + ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); + ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); + } + switch (CollisionType){ + case 1: + ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + case 2: + ScaLBL_D3Q19_AAodd_Greyscale(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); + break; + default: + ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + } + ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + + // *************EVEN TIMESTEP*************// + timestep++; + ScaLBL_Comm->SendD3Q19AA(fq); //READ FORM NORMAL + switch (CollisionType){ + case 1: + ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + case 2: + ScaLBL_D3Q19_AAeven_Greyscale(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); + break; + default: + ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + } + ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + // Set BCs + if (BoundaryCondition == 3){ + ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); + ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); + } + switch (CollisionType){ + case 1: + ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + case 2: + ScaLBL_D3Q19_AAeven_Greyscale(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); + break; + default: + ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + } + ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + //************************************************************************/ + + if (timestep%analysis_interval==0){ + ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); + ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); + ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); + //ScaLBL_Comm->RegularLayout(Map,Porosity,PorosityMap); + //ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); + + double count_loc=0; + double count; + double vax,vay,vaz; + double vax_loc,vay_loc,vaz_loc; + //double px_loc,py_loc,pz_loc; + //double px,py,pz; + //double mass_loc,mass_glb; + + //parameters for domain average + int64_t i,j,k,n,imin,jmin,kmin,kmax; + // If external boundary conditions are set, do not average over the inlet and outlet + kmin=1; kmax=Nz-1; + //In case user forgets to specify the inlet/outlet buffer layers for BC>0 + if (BoundaryCondition > 0 && Dm->kproc() == 0) kmin=4; + if (BoundaryCondition > 0 && Dm->kproc() == Dm->nprocz()-1) kmax=Nz-4; + + imin=jmin=1; + // If inlet/outlet layers exist use these as default + //if (Dm->inlet_layers_x > 0) imin = Dm->inlet_layers_x; + //if (Dm->inlet_layers_y > 0) jmin = Dm->inlet_layers_y; + if (BoundaryCondition > 0 && Dm->inlet_layers_z > 0 && Dm->kproc() == 0) kmin = 1 + Dm->inlet_layers_z;//"1" indicates the halo layer + if (BoundaryCondition > 0 && Dm->outlet_layers_z > 0 && Dm->kproc() == Dm->nprocz()-1) kmax = Nz-1 - Dm->outlet_layers_z; + +// px_loc = py_loc = pz_loc = 0.f; +// mass_loc = 0.f; +// for (int k=kmin; k 0){ +// px_loc += Velocity_x(i,j,k)*Den*PorosityMap(i,j,k); +// py_loc += Velocity_y(i,j,k)*Den*PorosityMap(i,j,k); +// pz_loc += Velocity_z(i,j,k)*Den*PorosityMap(i,j,k); +// mass_loc += Den*PorosityMap(i,j,k); +// } +// } +// } +// } +// MPI_Allreduce(&px_loc, &px, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// MPI_Allreduce(&py_loc, &py, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// MPI_Allreduce(&pz_loc, &pz, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// MPI_Allreduce(&mass_loc,&mass_glb,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// +// vax = px/mass_glb; +// vay = py/mass_glb; +// vaz = pz/mass_glb; + + vax_loc = vay_loc = vaz_loc = 0.f; + for (int k=kmin; k 0){ + vax_loc += Velocity_x(i,j,k); + vay_loc += Velocity_y(i,j,k); + vaz_loc += Velocity_z(i,j,k); + count_loc+=1.0; + } + } + } + } + //MPI_Allreduce(&vax_loc,&vax,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + //MPI_Allreduce(&vay_loc,&vay,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + //MPI_Allreduce(&vaz_loc,&vaz,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + //MPI_Allreduce(&count_loc,&count,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + + vax = Mask->Comm.sumReduce( vax_loc ); + vay = Mask->Comm.sumReduce( vay_loc ); + vaz = Mask->Comm.sumReduce( vaz_loc ); + count = Mask->Comm.sumReduce( count_loc ); + + vax /= count; + vay /= count; + vaz /= count; + + double force_mag = sqrt(Fx*Fx+Fy*Fy+Fz*Fz); + double dir_x = Fx/force_mag; + double dir_y = Fy/force_mag; + double dir_z = Fz/force_mag; + if (force_mag == 0.0){ + // default to z direction + dir_x = 0.0; + dir_y = 0.0; + dir_z = 1.0; + force_mag = 1.0; + } + //double flow_rate = (px*dir_x + py*dir_y + pz*dir_z)/mass_glb; + double flow_rate = (vax*dir_x + vay*dir_y + vaz*dir_z); + + error = fabs(flow_rate - flow_rate_previous) / fabs(flow_rate); + flow_rate_previous = flow_rate; + + //if (rank==0) printf("Computing Minkowski functionals \n"); + Morphology.ComputeScalar(SignDist,0.f); + //Morphology.PrintAll(); + double mu = (tau-0.5)/3.f; + double Vs = Morphology.V(); + double As = Morphology.A(); + double Hs = Morphology.H(); + double Xs = Morphology.X(); + Vs = Dm->Comm.sumReduce( Vs); + As = Dm->Comm.sumReduce( As); + Hs = Dm->Comm.sumReduce( Hs); + Xs = Dm->Comm.sumReduce( Xs); + + double h = Dm->voxel_length; + //double absperm = h*h*mu*Mask->Porosity()*flow_rate / force_mag; + double absperm = h*h*mu*GreyPorosity*flow_rate / force_mag; + + if (rank==0){ + printf(" AbsPerm = %.5g [micron^2]\n",absperm); + bool WriteHeader=false; + FILE * log_file = fopen("Permeability.csv","r"); + if (log_file != NULL) + fclose(log_file); + else + WriteHeader=true; + log_file = fopen("Permeability.csv","a"); + if (WriteHeader) + fprintf(log_file,"timestep Fx Fy Fz mu Vs As Hs Xs vax vay vaz AbsPerm \n", + timestep,Fx,Fy,Fz,mu,h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz,absperm); + + fprintf(log_file,"%i %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",timestep, Fx, Fy, Fz, mu, + h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz, absperm); + fclose(log_file); + } + } + + if (timestep%visualization_interval==0){ + VelocityField(); + } + + if (timestep%restart_interval==0){ + //Use rank=0 write out Restart.db + if (rank==0) { + greyscale_db->putScalar("timestep",timestep); + greyscale_db->putScalar( "Restart", true ); + current_db->putDatabase("Greyscale", greyscale_db); + std::ofstream OutStream("Restart.db"); + current_db->print(OutStream, ""); + OutStream.close(); + + } + //Write out Restart data. + std::shared_ptr cfq; + cfq = std::shared_ptr(new double[19*Np],DeleteArray); + ScaLBL_CopyToHost(cfq.get(),fq,19*Np*sizeof(double));// Copy restart data to the CPU + + FILE *RESTARTFILE; + RESTARTFILE=fopen(LocalRestartFile,"wb"); + fwrite(cfq.get(),sizeof(double),19*Np,RESTARTFILE); + fclose(RESTARTFILE); + MPI_Barrier(comm); + } + } + + PROFILE_STOP("Loop"); + PROFILE_SAVE("lbpm_greyscale_simulator",1); + //************************************************************************ + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); + stoptime = MPI_Wtime(); + if (rank==0) printf("-------------------------------------------------------------------\n"); + // Compute the walltime per timestep + cputime = (stoptime - starttime)/timestep; + // Performance obtained from each node + double MLUPS = double(Np)/cputime/1000000; + + if (rank==0) printf("********************************************************\n"); + if (rank==0) printf("CPU time = %f \n", cputime); + if (rank==0) printf("Lattice update rate (per core)= %f MLUPS \n", MLUPS); + MLUPS *= nprocs; + if (rank==0) printf("Lattice update rate (total)= %f MLUPS \n", MLUPS); + if (rank==0) printf("********************************************************\n"); + + // ************************************************************************ +} + +void ScaLBL_GreyscaleModel::VelocityField(){ + +/* Minkowski Morphology(Mask); + int SIZE=Np*sizeof(double); + ScaLBL_D3Q19_Momentum(fq,Velocity, Np); + ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + ScaLBL_CopyToHost(&VELOCITY[0],&Velocity[0],3*SIZE); + + memcpy(Morphology.SDn.data(), Distance.data(), Nx*Ny*Nz*sizeof(double)); + Morphology.Initialize(); + Morphology.UpdateMeshValues(); + Morphology.ComputeLocal(); + Morphology.Reduce(); + + double count_loc=0; + double count; + double vax,vay,vaz; + double vax_loc,vay_loc,vaz_loc; + vax_loc = vay_loc = vaz_loc = 0.f; + for (int n=0; nLastExterior(); n++){ + vax_loc += VELOCITY[n]; + vay_loc += VELOCITY[Np+n]; + vaz_loc += VELOCITY[2*Np+n]; + count_loc+=1.0; + } + + for (int n=ScaLBL_Comm->FirstInterior(); nLastInterior(); n++){ + vax_loc += VELOCITY[n]; + vay_loc += VELOCITY[Np+n]; + vaz_loc += VELOCITY[2*Np+n]; + count_loc+=1.0; + } + MPI_Allreduce(&vax_loc,&vax,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + MPI_Allreduce(&vay_loc,&vay,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + MPI_Allreduce(&vaz_loc,&vaz,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + MPI_Allreduce(&count_loc,&count,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + + vax /= count; + vay /= count; + vaz /= count; + + double mu = (tau-0.5)/3.f; + if (rank==0) printf("Fx Fy Fz mu Vs As Js Xs vx vy vz\n"); + if (rank==0) printf("%.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",Fx, Fy, Fz, mu, + Morphology.V(),Morphology.A(),Morphology.J(),Morphology.X(),vax,vay,vaz); + */ + + std::vector visData; + fillHalo fillData(Dm->Comm,Dm->rank_info,{Dm->Nx-2,Dm->Ny-2,Dm->Nz-2},{1,1,1},0,1); + + auto VxVar = std::make_shared(); + auto VyVar = std::make_shared(); + auto VzVar = std::make_shared(); + auto SignDistVar = std::make_shared(); + auto PressureVar = std::make_shared(); + + IO::initialize("","silo","false"); + // Create the MeshDataStruct + visData.resize(1); + visData[0].meshName = "domain"; + visData[0].mesh = std::make_shared( Dm->rank_info,Dm->Nx-2,Dm->Ny-2,Dm->Nz-2,Dm->Lx,Dm->Ly,Dm->Lz ); + SignDistVar->name = "SignDist"; + SignDistVar->type = IO::VariableType::VolumeVariable; + SignDistVar->dim = 1; + SignDistVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(SignDistVar); + + VxVar->name = "Velocity_x"; + VxVar->type = IO::VariableType::VolumeVariable; + VxVar->dim = 1; + VxVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(VxVar); + VyVar->name = "Velocity_y"; + VyVar->type = IO::VariableType::VolumeVariable; + VyVar->dim = 1; + VyVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(VyVar); + VzVar->name = "Velocity_z"; + VzVar->type = IO::VariableType::VolumeVariable; + VzVar->dim = 1; + VzVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(VzVar); + + PressureVar->name = "Pressure"; + PressureVar->type = IO::VariableType::VolumeVariable; + PressureVar->dim = 1; + PressureVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(PressureVar); + + Array& SignData = visData[0].vars[0]->data; + Array& VelxData = visData[0].vars[1]->data; + Array& VelyData = visData[0].vars[2]->data; + Array& VelzData = visData[0].vars[3]->data; + Array& PressureData = visData[0].vars[4]->data; + + ASSERT(visData[0].vars[0]->name=="SignDist"); + ASSERT(visData[0].vars[1]->name=="Velocity_x"); + ASSERT(visData[0].vars[2]->name=="Velocity_y"); + ASSERT(visData[0].vars[3]->name=="Velocity_z"); + ASSERT(visData[0].vars[4]->name=="Pressure"); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); + ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); + ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); + ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); + + fillData.copy(SignDist,SignData); + fillData.copy(Velocity_x,VelxData); + fillData.copy(Velocity_y,VelyData); + fillData.copy(Velocity_z,VelzData); + fillData.copy(Pressure,PressureData); + + IO::writeData( timestep, visData, Dm->Comm ); + +} + +void ScaLBL_GreyscaleModel::WriteDebug(){ + // Copy back final phase indicator field and convert to regular layout + DoubleArray PhaseField(Nx,Ny,Nz); + + //ScaLBL_CopyToHost(Porosity.data(), Poros, sizeof(double)*N); + +// FILE *OUTFILE; +// sprintf(LocalRankFilename,"Phase.%05i.raw",rank); +// OUTFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,OUTFILE); +// fclose(OUTFILE); +// +// ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); +// FILE *AFILE; +// sprintf(LocalRankFilename,"A.%05i.raw",rank); +// AFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,AFILE); +// fclose(AFILE); +// +// ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); +// FILE *BFILE; +// sprintf(LocalRankFilename,"B.%05i.raw",rank); +// BFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,BFILE); +// fclose(BFILE); +// +// ScaLBL_Comm->RegularLayout(Map,Pressure,PhaseField); +// FILE *PFILE; +// sprintf(LocalRankFilename,"Pressure.%05i.raw",rank); +// PFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,PFILE); +// fclose(PFILE); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[0],PhaseField); + FILE *VELX_FILE; + sprintf(LocalRankFilename,"Velocity_X.%05i.raw",rank); + VELX_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,VELX_FILE); + fclose(VELX_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],PhaseField); + FILE *VELY_FILE; + sprintf(LocalRankFilename,"Velocity_Y.%05i.raw",rank); + VELY_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,VELY_FILE); + fclose(VELY_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],PhaseField); + FILE *VELZ_FILE; + sprintf(LocalRankFilename,"Velocity_Z.%05i.raw",rank); + VELZ_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,VELZ_FILE); + fclose(VELZ_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Porosity[0],PhaseField); + FILE *POROS_FILE; + sprintf(LocalRankFilename,"Porosity.%05i.raw",rank); + POROS_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,POROS_FILE); + fclose(POROS_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Permeability[0],PhaseField); + FILE *PERM_FILE; + sprintf(LocalRankFilename,"Permeability.%05i.raw",rank); + PERM_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,PERM_FILE); + fclose(PERM_FILE); +} diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h new file mode 100644 index 00000000..a99925b1 --- /dev/null +++ b/models/GreyscaleColorModel.h @@ -0,0 +1,92 @@ +/* +Implementation of color lattice boltzmann model + */ +#include +#include +#include +#include +#include +#include +#include + +#include "common/Communication.h" +#include "common/MPI.h" +#include "common/Database.h" +#include "common/ScaLBL.h" +#include "ProfilerApp.h" +#include "threadpool/thread_pool.h" + +class ScaLBL_GreyscaleModel{ +public: + ScaLBL_GreyscaleModel(int RANK, int NP, MPI_Comm COMM); + ~ScaLBL_GreyscaleModel(); + + // functions in they should be run + void ReadParams(string filename); + void ReadParams(std::shared_ptr db0); + void SetDomain(); + void ReadInput(); + void Create(); + void Initialize(); + void Run(); + void WriteDebug(); + void VelocityField(); + + bool Restart,pBC; + int timestep,timestepMax; + int BoundaryCondition; + int CollisionType; + double tau; + double tau_eff; + double Den;//constant density + double tolerance; + double Fx,Fy,Fz,flux; + double din,dout; + double dp;//solid particle diameter, unit in voxel + double GreyPorosity; + + int Nx,Ny,Nz,N,Np; + int rank,nprocx,nprocy,nprocz,nprocs; + double Lx,Ly,Lz; + + std::shared_ptr Dm; // this domain is for analysis + std::shared_ptr Mask; // this domain is for lbm + std::shared_ptr ScaLBL_Comm; + + // input database + std::shared_ptr db; + std::shared_ptr domain_db; + std::shared_ptr greyscale_db; + std::shared_ptr analysis_db; + std::shared_ptr vis_db; + + signed char *id; + int *NeighborList; + int *dvcMap; + double *fq; + double *Permeability;//grey voxel permeability + double *Porosity; + double *Velocity; + double *Pressure_dvc; + IntArray Map; + DoubleArray SignDist; + DoubleArray Velocity_x; + DoubleArray Velocity_y; + DoubleArray Velocity_z; + DoubleArray PorosityMap; + DoubleArray Pressure; + +private: + MPI_Comm comm; + + int dist_mem_size; + int neighborSize; + // filenames + char LocalRankString[8]; + char LocalRankFilename[40]; + char LocalRestartFile[40]; + + void AssignComponentLabels(double *Porosity, double *Permeablity); + +}; + From cc14324c33f4e8c7da2416532034009533031c79 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Tue, 7 Apr 2020 15:29:33 -0400 Subject: [PATCH 06/75] GPU version ONLY; two-phase greyscale model; save the work --- common/ScaLBL.h | 21 + cpu/D3Q19.cpp | 27 - cpu/Greyscale.cpp | 27 + gpu/D3Q19.cu | 38 - gpu/Greyscale.cu | 38 + gpu/GreyscaleColor.cu | 1590 +++++++++++++++++++++++ models/GreyscaleColorModel.cpp | 864 +++++++----- models/GreyscaleColorModel.h | 31 +- models/GreyscaleModel.cpp | 33 +- models/GreyscaleModel.h | 1 - tests/CMakeLists.txt | 1 + tests/lbpm_greyscaleColor_simulator.cpp | 59 + 12 files changed, 2282 insertions(+), 448 deletions(-) create mode 100644 gpu/GreyscaleColor.cu create mode 100644 tests/lbpm_greyscaleColor_simulator.cpp diff --git a/common/ScaLBL.h b/common/ScaLBL.h index d3833bcb..df87fcc4 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -72,6 +72,27 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, int extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz, double *Poros,double *Perm, double *Velocity,double Den,double *Pressure); +// GREYSCALE COLOR MODEL + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(double *dist, double *Aq, double *Bq, double *Den, + double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure); + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, + double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure); + +extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, int start, int finish, int Np); + +extern "C" void ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np); + +extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *NeighborList, double *Aq, double *Bq, double *Den, int start, int finish, int Np); + +extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, int start, int finish, int Np); + +extern "C" void ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np); // MRT MODEL extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_setA, double rlx_setB, double Fx, diff --git a/cpu/D3Q19.cpp b/cpu/D3Q19.cpp index 2c0e686d..564eb96d 100644 --- a/cpu/D3Q19.cpp +++ b/cpu/D3Q19.cpp @@ -84,33 +84,6 @@ extern "C" void ScaLBL_D3Q19_Init(double *dist, int Np) } } - -extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den) -{ - int n; - for (n=0; n>>(dist, Np, Den); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyIMRT_Init: %s \n",cudaGetErrorString(err)); - } -} extern "C" void ScaLBL_D3Q19_Swap(char *ID, double *disteven, double *distodd, int Nx, int Ny, int Nz){ dvc_ScaLBL_D3Q19_Swap<<>>(ID, disteven, distodd, Nx, Ny, Nz); diff --git a/gpu/Greyscale.cu b/gpu/Greyscale.cu index 0a9a63e0..a3fba989 100644 --- a/gpu/Greyscale.cu +++ b/gpu/Greyscale.cu @@ -1590,6 +1590,37 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double } } +__global__ void dvc_ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den) +{ + int n; + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s>>(dist, Np, Den); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_GreyIMRT_Init: %s \n",cudaGetErrorString(err)); + } +} diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu new file mode 100644 index 00000000..c9586d3c --- /dev/null +++ b/gpu/GreyscaleColor.cu @@ -0,0 +1,1590 @@ +#include + +#define NBLOCKS 1024 +#define NTHREADS 256 + +__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(double *dist, double *Aq, double *Bq, double *Den, + double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure){ + + int n; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + // currently disable 'GeoFun' + double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double tau,tau_eff,rlx_setA,rlx_setB; + double mu_eff;//effective kinematic viscosity for Darcy term + double rho0; + double phi; + double nx,ny,nz,C; + double nA,nB; + double a1,b1,a2,b2,nAB,delta; + double beta=0.95; + double nA_gradx,nA_grady,nA_gradz; + double nB_gradx,nB_grady,nB_gradz; + double Gff_x,Gff_y,Gff_z; + double Gfs_x,Gfs_y,Gfs_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; s0.0)-Gsc*nB*nA_gradx*int(phi<0.0); + Gff_y = -Gsc*nA*nB_grady*int(phi>0.0)-Gsc*nB*nA_grady*int(phi<0.0); + Gff_z = -Gsc*nA*nB_gradz*int(phi>0.0)-Gsc*nB*nA_gradz*int(phi<0.0); + // fluid-solid force + Gfs_x = (nA-nB)*SolidForce[n+0*Np]; + Gfs_y = (nA-nB)*SolidForce[n+1*Np]; + Gfs_z = (nA-nB)*SolidForce[n+2*Np]; + + porosity = Poros[n]; + // use local saturation as an estimation of effective relperm values + perm = Perm[n]*nA/(nA+nB)*int(phi>0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); + vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); + vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); + if (porosity==1.0){ + Fx=rho0*(Gx + Gff_x + Gfs_x); + Fy=rho0*(Gy + Gff_y + Gfs_y); + Fz=rho0*(Gz + Gff_z + Gfs_z); + } + + //Calculate pressure for Incompressible-MRT model + pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); + +// //..............carry out relaxation process............................................... +// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; +// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; +// jx = jx + Fx; +// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +// jy = jy + Fy; +// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +// jz = jz + Fz; +// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) +// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; +// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) +// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; +// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) +// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; +// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) +// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; +// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) +// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; +// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) +// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; +// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) +// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); +// //....................................................................................................... + + //-------------------- IMRT collison where body force has NO higher-order terms -------------// + //..............carry out relaxation process............................................... + m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); + m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); + m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); + m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); + m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + dist[1*Np+n] = fq; + + // q=2 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + dist[2*Np+n] = fq; + + // q = 3 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + dist[3*Np+n] = fq; + + // q = 4 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + dist[4*Np+n] = fq; + + // q = 5 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + dist[5*Np+n] = fq; + + // q = 6 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + dist[6*Np+n] = fq; + + // q = 7 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + dist[7*Np+n] = fq; + + // q = 8 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); + dist[8*Np+n] = fq; + + // q = 9 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + dist[9*Np+n] = fq; + + // q = 10 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + dist[10*Np+n] = fq; + + // q = 11 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); + dist[11*Np+n] = fq; + + // q = 12 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + dist[12*Np+n] = fq; + + // q = 13 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); + dist[13*Np+n] = fq; + + // q= 14 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); + dist[14*Np+n] = fq; + + // q = 15 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + dist[15*Np+n] = fq; + + // q = 16 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + dist[16*Np+n] = fq; + + // q = 17 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + dist[17*Np+n] = fq; + + // q = 18 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + dist[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] = pressure; + + //-----------------------Mass transport------------------------// + // Calculate the color gradient + nx = (2*nB*nA_gradx-2*nA*nB_gradx)/(nA+nB)/(nA+nB); + ny = (2*nB*nA_grady-2*nA*nB_grady)/(nA+nB)/(nA+nB); + nz = (2*nB*nA_gradz-2*nA*nB_gradz)/(nA+nB)/(nA+nB); + //...........Normalize the Color Gradient................................. + C = sqrt(nx*nx+ny*ny+nz*nz); + double ColorMag = C; + if (C==0.0) ColorMag=1.0; + nx = nx/ColorMag; + ny = ny/ColorMag; + nz = nz/ColorMag; + if (C == 0.0) nx = ny = nz = 0.0; + + // Instantiate mass transport distributions + // Stationary value - distribution 0 + nAB = 1.0/(nA+nB); + Aq[n] = 0.3333333333333333*nA; + Bq[n] = 0.3333333333333333*nB; + + //............................................... + // q = 0,2,4 + // Cq = {1,0,0}, {0,1,0}, {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nx; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; + + Aq[1*Np+n] = a1; + Bq[1*Np+n] = b1; + Aq[2*Np+n] = a2; + Bq[2*Np+n] = b2; + + //............................................... + // q = 2 + // Cq = {0,1,0} + delta = beta*nA*nB*nAB*0.1111111111111111*ny; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; + + Aq[3*Np+n] = a1; + Bq[3*Np+n] = b1; + Aq[4*Np+n] = a2; + Bq[4*Np+n] = b2; + //............................................... + // q = 4 + // Cq = {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nz; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; + + Aq[5*Np+n] = a1; + Bq[5*Np+n] = b1; + Aq[6*Np+n] = a2; + Bq[6*Np+n] = b2; + //............................................... + + } + } +} + +__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, + double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure){ + + int n, nread, nr1,nr2,nr3,nr4,nr5,nr6; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + // currently disable 'GeoFun' + double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double tau,tau_eff,rlx_setA,rlx_setB; + double mu_eff;//effective kinematic viscosity for Darcy term + double rho0; + double phi; + double nx,ny,nz,C; + double nA,nB; + double a1,b1,a2,b2,nAB,delta; + double beta=0.95; + double nA_gradx,nA_grady,nA_gradz; + double nB_gradx,nB_grady,nB_gradz; + double Gff_x,Gff_y,Gff_z; + double Gfs_x,Gfs_y,Gfs_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 10Np => odd part of dist) + fq = dist[nr1]; // reading the f1 data into register fq + pressure = fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jx = fq; + m4 = -4.0*fq; + m9 = 2.0*fq; + m10 = -4.0*fq; + + // q=2 + nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nr2]; // reading the f2 data into register fq + pressure += fq; + m1 -= 11.0*(fq); + m2 -= 4.0*(fq); + jx -= fq; + m4 += 4.0*(fq); + m9 += 2.0*(fq); + m10 -= 4.0*(fq); + + // q=3 + nr3 = neighborList[n+2*Np]; // neighbor 4 + fq = dist[nr3]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy = fq; + m6 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 = fq; + m12 = -2.0*fq; + + // q = 4 + nr4 = neighborList[n+3*Np]; // neighbor 3 + fq = dist[nr4]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy -= fq; + m6 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 += fq; + m12 -= 2.0*fq; + + // q=5 + nr5 = neighborList[n+4*Np]; + fq = dist[nr5]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz = fq; + m8 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q = 6 + nr6 = neighborList[n+5*Np]; + fq = dist[nr6]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz -= fq; + m8 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q=7 + nread = neighborList[n+6*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 = fq; + m16 = fq; + m17 = -fq; + + // q = 8 + nread = neighborList[n+7*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 += fq; + m16 -= fq; + m17 += fq; + + // q=9 + nread = neighborList[n+8*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 += fq; + m17 += fq; + + // q = 10 + nread = neighborList[n+9*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 -= fq; + m17 -= fq; + + // q=11 + nread = neighborList[n+10*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 = fq; + m16 -= fq; + m18 = fq; + + // q=12 + nread = neighborList[n+11*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 += fq; + m16 += fq; + m18 -= fq; + + // q=13 + nread = neighborList[n+12*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 -= fq; + m18 -= fq; + + // q=14 + nread = neighborList[n+13*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 += fq; + m18 += fq; + + // q=15 + nread = neighborList[n+14*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 = fq; + m17 += fq; + m18 -= fq; + + // q=16 + nread = neighborList[n+15*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 += fq; + m17 -= fq; + m18 += fq; + + // q=17 + nread = neighborList[n+16*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 += fq; + m18 += fq; + + // q=18 + nread = neighborList[n+17*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 -= fq; + m18 -= fq; + //---------------------------------------------------------------------// + + //---------------- Calculate SC fluid-fluid and fluid-solid forces ---------------// + // fluid-fluid force + Gff_x = -Gsc*nA*nB_gradx*int(phi>0.0)-Gsc*nB*nA_gradx*int(phi<0.0); + Gff_y = -Gsc*nA*nB_grady*int(phi>0.0)-Gsc*nB*nA_grady*int(phi<0.0); + Gff_z = -Gsc*nA*nB_gradz*int(phi>0.0)-Gsc*nB*nA_gradz*int(phi<0.0); + // fluid-solid force + Gfs_x = (nA-nB)*SolidForce[n+0*Np]; + Gfs_y = (nA-nB)*SolidForce[n+1*Np]; + Gfs_z = (nA-nB)*SolidForce[n+2*Np]; + + porosity = Poros[n]; + // use local saturation as an estimation of effective relperm values + perm = Perm[n]*nA/(nA+nB)*int(phi>0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); + vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); + vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); + if (porosity==1.0){ + Fx=rho0*(Gx + Gff_x + Gfs_x); + Fy=rho0*(Gy + Gff_y + Gfs_y); + Fz=rho0*(Gz + Gff_z + Gfs_z); + } + + //Calculate pressure for Incompressible-MRT model + pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); + +// //..............carry out relaxation process............................................... +// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; +// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; +// jx = jx + Fx; +// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +// jy = jy + Fy; +// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +// jz = jz + Fz; +// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) +// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; +// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) +// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; +// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) +// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; +// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) +// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; +// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) +// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; +// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) +// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; +// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) +// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); +// //....................................................................................................... + + //-------------------- IMRT collison where body force has NO higher-order terms -------------// + //..............carry out relaxation process............................................... + m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); + m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); + m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); + m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); + m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... + + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + //nread = neighborList[n+Np]; + dist[nr2] = fq; + + // q=2 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + //nread = neighborList[n]; + dist[nr1] = fq; + + // q = 3 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+3*Np]; + dist[nr4] = fq; + + // q = 4 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+2*Np]; + dist[nr3] = fq; + + // q = 5 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+5*Np]; + dist[nr6] = fq; + + // q = 6 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+4*Np]; + dist[nr5] = fq; + + // q = 7 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + nread = neighborList[n+7*Np]; + dist[nread] = fq; + + // q = 8 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); + nread = neighborList[n+6*Np]; + dist[nread] = fq; + + // q = 9 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + nread = neighborList[n+9*Np]; + dist[nread] = fq; + + // q = 10 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + nread = neighborList[n+8*Np]; + dist[nread] = fq; + + // q = 11 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); + nread = neighborList[n+11*Np]; + dist[nread] = fq; + + // q = 12 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + nread = neighborList[n+10*Np]; + dist[nread]= fq; + + // q = 13 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); + nread = neighborList[n+13*Np]; + dist[nread] = fq; + + // q= 14 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); + nread = neighborList[n+12*Np]; + dist[nread] = fq; + + // q = 15 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + nread = neighborList[n+15*Np]; + dist[nread] = fq; + + // q = 16 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + nread = neighborList[n+14*Np]; + dist[nread] = fq; + + // q = 17 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + nread = neighborList[n+17*Np]; + dist[nread] = fq; + + // q = 18 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + nread = neighborList[n+16*Np]; + dist[nread] = fq; + //........................................................................ + + //Update velocity on device + Velocity[0*Np+n] = ux; + Velocity[1*Np+n] = uy; + Velocity[2*Np+n] = uz; + //Update pressure on device + Pressure[n] = pressure; + + //-----------------------Mass transport------------------------// + // Calculate the color gradient + nx = (2*nB*nA_gradx-2*nA*nB_gradx)/(nA+nB)/(nA+nB); + ny = (2*nB*nA_grady-2*nA*nB_grady)/(nA+nB)/(nA+nB); + nz = (2*nB*nA_gradz-2*nA*nB_gradz)/(nA+nB)/(nA+nB); + //...........Normalize the Color Gradient................................. + C = sqrt(nx*nx+ny*ny+nz*nz); + double ColorMag = C; + if (C==0.0) ColorMag=1.0; + nx = nx/ColorMag; + ny = ny/ColorMag; + nz = nz/ColorMag; + if (C == 0.0) nx = ny = nz = 0.0; + + // Instantiate mass transport distributions + // Stationary value - distribution 0 + nAB = 1.0/(nA+nB); + Aq[n] = 0.3333333333333333*nA; + Bq[n] = 0.3333333333333333*nB; + + //............................................... + // q = 0,2,4 + // Cq = {1,0,0}, {0,1,0}, {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nx; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; + + // q = 1 + //nread = neighborList[n+Np]; + Aq[nr2] = a1; + Bq[nr2] = b1; + // q=2 + //nread = neighborList[n]; + Aq[nr1] = a2; + Bq[nr1] = b2; + + //............................................... + // Cq = {0,1,0} + delta = beta*nA*nB*nAB*0.1111111111111111*ny; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; + + // q = 3 + //nread = neighborList[n+3*Np]; + Aq[nr4] = a1; + Bq[nr4] = b1; + // q = 4 + //nread = neighborList[n+2*Np]; + Aq[nr3] = a2; + Bq[nr3] = b2; + + //............................................... + // q = 4 + // Cq = {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nz; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; + + // q = 5 + //nread = neighborList[n+5*Np]; + Aq[nr6] = a1; + Bq[nr6] = b1; + // q = 6 + //nread = neighborList[n+4*Np]; + Aq[nr5] = a2; + Bq[nr5] = b2; + //............................................... + } + } +} + +__global__ void dvc_ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np){ + int n; + int S = Np/NBLOCKS/NTHREADS + 1; + double phi; + double nA,nB; + double Den0; + for (int s=0; s>>(dist, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, start, finish, Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, Gsc, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleColor: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, + double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure){ + + dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor<<>>(neighborList, dist, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, start, finish, Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, Gsc, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleColor: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, int start, int finish, int Np){ + dvc_ScaLBL_D3Q7_GreyColorIMRT_Init<<>>(Den, Aq, Bq, start, finish, Np); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q7_GreyColorIMRT_Init: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np){ + dvc_ScaLBL_D3Q19_GreyColorIMRT_Init<<>>(dist,Den,rhoA,rhoB,Np); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_GreyColorIMRT_Init: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *NeighborList, double *Aq, double *Bq, double *Den, int start, int finish, int Np){ + + dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorDensity<<>>(NeighborList, Aq, Bq, Den, start, finish, Np); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q7_AAodd_GreyscaleColorDensity: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, int start, int finish, int Np){ + + dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorDensity<<>>(Aq, Bq, Den, start, finish, Np); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q7_AAeven_GreyscaleColorDensity: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np){ + + dvc_ScaLBL_D3Q19_GreyscaleColor_Gradient<<>>(neighborList, Den, DenGrad, start, finish, Np); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_GreyscaleColor_Gradient: %s \n",cudaGetErrorString(err)); + } +} + diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 11d92c80..421805c5 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -1,7 +1,7 @@ /* Greyscale lattice boltzmann model */ -#include "models/GreyscaleModel.h" +#include "models/GreyscaleColorModel.h" #include "analysis/distance.h" #include "analysis/morphology.h" #include @@ -13,77 +13,90 @@ void DeleteArray( const TYPE *p ) delete [] p; } -ScaLBL_GreyscaleModel::ScaLBL_GreyscaleModel(int RANK, int NP, MPI_Comm COMM): -rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tau(0),tau_eff(0),Den(0),Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),GreyPorosity(0), +ScaLBL_GreyscaleColorModel::ScaLBL_GreyscaleColorModel(int RANK, int NP, MPI_Comm COMM): +rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0),rhoA(0),rhoB(0),Gsc(0), +Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),GreyPorosity(0), Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) { SignDist.resize(Nx,Ny,Nz); SignDist.fill(0); } -ScaLBL_GreyscaleModel::~ScaLBL_GreyscaleModel(){ +ScaLBL_GreyscaleColorModel::~ScaLBL_GreyscaleColorModel(){ } -void ScaLBL_GreyscaleModel::ReadParams(string filename){ +void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ // read the input database db = std::make_shared( filename ); domain_db = db->getDatabase( "Domain" ); - greyscale_db = db->getDatabase( "Greyscale" ); + greyscaleColor_db = db->getDatabase( "GreyscaleColor" ); analysis_db = db->getDatabase( "Analysis" ); vis_db = db->getDatabase( "Visualization" ); // set defaults timestepMax = 100000; - tau = 1.0; - tau_eff = tau; - Den = 1.0;//constant density + tauA = 1.0; + tauB = 1.0; + tauA_eff = tauA;//the effective viscosity of the Darcy term + tauB_eff = tauB; + rhoA = 1.0;//constant molecular mass (after LB scaling) + rhoB = 1.0; tolerance = 0.01; Fx = Fy = Fz = 0.0; Restart=false; din=dout=1.0; flux=0.0; dp = 10.0; //unit of 'dp': voxel - CollisionType = 1; //1: IMRT; 2: BGK // ---------------------- Greyscale Model parameters -----------------------// - if (greyscale_db->keyExists( "timestepMax" )){ - timestepMax = greyscale_db->getScalar( "timestepMax" ); + if (greyscaleColor_db->keyExists( "timestepMax" )){ + timestepMax = greyscaleColor_db->getScalar( "timestepMax" ); } - if (greyscale_db->keyExists( "tau" )){ - tau = greyscale_db->getScalar( "tau" ); + if (greyscaleColor_db->keyExists( "tauA" )){ + tauA = greyscaleColor_db->getScalar( "tauA" ); } - tau_eff = greyscale_db->getWithDefault( "tau_eff", tau ); - if (greyscale_db->keyExists( "Den" )){ - Den = greyscale_db->getScalar( "Den" ); + if (greyscaleColor_db->keyExists( "tauB" )){ + tauB = greyscaleColor_db->getScalar( "tauB" ); } - if (greyscale_db->keyExists( "dp" )){ - dp = greyscale_db->getScalar( "dp" ); + tauA_eff = greyscaleColor_db->getWithDefault( "tauA_eff", tauA); + tauB_eff = greyscaleColor_db->getWithDefault( "tauB_eff", tauB); + if (greyscaleColor_db->keyExists( "rhoA" )){ + rhoA = greyscaleColor_db->getScalar( "rhoA" ); } - if (greyscale_db->keyExists( "F" )){ - Fx = greyscale_db->getVector( "F" )[0]; - Fy = greyscale_db->getVector( "F" )[1]; - Fz = greyscale_db->getVector( "F" )[2]; + if (greyscaleColor_db->keyExists( "rhoB" )){ + rhoB = greyscaleColor_db->getScalar( "rhoB" ); } - if (greyscale_db->keyExists( "Restart" )){ - Restart = greyscale_db->getScalar( "Restart" ); + if (greyscaleColor_db->keyExists( "Gsc" )){ + Gsc = greyscaleColor_db->getScalar( "Gsc" ); } - if (greyscale_db->keyExists( "din" )){ - din = greyscale_db->getScalar( "din" ); + if (greyscaleColor_db->keyExists( "dp" )){ + dp = greyscaleColor_db->getScalar( "dp" ); } - if (greyscale_db->keyExists( "dout" )){ - dout = greyscale_db->getScalar( "dout" ); + if (greyscaleColor_db->keyExists( "F" )){ + Fx = greyscaleColor_db->getVector( "F" )[0]; + Fy = greyscaleColor_db->getVector( "F" )[1]; + Fz = greyscaleColor_db->getVector( "F" )[2]; } - if (greyscale_db->keyExists( "flux" )){ - flux = greyscale_db->getScalar( "flux" ); + if (greyscaleColor_db->keyExists( "Restart" )){ + Restart = greyscaleColor_db->getScalar( "Restart" ); } - if (greyscale_db->keyExists( "tolerance" )){ - tolerance = greyscale_db->getScalar( "tolerance" ); + if (greyscaleColor_db->keyExists( "din" )){ + din = greyscaleColor_db->getScalar( "din" ); } - auto collision = greyscale_db->getWithDefault( "collision", "IMRT" ); - if (collision == "BGK"){ - CollisionType=2; + if (greyscaleColor_db->keyExists( "dout" )){ + dout = greyscaleColor_db->getScalar( "dout" ); } + if (greyscaleColor_db->keyExists( "flux" )){ + flux = greyscaleColor_db->getScalar( "flux" ); + } + if (greyscaleColor_db->keyExists( "tolerance" )){ + tolerance = greyscaleColor_db->getScalar( "tolerance" ); + } + //auto collision = greyscaleColor_db->getWithDefault( "collision", "IMRT" ); + //if (collision == "BGK"){ + // CollisionType=2; + //} // ------------------------------------------------------------------------// //------------------------ Other Domain parameters ------------------------// @@ -94,7 +107,7 @@ void ScaLBL_GreyscaleModel::ReadParams(string filename){ // ------------------------------------------------------------------------// } -void ScaLBL_GreyscaleModel::SetDomain(){ +void ScaLBL_GreyscaleColorModel::SetDomain(){ Dm = std::shared_ptr(new Domain(domain_db,comm)); // full domain for analysis Mask = std::shared_ptr(new Domain(domain_db,comm)); // mask domain removes immobile phases // domain parameters @@ -125,7 +138,7 @@ void ScaLBL_GreyscaleModel::SetDomain(){ nprocz = Dm->nprocz(); } -void ScaLBL_GreyscaleModel::ReadInput(){ +void ScaLBL_GreyscaleColorModel::ReadInput(){ sprintf(LocalRankString,"%05d",rank); sprintf(LocalRankFilename,"%s%s","ID.",LocalRankString); @@ -174,44 +187,151 @@ void ScaLBL_GreyscaleModel::ReadInput(){ if (rank == 0) cout << "Domain set." << endl; } -/******************************************************** - * AssignComponentLabels * - ********************************************************/ -void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, double *Permeability) +void ScaLBL_GreyscaleColorModel::AssignSolidForce(double *SolidPotential, double *SolidForce){ + + double *Dst; + Dst = new double [3*3*3]; + for (int kk=0; kk<3; kk++){ + for (int jj=0; jj<3; jj++){ + for (int ii=0; ii<3; ii++){ + int index = kk*9+jj*3+ii; + Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); + } + } + } + double w_face = 1.f/18.f; + double w_edge = 1.f/36.f; + double w_corner = 0.f; + //local + Dst[13] = 0.f; + //faces + Dst[4] = w_face; + Dst[10] = w_face; + Dst[12] = w_face; + Dst[14] = w_face; + Dst[16] = w_face; + Dst[22] = w_face; + // corners + Dst[0] = w_corner; + Dst[2] = w_corner; + Dst[6] = w_corner; + Dst[8] = w_corner; + Dst[18] = w_corner; + Dst[20] = w_corner; + Dst[24] = w_corner; + Dst[26] = w_corner; + // edges + Dst[1] = w_edge; + Dst[3] = w_edge; + Dst[5] = w_edge; + Dst[7] = w_edge; + Dst[9] = w_edge; + Dst[11] = w_edge; + Dst[15] = w_edge; + Dst[17] = w_edge; + Dst[19] = w_edge; + Dst[21] = w_edge; + Dst[23] = w_edge; + Dst[25] = w_edge; + + for (int k=1; kid[nn] <= 0)||(Mask->id[nn]>=3)){ + double vec_x = double(ii-1); + double vec_y = double(jj-1); + double vec_z = double(kk-1); + double GWNS=SolidPotential[nn]; + phi_x += GWNS*weight*vec_x; + phi_y += GWNS*weight*vec_y; + phi_z += GWNS*weight*vec_z; + } + } + } + } + SolidForce[idx] = phi_x; + SolidForce[idx+Np] = phi_y; + SolidForce[idx+2*Np] = phi_z; + } + } + } + } + delete [] Dst; +} + + +void ScaLBL_GreyscaleColorModel::AssignComponentLabels(double *Porosity, double *Permeability, double *SolidPotential) { size_t NLABELS=0; signed char VALUE=0; double POROSITY=0.f; double PERMEABILITY=0.f; + double AFFINITY=0.f; - auto LabelList = greyscale_db->getVector( "ComponentLabels" ); - auto PorosityList = greyscale_db->getVector( "PorosityList" ); - auto PermeabilityList = greyscale_db->getVector( "PermeabilityList" ); + auto LabelList = greyscaleColor_db->getVector( "ComponentLabels" ); + auto AffinityList = greyscaleColor_db->getVector( "ComponentAffinity" ); + auto PorosityList = greyscaleColor_db->getVector( "PorosityList" ); + auto PermeabilityList = greyscaleColor_db->getVector( "PermeabilityList" ); + + //1. Requirement for "ComponentLabels": + // *labels can be a nagative integer, 0, 1, 2, or a positive integer >= 3 + // *label = 1 and 2 are reserved for NW and W phase respectively. + //2. Requirement for "ComponentAffinity": + // *should be in the same length as "ComponentLabels" + // *could leave Affinity=0.0 for label=1 and 2 + //3. Requirement for "PorosityList": + // *for ComponentLables <=0, put porosity value = 0.0; + // *for ComponentLabels >=3, put the corresponding sub-resolution porosity + // *for ComponentLabels =1, 2, put porosity=1 (or if users accidentally put other values it should still be fine) + //4. Requirement for "PermeabilityList": + // *for ComponentLabels <=2, does not matter, can leave it as 1.0 NLABELS=LabelList.size(); - if (NLABELS != PorosityList.size()){ - ERROR("Error: ComponentLabels and PorosityList must be the same length! \n"); + if (NLABELS != PorosityList.size() || NLABELS != AffinityList.size() || NLABELS != PermeabilityList.size()){ + ERROR("Error: ComponentLabels, ComponentAffinity, PorosityList and PermeabilityList must all be the same length! \n"); } double label_count[NLABELS]; double label_count_global[NLABELS]; - // Assign the labels for (int idx=0; idx 0, i.e. open or grey nodes + //For node_ID <= 0: these are solid nodes of various wettability for (int k=1;k0) && (VALUE == LabelList[idx])){ POROSITY=PorosityList[idx]; label_count[idx] += 1.0; idx = NLABELS; - //Mask->id[n] = 0; // set mask to zero since this is an immobile component } } int idx = Map(i,j,k); @@ -227,9 +347,8 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, double *Perm } } - if (NLABELS != PermeabilityList.size()){ - ERROR("Error: ComponentLabels and PermeabilityList must be the same length! \n"); - } + //Populate the permeability map, NOTE only for node_ID > 0, i.e. open or grey nodes + //For node_ID <= 0: these are solid nodes of various wettability for (int k=1;k0) && (VALUE == LabelList[idx])){ PERMEABILITY=PermeabilityList[idx]; idx = NLABELS; //Mask->id[n] = 0; // set mask to zero since this is an immobile component @@ -257,6 +376,34 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, double *Perm } } + //Populate the solid potential map, for ALL range of node_ID except node = 1,2, i.e. NW and W phase + for (int k=0;k=3){ + AFFINITY=AffinityList[idx]*(1.0-PorosityList[idx]);//BE CAREFUL! Requires for node_ID<=0, user puts porosity=0.0 + } + else{//i.e. label = 1 or 2 + AFFINITY=0.0; + } + idx = NLABELS; + } + } + //NOTE: node_ID = 1 and 2 are reserved + if ((VALUE == 1)||(VALUE == 2)) AFFINITY=0.0;//NOTE: still need this as users may forget to put label=1,2 in ComponentLabelLists + SolidPotential[n] = AFFINITY; + } + } + } + // Set Dm to match Mask for (int i=0; iid[i] = Mask->id[i]; @@ -286,8 +433,61 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, double *Perm } } +void ScaLBL_GreyscaleColorModel::DensityField_Init(){ -void ScaLBL_GreyscaleModel::Create(){ + size_t NLABELS=0; + signed char VALUE=0; + //Read all greyscale node labels and their conrresponding initial saturaiton + //TODO make something default, LabelList=1,2, SwList=0.0, 1.0 + auto LabelList = greyscaleColor_db->getVector( "GreyNodeLabels" ); + auto SwList = greyscaleColor_db->getVector( "GreyNodeSw" ); + NLABELS=LabelList.size(); + if (NLABELS != SwList.size()){ + ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); + } + + double *Den_temp; + Den_temp=new double [2*Np]; + double nA=0.5;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. + double nB=0.5; + + for (int k=1; kid[n]; + if (VALUE>0){ + for (unsigned int idx=0; idx < NLABELS; idx++){ + if (VALUE == LabelList[idx]){ + double Sw = SwList[idx]; + if ((Sw<0.0) || (Sw>1.0)) ERROR("Error: Initial saturation for grey nodes must be between [0.0, 1.0]! \n"); + nB=Sw; + nA=1.0-Sw; + idx = NLABELS; + } + } + if (VALUE==1){//label=1 reserved for NW phase + nA=1.0; + nB=0.0; + } + else if(VALUE==2){//label=2 reserved for W phase + nA=0.0; + nB=1.0; + } + int idx = Map(i,j,k); + Den_temp[idx+0*Np] = nA; + Den_temp[idx+1*Np] = nB; + } + } + } + } + //copy to device + ScaLBL_CopyToDevice(Den, Den_temp, 2*Np*sizeof(double)); + ScaLBL_DeviceBarrier(); + delete [] Den_temp; +} + +void ScaLBL_GreyscaleColorModel::Create(){ /* * This function creates the variables needed to run a LBM */ @@ -324,99 +524,81 @@ void ScaLBL_GreyscaleModel::Create(){ neighborSize=18*(Np*sizeof(int)); //........................................................................... ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); - ScaLBL_AllocateDeviceMemory((void **) &dvcMap, sizeof(int)*Np); ScaLBL_AllocateDeviceMemory((void **) &fq, 19*dist_mem_size); ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Aq, 7*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Bq, 7*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Den, 2*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &SolidForce, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &DenGradA, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &DenGradB, 3*sizeof(double)*Np); //........................................................................... // Update GPU data structures - if (rank==0) printf ("Setting up device map and neighbor list \n"); + if (rank==0) printf ("Setting up device neighbor list \n"); fflush(stdout); - int *TmpMap; - TmpMap=new int[Np]; - for (int k=1; kLastExterior(); idx++){ - int n = TmpMap[idx]; - if (n > Nx*Ny*Nz){ - printf("Bad value! idx=%i \n"); - TmpMap[idx] = Nx*Ny*Nz-1; - } - } - for (int idx=ScaLBL_Comm->FirstInterior(); idxLastInterior(); idx++){ - int n = TmpMap[idx]; - if (n > Nx*Ny*Nz){ - printf("Bad value! idx=%i \n"); - TmpMap[idx] = Nx*Ny*Nz-1; - } - } - ScaLBL_CopyToDevice(dvcMap, TmpMap, sizeof(int)*Np); - ScaLBL_DeviceBarrier(); - delete [] TmpMap; - // copy the neighbor list ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); // initialize phi based on PhaseLabel (include solid component labels) double *Poros, *Perm; Poros = new double[Np]; Perm = new double[Np]; - AssignComponentLabels(Poros,Perm); + double *SolidForce_host = new double[3*Np]; + double *SolidPotential_host = new double [Nx*Ny*Nz]; + AssignComponentLabels(Poros,Perm,SolidPotential_host); + AssignSolidForce(SolidPotential_host,SolidForce_host); ScaLBL_CopyToDevice(Porosity, Poros, Np*sizeof(double)); ScaLBL_CopyToDevice(Permeability, Perm, Np*sizeof(double)); + ScaLBL_CopyToDevice(SolidForce, SolidForce_host, 3*Np*sizeof(double)); + + ScaLBL_DeviceBarrier(); + //TODO make the following smart pointers + delete [] SolidForce_host; + delete [] SolidPotential_host; + delete [] Poros; + delete [] Perm; } -void ScaLBL_GreyscaleModel::Initialize(){ - if (rank==0) printf ("Initializing distributions \n"); - //TODO: for BGK, you need to consider voxel porosity - // for IMRT, the whole set of feq is different - // if in the future you have different collison mode, need to write two set of initialization functions - if (CollisionType==1){ - ScaLBL_D3Q19_GreyIMRT_Init(fq, Np, Den); - if (rank==0) printf("Collision model: Incompressible MRT.\n"); - } - else if (CollisionType==2){ - ScaLBL_D3Q19_Init(fq, Np); - if (rank==0) printf("Collision model: BGK.\n"); - } - else{ - if (rank==0) printf("Unknown collison type! IMRT collision is used.\n"); - ScaLBL_D3Q19_GreyIMRT_Init(fq, Np, Den); - CollisionType=1; - greyscale_db->putScalar( "collision", "IMRT" ); - } - +void ScaLBL_GreyscaleColorModel::Initialize(){ if (Restart == true){ if (rank==0){ - printf("Initializing distributions from Restart! \n"); + printf("Initializing density field and distributions from Restart! \n"); } // Read in the restart file to CPU buffers std::shared_ptr cfq; cfq = std::shared_ptr(new double[19*Np],DeleteArray); + std::shared_ptr cDen; + cDen = std::shared_ptr(new double[2*Np],DeleteArray); FILE *File; File=fopen(LocalRestartFile,"rb"); fread(cfq.get(),sizeof(double),19*Np,File); + fread(cDen.get(),sizeof(double),2*Np,File); fclose(File); // Copy the restart data to the GPU ScaLBL_CopyToDevice(fq,cfq.get(),19*Np*sizeof(double)); + ScaLBL_CopyToDevice(Den,cDen.get(),2*Np*sizeof(double)); ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); + + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); } + else{ + if (rank==0) printf ("Initializing density field \n"); + DensityField_Init();//initialize density field + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + + if (rank==0) printf ("Initializing distributions \n"); + ScaLBL_D3Q19_GreyColorIMRT_Init(fq, Den, rhoA, rhoB, Np); + } } -void ScaLBL_GreyscaleModel::Run(){ +void ScaLBL_GreyscaleColorModel::Run(){ int nprocs=nprocx*nprocy*nprocz; const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); @@ -432,8 +614,8 @@ void ScaLBL_GreyscaleModel::Run(){ if (analysis_db->keyExists( "restart_interval" )){ restart_interval = analysis_db->getScalar( "restart_interval" ); } - if (greyscale_db->keyExists( "timestep" )){ - timestep = greyscale_db->getScalar( "timestep" ); + if (greyscaleColor_db->keyExists( "timestep" )){ + timestep = greyscaleColor_db->getScalar( "timestep" ); } if (rank==0){ @@ -454,213 +636,217 @@ void ScaLBL_GreyscaleModel::Run(){ //************ MAIN ITERATION LOOP ***************************************/ PROFILE_START("Loop"); auto current_db = db->cloneDatabase(); - double rlx = 1.0/tau; - double rlx_eff = 1.0/tau_eff; double error = 1.0; double flow_rate_previous = 0.0; while (timestep < timestepMax && error > tolerance) { //************************************************************************/ // *************ODD TIMESTEP*************// timestep++; + // Compute the density field + // Read for Aq, Bq happens in this routine (requires communication) + ScaLBL_Comm->BiSendD3Q7AA(Aq,Bq); //READ FROM NORMAL + ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(NeighborList, Aq, Bq, Den, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->BiRecvD3Q7AA(Aq,Bq); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(NeighborList, Aq, Bq, Den, 0, ScaLBL_Comm->LastExterior(), Np); + + //compute Den gradients - component A + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&Den[0*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[0*Np],DenGradA); + //compute Den gradients - component B + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&Den[1*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[1*Np],DenGradB); + ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL - switch (CollisionType){ - case 1: - ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - case 2: - ScaLBL_D3Q19_AAodd_Greyscale(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); - break; - default: - ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - } + ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, + tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); - // Set BCs - if (BoundaryCondition == 3){ - ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); - ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); - } - switch (CollisionType){ - case 1: - ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - case 2: - ScaLBL_D3Q19_AAodd_Greyscale(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); - break; - default: - ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - } - ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + +// // Set BCs +// if (BoundaryCondition == 3){ +// ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); +// ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); +// } + ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, + tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); // *************EVEN TIMESTEP*************// timestep++; - ScaLBL_Comm->SendD3Q19AA(fq); //READ FORM NORMAL - switch (CollisionType){ - case 1: - ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - case 2: - ScaLBL_D3Q19_AAeven_Greyscale(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); - break; - default: - ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - } - ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE + // Compute the density field + // Read for Aq, Bq happens in this routine (requires communication) + ScaLBL_Comm->BiSendD3Q7AA(Aq,Bq); //READ FROM NORMAL + ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(Aq, Bq, Den, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->BiRecvD3Q7AA(Aq,Bq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); - // Set BCs - if (BoundaryCondition == 3){ - ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); - ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); - } - switch (CollisionType){ - case 1: - ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - case 2: - ScaLBL_D3Q19_AAeven_Greyscale(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); - break; - default: - ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - } - ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(Aq, Bq, Den, 0, ScaLBL_Comm->LastExterior(), Np); + + //compute Den gradients - component A + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&Den[0*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[0*Np],DenGradA); + //compute Den gradients - component B + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&Den[1*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[1*Np],DenGradB); + + ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL + ScaLBL_D3Q19_AAeven_GreyscaleColor(fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, + tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); + ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + +// // Set BCs +// if (BoundaryCondition == 3){ +// ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); +// ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); +// } + ScaLBL_D3Q19_AAeven_GreyscaleColor(fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, + tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); //************************************************************************/ - if (timestep%analysis_interval==0){ - ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); - ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); - ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); - //ScaLBL_Comm->RegularLayout(Map,Porosity,PorosityMap); - //ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); - - double count_loc=0; - double count; - double vax,vay,vaz; - double vax_loc,vay_loc,vaz_loc; - //double px_loc,py_loc,pz_loc; - //double px,py,pz; - //double mass_loc,mass_glb; - - //parameters for domain average - int64_t i,j,k,n,imin,jmin,kmin,kmax; - // If external boundary conditions are set, do not average over the inlet and outlet - kmin=1; kmax=Nz-1; - //In case user forgets to specify the inlet/outlet buffer layers for BC>0 - if (BoundaryCondition > 0 && Dm->kproc() == 0) kmin=4; - if (BoundaryCondition > 0 && Dm->kproc() == Dm->nprocz()-1) kmax=Nz-4; - - imin=jmin=1; - // If inlet/outlet layers exist use these as default - //if (Dm->inlet_layers_x > 0) imin = Dm->inlet_layers_x; - //if (Dm->inlet_layers_y > 0) jmin = Dm->inlet_layers_y; - if (BoundaryCondition > 0 && Dm->inlet_layers_z > 0 && Dm->kproc() == 0) kmin = 1 + Dm->inlet_layers_z;//"1" indicates the halo layer - if (BoundaryCondition > 0 && Dm->outlet_layers_z > 0 && Dm->kproc() == Dm->nprocz()-1) kmax = Nz-1 - Dm->outlet_layers_z; - -// px_loc = py_loc = pz_loc = 0.f; -// mass_loc = 0.f; +// if (timestep%analysis_interval==0){ +// ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); +// ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); +// ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); +// //ScaLBL_Comm->RegularLayout(Map,Porosity,PorosityMap); +// //ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); +// +// double count_loc=0; +// double count; +// double vax,vay,vaz; +// double vax_loc,vay_loc,vaz_loc; +// //double px_loc,py_loc,pz_loc; +// //double px,py,pz; +// //double mass_loc,mass_glb; +// +// //parameters for domain average +// int64_t i,j,k,n,imin,jmin,kmin,kmax; +// // If external boundary conditions are set, do not average over the inlet and outlet +// kmin=1; kmax=Nz-1; +// //In case user forgets to specify the inlet/outlet buffer layers for BC>0 +// if (BoundaryCondition > 0 && Dm->kproc() == 0) kmin=4; +// if (BoundaryCondition > 0 && Dm->kproc() == Dm->nprocz()-1) kmax=Nz-4; +// +// imin=jmin=1; +// // If inlet/outlet layers exist use these as default +// //if (Dm->inlet_layers_x > 0) imin = Dm->inlet_layers_x; +// //if (Dm->inlet_layers_y > 0) jmin = Dm->inlet_layers_y; +// if (BoundaryCondition > 0 && Dm->inlet_layers_z > 0 && Dm->kproc() == 0) kmin = 1 + Dm->inlet_layers_z;//"1" indicates the halo layer +// if (BoundaryCondition > 0 && Dm->outlet_layers_z > 0 && Dm->kproc() == Dm->nprocz()-1) kmax = Nz-1 - Dm->outlet_layers_z; +// +//// px_loc = py_loc = pz_loc = 0.f; +//// mass_loc = 0.f; +//// for (int k=kmin; k 0){ +//// px_loc += Velocity_x(i,j,k)*Den*PorosityMap(i,j,k); +//// py_loc += Velocity_y(i,j,k)*Den*PorosityMap(i,j,k); +//// pz_loc += Velocity_z(i,j,k)*Den*PorosityMap(i,j,k); +//// mass_loc += Den*PorosityMap(i,j,k); +//// } +//// } +//// } +//// } +//// MPI_Allreduce(&px_loc, &px, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +//// MPI_Allreduce(&py_loc, &py, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +//// MPI_Allreduce(&pz_loc, &pz, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +//// MPI_Allreduce(&mass_loc,&mass_glb,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +//// +//// vax = px/mass_glb; +//// vay = py/mass_glb; +//// vaz = pz/mass_glb; +// +// vax_loc = vay_loc = vaz_loc = 0.f; // for (int k=kmin; k 0){ -// px_loc += Velocity_x(i,j,k)*Den*PorosityMap(i,j,k); -// py_loc += Velocity_y(i,j,k)*Den*PorosityMap(i,j,k); -// pz_loc += Velocity_z(i,j,k)*Den*PorosityMap(i,j,k); -// mass_loc += Den*PorosityMap(i,j,k); +// vax_loc += Velocity_x(i,j,k); +// vay_loc += Velocity_y(i,j,k); +// vaz_loc += Velocity_z(i,j,k); +// count_loc+=1.0; // } // } // } // } -// MPI_Allreduce(&px_loc, &px, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -// MPI_Allreduce(&py_loc, &py, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -// MPI_Allreduce(&pz_loc, &pz, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -// MPI_Allreduce(&mass_loc,&mass_glb,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// //MPI_Allreduce(&vax_loc,&vax,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// //MPI_Allreduce(&vay_loc,&vay,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// //MPI_Allreduce(&vaz_loc,&vaz,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// //MPI_Allreduce(&count_loc,&count,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); // -// vax = px/mass_glb; -// vay = py/mass_glb; -// vaz = pz/mass_glb; - - vax_loc = vay_loc = vaz_loc = 0.f; - for (int k=kmin; k 0){ - vax_loc += Velocity_x(i,j,k); - vay_loc += Velocity_y(i,j,k); - vaz_loc += Velocity_z(i,j,k); - count_loc+=1.0; - } - } - } - } - //MPI_Allreduce(&vax_loc,&vax,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - //MPI_Allreduce(&vay_loc,&vay,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - //MPI_Allreduce(&vaz_loc,&vaz,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - //MPI_Allreduce(&count_loc,&count,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - - vax = Mask->Comm.sumReduce( vax_loc ); - vay = Mask->Comm.sumReduce( vay_loc ); - vaz = Mask->Comm.sumReduce( vaz_loc ); - count = Mask->Comm.sumReduce( count_loc ); - - vax /= count; - vay /= count; - vaz /= count; - - double force_mag = sqrt(Fx*Fx+Fy*Fy+Fz*Fz); - double dir_x = Fx/force_mag; - double dir_y = Fy/force_mag; - double dir_z = Fz/force_mag; - if (force_mag == 0.0){ - // default to z direction - dir_x = 0.0; - dir_y = 0.0; - dir_z = 1.0; - force_mag = 1.0; - } - //double flow_rate = (px*dir_x + py*dir_y + pz*dir_z)/mass_glb; - double flow_rate = (vax*dir_x + vay*dir_y + vaz*dir_z); - - error = fabs(flow_rate - flow_rate_previous) / fabs(flow_rate); - flow_rate_previous = flow_rate; - - //if (rank==0) printf("Computing Minkowski functionals \n"); - Morphology.ComputeScalar(SignDist,0.f); - //Morphology.PrintAll(); - double mu = (tau-0.5)/3.f; - double Vs = Morphology.V(); - double As = Morphology.A(); - double Hs = Morphology.H(); - double Xs = Morphology.X(); - Vs = Dm->Comm.sumReduce( Vs); - As = Dm->Comm.sumReduce( As); - Hs = Dm->Comm.sumReduce( Hs); - Xs = Dm->Comm.sumReduce( Xs); - - double h = Dm->voxel_length; - //double absperm = h*h*mu*Mask->Porosity()*flow_rate / force_mag; - double absperm = h*h*mu*GreyPorosity*flow_rate / force_mag; - - if (rank==0){ - printf(" AbsPerm = %.5g [micron^2]\n",absperm); - bool WriteHeader=false; - FILE * log_file = fopen("Permeability.csv","r"); - if (log_file != NULL) - fclose(log_file); - else - WriteHeader=true; - log_file = fopen("Permeability.csv","a"); - if (WriteHeader) - fprintf(log_file,"timestep Fx Fy Fz mu Vs As Hs Xs vax vay vaz AbsPerm \n", - timestep,Fx,Fy,Fz,mu,h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz,absperm); - - fprintf(log_file,"%i %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",timestep, Fx, Fy, Fz, mu, - h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz, absperm); - fclose(log_file); - } - } +// vax = Mask->Comm.sumReduce( vax_loc ); +// vay = Mask->Comm.sumReduce( vay_loc ); +// vaz = Mask->Comm.sumReduce( vaz_loc ); +// count = Mask->Comm.sumReduce( count_loc ); +// +// vax /= count; +// vay /= count; +// vaz /= count; +// +// double force_mag = sqrt(Fx*Fx+Fy*Fy+Fz*Fz); +// double dir_x = Fx/force_mag; +// double dir_y = Fy/force_mag; +// double dir_z = Fz/force_mag; +// if (force_mag == 0.0){ +// // default to z direction +// dir_x = 0.0; +// dir_y = 0.0; +// dir_z = 1.0; +// force_mag = 1.0; +// } +// //double flow_rate = (px*dir_x + py*dir_y + pz*dir_z)/mass_glb; +// double flow_rate = (vax*dir_x + vay*dir_y + vaz*dir_z); +// +// error = fabs(flow_rate - flow_rate_previous) / fabs(flow_rate); +// flow_rate_previous = flow_rate; +// +// //if (rank==0) printf("Computing Minkowski functionals \n"); +// Morphology.ComputeScalar(SignDist,0.f); +// //Morphology.PrintAll(); +// double mu = (tau-0.5)/3.f; +// double Vs = Morphology.V(); +// double As = Morphology.A(); +// double Hs = Morphology.H(); +// double Xs = Morphology.X(); +// Vs = Dm->Comm.sumReduce( Vs); +// As = Dm->Comm.sumReduce( As); +// Hs = Dm->Comm.sumReduce( Hs); +// Xs = Dm->Comm.sumReduce( Xs); +// +// double h = Dm->voxel_length; +// //double absperm = h*h*mu*Mask->Porosity()*flow_rate / force_mag; +// double absperm = h*h*mu*GreyPorosity*flow_rate / force_mag; +// +// if (rank==0){ +// printf(" AbsPerm = %.5g [micron^2]\n",absperm); +// bool WriteHeader=false; +// FILE * log_file = fopen("Permeability.csv","r"); +// if (log_file != NULL) +// fclose(log_file); +// else +// WriteHeader=true; +// log_file = fopen("Permeability.csv","a"); +// if (WriteHeader) +// fprintf(log_file,"timestep Fx Fy Fz mu Vs As Hs Xs vax vay vaz AbsPerm \n", +// timestep,Fx,Fy,Fz,mu,h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz,absperm); +// +// fprintf(log_file,"%i %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",timestep, Fx, Fy, Fz, mu, +// h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz, absperm); +// fclose(log_file); +// } +// } if (timestep%visualization_interval==0){ VelocityField(); @@ -669,9 +855,9 @@ void ScaLBL_GreyscaleModel::Run(){ if (timestep%restart_interval==0){ //Use rank=0 write out Restart.db if (rank==0) { - greyscale_db->putScalar("timestep",timestep); - greyscale_db->putScalar( "Restart", true ); - current_db->putDatabase("Greyscale", greyscale_db); + greyscaleColor_db->putScalar("timestep",timestep); + greyscaleColor_db->putScalar( "Restart", true ); + current_db->putDatabase("GreyscaleColor", greyscaleColor_db); std::ofstream OutStream("Restart.db"); current_db->print(OutStream, ""); OutStream.close(); @@ -681,17 +867,21 @@ void ScaLBL_GreyscaleModel::Run(){ std::shared_ptr cfq; cfq = std::shared_ptr(new double[19*Np],DeleteArray); ScaLBL_CopyToHost(cfq.get(),fq,19*Np*sizeof(double));// Copy restart data to the CPU + std::shared_ptr cDen; + cDen = std::shared_ptr(new double[2*Np],DeleteArray); + ScaLBL_CopyToHost(cDen.get(),Den,2*Np*sizeof(double));// Copy restart data to the CPU FILE *RESTARTFILE; RESTARTFILE=fopen(LocalRestartFile,"wb"); fwrite(cfq.get(),sizeof(double),19*Np,RESTARTFILE); + fwrite(cDen.get(),sizeof(double),2*Np,RESTARTFILE); fclose(RESTARTFILE); MPI_Barrier(comm); } } PROFILE_STOP("Loop"); - PROFILE_SAVE("lbpm_greyscale_simulator",1); + PROFILE_SAVE("lbpm_greyscaleColor_simulator",1); //************************************************************************ ScaLBL_DeviceBarrier(); MPI_Barrier(comm); @@ -712,7 +902,7 @@ void ScaLBL_GreyscaleModel::Run(){ // ************************************************************************ } -void ScaLBL_GreyscaleModel::VelocityField(){ +void ScaLBL_GreyscaleColorModel::VelocityField(){ /* Minkowski Morphology(Mask); int SIZE=Np*sizeof(double); @@ -828,7 +1018,7 @@ void ScaLBL_GreyscaleModel::VelocityField(){ } -void ScaLBL_GreyscaleModel::WriteDebug(){ +void ScaLBL_GreyscaleColorModel::WriteDebug(){ // Copy back final phase indicator field and convert to regular layout DoubleArray PhaseField(Nx,Ny,Nz); @@ -840,26 +1030,26 @@ void ScaLBL_GreyscaleModel::WriteDebug(){ // fwrite(PhaseField.data(),8,N,OUTFILE); // fclose(OUTFILE); // -// ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); -// FILE *AFILE; -// sprintf(LocalRankFilename,"A.%05i.raw",rank); -// AFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,AFILE); -// fclose(AFILE); -// -// ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); -// FILE *BFILE; -// sprintf(LocalRankFilename,"B.%05i.raw",rank); -// BFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,BFILE); -// fclose(BFILE); -// -// ScaLBL_Comm->RegularLayout(Map,Pressure,PhaseField); -// FILE *PFILE; -// sprintf(LocalRankFilename,"Pressure.%05i.raw",rank); -// PFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,PFILE); -// fclose(PFILE); + ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + FILE *AFILE; + sprintf(LocalRankFilename,"A.%05i.raw",rank); + AFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,AFILE); + fclose(AFILE); + + ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + FILE *BFILE; + sprintf(LocalRankFilename,"B.%05i.raw",rank); + BFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,BFILE); + fclose(BFILE); + + ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,PhaseField); + FILE *PFILE; + sprintf(LocalRankFilename,"Pressure.%05i.raw",rank); + PFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,PFILE); + fclose(PFILE); ScaLBL_Comm->RegularLayout(Map,&Velocity[0],PhaseField); FILE *VELX_FILE; @@ -882,17 +1072,17 @@ void ScaLBL_GreyscaleModel::WriteDebug(){ fwrite(PhaseField.data(),8,N,VELZ_FILE); fclose(VELZ_FILE); - ScaLBL_Comm->RegularLayout(Map,&Porosity[0],PhaseField); - FILE *POROS_FILE; - sprintf(LocalRankFilename,"Porosity.%05i.raw",rank); - POROS_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,POROS_FILE); - fclose(POROS_FILE); - - ScaLBL_Comm->RegularLayout(Map,&Permeability[0],PhaseField); - FILE *PERM_FILE; - sprintf(LocalRankFilename,"Permeability.%05i.raw",rank); - PERM_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,PERM_FILE); - fclose(PERM_FILE); +// ScaLBL_Comm->RegularLayout(Map,&Porosity[0],PhaseField); +// FILE *POROS_FILE; +// sprintf(LocalRankFilename,"Porosity.%05i.raw",rank); +// POROS_FILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,POROS_FILE); +// fclose(POROS_FILE); +// +// ScaLBL_Comm->RegularLayout(Map,&Permeability[0],PhaseField); +// FILE *PERM_FILE; +// sprintf(LocalRankFilename,"Permeability.%05i.raw",rank); +// PERM_FILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,PERM_FILE); +// fclose(PERM_FILE); } diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h index a99925b1..52841c4a 100644 --- a/models/GreyscaleColorModel.h +++ b/models/GreyscaleColorModel.h @@ -1,5 +1,5 @@ /* -Implementation of color lattice boltzmann model +Implementation of multicomponent greyscale lattice boltzmann model */ #include #include @@ -16,10 +16,10 @@ Implementation of color lattice boltzmann model #include "ProfilerApp.h" #include "threadpool/thread_pool.h" -class ScaLBL_GreyscaleModel{ +class ScaLBL_GreyscaleColorModel{ public: - ScaLBL_GreyscaleModel(int RANK, int NP, MPI_Comm COMM); - ~ScaLBL_GreyscaleModel(); + ScaLBL_GreyscaleColorModel(int RANK, int NP, MPI_Comm COMM); + ~ScaLBL_GreyscaleColorModel(); // functions in they should be run void ReadParams(string filename); @@ -35,15 +35,15 @@ public: bool Restart,pBC; int timestep,timestepMax; int BoundaryCondition; - int CollisionType; - double tau; - double tau_eff; - double Den;//constant density + double tauA,tauB; + double tauA_eff,tauB_eff; + double rhoA,rhoB; double tolerance; double Fx,Fy,Fz,flux; double din,dout; double dp;//solid particle diameter, unit in voxel double GreyPorosity; + double Gsc; int Nx,Ny,Nz,N,Np; int rank,nprocx,nprocy,nprocz,nprocs; @@ -56,18 +56,21 @@ public: // input database std::shared_ptr db; std::shared_ptr domain_db; - std::shared_ptr greyscale_db; + std::shared_ptr greyscaleColor_db; std::shared_ptr analysis_db; std::shared_ptr vis_db; signed char *id; int *NeighborList; - int *dvcMap; - double *fq; + double *fq,*Aq,*Bq; + double *Den; double *Permeability;//grey voxel permeability double *Porosity; double *Velocity; double *Pressure_dvc; + double *SolidForce; + double *DenGradA; + double *DenGradB; IntArray Map; DoubleArray SignDist; DoubleArray Velocity_x; @@ -86,7 +89,9 @@ private: char LocalRankFilename[40]; char LocalRestartFile[40]; - void AssignComponentLabels(double *Porosity, double *Permeablity); - + void AssignComponentLabels(double *Porosity, double *Permeablity, double *SolidPotential); + void AssignSolidForce(double *SolidPotential, double *SolidForce); + void DensityField_Init(); + }; diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index 11d92c80..1ef65204 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -324,7 +324,6 @@ void ScaLBL_GreyscaleModel::Create(){ neighborSize=18*(Np*sizeof(int)); //........................................................................... ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); - ScaLBL_AllocateDeviceMemory((void **) &dvcMap, sizeof(int)*Np); ScaLBL_AllocateDeviceMemory((void **) &fq, 19*dist_mem_size); ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); @@ -332,38 +331,8 @@ void ScaLBL_GreyscaleModel::Create(){ ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); //........................................................................... // Update GPU data structures - if (rank==0) printf ("Setting up device map and neighbor list \n"); + if (rank==0) printf ("Setting up device neighbor list \n"); fflush(stdout); - int *TmpMap; - TmpMap=new int[Np]; - for (int k=1; kLastExterior(); idx++){ - int n = TmpMap[idx]; - if (n > Nx*Ny*Nz){ - printf("Bad value! idx=%i \n"); - TmpMap[idx] = Nx*Ny*Nz-1; - } - } - for (int idx=ScaLBL_Comm->FirstInterior(); idxLastInterior(); idx++){ - int n = TmpMap[idx]; - if (n > Nx*Ny*Nz){ - printf("Bad value! idx=%i \n"); - TmpMap[idx] = Nx*Ny*Nz-1; - } - } - ScaLBL_CopyToDevice(dvcMap, TmpMap, sizeof(int)*Np); - ScaLBL_DeviceBarrier(); - delete [] TmpMap; - // copy the neighbor list ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); // initialize phi based on PhaseLabel (include solid component labels) diff --git a/models/GreyscaleModel.h b/models/GreyscaleModel.h index a99925b1..3e883b16 100644 --- a/models/GreyscaleModel.h +++ b/models/GreyscaleModel.h @@ -62,7 +62,6 @@ public: signed char *id; int *NeighborList; - int *dvcMap; double *fq; double *Permeability;//grey voxel permeability double *Porosity; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 8b14a9dc..56eda802 100755 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -4,6 +4,7 @@ ADD_LBPM_EXECUTABLE( lbpm_color_simulator ) ADD_LBPM_EXECUTABLE( lbpm_permeability_simulator ) ADD_LBPM_EXECUTABLE( lbpm_greyscale_simulator ) +ADD_LBPM_EXECUTABLE( lbpm_greyscaleColor_simulator ) #ADD_LBPM_EXECUTABLE( lbpm_BGK_simulator ) #ADD_LBPM_EXECUTABLE( lbpm_color_macro_simulator ) ADD_LBPM_EXECUTABLE( lbpm_dfh_simulator ) diff --git a/tests/lbpm_greyscaleColor_simulator.cpp b/tests/lbpm_greyscaleColor_simulator.cpp new file mode 100644 index 00000000..b836e03c --- /dev/null +++ b/tests/lbpm_greyscaleColor_simulator.cpp @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "common/ScaLBL.h" +#include "common/Communication.h" +#include "common/MPI.h" +#include "models/GreyscaleColorModel.h" +//#define WRITE_SURFACES + +using namespace std; + + +int main(int argc, char **argv) +{ + //***************************************** + // ***** MPI STUFF **************** + //***************************************** + // Initialize MPI + int rank,nprocs; + MPI_Init(&argc,&argv); + MPI_Comm comm = MPI_COMM_WORLD; + MPI_Comm_rank(comm,&rank); + MPI_Comm_size(comm,&nprocs); + { + // parallel domain size (# of sub-domains) + int nprocx,nprocy,nprocz; + int iproc,jproc,kproc; + + if (rank == 0){ + printf("****************************************\n"); + printf("Running Greyscale Two-Phase Calculation \n"); + printf("****************************************\n"); + } + // Initialize compute device + int device=ScaLBL_SetDevice(rank); + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); + + ScaLBL_GreyscaleColorModel GreyscaleColor(rank,nprocs,comm); + auto filename = argv[1]; + GreyscaleColor.ReadParams(filename); + GreyscaleColor.SetDomain(); // this reads in the domain + GreyscaleColor.ReadInput(); + GreyscaleColor.Create(); // creating the model will create data structure to match the pore structure and allocate variables + GreyscaleColor.Initialize(); // initializing the model will set initial conditions for variables + GreyscaleColor.Run(); + //GreyscaleColor.VelocityField(); + GreyscaleColor.WriteDebug(); + } + // **************************************************** + MPI_Barrier(comm); + MPI_Finalize(); + // **************************************************** +} From ce09bb9ad527475690d6297879341678eac1fb37 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Tue, 7 Apr 2020 22:17:29 -0400 Subject: [PATCH 07/75] save the work --- models/GreyscaleColorModel.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 421805c5..2a01f45b 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -437,10 +437,20 @@ void ScaLBL_GreyscaleColorModel::DensityField_Init(){ size_t NLABELS=0; signed char VALUE=0; - //Read all greyscale node labels and their conrresponding initial saturaiton - //TODO make something default, LabelList=1,2, SwList=0.0, 1.0 - auto LabelList = greyscaleColor_db->getVector( "GreyNodeLabels" ); - auto SwList = greyscaleColor_db->getVector( "GreyNodeSw" ); + + if (greyscaleColor_db->keyExists( "GreyNodeLabels" )){ + auto LabelList = greyscaleColor_db->getVector( "GreyNodeLabels" ); + } + else{ + vector LabelList{1,2}; + } + if (greyscaleColor_db->keyExists( "GreyNodeSw" )){ + auto SwList = greyscaleColor_db->getVector( "GreyNodeSw" ); + } + else{ + vector SwList{0.0,1.0}; + } + NLABELS=LabelList.size(); if (NLABELS != SwList.size()){ ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); From 606e81d6849a38036f8332baabad29b61f77ebbc Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Wed, 8 Apr 2020 16:48:39 -0400 Subject: [PATCH 08/75] GPU version: save the work --- gpu/GreyscaleColor.cu | 18 ++++++++++++------ models/GreyscaleColorModel.cpp | 15 +++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu index c9586d3c..dd24c995 100644 --- a/gpu/GreyscaleColor.cu +++ b/gpu/GreyscaleColor.cu @@ -357,9 +357,12 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(double *dist, double *Aq, //---------------- Calculate SC fluid-fluid and fluid-solid forces ---------------// // fluid-fluid force - Gff_x = -Gsc*nA*nB_gradx*int(phi>0.0)-Gsc*nB*nA_gradx*int(phi<0.0); - Gff_y = -Gsc*nA*nB_grady*int(phi>0.0)-Gsc*nB*nA_grady*int(phi<0.0); - Gff_z = -Gsc*nA*nB_gradz*int(phi>0.0)-Gsc*nB*nA_gradz*int(phi<0.0); +// Gff_x = -Gsc*nA*nB_gradx*int(phi>0.0)-Gsc*nB*nA_gradx*int(phi<0.0); +// Gff_y = -Gsc*nA*nB_grady*int(phi>0.0)-Gsc*nB*nA_grady*int(phi<0.0); +// Gff_z = -Gsc*nA*nB_gradz*int(phi>0.0)-Gsc*nB*nA_gradz*int(phi<0.0); + Gff_x = -Gsc*(nA*nB_gradx+nB*nA_gradx); + Gff_y = -Gsc*(nA*nB_grady+nB*nA_grady); + Gff_z = -Gsc*(nA*nB_gradz+nB*nA_gradz); // fluid-solid force Gfs_x = (nA-nB)*SolidForce[n+0*Np]; Gfs_y = (nA-nB)*SolidForce[n+1*Np]; @@ -978,9 +981,12 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double //---------------- Calculate SC fluid-fluid and fluid-solid forces ---------------// // fluid-fluid force - Gff_x = -Gsc*nA*nB_gradx*int(phi>0.0)-Gsc*nB*nA_gradx*int(phi<0.0); - Gff_y = -Gsc*nA*nB_grady*int(phi>0.0)-Gsc*nB*nA_grady*int(phi<0.0); - Gff_z = -Gsc*nA*nB_gradz*int(phi>0.0)-Gsc*nB*nA_gradz*int(phi<0.0); +// Gff_x = -Gsc*nA*nB_gradx*int(phi>0.0)-Gsc*nB*nA_gradx*int(phi<0.0); +// Gff_y = -Gsc*nA*nB_grady*int(phi>0.0)-Gsc*nB*nA_grady*int(phi<0.0); +// Gff_z = -Gsc*nA*nB_gradz*int(phi>0.0)-Gsc*nB*nA_gradz*int(phi<0.0); + Gff_x = -Gsc*(nA*nB_gradx+nB*nA_gradx); + Gff_y = -Gsc*(nA*nB_grady+nB*nA_grady); + Gff_z = -Gsc*(nA*nB_gradz+nB*nA_gradz); // fluid-solid force Gfs_x = (nA-nB)*SolidForce[n+0*Np]; Gfs_y = (nA-nB)*SolidForce[n+1*Np]; diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 2a01f45b..5eefb899 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -438,18 +438,17 @@ void ScaLBL_GreyscaleColorModel::DensityField_Init(){ size_t NLABELS=0; signed char VALUE=0; + vector LabelList{1,2}; + vector SwList{0.0,1.0}; + if (greyscaleColor_db->keyExists( "GreyNodeLabels" )){ - auto LabelList = greyscaleColor_db->getVector( "GreyNodeLabels" ); + LabelList.clear(); + LabelList = greyscaleColor_db->getVector( "GreyNodeLabels" ); } - else{ - vector LabelList{1,2}; - } if (greyscaleColor_db->keyExists( "GreyNodeSw" )){ - auto SwList = greyscaleColor_db->getVector( "GreyNodeSw" ); + SwList.clear(); + SwList = greyscaleColor_db->getVector( "GreyNodeSw" ); } - else{ - vector SwList{0.0,1.0}; - } NLABELS=LabelList.size(); if (NLABELS != SwList.size()){ From 984e7b504eb3429320ec5a39eef762adb2946131 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sun, 12 Apr 2020 23:38:24 -0400 Subject: [PATCH 09/75] GPU: save the work; mass transport using chemical potential --- common/ScaLBL.h | 12 + gpu/GreyscaleColor.cu | 1383 +++++++++++++++++++++++++++++++- models/GreyscaleColorModel.cpp | 67 +- models/GreyscaleColorModel.h | 4 + 4 files changed, 1454 insertions(+), 12 deletions(-) diff --git a/common/ScaLBL.h b/common/ScaLBL.h index df87fcc4..e9561be3 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -84,6 +84,16 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double *dis double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure); +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Aq, double *Bq, double *Den, + double *DenGradA, double *DenGradB, double *DenLapA, double *DenLapB, double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappa,double lambda, double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure); + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, + double *DenGradA, double *DenGradB, double *DenLapA, double *DenLapB,double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappa,double lambda,double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure); + extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, int start, int finish, int Np); extern "C" void ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np); @@ -94,6 +104,8 @@ extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, extern "C" void ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np); + // MRT MODEL extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_setA, double rlx_setB, double Fx, double Fy, double Fz); diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu index dd24c995..edfb903f 100644 --- a/gpu/GreyscaleColor.cu +++ b/gpu/GreyscaleColor.cu @@ -1266,6 +1266,1292 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double } } +__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Aq, double *Bq, double *Den, + double *DenGradA, double *DenGradB, double *DenLapA, double *DenLapB, double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappa,double lambda, double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure){ + + int n; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + // currently disable 'GeoFun' + double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double tau,tau_eff,rlx_setA,rlx_setB; + double mu_eff;//effective kinematic viscosity for Darcy term + double rho0; + double phi; + double nA,nB; + double nA_sum_tmp,nB_sum_tmp; + double a1,b1,a2,b2; + double nA_gradx,nA_grady,nA_gradz; + double nB_gradx,nB_grady,nB_gradz; + double Gff_x,Gff_y,Gff_z; + double Gfs_x,Gfs_y,Gfs_z; + double Gsc = 1.f/3.f*sqrt(kappa*lambda); + double nA_lap,nB_lap; + double chem_a,chem_b; + double rlx_massA,rlx_massB; + + + 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; s0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); + vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); + vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); + if (porosity==1.0){ + Fx=rho0*(Gx + Gff_x + Gfs_x); + Fy=rho0*(Gy + Gff_y + Gfs_y); + Fz=rho0*(Gz + Gff_z + Gfs_z); + } + + //Calculate pressure for Incompressible-MRT model + pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); + +// //..............carry out relaxation process............................................... +// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; +// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; +// jx = jx + Fx; +// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +// jy = jy + Fy; +// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +// jz = jz + Fz; +// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) +// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; +// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) +// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; +// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) +// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; +// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) +// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; +// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) +// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; +// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) +// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; +// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) +// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); +// //....................................................................................................... + + //-------------------- IMRT collison where body force has NO higher-order terms -------------// + //..............carry out relaxation process............................................... + m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); + m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); + m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); + m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); + m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + dist[1*Np+n] = fq; + + // q=2 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + dist[2*Np+n] = fq; + + // q = 3 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + dist[3*Np+n] = fq; + + // q = 4 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + dist[4*Np+n] = fq; + + // q = 5 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + dist[5*Np+n] = fq; + + // q = 6 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + dist[6*Np+n] = fq; + + // q = 7 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + dist[7*Np+n] = fq; + + // q = 8 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); + dist[8*Np+n] = fq; + + // q = 9 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + dist[9*Np+n] = fq; + + // q = 10 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + dist[10*Np+n] = fq; + + // q = 11 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); + dist[11*Np+n] = fq; + + // q = 12 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + dist[12*Np+n] = fq; + + // q = 13 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); + dist[13*Np+n] = fq; + + // q= 14 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); + dist[14*Np+n] = fq; + + // q = 15 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + dist[15*Np+n] = fq; + + // q = 16 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + dist[16*Np+n] = fq; + + // q = 17 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + dist[17*Np+n] = fq; + + // q = 18 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + dist[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] = pressure; + + //-----------------------Mass transport------------------------// + // calcuale chemical potential + chem_a = lambda*(nA*nA*nA-1.5*nA*nA+0.5*nA)-kappa*nA_lap; + chem_b = lambda*(nB*nB*nB-1.5*nB*nB+0.5*nB)-kappa*nB_lap; + nA_sum_tmp = 0.0; + nB_sum_tmp = 0.0; + rlx_massA = 3.f-sqrt(3.f); + rlx_massB = 3.f-sqrt(3.f); + + //............................................... + // q = 0,2,4 + // Cq = {1,0,0}, {0,1,0}, {0,0,1} + a1 = Aq[1*Np+n]; + b1 = Bq[1*Np+n]; + a2 = Aq[2*Np+n]; + b2 = Bq[2*Np+n]; + a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5+nA*4.5*ux)); + b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5+nB*4.5*ux)); + a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5-nA*4.5*ux)); + b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5-nB*4.5*ux)); + nA_sum_tmp += a1+a2; + nB_sum_tmp += b1+b2; + + Aq[1*Np+n] = a1; + Bq[1*Np+n] = b1; + Aq[2*Np+n] = a2; + Bq[2*Np+n] = b2; + + //............................................... + // q = 2 + // Cq = {0,1,0} + a1 = Aq[3*Np+n]; + b1 = Bq[3*Np+n]; + a2 = Aq[4*Np+n]; + b2 = Bq[4*Np+n]; + a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5+nA*4.5*uy)); + b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5+nB*4.5*uy)); + a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5-nA*4.5*uy)); + b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5-nB*4.5*uy)); + nA_sum_tmp += a1+a2; + nB_sum_tmp += b1+b2; + + Aq[3*Np+n] = a1; + Bq[3*Np+n] = b1; + Aq[4*Np+n] = a2; + Bq[4*Np+n] = b2; + //............................................... + // q = 4 + // Cq = {0,0,1} + a1 = Aq[5*Np+n]; + b1 = Bq[5*Np+n]; + a2 = Aq[6*Np+n]; + b2 = Bq[6*Np+n]; + a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5+nA*4.5*uz)); + b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5+nB*4.5*uz)); + a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5-nA*4.5*uz)); + b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5-nB*4.5*uz)); + nA_sum_tmp += a1+a2; + nB_sum_tmp += b1+b2; + + Aq[5*Np+n] = a1; + Bq[5*Np+n] = b1; + Aq[6*Np+n] = a2; + Bq[6*Np+n] = b2; + //............................................... + + // Instantiate mass transport distributions + // Stationary value - distribution 0 + a1=Aq[n]; + b1=Bq[n]; + Aq[n] = (1.0-rlx_massA)*a1+rlx_massA*(nA-nA_sum_tmp); + Bq[n] = (1.0-rlx_massB)*b1+rlx_massB*(nB-nB_sum_tmp); + + + } + } +} + +__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, + double *DenGradA, double *DenGradB, double *DenLapA, double *DenLapB,double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappa,double lambda,double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure){ + + int n, nread, nr1,nr2,nr3,nr4,nr5,nr6; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + // currently disable 'GeoFun' + double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double tau,tau_eff,rlx_setA,rlx_setB; + double mu_eff;//effective kinematic viscosity for Darcy term + double rho0; + double phi; + double nA,nB; + double nA_sum_tmp,nB_sum_tmp; + double a1,b1,a2,b2; + double nA_gradx,nA_grady,nA_gradz; + double nB_gradx,nB_grady,nB_gradz; + double Gff_x,Gff_y,Gff_z; + double Gfs_x,Gfs_y,Gfs_z; + double Gsc = 1.f/3.f*sqrt(kappa*lambda); + double nA_lap,nB_lap; + double chem_a,chem_b; + double rlx_massA,rlx_massB; + + const double mrt_V1=0.05263157894736842; + const double mrt_V2=0.012531328320802; + const double mrt_V3=0.04761904761904762; + const double mrt_V4=0.004594820384294068; + const double mrt_V5=0.01587301587301587; + const double mrt_V6=0.0555555555555555555555555; + const double mrt_V7=0.02777777777777778; + const double mrt_V8=0.08333333333333333; + const double mrt_V9=0.003341687552213868; + const double mrt_V10=0.003968253968253968; + const double mrt_V11=0.01388888888888889; + const double mrt_V12=0.04166666666666666; + + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s 10Np => odd part of dist) + fq = dist[nr1]; // reading the f1 data into register fq + pressure = fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jx = fq; + m4 = -4.0*fq; + m9 = 2.0*fq; + m10 = -4.0*fq; + + // q=2 + nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nr2]; // reading the f2 data into register fq + pressure += fq; + m1 -= 11.0*(fq); + m2 -= 4.0*(fq); + jx -= fq; + m4 += 4.0*(fq); + m9 += 2.0*(fq); + m10 -= 4.0*(fq); + + // q=3 + nr3 = neighborList[n+2*Np]; // neighbor 4 + fq = dist[nr3]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy = fq; + m6 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 = fq; + m12 = -2.0*fq; + + // q = 4 + nr4 = neighborList[n+3*Np]; // neighbor 3 + fq = dist[nr4]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy -= fq; + m6 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 += fq; + m12 -= 2.0*fq; + + // q=5 + nr5 = neighborList[n+4*Np]; + fq = dist[nr5]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz = fq; + m8 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q = 6 + nr6 = neighborList[n+5*Np]; + fq = dist[nr6]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz -= fq; + m8 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q=7 + nread = neighborList[n+6*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 = fq; + m16 = fq; + m17 = -fq; + + // q = 8 + nread = neighborList[n+7*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 += fq; + m16 -= fq; + m17 += fq; + + // q=9 + nread = neighborList[n+8*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 += fq; + m17 += fq; + + // q = 10 + nread = neighborList[n+9*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 -= fq; + m17 -= fq; + + // q=11 + nread = neighborList[n+10*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 = fq; + m16 -= fq; + m18 = fq; + + // q=12 + nread = neighborList[n+11*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 += fq; + m16 += fq; + m18 -= fq; + + // q=13 + nread = neighborList[n+12*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 -= fq; + m18 -= fq; + + // q=14 + nread = neighborList[n+13*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 += fq; + m18 += fq; + + // q=15 + nread = neighborList[n+14*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 = fq; + m17 += fq; + m18 -= fq; + + // q=16 + nread = neighborList[n+15*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 += fq; + m17 -= fq; + m18 += fq; + + // q=17 + nread = neighborList[n+16*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 += fq; + m18 += fq; + + // q=18 + nread = neighborList[n+17*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 -= fq; + m18 -= fq; + //---------------------------------------------------------------------// + + //---------------- Calculate SC fluid-fluid and fluid-solid forces ---------------// + // fluid-fluid force + Gff_x = -Gsc*(nA*nB_gradx+nB*nA_gradx); + Gff_y = -Gsc*(nA*nB_grady+nB*nA_grady); + Gff_z = -Gsc*(nA*nB_gradz+nB*nA_gradz); + // fluid-solid force + Gfs_x = (nA-nB)*SolidForce[n+0*Np]; + Gfs_y = (nA-nB)*SolidForce[n+1*Np]; + Gfs_z = (nA-nB)*SolidForce[n+2*Np]; + + porosity = Poros[n]; + // use local saturation as an estimation of effective relperm values + perm = Perm[n]*nA/(nA+nB)*int(phi>0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); + vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); + vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); + if (porosity==1.0){ + Fx=rho0*(Gx + Gff_x + Gfs_x); + Fy=rho0*(Gy + Gff_y + Gfs_y); + Fz=rho0*(Gz + Gff_z + Gfs_z); + } + + //Calculate pressure for Incompressible-MRT model + pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); + +// //..............carry out relaxation process............................................... +// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; +// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; +// jx = jx + Fx; +// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +// jy = jy + Fy; +// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +// jz = jz + Fz; +// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) +// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; +// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) +// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; +// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) +// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; +// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) +// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; +// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) +// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; +// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) +// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; +// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) +// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); +// //....................................................................................................... + + //-------------------- IMRT collison where body force has NO higher-order terms -------------// + //..............carry out relaxation process............................................... + m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); + m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); + m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); + m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); + m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... + + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + //nread = neighborList[n+Np]; + dist[nr2] = fq; + + // q=2 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + //nread = neighborList[n]; + dist[nr1] = fq; + + // q = 3 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+3*Np]; + dist[nr4] = fq; + + // q = 4 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+2*Np]; + dist[nr3] = fq; + + // q = 5 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+5*Np]; + dist[nr6] = fq; + + // q = 6 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+4*Np]; + dist[nr5] = fq; + + // q = 7 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + nread = neighborList[n+7*Np]; + dist[nread] = fq; + + // q = 8 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); + nread = neighborList[n+6*Np]; + dist[nread] = fq; + + // q = 9 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + nread = neighborList[n+9*Np]; + dist[nread] = fq; + + // q = 10 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + nread = neighborList[n+8*Np]; + dist[nread] = fq; + + // q = 11 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); + nread = neighborList[n+11*Np]; + dist[nread] = fq; + + // q = 12 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + nread = neighborList[n+10*Np]; + dist[nread]= fq; + + // q = 13 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); + nread = neighborList[n+13*Np]; + dist[nread] = fq; + + // q= 14 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); + nread = neighborList[n+12*Np]; + dist[nread] = fq; + + // q = 15 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + nread = neighborList[n+15*Np]; + dist[nread] = fq; + + // q = 16 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + nread = neighborList[n+14*Np]; + dist[nread] = fq; + + // q = 17 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + nread = neighborList[n+17*Np]; + dist[nread] = fq; + + // q = 18 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + nread = neighborList[n+16*Np]; + dist[nread] = fq; + //........................................................................ + + //Update velocity on device + Velocity[0*Np+n] = ux; + Velocity[1*Np+n] = uy; + Velocity[2*Np+n] = uz; + //Update pressure on device + Pressure[n] = pressure; + + //-----------------------Mass transport------------------------// + // calcuale chemical potential + chem_a = lambda*(nA*nA*nA-1.5*nA*nA+0.5*nA)-kappa*nA_lap; + chem_b = lambda*(nB*nB*nB-1.5*nB*nB+0.5*nB)-kappa*nB_lap; + nA_sum_tmp = 0.0; + nB_sum_tmp = 0.0; + rlx_massA = 3.f-sqrt(3.f); + rlx_massB = 3.f-sqrt(3.f); + + //............................................... + // q = 0,2,4 + // Cq = {1,0,0}, {0,1,0}, {0,0,1} + a1 = Aq[nr2]; + b1 = Bq[nr2]; + a2 = Aq[nr1]; + b2 = Bq[nr1]; + a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5+nA*4.5*ux)); + b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5+nB*4.5*ux)); + a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5-nA*4.5*ux)); + b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5-nB*4.5*ux)); + nA_sum_tmp += a1+a2; + nB_sum_tmp += b1+b2; + + // q = 1 + //nread = neighborList[n+Np]; + Aq[nr2] = a1; + Bq[nr2] = b1; + // q=2 + //nread = neighborList[n]; + Aq[nr1] = a2; + Bq[nr1] = b2; + + //............................................... + // Cq = {0,1,0} + a1 = Aq[nr4]; + b1 = Bq[nr4]; + a2 = Aq[nr3]; + b2 = Bq[nr3]; + a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5+nA*4.5*uy)); + b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5+nB*4.5*uy)); + a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5-nA*4.5*uy)); + b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5-nB*4.5*uy)); + nA_sum_tmp += a1+a2; + nB_sum_tmp += b1+b2; + + // q = 3 + //nread = neighborList[n+3*Np]; + Aq[nr4] = a1; + Bq[nr4] = b1; + // q = 4 + //nread = neighborList[n+2*Np]; + Aq[nr3] = a2; + Bq[nr3] = b2; + + //............................................... + // q = 4 + // Cq = {0,0,1} + a1 = Aq[nr6]; + b1 = Bq[nr6]; + a2 = Aq[nr5]; + b2 = Bq[nr5]; + a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5+nA*4.5*uz)); + b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5+nB*4.5*uz)); + a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5-nA*4.5*uz)); + b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5-nB*4.5*uz)); + nA_sum_tmp += a1+a2; + nB_sum_tmp += b1+b2; + + // q = 5 + //nread = neighborList[n+5*Np]; + Aq[nr6] = a1; + Bq[nr6] = b1; + // q = 6 + //nread = neighborList[n+4*Np]; + Aq[nr5] = a2; + Bq[nr5] = b2; + //............................................... + + // Instantiate mass transport distributions + // Stationary value - distribution 0 + a1=Aq[n]; + b1=Bq[n]; + Aq[n] = (1.0-rlx_massA)*a1+rlx_massA*(nA-nA_sum_tmp); + Bq[n] = (1.0-rlx_massB)*b1+rlx_massB*(nB-nB_sum_tmp); + + + } + } +} + __global__ void dvc_ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np){ int n; int S = Np/NBLOCKS/NTHREADS + 1; @@ -1510,9 +2796,9 @@ __global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, doub m18 = Den[nn]*int(n!=nn); //............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)); + nx = 0.3333333333333333*1.f/18.f*(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); + ny = 0.3333333333333333*1.f/18.f*(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); + nz = 0.3333333333333333*1.f/18.f*(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); DenGrad[n] = nx; DenGrad[Np+n] = ny; @@ -1521,6 +2807,61 @@ __global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, doub } } +__global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np){ + + int n,nn; + // distributions + double m1,m2,m3,m4,m5,m6,m7,m8,m9; + double m10,m11,m12,m13,m14,m15,m16,m17,m18; + double lap; + + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s>>(dist, Aq, Bq, Den, DenGradA, DenGradB,DenLapA,DenLapB, SolidForce, start, finish, Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappa,lambda, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleColorChem: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, + double *DenGradA, double *DenGradB, double *DenLapA, double *DenLapB,double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappa,double lambda,double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure){ + + dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem<<>>(neighborList, dist, Aq, Bq, Den, DenGradA, DenGradB,DenLapA,DenLapB, SolidForce, start, finish, Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappa,lambda, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleColorChem: %s \n",cudaGetErrorString(err)); + } +} + + extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, int start, int finish, int Np){ dvc_ScaLBL_D3Q7_GreyColorIMRT_Init<<>>(Den, Aq, Bq, start, finish, Np); cudaError_t err = cudaGetLastError(); @@ -1594,3 +2964,10 @@ extern "C" void ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, double * } } +extern "C" void ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np){ + dvc_ScaLBL_D3Q19_GreyscaleColor_Laplacian<<>>(neighborList, Den, DenLap, start, finish, Np); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_GreyscaleColor_Laplacian: %s \n",cudaGetErrorString(err)); + } +} diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 5eefb899..4b1164e1 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -14,7 +14,7 @@ void DeleteArray( const TYPE *p ) } ScaLBL_GreyscaleColorModel::ScaLBL_GreyscaleColorModel(int RANK, int NP, MPI_Comm COMM): -rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0),rhoA(0),rhoB(0),Gsc(0), +rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0),rhoA(0),rhoB(0),Gsc(0),gamma(0),kappa(0),lambda(0), Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),GreyPorosity(0), Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) { @@ -48,6 +48,10 @@ void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ din=dout=1.0; flux=0.0; dp = 10.0; //unit of 'dp': voxel + Gsc = 1.0; + gamma = 1.0; + kappa = 1.0; + lambda = 1.0; // ---------------------- Greyscale Model parameters -----------------------// if (greyscaleColor_db->keyExists( "timestepMax" )){ @@ -70,6 +74,15 @@ void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ if (greyscaleColor_db->keyExists( "Gsc" )){ Gsc = greyscaleColor_db->getScalar( "Gsc" ); } + if (greyscaleColor_db->keyExists( "gamma" )){ + gamma = greyscaleColor_db->getScalar( "gamma" ); + } + if (greyscaleColor_db->keyExists( "kappa" )){ + kappa = greyscaleColor_db->getScalar( "kappa" ); + } + if (greyscaleColor_db->keyExists( "lambda" )){ + lambda = greyscaleColor_db->getScalar( "lambda" ); + } if (greyscaleColor_db->keyExists( "dp" )){ dp = greyscaleColor_db->getScalar( "dp" ); } @@ -544,6 +557,8 @@ void ScaLBL_GreyscaleColorModel::Create(){ ScaLBL_AllocateDeviceMemory((void **) &SolidForce, 3*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &DenGradA, 3*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &DenGradB, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &DenLapA, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &DenLapB, sizeof(double)*Np); //........................................................................... // Update GPU data structures if (rank==0) printf ("Setting up device neighbor list \n"); @@ -670,9 +685,24 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&Den[1*Np],DenGradB); + //compute Den laplacian - component A + ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[0*Np], DenLapA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&Den[0*Np]); + ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[0*Np], DenLapA, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[0*Np],DenLapA); + + //compute Den laplacian - component B + ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[1*Np], DenLapB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&Den[1*Np]); + ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[1*Np], DenLapB, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[1*Np],DenLapB); + ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL - ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, - tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); +// ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, +// tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); + ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, DenLapA,DenLapB, SolidForce, + ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappa,lambda, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc); ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); @@ -681,8 +711,10 @@ void ScaLBL_GreyscaleColorModel::Run(){ // ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); // ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); // } - ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, - tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); +// ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, +// tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); + ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, DenLapA,DenLapB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappa,lambda, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); @@ -707,9 +739,24 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&Den[1*Np],DenGradB); + //compute Den laplacian - component A + ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[0*Np], DenLapA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&Den[0*Np]); + ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[0*Np], DenLapA, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[0*Np],DenLapA); + + //compute Den laplacian - component B + ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[1*Np], DenLapB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&Den[1*Np]); + ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[1*Np], DenLapB, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[1*Np],DenLapB); + ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL - ScaLBL_D3Q19_AAeven_GreyscaleColor(fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, - tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); +// ScaLBL_D3Q19_AAeven_GreyscaleColor(fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, +// tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); + ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Aq, Bq, Den, DenGradA, DenGradB, DenLapA,DenLapB, SolidForce, + ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappa,lambda, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc); ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); @@ -718,8 +765,10 @@ void ScaLBL_GreyscaleColorModel::Run(){ // ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); // ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); // } - ScaLBL_D3Q19_AAeven_GreyscaleColor(fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, - tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); +// ScaLBL_D3Q19_AAeven_GreyscaleColor(fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, +// tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); + ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Aq, Bq, Den, DenGradA, DenGradB, DenLapA,DenLapB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappa,lambda, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); //************************************************************************/ diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h index 52841c4a..85bbb56f 100644 --- a/models/GreyscaleColorModel.h +++ b/models/GreyscaleColorModel.h @@ -44,6 +44,8 @@ public: double dp;//solid particle diameter, unit in voxel double GreyPorosity; double Gsc; + double gamma; + double kappa,lambda; int Nx,Ny,Nz,N,Np; int rank,nprocx,nprocy,nprocz,nprocs; @@ -71,6 +73,8 @@ public: double *SolidForce; double *DenGradA; double *DenGradB; + double *DenLapA; + double *DenLapB; IntArray Map; DoubleArray SignDist; DoubleArray Velocity_x; From 297ea4cb63ab1ec610606722308d00ddafd9b987 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Fri, 17 Apr 2020 16:23:06 -0400 Subject: [PATCH 10/75] update the chemical potential approach and save work --- common/ScaLBL.h | 28 +- gpu/GreyscaleColor.cu | 511 ++++++++++++++++++++++++--------- models/GreyscaleColorModel.cpp | 252 +++++++++++----- models/GreyscaleColorModel.h | 20 +- 4 files changed, 583 insertions(+), 228 deletions(-) diff --git a/common/ScaLBL.h b/common/ScaLBL.h index e9561be3..7bee2d1b 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -84,28 +84,34 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double *dis double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure); -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Aq, double *Bq, double *Den, - double *DenGradA, double *DenGradB, double *DenLapA, double *DenLapB, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappa,double lambda, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure); +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, + double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, - double *DenGradA, double *DenGradB, double *DenLapA, double *DenLapB,double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappa,double lambda,double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure); +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, + double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); -extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, double *Phi, int start, int finish, int Np); extern "C" void ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np); -extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *NeighborList, double *Aq, double *Bq, double *Den, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *NeighborList, double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np); extern "C" void ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np); extern "C" void ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q19_GreyscaleColor_Pressure(double *dist, double *Den, double *Porosity,double *Velocity, + double *Pressure, double rhoA,double rhoB, int Np); + +extern "C" void ScaLBL_D3Q19_GreyscaleColor_PressureTensor(int *neighborList, double *Phi, double *PressTensor, double *PhiLap, + double kappaA,double kappaB,double lambdaA,double lambdaB, int start, int finish, int Np); + // MRT MODEL extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_setA, double rlx_setB, double Fx, double Fy, double Fz); diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu index edfb903f..b773ab4a 100644 --- a/gpu/GreyscaleColor.cu +++ b/gpu/GreyscaleColor.cu @@ -3,6 +3,69 @@ #define NBLOCKS 1024 #define NTHREADS 256 +__global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Pressure(double *dist, double *Den, double *Poros,double *Velocity, + double *Pressure, double rhoA,double rhoB, int N){ + + int n; + double ux,uy,uz,u_mag; + double pressure; + double porosity; + double rho0; + double phi; + double nA,nB; + + int S = N/NBLOCKS/NTHREADS + 1; + for (int s=0; s0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); + + //Load pressure gradient + px=PressureGrad[0*Np+n]; + py=PressureGrad[1*Np+n]; + pz=PressureGrad[2*Np+n]; + + //Load pressure tensor gradient + //For reference full list of PressTensorGrad + //PressTensorGrad[n+0*Np] = Pxx_x + //PressTensorGrad[n+1*Np] = Pxx_y + //PressTensorGrad[n+2*Np] = Pxx_z + //PressTensorGrad[n+3*Np] = Pyy_x + //PressTensorGrad[n+4*Np] = Pyy_y + //PressTensorGrad[n+5*Np] = Pyy_z + //PressTensorGrad[n+6*Np] = Pzz_x + //PressTensorGrad[n+7*Np] = Pzz_y + //PressTensorGrad[n+8*Np] = Pzz_z + //PressTensorGrad[n+9*Np] = Pxy_x + //PressTensorGrad[n+10*Np] = Pxy_y + //PressTensorGrad[n+11*Np] = Pxy_z + //PressTensorGrad[n+12*Np] = Pyz_x + //PressTensorGrad[n+13*Np] = Pyz_y + //PressTensorGrad[n+14*Np] = Pyz_z + //PressTensorGrad[n+15*Np] = Pxz_x + //PressTensorGrad[n+16*Np] = Pxz_y + //PressTensorGrad[n+17*Np] = Pxz_z + Pxx_x = PressTensorGrad[0*Np+n]; + Pyy_y = PressTensorGrad[4*Np+n]; + Pzz_z = PressTensorGrad[8*Np+n]; + Pxy_x = PressTensorGrad[9*Np+n]; + Pxz_x = PressTensorGrad[15*Np+n]; + Pxy_y = PressTensorGrad[10*Np+n]; + Pyz_y = PressTensorGrad[13*Np+n]; + Pyz_z = PressTensorGrad[14*Np+n]; + Pxz_z = PressTensorGrad[17*Np+n]; + //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... + //TODO double check if you need porosity as a fre-factor + Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); + Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); + Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); + // fluid-solid force + Gfs_x = (nA-nB)*SolidForce[n+0*Np]; + Gfs_y = (nA-nB)*SolidForce[n+1*Np]; + Gfs_z = (nA-nB)*SolidForce[n+2*Np]; // local density rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); @@ -1623,20 +1728,6 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double m18 -= fq; //---------------------------------------------------------------------// - //---------------- Calculate SC fluid-fluid and fluid-solid forces ---------------// - // fluid-fluid force - Gff_x = -Gsc*(nA*nB_gradx+nB*nA_gradx); - Gff_y = -Gsc*(nA*nB_grady+nB*nA_grady); - Gff_z = -Gsc*(nA*nB_gradz+nB*nA_gradz); - // fluid-solid force - Gfs_x = (nA-nB)*SolidForce[n+0*Np]; - Gfs_y = (nA-nB)*SolidForce[n+1*Np]; - Gfs_z = (nA-nB)*SolidForce[n+2*Np]; - - porosity = Poros[n]; - // use local saturation as an estimation of effective relperm values - perm = Perm[n]*nA/(nA+nB)*int(phi>0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); @@ -1810,10 +1901,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double //-----------------------Mass transport------------------------// // calcuale chemical potential - chem_a = lambda*(nA*nA*nA-1.5*nA*nA+0.5*nA)-kappa*nA_lap; - chem_b = lambda*(nB*nB*nB-1.5*nB*nB+0.5*nB)-kappa*nB_lap; - nA_sum_tmp = 0.0; - nB_sum_tmp = 0.0; + chem_a = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-0.25*kappaA*phi_lap; + chem_b = lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*kappaB*phi_lap; rlx_massA = 3.f-sqrt(3.f); rlx_massB = 3.f-sqrt(3.f); @@ -1824,12 +1913,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double b1 = Bq[1*Np+n]; a2 = Aq[2*Np+n]; b2 = Bq[2*Np+n]; - a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5+nA*4.5*ux)); - b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5+nB*4.5*ux)); - a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5-nA*4.5*ux)); - b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5-nB*4.5*ux)); - nA_sum_tmp += a1+a2; - nB_sum_tmp += b1+b2; + a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*ux)); + b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*ux)); + a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*ux)); + b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*ux)); Aq[1*Np+n] = a1; Bq[1*Np+n] = b1; @@ -1843,12 +1930,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double b1 = Bq[3*Np+n]; a2 = Aq[4*Np+n]; b2 = Bq[4*Np+n]; - a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5+nA*4.5*uy)); - b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5+nB*4.5*uy)); - a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5-nA*4.5*uy)); - b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5-nB*4.5*uy)); - nA_sum_tmp += a1+a2; - nB_sum_tmp += b1+b2; + a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uy)); + b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uy)); + a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uy)); + b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uy)); Aq[3*Np+n] = a1; Bq[3*Np+n] = b1; @@ -1861,12 +1946,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double b1 = Bq[5*Np+n]; a2 = Aq[6*Np+n]; b2 = Bq[6*Np+n]; - a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5+nA*4.5*uz)); - b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5+nB*4.5*uz)); - a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5-nA*4.5*uz)); - b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5-nB*4.5*uz)); - nA_sum_tmp += a1+a2; - nB_sum_tmp += b1+b2; + a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uz)); + b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uz)); + a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uz)); + b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uz)); Aq[5*Np+n] = a1; Bq[5*Np+n] = b1; @@ -1878,18 +1961,18 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double // Stationary value - distribution 0 a1=Aq[n]; b1=Bq[n]; - Aq[n] = (1.0-rlx_massA)*a1+rlx_massA*(nA-nA_sum_tmp); - Bq[n] = (1.0-rlx_massB)*b1+rlx_massB*(nB-nB_sum_tmp); + Aq[n] = (1.0-rlx_massA)*a1+rlx_massA*(nA-3.0*gamma*chem_a); + Bq[n] = (1.0-rlx_massB)*b1+rlx_massB*(nB-3.0*gamma*chem_b); } } } -__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, - double *DenGradA, double *DenGradB, double *DenLapA, double *DenLapB,double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappa,double lambda,double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure){ +__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, + double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ int n, nread, nr1,nr2,nr3,nr4,nr5,nr6; double vx,vy,vz,v_mag; @@ -1910,17 +1993,19 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou double mu_eff;//effective kinematic viscosity for Darcy term double rho0; double phi; + double phi_lap;//laplacian of phase field double nA,nB; - double nA_sum_tmp,nB_sum_tmp; double a1,b1,a2,b2; - double nA_gradx,nA_grady,nA_gradz; - double nB_gradx,nB_grady,nB_gradz; - double Gff_x,Gff_y,Gff_z; double Gfs_x,Gfs_y,Gfs_z; - double Gsc = 1.f/3.f*sqrt(kappa*lambda); - double nA_lap,nB_lap; + double Gff_x,Gff_y,Gff_z; double chem_a,chem_b; double rlx_massA,rlx_massB; + // *---------------------------------Pressure Tensor Gradient------------------------------------*// + double Pxx_x,Pyy_y,Pzz_z; + double Pxy_x,Pxy_y; + double Pyz_y,Pyz_z; + double Pxz_x,Pxz_z; + double px,py,pz; //pressure gradient const double mrt_V1=0.05263157894736842; const double mrt_V2=0.012531328320802; @@ -1945,17 +2030,58 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // read the component number densities nA = Den[n]; nB = Den[Np + n]; - 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]; - nA_lap = DenLapA[n];//laplacian of denA - nB_lap = DenLapB[n]; - // compute phase indicator field phi=(nA-nB)/(nA+nB); + // load laplacian of phase field + phi_lap = PhiLap[n]; + // Load voxel porosity and perm + porosity = Poros[n]; + // use local saturation as an estimation of effective relperm values + perm = Perm[n]*nA/(nA+nB)*int(phi>0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); + + //Load pressure gradient + px=PressureGrad[0*Np+n]; + py=PressureGrad[1*Np+n]; + pz=PressureGrad[2*Np+n]; + + //Load pressure tensor gradient + //For reference full list of PressTensorGrad + //PressTensorGrad[n+0*Np] = Pxx_x + //PressTensorGrad[n+1*Np] = Pxx_y + //PressTensorGrad[n+2*Np] = Pxx_z + //PressTensorGrad[n+3*Np] = Pyy_x + //PressTensorGrad[n+4*Np] = Pyy_y + //PressTensorGrad[n+5*Np] = Pyy_z + //PressTensorGrad[n+6*Np] = Pzz_x + //PressTensorGrad[n+7*Np] = Pzz_y + //PressTensorGrad[n+8*Np] = Pzz_z + //PressTensorGrad[n+9*Np] = Pxy_x + //PressTensorGrad[n+10*Np] = Pxy_y + //PressTensorGrad[n+11*Np] = Pxy_z + //PressTensorGrad[n+12*Np] = Pyz_x + //PressTensorGrad[n+13*Np] = Pyz_y + //PressTensorGrad[n+14*Np] = Pyz_z + //PressTensorGrad[n+15*Np] = Pxz_x + //PressTensorGrad[n+16*Np] = Pxz_y + //PressTensorGrad[n+17*Np] = Pxz_z + Pxx_x = PressTensorGrad[0*Np+n]; + Pyy_y = PressTensorGrad[4*Np+n]; + Pzz_z = PressTensorGrad[8*Np+n]; + Pxy_x = PressTensorGrad[9*Np+n]; + Pxz_x = PressTensorGrad[15*Np+n]; + Pxy_y = PressTensorGrad[10*Np+n]; + Pyz_y = PressTensorGrad[13*Np+n]; + Pyz_z = PressTensorGrad[14*Np+n]; + Pxz_z = PressTensorGrad[17*Np+n]; + //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... + //TODO double check if you need porosity as a fre-factor + Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); + Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); + Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); + // fluid-solid force + Gfs_x = (nA-nB)*SolidForce[n+0*Np]; + Gfs_y = (nA-nB)*SolidForce[n+1*Np]; + Gfs_z = (nA-nB)*SolidForce[n+2*Np]; // local density rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); @@ -2258,20 +2384,6 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou m18 -= fq; //---------------------------------------------------------------------// - //---------------- Calculate SC fluid-fluid and fluid-solid forces ---------------// - // fluid-fluid force - Gff_x = -Gsc*(nA*nB_gradx+nB*nA_gradx); - Gff_y = -Gsc*(nA*nB_grady+nB*nA_grady); - Gff_z = -Gsc*(nA*nB_gradz+nB*nA_gradz); - // fluid-solid force - Gfs_x = (nA-nB)*SolidForce[n+0*Np]; - Gfs_y = (nA-nB)*SolidForce[n+1*Np]; - Gfs_z = (nA-nB)*SolidForce[n+2*Np]; - - porosity = Poros[n]; - // use local saturation as an estimation of effective relperm values - perm = Perm[n]*nA/(nA+nB)*int(phi>0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); @@ -2464,10 +2576,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou //-----------------------Mass transport------------------------// // calcuale chemical potential - chem_a = lambda*(nA*nA*nA-1.5*nA*nA+0.5*nA)-kappa*nA_lap; - chem_b = lambda*(nB*nB*nB-1.5*nB*nB+0.5*nB)-kappa*nB_lap; - nA_sum_tmp = 0.0; - nB_sum_tmp = 0.0; + chem_a = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-0.25*kappaA*phi_lap; + chem_b = lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*kappaB*phi_lap; rlx_massA = 3.f-sqrt(3.f); rlx_massB = 3.f-sqrt(3.f); @@ -2478,12 +2588,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou b1 = Bq[nr2]; a2 = Aq[nr1]; b2 = Bq[nr1]; - a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5+nA*4.5*ux)); - b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5+nB*4.5*ux)); - a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5-nA*4.5*ux)); - b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5-nB*4.5*ux)); - nA_sum_tmp += a1+a2; - nB_sum_tmp += b1+b2; + a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*ux)); + b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*ux)); + a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*ux)); + b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*ux)); // q = 1 //nread = neighborList[n+Np]; @@ -2500,12 +2608,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou b1 = Bq[nr4]; a2 = Aq[nr3]; b2 = Bq[nr3]; - a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5+nA*4.5*uy)); - b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5+nB*4.5*uy)); - a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5-nA*4.5*uy)); - b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5-nB*4.5*uy)); - nA_sum_tmp += a1+a2; - nB_sum_tmp += b1+b2; + a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uy)); + b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uy)); + a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uy)); + b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uy)); // q = 3 //nread = neighborList[n+3*Np]; @@ -2523,12 +2629,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou b1 = Bq[nr6]; a2 = Aq[nr5]; b2 = Bq[nr5]; - a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5+nA*4.5*uz)); - b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5+nB*4.5*uz)); - a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*(gamma*chem_a*4.5-nA*4.5*uz)); - b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*(gamma*chem_b*4.5-nB*4.5*uz)); - nA_sum_tmp += a1+a2; - nB_sum_tmp += b1+b2; + a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uz)); + b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uz)); + a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uz)); + b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uz)); // q = 5 //nread = neighborList[n+5*Np]; @@ -2544,8 +2648,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // Stationary value - distribution 0 a1=Aq[n]; b1=Bq[n]; - Aq[n] = (1.0-rlx_massA)*a1+rlx_massA*(nA-nA_sum_tmp); - Bq[n] = (1.0-rlx_massB)*b1+rlx_massB*(nB-nB_sum_tmp); + Aq[n] = (1.0-rlx_massA)*a1+rlx_massA*(nA-3.0*gamma*chem_a); + Bq[n] = (1.0-rlx_massB)*b1+rlx_massB*(nB-3.0*gamma*chem_b); } @@ -2590,7 +2694,7 @@ __global__ void dvc_ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, d } } -__global__ void dvc_ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, int start, int finish, int Np){ +__global__ void dvc_ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, double *Phi, int start, int finish, int Np){ int idx; double nA,nB; @@ -2617,11 +2721,13 @@ __global__ void dvc_ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, doub Bq[4*Np+idx]=0.1111111111111111*nB; Bq[5*Np+idx]=0.1111111111111111*nB; Bq[6*Np+idx]=0.1111111111111111*nB; + + Phi[idx] = nA-nB; } } } -__global__ void dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *neighborList, double *Aq, double *Bq, double *Den, int start, int finish, int Np){ +__global__ void dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *neighborList, double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ int n,nread; double fq,nA,nB; @@ -2682,11 +2788,13 @@ __global__ void dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *neighborList, // save the number densities Den[n] = nA; Den[Np+n] = nB; + // save the phase field + Phi[n] = nA-nB; } } } -__global__ void dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, int start, int finish, int Np){ +__global__ void dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ int n; double fq,nA,nB; @@ -2741,6 +2849,8 @@ __global__ void dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double // save the number densities Den[n] = nA; Den[Np+n] = nB; + // save the phase field + Phi[n] = nA-nB; } } } @@ -2863,6 +2973,115 @@ __global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, dou } } +__global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_PressureTensor(int *neighborList, double *Phi, double *PressTensor, double *PhiLap, + double kappaA,double kappaB,double lambdaA,double lambdaB, int start, int finish, int Np){ + //**GreyscaleColor model related parameters: + //kappaA, kappaB: characterize interfacial tension + //lambdaA, lambdaB: characterize bulk free energy + //nA: concentration of liquid 1; + //nB: concentration of liquid 2; + //nA = 0.5*(1+phi/chi) + //nB = 0.5*(1-phi/chi) + //nA+nB=1 + //chi: a scaling factor, is set to 1.0 for now. + + int nn,n; + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double m3,m5,m7; + double nx,ny,nz;//Color gradient + double nA,nB;//ELBM parameters: concentration of liquid 1 and 2 + double phi;//phase field + double pb;//thermodynamic bulk fluid pressure + double Lphi;//Laplacian of phase field + double C;//squared magnitude of the gradient of phase field + double chi = 1.0;//legacy ELBM parameter, scale the phase field; may be useful in the future; + double kappa = 0.25*(kappaA+kappaB)/(chi*chi);//the effective surface tension coefficient + double Pxx,Pyy,Pzz,Pxy,Pyz,Pxz;//Pressure tensor + + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s>>(dist, Aq, Bq, Den, DenGradA, DenGradB,DenLapA,DenLapB, SolidForce, start, finish, Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappa,lambda, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure); + dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem<<>>(dist, Aq, Bq, Den, SolidForce, start, finish, Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ @@ -2905,13 +3124,14 @@ extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Aq, } } -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, - double *DenGradA, double *DenGradB, double *DenLapA, double *DenLapB,double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappa,double lambda,double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure){ +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, + double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem<<>>(neighborList, dist, Aq, Bq, Den, DenGradA, DenGradB,DenLapA,DenLapB, SolidForce, start, finish, Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappa,lambda, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure); + dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem<<>>(neighborList, dist, Aq, Bq, Den, SolidForce, start, finish, Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, + Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ @@ -2920,8 +3140,8 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double } -extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_GreyColorIMRT_Init<<>>(Den, Aq, Bq, start, finish, Np); +extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, double *Phi, int start, int finish, int Np){ + dvc_ScaLBL_D3Q7_GreyColorIMRT_Init<<>>(Den, Aq, Bq, Phi, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ printf("CUDA error in ScaLBL_D3Q7_GreyColorIMRT_Init: %s \n",cudaGetErrorString(err)); @@ -2936,9 +3156,9 @@ extern "C" void ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, doubl } } -extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *NeighborList, double *Aq, double *Bq, double *Den, int start, int finish, int Np){ +extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *NeighborList, double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorDensity<<>>(NeighborList, Aq, Bq, Den, start, finish, Np); + dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorDensity<<>>(NeighborList, Aq, Bq, Den, Phi, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ @@ -2946,9 +3166,9 @@ extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *NeighborList, doubl } } -extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, int start, int finish, int Np){ +extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorDensity<<>>(Aq, Bq, Den, start, finish, Np); + dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorDensity<<>>(Aq, Bq, Den, Phi, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ printf("CUDA error in ScaLBL_D3Q7_AAeven_GreyscaleColorDensity: %s \n",cudaGetErrorString(err)); @@ -2971,3 +3191,22 @@ extern "C" void ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, double printf("CUDA error in ScaLBL_D3Q19_GreyscaleColor_Laplacian: %s \n",cudaGetErrorString(err)); } } + +extern "C" void ScaLBL_D3Q19_GreyscaleColor_Pressure(double *dist, double *Den, double *Porosity,double *Velocity, + double *Pressure, double rhoA,double rhoB, int Np){ + + dvc_ScaLBL_D3Q19_GreyscaleColor_Pressure<<>>(dist, Den, Porosity, Velocity, Pressure, rhoA, rhoB, Np); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_GreyscaleColor_Pressure: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_GreyscaleColor_PressureTensor(int *neighborList, double *Phi, double *PressTensor, double *PhiLap, + double kappaA,double kappaB,double lambdaA,double lambdaB, int start, int finish, int Np){ + dvc_ScaLBL_D3Q19_GreyscaleColor_PressureTensor<<>>(neighborList,Phi,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,start,finish,Np); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_GreyscaleColor_PressureTensor: %s \n",cudaGetErrorString(err)); + } +} diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 4b1164e1..8360e2dc 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -14,7 +14,8 @@ void DeleteArray( const TYPE *p ) } ScaLBL_GreyscaleColorModel::ScaLBL_GreyscaleColorModel(int RANK, int NP, MPI_Comm COMM): -rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0),rhoA(0),rhoB(0),Gsc(0),gamma(0),kappa(0),lambda(0), +rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0), +rhoA(0),rhoB(0),gamma(0),kappaA(0),kappaB(0),lambdaA(0),lambdaB(0), Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),GreyPorosity(0), Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) { @@ -48,10 +49,12 @@ void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ din=dout=1.0; flux=0.0; dp = 10.0; //unit of 'dp': voxel - Gsc = 1.0; - gamma = 1.0; - kappa = 1.0; - lambda = 1.0; + //Gsc = 1.0; + gamma = 1.0;//may also have gammaA and gammaB; + kappaA = 1.0e-3; + kappaB = 1.0e-3; + lambdaA = 1.0e-3; + lambdaB = 1.0e-3; // ---------------------- Greyscale Model parameters -----------------------// if (greyscaleColor_db->keyExists( "timestepMax" )){ @@ -71,17 +74,23 @@ void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ if (greyscaleColor_db->keyExists( "rhoB" )){ rhoB = greyscaleColor_db->getScalar( "rhoB" ); } - if (greyscaleColor_db->keyExists( "Gsc" )){ - Gsc = greyscaleColor_db->getScalar( "Gsc" ); - } +// if (greyscaleColor_db->keyExists( "Gsc" )){ +// Gsc = greyscaleColor_db->getScalar( "Gsc" ); +// } if (greyscaleColor_db->keyExists( "gamma" )){ gamma = greyscaleColor_db->getScalar( "gamma" ); } - if (greyscaleColor_db->keyExists( "kappa" )){ - kappa = greyscaleColor_db->getScalar( "kappa" ); + if (greyscaleColor_db->keyExists( "kappaA" )){ + kappaA = greyscaleColor_db->getScalar( "kappaA" ); } - if (greyscaleColor_db->keyExists( "lambda" )){ - lambda = greyscaleColor_db->getScalar( "lambda" ); + if (greyscaleColor_db->keyExists( "kappaB" )){ + kappaB = greyscaleColor_db->getScalar( "kappaB" ); + } + if (greyscaleColor_db->keyExists( "lambdaA" )){ + lambdaA = greyscaleColor_db->getScalar( "lambdaA" ); + } + if (greyscaleColor_db->keyExists( "lambdaB" )){ + lambdaB = greyscaleColor_db->getScalar( "lambdaB" ); } if (greyscaleColor_db->keyExists( "dp" )){ dp = greyscaleColor_db->getScalar( "dp" ); @@ -550,15 +559,20 @@ void ScaLBL_GreyscaleColorModel::Create(){ ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &PressureGrad, 3*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Aq, 7*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Bq, 7*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Den, 2*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Phi, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &PhiLap, sizeof(double)*Np);//laplacian of phase field ScaLBL_AllocateDeviceMemory((void **) &SolidForce, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &DenGradA, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &DenGradB, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &DenLapA, sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &DenLapB, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &PressTensor, 6*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &PressTensorGrad, 18*sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &DenGradA, 3*sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &DenGradB, 3*sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &DenLapA, sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &DenLapB, sizeof(double)*Np); //........................................................................... // Update GPU data structures if (rank==0) printf ("Setting up device neighbor list \n"); @@ -608,17 +622,30 @@ void ScaLBL_GreyscaleColorModel::Initialize(){ ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + + //TODO need to initialize velocity field ! + //this is required for calculating the pressure_dvc + //can make a funciton to update velocity, such as ScaLBL_D3Q19_GreyColorIMRT_Velocity } else{ if (rank==0) printf ("Initializing density field \n"); DensityField_Init();//initialize density field - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); if (rank==0) printf ("Initializing distributions \n"); ScaLBL_D3Q19_GreyColorIMRT_Init(fq, Den, rhoA, rhoB, Np); + + //Velocity also needs initialization + if (rank==0) printf ("Initializing velocity field \n"); + double *vel_init; + vel_init = new double [3*Np]; + for (int i=0;i<3*Np;i++) vel_init[i]=0.0; + ScaLBL_CopyToDevice(Velocity,vel_init,3*Np*sizeof(double)); + ScaLBL_DeviceBarrier(); + delete [] vel_init; } } @@ -669,40 +696,77 @@ void ScaLBL_GreyscaleColorModel::Run(){ // Compute the density field // Read for Aq, Bq happens in this routine (requires communication) ScaLBL_Comm->BiSendD3Q7AA(Aq,Bq); //READ FROM NORMAL - ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(NeighborList, Aq, Bq, Den, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(NeighborList, Aq, Bq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->BiRecvD3Q7AA(Aq,Bq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); - ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(NeighborList, Aq, Bq, Den, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(NeighborList, Aq, Bq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); - //compute Den gradients - component A - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&Den[0*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[0*Np],DenGradA); - //compute Den gradients - component B - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&Den[1*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[1*Np],DenGradB); + // Update local pressure + ScaLBL_D3Q19_GreyscaleColor_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); + // Compute pressure gradient + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(Pressure_dvc); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(Pressure_dvc,PressureGrad);//TODO need to fix RecvGrad missing send function - see ScaLBL.cpp + ScaLBL_DeviceBarrier(); + // Compute Pressure Tensor + ScaLBL_Comm->SendHalo(Phi); + ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(),Np); + ScaLBL_Comm->RecvHalo(Phi); + ScaLBL_DeviceBarrier(); + ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,0,ScaLBL_Comm->LastExterior(),Np); + /* Compute gradient of the pressure tensor */ + // call the recv Grad function once per tensor element + // 1st tensor element + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&PressTensor[0*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&PressTensor[0*Np],&PressTensorGrad[0*Np]); + // 2nd tensor element + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&PressTensor[1*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&PressTensor[1*Np],&PressTensorGrad[3*Np]); + // 3rd tensor element + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&PressTensor[2*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&PressTensor[2*Np],&PressTensorGrad[6*Np]); + // 4th tensor element + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&PressTensor[3*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&PressTensor[3*Np],&PressTensorGrad[9*Np]); + // 5th tensor element + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&PressTensor[4*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&PressTensor[4*Np],&PressTensorGrad[12*Np]); + // 6th tensor element + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&PressTensor[5*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&PressTensor[5*Np],&PressTensorGrad[15*Np]); - //compute Den laplacian - component A - ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[0*Np], DenLapA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&Den[0*Np]); - ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[0*Np], DenLapA, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[0*Np],DenLapA); +// //compute Den gradients - component A +// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); +// ScaLBL_Comm->SendHalo(&Den[0*Np]); +// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); +// ScaLBL_Comm->RecvGrad(&Den[0*Np],DenGradA); +// //compute Den gradients - component B +// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); +// ScaLBL_Comm->SendHalo(&Den[1*Np]); +// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); +// ScaLBL_Comm->RecvGrad(&Den[1*Np],DenGradB); - //compute Den laplacian - component B - ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[1*Np], DenLapB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&Den[1*Np]); - ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[1*Np], DenLapB, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[1*Np],DenLapB); ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL // ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, // tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); - ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, DenLapA,DenLapB, SolidForce, + ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Aq, Bq, Den, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappa,lambda, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc); + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, + Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); @@ -713,8 +777,10 @@ void ScaLBL_GreyscaleColorModel::Run(){ // } // ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, // tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); - ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, DenLapA,DenLapB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappa,lambda, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc); + ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Aq, Bq, Den, SolidForce, + 0, ScaLBL_Comm->LastExterior(), Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, + Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); @@ -723,40 +789,76 @@ void ScaLBL_GreyscaleColorModel::Run(){ // Compute the density field // Read for Aq, Bq happens in this routine (requires communication) ScaLBL_Comm->BiSendD3Q7AA(Aq,Bq); //READ FROM NORMAL - ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(Aq, Bq, Den, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(Aq, Bq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->BiRecvD3Q7AA(Aq,Bq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); - ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(Aq, Bq, Den, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(Aq, Bq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); - //compute Den gradients - component A - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&Den[0*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[0*Np],DenGradA); - //compute Den gradients - component B - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&Den[1*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[1*Np],DenGradB); + // Update local pressure + ScaLBL_D3Q19_GreyscaleColor_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); + // Compute pressure gradient + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(Pressure_dvc); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(Pressure_dvc,PressureGrad);//TODO need to fix RecvGrad missing send function - see ScaLBL.cpp + ScaLBL_DeviceBarrier(); + // Compute Pressure Tensor + ScaLBL_Comm->SendHalo(Phi); + ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(),Np); + ScaLBL_Comm->RecvHalo(Phi); + ScaLBL_DeviceBarrier(); + ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,0,ScaLBL_Comm->LastExterior(),Np); + /* Compute gradient of the pressure tensor */ + // call the recv Grad function once per tensor element + // 1st tensor element + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&PressTensor[0*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&PressTensor[0*Np],&PressTensorGrad[0*Np]); + // 2nd tensor element + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&PressTensor[1*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&PressTensor[1*Np],&PressTensorGrad[3*Np]); + // 3rd tensor element + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&PressTensor[2*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&PressTensor[2*Np],&PressTensorGrad[6*Np]); + // 4th tensor element + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&PressTensor[3*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&PressTensor[3*Np],&PressTensorGrad[9*Np]); + // 5th tensor element + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&PressTensor[4*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&PressTensor[4*Np],&PressTensorGrad[12*Np]); + // 6th tensor element + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&PressTensor[5*Np]); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&PressTensor[5*Np],&PressTensorGrad[15*Np]); - //compute Den laplacian - component A - ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[0*Np], DenLapA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&Den[0*Np]); - ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[0*Np], DenLapA, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[0*Np],DenLapA); - - //compute Den laplacian - component B - ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[1*Np], DenLapB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&Den[1*Np]); - ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, &Den[1*Np], DenLapB, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[1*Np],DenLapB); +// //compute Den gradients - component A +// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); +// ScaLBL_Comm->SendHalo(&Den[0*Np]); +// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); +// ScaLBL_Comm->RecvGrad(&Den[0*Np],DenGradA); +// //compute Den gradients - component B +// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); +// ScaLBL_Comm->SendHalo(&Den[1*Np]); +// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); +// ScaLBL_Comm->RecvGrad(&Den[1*Np],DenGradB); ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL // ScaLBL_D3Q19_AAeven_GreyscaleColor(fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, // tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); - ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Aq, Bq, Den, DenGradA, DenGradB, DenLapA,DenLapB, SolidForce, - ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappa,lambda, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc); + ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Aq, Bq, Den, SolidForce, + ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, + Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); @@ -767,8 +869,10 @@ void ScaLBL_GreyscaleColorModel::Run(){ // } // ScaLBL_D3Q19_AAeven_GreyscaleColor(fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, // tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); - ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Aq, Bq, Den, DenGradA, DenGradB, DenLapA,DenLapB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappa,lambda, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc); + ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Aq, Bq, Den, SolidForce, + 0, ScaLBL_Comm->LastExterior(), Np, + tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, + Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); //************************************************************************/ diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h index 85bbb56f..374920d0 100644 --- a/models/GreyscaleColorModel.h +++ b/models/GreyscaleColorModel.h @@ -43,9 +43,10 @@ public: double din,dout; double dp;//solid particle diameter, unit in voxel double GreyPorosity; - double Gsc; + //double Gsc; double gamma; - double kappa,lambda; + double kappaA,kappaB; + double lambdaA,lambdaB; int Nx,Ny,Nz,N,Np; int rank,nprocx,nprocy,nprocz,nprocs; @@ -69,12 +70,17 @@ public: double *Permeability;//grey voxel permeability double *Porosity; double *Velocity; - double *Pressure_dvc; double *SolidForce; - double *DenGradA; - double *DenGradB; - double *DenLapA; - double *DenLapB; + double *Pressure_dvc; + double *PressureGrad;// gradiant of pressure + double *PressTensor;//pressure tensor + double *PressTensorGrad;// gradient of pressure tensor + double *Phi; + double *PhiLap;//laplacian of phase field phi +// double *DenGradA; +// double *DenGradB; +// double *DenLapA; +// double *DenLapB; IntArray Map; DoubleArray SignDist; DoubleArray Velocity_x; From 67f5076fa39e9170c67bf7319f262373a8177cee Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Fri, 17 Apr 2020 16:32:09 -0400 Subject: [PATCH 11/75] fix bug in recvGrad --- common/ScaLBL.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/common/ScaLBL.cpp b/common/ScaLBL.cpp index 6f2966e7..4c187f0e 100644 --- a/common/ScaLBL.cpp +++ b/common/ScaLBL.cpp @@ -1068,6 +1068,7 @@ void ScaLBL_Communicator::RecvGrad(double *phi, double *grad){ ScaLBL_Gradient_Unpack(1.0,-1,0,0,dvcRecvDist_x,0,recvCount_x,recvbuf_x,phi,grad,N); ScaLBL_Gradient_Unpack(0.5,-1,-1,0,dvcRecvDist_x,recvCount_x,recvCount_x,recvbuf_x,phi,grad,N); ScaLBL_Gradient_Unpack(0.5,-1,1,0,dvcRecvDist_x,2*recvCount_x,recvCount_x,recvbuf_x,phi,grad,N); + ScaLBL_Gradient_Unpack(0.5,-1,0,-1,dvcRecvDist_x,3*recvCount_x,recvCount_x,recvbuf_x,phi,grad,N); ScaLBL_Gradient_Unpack(0.5,-1,0,1,dvcRecvDist_x,4*recvCount_x,recvCount_x,recvbuf_x,phi,grad,N); //................................................................................... //...Packing for X face(1,7,9,11,13)................................ From 4f75ddd89ab7d6b5426bf65c0b646b0617a4727d Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sat, 18 Apr 2020 10:56:28 -0400 Subject: [PATCH 12/75] fix a few bugs; but wait to see if that works --- gpu/GreyscaleColor.cu | 24 +++++++++++++----------- models/GreyscaleColorModel.cpp | 4 ++-- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu index b773ab4a..1f939acc 100644 --- a/gpu/GreyscaleColor.cu +++ b/gpu/GreyscaleColor.cu @@ -1902,7 +1902,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double //-----------------------Mass transport------------------------// // calcuale chemical potential chem_a = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-0.25*kappaA*phi_lap; - chem_b = lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*kappaB*phi_lap; + chem_b = -lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*kappaB*phi_lap; rlx_massA = 3.f-sqrt(3.f); rlx_massB = 3.f-sqrt(3.f); @@ -2577,7 +2577,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou //-----------------------Mass transport------------------------// // calcuale chemical potential chem_a = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-0.25*kappaA*phi_lap; - chem_b = lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*kappaB*phi_lap; + chem_b = -lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*kappaB*phi_lap; rlx_massA = 3.f-sqrt(3.f); rlx_massB = 3.f-sqrt(3.f); @@ -2906,9 +2906,9 @@ __global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, doub m18 = Den[nn]*int(n!=nn); //............Compute the Color Gradient................................... - nx = 0.3333333333333333*1.f/18.f*(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); - ny = 0.3333333333333333*1.f/18.f*(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); - nz = 0.3333333333333333*1.f/18.f*(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); + nx = 1.f/6.f*(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); + ny = 1.f/6.f*(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); + nz = 1.f/6.f*(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); DenGrad[n] = nx; DenGrad[Np+n] = ny; @@ -2967,7 +2967,9 @@ __global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, dou nn = neighborList[n+16*Np]%Np; m18 = Den[nn]*int(n!=nn); - lap = 2.0*0.3333333333333333*1.f/18.f*(m1+m2+m3+m4+m5+m6-6*Den[n]+0.5*(m7+m8+m9+m10+m11+m12+m13+m14+m15+m16+m17+m18-12*Den[n])); + + + lap = 1.f/3.f*(m1+m2+m3+m4+m5+m6-6*Den[n]+0.5*(m7+m8+m9+m10+m11+m12+m13+m14+m15+m16+m17+m18-12*Den[n])); DenLap[n] = lap; } } @@ -3042,21 +3044,21 @@ __global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_PressureTensor(int *neighborLis m18 = Phi[nn]*int(n!=nn); //............Compute the Color Gradient................................... - nx = 0.3333333333333333*1.f/18.f*(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); - ny = 0.3333333333333333*1.f/18.f*(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); - nz = 0.3333333333333333*1.f/18.f*(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); + nx = 1.f/6.f*(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); + ny = 1.f/6.f*(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); + nz = 1.f/6.f*(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); C = nx*nx+ny*ny+nz*nz; // Laplacian of phase field //Lphi = 0.3333333333333333*(m1+m2+m3+m4+m5+m6)+ // 0.16666666666666666*(m7+m8+m9+m10+m11+m12+m13+m14+m15+m16+m17+m18) - 4.0*phi; phi = Phi[n]; - Lphi = 2.0*0.3333333333333333*1.f/18.f*(m1+m2+m3+m4+m5+m6-6*phi+0.5*(m7+m8+m9+m10+m11+m12+m13+m14+m15+m16+m17+m18-12*phi)); + Lphi = 1.f/3.f*(m1+m2+m3+m4+m5+m6-6*phi+0.5*(m7+m8+m9+m10+m11+m12+m13+m14+m15+m16+m17+m18-12*phi)); //bulk pressure p_b nA = 0.5*(1.0+phi/chi); nB = 0.5*(1.0-phi/chi); pb = -((1.0-nA)*(1.0-nA)*nA*nA*lambdaA)*0.5 - ((1.0-nB)*(1.0-nB)*nB*nB*lambdaB)*0.5 + - (nA - nB)*chi*(((0.5*nA-1.5*nA*nA+nA*nA*nA)*lambdaA)/chi + ((0.5*nB-1.5*nB*nB+nB*nB*nB)*lambdaB)/chi); + (nA - nB)*chi*(((0.5*nA-1.5*nA*nA+nA*nA*nA)*lambdaA)/chi - ((0.5*nB-1.5*nB*nB+nB*nB*nB)*lambdaB)/chi); //Pressure tensors Pxx=pb-kappa*phi*Lphi-0.5*kappa*C + kappa*nx*nx ; diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 8360e2dc..26c6d783 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -707,7 +707,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(Pressure_dvc); ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(Pressure_dvc,PressureGrad);//TODO need to fix RecvGrad missing send function - see ScaLBL.cpp + ScaLBL_Comm->RecvGrad(Pressure_dvc,PressureGrad); ScaLBL_DeviceBarrier(); // Compute Pressure Tensor ScaLBL_Comm->SendHalo(Phi); @@ -800,7 +800,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(Pressure_dvc); ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(Pressure_dvc,PressureGrad);//TODO need to fix RecvGrad missing send function - see ScaLBL.cpp + ScaLBL_Comm->RecvGrad(Pressure_dvc,PressureGrad); ScaLBL_DeviceBarrier(); // Compute Pressure Tensor ScaLBL_Comm->SendHalo(Phi); From dd3c177deed9112378e2934e138520b433333350 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sat, 18 Apr 2020 22:46:44 -0400 Subject: [PATCH 13/75] change the mass transport formulation;no longer solve Aq and Bq, only solve for phase field --- common/ScaLBL.cpp | 101 ++ common/ScaLBL.h | 23 +- gpu/GreyscaleColor.cu | 2861 ++++++++++++++++++++++++-------- models/GreyscaleColorModel.cpp | 49 +- models/GreyscaleColorModel.h | 3 +- 5 files changed, 2318 insertions(+), 719 deletions(-) diff --git a/common/ScaLBL.cpp b/common/ScaLBL.cpp index 4c187f0e..e0f3879c 100644 --- a/common/ScaLBL.cpp +++ b/common/ScaLBL.cpp @@ -1135,6 +1135,107 @@ void ScaLBL_Communicator::RecvGrad(double *phi, double *grad){ } +void ScaLBL_Communicator::SendD3Q7AA(double *Aq){ + + // NOTE: the center distribution f0 must NOT be at the start of feven, provide offset to start of f2 + if (Lock==true){ + ERROR("ScaLBL Error (SendD3Q7): ScaLBL_Communicator is locked -- did you forget to match Send/Recv calls?"); + } + else{ + Lock=true; + } + // assign tag of 19 to D3Q19 communication + sendtag = recvtag = 7; + ScaLBL_DeviceBarrier(); + // Pack the distributions + //...Packing for x face(2,8,10,12,14)................................ + ScaLBL_D3Q19_Pack(2,dvcSendList_x,0,sendCount_x,sendbuf_x,Aq,N); + + req1[0] = MPI_COMM_SCALBL.Isend(sendbuf_x, 2*sendCount_x,rank_x,sendtag); + req2[0] = MPI_COMM_SCALBL.Irecv(recvbuf_X, 2*recvCount_X,rank_X,recvtag); + + //...Packing for X face(1,7,9,11,13)................................ + ScaLBL_D3Q19_Pack(1,dvcSendList_X,0,sendCount_X,sendbuf_X,Aq,N); + + req1[1] = MPI_COMM_SCALBL.Isend(sendbuf_X, 2*sendCount_X,rank_X,sendtag); + req2[1] = MPI_COMM_SCALBL.Irecv(recvbuf_x, 2*recvCount_x,rank_x,recvtag); + + //...Packing for y face(4,8,9,16,18)................................. + ScaLBL_D3Q19_Pack(4,dvcSendList_y,0,sendCount_y,sendbuf_y,Aq,N); + + req1[2] = MPI_COMM_SCALBL.Isend(sendbuf_y, 2*sendCount_y,rank_y,sendtag); + req2[2] = MPI_COMM_SCALBL.Irecv(recvbuf_Y, 2*recvCount_Y,rank_Y,recvtag); + + //...Packing for Y face(3,7,10,15,17)................................. + ScaLBL_D3Q19_Pack(3,dvcSendList_Y,0,sendCount_Y,sendbuf_Y,Aq,N); + + req1[3] = MPI_COMM_SCALBL.Isend(sendbuf_Y, 2*sendCount_Y,rank_Y,sendtag); + req2[3] = MPI_COMM_SCALBL.Irecv(recvbuf_y, 2*recvCount_y,rank_y,recvtag); + + //...Packing for z face(6,12,13,16,17)................................ + ScaLBL_D3Q19_Pack(6,dvcSendList_z,0,sendCount_z,sendbuf_z,Aq,N); + + req1[4] = MPI_COMM_SCALBL.Isend(sendbuf_z, 2*sendCount_z,rank_z,sendtag); + req2[4] = MPI_COMM_SCALBL.Irecv(recvbuf_Z, 2*recvCount_Z,rank_Z,recvtag); + + //...Packing for Z face(5,11,14,15,18)................................ + ScaLBL_D3Q19_Pack(5,dvcSendList_Z,0,sendCount_Z,sendbuf_Z,Aq,N); + + //................................................................................... + // Send all the distributions + req1[5] = MPI_COMM_SCALBL.Isend(sendbuf_Z, 2*sendCount_Z,rank_Z,sendtag); + req2[5] = MPI_COMM_SCALBL.Irecv(recvbuf_z, 2*recvCount_z,rank_z,recvtag); + +} + +void ScaLBL_Communicator::RecvD3Q7AA(double *Aq){ + + // NOTE: the center distribution f0 must NOT be at the start of feven, provide offset to start of f2 + //................................................................................... + // Wait for completion of D3Q19 communication + MPI_COMM_SCALBL.waitAll(6,req1); + ScaLBL_DeviceBarrier(); + + //................................................................................... + // NOTE: AA Routine writes to opposite + // Unpack the distributions on the device + //................................................................................... + //...Unpacking for x face(2,8,10,12,14)................................ + ScaLBL_D3Q7_Unpack(2,dvcRecvDist_x,0,recvCount_x,recvbuf_x,Aq,N); + //................................................................................... + //...Packing for X face(1,7,9,11,13)................................ + ScaLBL_D3Q7_Unpack(1,dvcRecvDist_X,0,recvCount_X,recvbuf_X,Aq,N); + //................................................................................... + //...Packing for y face(4,8,9,16,18)................................. + ScaLBL_D3Q7_Unpack(4,dvcRecvDist_y,0,recvCount_y,recvbuf_y,Aq,N); + //................................................................................... + //...Packing for Y face(3,7,10,15,17)................................. + ScaLBL_D3Q7_Unpack(3,dvcRecvDist_Y,0,recvCount_Y,recvbuf_Y,Aq,N); + //................................................................................... + + if (BoundaryCondition > 0 && kproc == 0){ + // don't unpack little z + //...Packing for Z face(5,11,14,15,18)................................ + ScaLBL_D3Q7_Unpack(5,dvcRecvDist_Z,0,recvCount_Z,recvbuf_Z,Aq,N); + } + else if (BoundaryCondition > 0 && kproc == nprocz-1){ + // don't unpack big z + //...Packing for z face(6,12,13,16,17)................................ + ScaLBL_D3Q7_Unpack(6,dvcRecvDist_z,0,recvCount_z,recvbuf_z,Aq,N); + } + else { + //...Packing for z face(6,12,13,16,17)................................ + ScaLBL_D3Q7_Unpack(6,dvcRecvDist_z,0,recvCount_z,recvbuf_z,Aq,N); + //...Packing for Z face(5,11,14,15,18)................................ + ScaLBL_D3Q7_Unpack(5,dvcRecvDist_Z,0,recvCount_Z,recvbuf_Z,Aq,N); + } + + //................................................................................... + Lock=false; // unlock the communicator after communications complete + //................................................................................... + +} + void ScaLBL_Communicator::BiSendD3Q7AA(double *Aq, double *Bq){ // NOTE: the center distribution f0 must NOT be at the start of feven, provide offset to start of f2 diff --git a/common/ScaLBL.h b/common/ScaLBL.h index 7bee2d1b..d3251740 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -84,17 +84,28 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double *dis double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure); -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, +//extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, +// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, +// double Gx, double Gy, double Gz, +// double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); +// +//extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, +// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, +// double Gx, double Gy, double Gz, +// double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, double *Phi, double *Den,double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Cq, double *Phi, double *Den,double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); -extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, double *Phi, int start, int finish, int Np); +//extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, double *Phi, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Cq, double *Phi, int start, int finish, int Np); extern "C" void ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np); @@ -102,6 +113,10 @@ extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *NeighborList, doubl extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(int *NeighborList, double *Cq, double *Den, double *Phi, int start, int finish, int Np); + +extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(double *Cq, double *Den, double *Phi, int start, int finish, int Np); + extern "C" void ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np); extern "C" void ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np); @@ -223,6 +238,8 @@ public: void RecvD3Q19AA(double *dist); // void BiSendD3Q7(double *A_even, double *A_odd, double *B_even, double *B_odd); // void BiRecvD3Q7(double *A_even, double *A_odd, double *B_even, double *B_odd); + void SendD3Q7AA(double *Aq); + void RecvD3Q7AA(double *Aq); void BiSendD3Q7AA(double *Aq, double *Bq); void BiRecvD3Q7AA(double *Aq, double *Bq); void TriSendD3Q7AA(double *Aq, double *Bq, double *Cq); diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu index 1f939acc..489b8a6b 100644 --- a/gpu/GreyscaleColor.cu +++ b/gpu/GreyscaleColor.cu @@ -1329,438 +1329,470 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double } } -__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, - double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - int n; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; - double fq; - // currently disable 'GeoFun' - double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) - double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double tau,tau_eff,rlx_setA,rlx_setB; - double mu_eff;//effective kinematic viscosity for Darcy term - double rho0; - double phi; - double phi_lap;//laplacian of phase field - double nA,nB; - double a1,b1,a2,b2; - double Gfs_x,Gfs_y,Gfs_z; - double Gff_x,Gff_y,Gff_z; - double chem_a,chem_b; - double rlx_massA,rlx_massB; - // *---------------------------------Pressure Tensor Gradient------------------------------------*// - double Pxx_x,Pyy_y,Pzz_z; - double Pxy_x,Pxy_y; - double Pyz_y,Pyz_z; - double Pxz_x,Pxz_z; - double px,py,pz; //pressure gradient - - - 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; s0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); - - //Load pressure gradient - px=PressureGrad[0*Np+n]; - py=PressureGrad[1*Np+n]; - pz=PressureGrad[2*Np+n]; - - //Load pressure tensor gradient - //For reference full list of PressTensorGrad - //PressTensorGrad[n+0*Np] = Pxx_x - //PressTensorGrad[n+1*Np] = Pxx_y - //PressTensorGrad[n+2*Np] = Pxx_z - //PressTensorGrad[n+3*Np] = Pyy_x - //PressTensorGrad[n+4*Np] = Pyy_y - //PressTensorGrad[n+5*Np] = Pyy_z - //PressTensorGrad[n+6*Np] = Pzz_x - //PressTensorGrad[n+7*Np] = Pzz_y - //PressTensorGrad[n+8*Np] = Pzz_z - //PressTensorGrad[n+9*Np] = Pxy_x - //PressTensorGrad[n+10*Np] = Pxy_y - //PressTensorGrad[n+11*Np] = Pxy_z - //PressTensorGrad[n+12*Np] = Pyz_x - //PressTensorGrad[n+13*Np] = Pyz_y - //PressTensorGrad[n+14*Np] = Pyz_z - //PressTensorGrad[n+15*Np] = Pxz_x - //PressTensorGrad[n+16*Np] = Pxz_y - //PressTensorGrad[n+17*Np] = Pxz_z - Pxx_x = PressTensorGrad[0*Np+n]; - Pyy_y = PressTensorGrad[4*Np+n]; - Pzz_z = PressTensorGrad[8*Np+n]; - Pxy_x = PressTensorGrad[9*Np+n]; - Pxz_x = PressTensorGrad[15*Np+n]; - Pxy_y = PressTensorGrad[10*Np+n]; - Pyz_y = PressTensorGrad[13*Np+n]; - Pyz_z = PressTensorGrad[14*Np+n]; - Pxz_z = PressTensorGrad[17*Np+n]; - //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... - //TODO double check if you need porosity as a fre-factor - Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); - Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); - Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); - // fluid-solid force - Gfs_x = (nA-nB)*SolidForce[n+0*Np]; - Gfs_y = (nA-nB)*SolidForce[n+1*Np]; - Gfs_z = (nA-nB)*SolidForce[n+2*Np]; - - // local density - rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); - // local relaxation time - tau=tauA + 0.5*(1.0-phi)*(tauB-tauA); - rlx_setA = 1.f/tau; - rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); - tau_eff=tauA_eff + 0.5*(1.0-phi)*(tauB_eff-tauA_eff); - mu_eff = (tau_eff-0.5)/3.f;//kinematic viscosity - - - //........................................................................ - // READ THE DISTRIBUTIONS - // (read from opposite array due to previous swap operation) - //........................................................................ - // q=0 - fq = dist[n]; - m1 = -30.0*fq; - m2 = 12.0*fq; - - // q=1 - fq = dist[2*Np+n]; - pressure = fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jx = fq; - m4 = -4.0*fq; - m9 = 2.0*fq; - m10 = -4.0*fq; - - // f2 = dist[10*Np+n]; - fq = dist[1*Np+n]; - pressure += fq; - m1 -= 11.0*(fq); - m2 -= 4.0*(fq); - jx -= fq; - m4 += 4.0*(fq); - m9 += 2.0*(fq); - m10 -= 4.0*(fq); - - // q=3 - fq = dist[4*Np+n]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy = fq; - m6 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 = fq; - m12 = -2.0*fq; - - // q = 4 - fq = dist[3*Np+n]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy -= fq; - m6 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 += fq; - m12 -= 2.0*fq; - - // q=5 - fq = dist[6*Np+n]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz = fq; - m8 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q = 6 - fq = dist[5*Np+n]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz -= fq; - m8 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q=7 - fq = dist[8*Np+n]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 = fq; - m16 = fq; - m17 = -fq; - - // q = 8 - fq = dist[7*Np+n]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 += fq; - m16 -= fq; - m17 += fq; - - // q=9 - fq = dist[10*Np+n]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 += fq; - m17 += fq; - - // q = 10 - fq = dist[9*Np+n]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 -= fq; - m17 -= fq; - - // q=11 - fq = dist[12*Np+n]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 = fq; - m16 -= fq; - m18 = fq; - - // q=12 - fq = dist[11*Np+n]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 += fq; - m16 += fq; - m18 -= fq; - - // q=13 - fq = dist[14*Np+n]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 -= fq; - m18 -= fq; - - // q=14 - fq = dist[13*Np+n]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 += fq; - m18 += fq; - - // q=15 - fq = dist[16*Np+n]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 = fq; - m17 += fq; - m18 -= fq; - - // q=16 - fq = dist[15*Np+n]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 += fq; - m17 -= fq; - m18 += fq; - - // q=17 - fq = dist[18*Np+n]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 += fq; - m18 += fq; - - // q=18 - fq = dist[17*Np+n]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 -= fq; - m18 -= fq; - //---------------------------------------------------------------------// - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); - vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); - vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); - Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); - Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); - if (porosity==1.0){ - Fx=rho0*(Gx + Gff_x + Gfs_x); - Fy=rho0*(Gy + Gff_y + Gfs_y); - Fz=rho0*(Gz + Gff_z + Gfs_z); - } - - //Calculate pressure for Incompressible-MRT model - pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); - +//__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, +// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, +// double Gx, double Gy, double Gz, +// double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ +// int n; +// double vx,vy,vz,v_mag; +// double ux,uy,uz,u_mag; +// double pressure;//defined for this incompressible model +// // conserved momemnts +// double jx,jy,jz; +// // non-conserved moments +// double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; +// double fq; +// // currently disable 'GeoFun' +// double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) +// double porosity; +// double perm;//voxel permeability +// double c0, c1; //Guo's model parameters +// double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) +// double tau,tau_eff,rlx_setA,rlx_setB; +// double mu_eff;//effective kinematic viscosity for Darcy term +// double rho0; +// double phi; +// double phi_lap;//laplacian of phase field +// double nA,nB; +// double a1,b1,a2,b2; +// double Gfs_x,Gfs_y,Gfs_z; +// double Gff_x,Gff_y,Gff_z; +// double chem_a,chem_b; +// double rlx_massA,rlx_massB; +// // *---------------------------------Pressure Tensor Gradient------------------------------------*// +// double Pxx_x,Pyy_y,Pzz_z; +// double Pxy_x,Pxy_y; +// double Pyz_y,Pyz_z; +// double Pxz_x,Pxz_z; +// double px,py,pz; //pressure gradient +// +// +// 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; s0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); +// +// //Load pressure gradient +// px=PressureGrad[0*Np+n]; +// py=PressureGrad[1*Np+n]; +// pz=PressureGrad[2*Np+n]; +// +// //Load pressure tensor gradient +// //For reference full list of PressTensorGrad +// //PressTensorGrad[n+0*Np] = Pxx_x +// //PressTensorGrad[n+1*Np] = Pxx_y +// //PressTensorGrad[n+2*Np] = Pxx_z +// //PressTensorGrad[n+3*Np] = Pyy_x +// //PressTensorGrad[n+4*Np] = Pyy_y +// //PressTensorGrad[n+5*Np] = Pyy_z +// //PressTensorGrad[n+6*Np] = Pzz_x +// //PressTensorGrad[n+7*Np] = Pzz_y +// //PressTensorGrad[n+8*Np] = Pzz_z +// //PressTensorGrad[n+9*Np] = Pxy_x +// //PressTensorGrad[n+10*Np] = Pxy_y +// //PressTensorGrad[n+11*Np] = Pxy_z +// //PressTensorGrad[n+12*Np] = Pyz_x +// //PressTensorGrad[n+13*Np] = Pyz_y +// //PressTensorGrad[n+14*Np] = Pyz_z +// //PressTensorGrad[n+15*Np] = Pxz_x +// //PressTensorGrad[n+16*Np] = Pxz_y +// //PressTensorGrad[n+17*Np] = Pxz_z +// Pxx_x = PressTensorGrad[0*Np+n]; +// Pyy_y = PressTensorGrad[4*Np+n]; +// Pzz_z = PressTensorGrad[8*Np+n]; +// Pxy_x = PressTensorGrad[9*Np+n]; +// Pxz_x = PressTensorGrad[15*Np+n]; +// Pxy_y = PressTensorGrad[10*Np+n]; +// Pyz_y = PressTensorGrad[13*Np+n]; +// Pyz_z = PressTensorGrad[14*Np+n]; +// Pxz_z = PressTensorGrad[17*Np+n]; +// //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... +// //TODO double check if you need porosity as a fre-factor +// Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); +// Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); +// Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); +// // fluid-solid force +// Gfs_x = (nA-nB)*SolidForce[n+0*Np]; +// Gfs_y = (nA-nB)*SolidForce[n+1*Np]; +// Gfs_z = (nA-nB)*SolidForce[n+2*Np]; +// +// // local density +// rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); +// // local relaxation time +// tau=tauA + 0.5*(1.0-phi)*(tauB-tauA); +// rlx_setA = 1.f/tau; +// rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); +// tau_eff=tauA_eff + 0.5*(1.0-phi)*(tauB_eff-tauA_eff); +// mu_eff = (tau_eff-0.5)/3.f;//kinematic viscosity +// +// +// //........................................................................ +// // READ THE DISTRIBUTIONS +// // (read from opposite array due to previous swap operation) +// //........................................................................ +// // q=0 +// fq = dist[n]; +// m1 = -30.0*fq; +// m2 = 12.0*fq; +// +// // q=1 +// fq = dist[2*Np+n]; +// pressure = fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jx = fq; +// m4 = -4.0*fq; +// m9 = 2.0*fq; +// m10 = -4.0*fq; +// +// // f2 = dist[10*Np+n]; +// fq = dist[1*Np+n]; +// pressure += fq; +// m1 -= 11.0*(fq); +// m2 -= 4.0*(fq); +// jx -= fq; +// m4 += 4.0*(fq); +// m9 += 2.0*(fq); +// m10 -= 4.0*(fq); +// +// // q=3 +// fq = dist[4*Np+n]; +// pressure += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jy = fq; +// m6 = -4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 = fq; +// m12 = -2.0*fq; +// +// // q = 4 +// fq = dist[3*Np+n]; +// pressure += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jy -= fq; +// m6 += 4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 += fq; +// m12 -= 2.0*fq; +// +// // q=5 +// fq = dist[6*Np+n]; +// pressure += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jz = fq; +// m8 = -4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 -= fq; +// m12 += 2.0*fq; +// +// // q = 6 +// fq = dist[5*Np+n]; +// pressure += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jz -= fq; +// m8 += 4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 -= fq; +// m12 += 2.0*fq; +// +// // q=7 +// fq = dist[8*Np+n]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jy += fq; +// m6 += fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 = fq; +// m16 = fq; +// m17 = -fq; +// +// // q = 8 +// fq = dist[7*Np+n]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jy -= fq; +// m6 -= fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 += fq; +// m16 -= fq; +// m17 += fq; +// +// // q=9 +// fq = dist[10*Np+n]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jy -= fq; +// m6 -= fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 -= fq; +// m16 += fq; +// m17 += fq; +// +// // q = 10 +// fq = dist[9*Np+n]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jy += fq; +// m6 += fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 -= fq; +// m16 -= fq; +// m17 -= fq; +// +// // q=11 +// fq = dist[12*Np+n]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jz += fq; +// m8 += fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 = fq; +// m16 -= fq; +// m18 = fq; +// +// // q=12 +// fq = dist[11*Np+n]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jz -= fq; +// m8 -= fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 += fq; +// m16 += fq; +// m18 -= fq; +// +// // q=13 +// fq = dist[14*Np+n]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jz -= fq; +// m8 -= fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 -= fq; +// m16 -= fq; +// m18 -= fq; +// +// // q=14 +// fq = dist[13*Np+n]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jz += fq; +// m8 += fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 -= fq; +// m16 += fq; +// m18 += fq; +// +// // q=15 +// fq = dist[16*Np+n]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy += fq; +// m6 += fq; +// jz += fq; +// m8 += fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 = fq; +// m17 += fq; +// m18 -= fq; +// +// // q=16 +// fq = dist[15*Np+n]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy -= fq; +// m6 -= fq; +// jz -= fq; +// m8 -= fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 += fq; +// m17 -= fq; +// m18 += fq; +// +// // q=17 +// fq = dist[18*Np+n]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy += fq; +// m6 += fq; +// jz -= fq; +// m8 -= fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 -= fq; +// m17 += fq; +// m18 += fq; +// +// // q=18 +// fq = dist[17*Np+n]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy -= fq; +// m6 -= fq; +// jz += fq; +// m8 += fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 -= fq; +// m17 -= fq; +// m18 -= fq; +// //---------------------------------------------------------------------// +// +// c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); +// if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes +// //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); +// c1 = porosity*0.5*GeoFun/sqrt(perm); +// if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes +// +// vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); +// vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); +// vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); +// v_mag=sqrt(vx*vx+vy*vy+vz*vz); +// ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); +// uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); +// uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); +// u_mag=sqrt(ux*ux+uy*uy+uz*uz); +// +// //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium +// Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); +// Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); +// Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); +// if (porosity==1.0){ +// Fx=rho0*(Gx + Gff_x + Gfs_x); +// Fy=rho0*(Gy + Gff_y + Gfs_y); +// Fz=rho0*(Gz + Gff_z + Gfs_z); +// } +// +// //Calculate pressure for Incompressible-MRT model +// pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); +// +//// //..............carry out relaxation process............................................... +//// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +//// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; +//// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +//// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; +//// jx = jx + Fx; +//// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) +//// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +//// jy = jy + Fy; +//// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) +//// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +//// jz = jz + Fz; +//// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) +//// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +//// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) +//// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; +//// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) +//// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; +//// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) +//// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; +//// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) +//// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; +//// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) +//// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; +//// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) +//// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; +//// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) +//// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; +//// m16 = m16 + rlx_setB*( - m16); +//// m17 = m17 + rlx_setB*( - m17); +//// m18 = m18 + rlx_setB*( - m18); +//// //....................................................................................................... +// +// //-------------------- IMRT collison where body force has NO higher-order terms -------------// // //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) -// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) -// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; +// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); +// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); // jx = jx + Fx; // m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); @@ -1770,206 +1802,861 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double // jz = jz + Fz; // m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) -// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; -// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) -// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; -// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) -// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; -// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) -// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; -// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) -// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; -// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) -// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; -// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) -// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; +// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); +// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); +// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); +// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); +// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); +// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); +// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); // m16 = m16 + rlx_setB*( - m16); // m17 = m17 + rlx_setB*( - m17); // m18 = m18 + rlx_setB*( - m18); // //....................................................................................................... +// +// //.................inverse transformation...................................................... +// // q=0 +// fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; +// dist[n] = fq; +// +// // q = 1 +// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); +// dist[1*Np+n] = fq; +// +// // q=2 +// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); +// dist[2*Np+n] = fq; +// +// // q = 3 +// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); +// dist[3*Np+n] = fq; +// +// // q = 4 +// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); +// dist[4*Np+n] = fq; +// +// // q = 5 +// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); +// dist[5*Np+n] = fq; +// +// // q = 6 +// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); +// dist[6*Np+n] = fq; +// +// // q = 7 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); +// dist[7*Np+n] = fq; +// +// // q = 8 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); +// dist[8*Np+n] = fq; +// +// // q = 9 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); +// dist[9*Np+n] = fq; +// +// // q = 10 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); +// dist[10*Np+n] = fq; +// +// // q = 11 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); +// dist[11*Np+n] = fq; +// +// // q = 12 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); +// dist[12*Np+n] = fq; +// +// // q = 13 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); +// dist[13*Np+n] = fq; +// +// // q= 14 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); +// dist[14*Np+n] = fq; +// +// // q = 15 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); +// dist[15*Np+n] = fq; +// +// // q = 16 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); +// dist[16*Np+n] = fq; +// +// // q = 17 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); +// dist[17*Np+n] = fq; +// +// // q = 18 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); +// dist[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] = pressure; +// +// //-----------------------Mass transport------------------------// +// // calcuale chemical potential +// chem_a = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-0.25*kappaA*phi_lap; +// chem_b = -lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*kappaB*phi_lap; +// rlx_massA = 3.f-sqrt(3.f); +// rlx_massB = 3.f-sqrt(3.f); +// +// //............................................... +// // q = 0,2,4 +// // Cq = {1,0,0}, {0,1,0}, {0,0,1} +// a1 = Aq[1*Np+n]; +// b1 = Bq[1*Np+n]; +// a2 = Aq[2*Np+n]; +// b2 = Bq[2*Np+n]; +// a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*ux)); +// b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*ux)); +// a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*ux)); +// b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*ux)); +// +// Aq[1*Np+n] = a1; +// Bq[1*Np+n] = b1; +// Aq[2*Np+n] = a2; +// Bq[2*Np+n] = b2; +// +// //............................................... +// // q = 2 +// // Cq = {0,1,0} +// a1 = Aq[3*Np+n]; +// b1 = Bq[3*Np+n]; +// a2 = Aq[4*Np+n]; +// b2 = Bq[4*Np+n]; +// a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uy)); +// b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uy)); +// a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uy)); +// b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uy)); +// +// Aq[3*Np+n] = a1; +// Bq[3*Np+n] = b1; +// Aq[4*Np+n] = a2; +// Bq[4*Np+n] = b2; +// //............................................... +// // q = 4 +// // Cq = {0,0,1} +// a1 = Aq[5*Np+n]; +// b1 = Bq[5*Np+n]; +// a2 = Aq[6*Np+n]; +// b2 = Bq[6*Np+n]; +// a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uz)); +// b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uz)); +// a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uz)); +// b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uz)); +// +// Aq[5*Np+n] = a1; +// Bq[5*Np+n] = b1; +// Aq[6*Np+n] = a2; +// Bq[6*Np+n] = b2; +// //............................................... +// +// // Instantiate mass transport distributions +// // Stationary value - distribution 0 +// a1=Aq[n]; +// b1=Bq[n]; +// Aq[n] = (1.0-rlx_massA)*a1+rlx_massA*(nA-3.0*gamma*chem_a); +// Bq[n] = (1.0-rlx_massB)*b1+rlx_massB*(nB-3.0*gamma*chem_b); +// +// +// } +// } +//} - //-------------------- IMRT collison where body force has NO higher-order terms -------------// - //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); - m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); - m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); - m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); - m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... +//__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, +// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, +// double Gx, double Gy, double Gz, +// double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ +// +// int n, nread, nr1,nr2,nr3,nr4,nr5,nr6; +// double vx,vy,vz,v_mag; +// double ux,uy,uz,u_mag; +// double pressure;//defined for this incompressible model +// // conserved momemnts +// double jx,jy,jz; +// // non-conserved moments +// double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; +// double fq; +// // currently disable 'GeoFun' +// double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) +// double porosity; +// double perm;//voxel permeability +// double c0, c1; //Guo's model parameters +// double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) +// double tau,tau_eff,rlx_setA,rlx_setB; +// double mu_eff;//effective kinematic viscosity for Darcy term +// double rho0; +// double phi; +// double phi_lap;//laplacian of phase field +// double nA,nB; +// double a1,b1,a2,b2; +// double Gfs_x,Gfs_y,Gfs_z; +// double Gff_x,Gff_y,Gff_z; +// double chem_a,chem_b; +// double rlx_massA,rlx_massB; +// // *---------------------------------Pressure Tensor Gradient------------------------------------*// +// double Pxx_x,Pyy_y,Pzz_z; +// double Pxy_x,Pxy_y; +// double Pyz_y,Pyz_z; +// double Pxz_x,Pxz_z; +// double px,py,pz; //pressure gradient +// +// 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; s0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); +// +// //Load pressure gradient +// px=PressureGrad[0*Np+n]; +// py=PressureGrad[1*Np+n]; +// pz=PressureGrad[2*Np+n]; +// +// //Load pressure tensor gradient +// //For reference full list of PressTensorGrad +// //PressTensorGrad[n+0*Np] = Pxx_x +// //PressTensorGrad[n+1*Np] = Pxx_y +// //PressTensorGrad[n+2*Np] = Pxx_z +// //PressTensorGrad[n+3*Np] = Pyy_x +// //PressTensorGrad[n+4*Np] = Pyy_y +// //PressTensorGrad[n+5*Np] = Pyy_z +// //PressTensorGrad[n+6*Np] = Pzz_x +// //PressTensorGrad[n+7*Np] = Pzz_y +// //PressTensorGrad[n+8*Np] = Pzz_z +// //PressTensorGrad[n+9*Np] = Pxy_x +// //PressTensorGrad[n+10*Np] = Pxy_y +// //PressTensorGrad[n+11*Np] = Pxy_z +// //PressTensorGrad[n+12*Np] = Pyz_x +// //PressTensorGrad[n+13*Np] = Pyz_y +// //PressTensorGrad[n+14*Np] = Pyz_z +// //PressTensorGrad[n+15*Np] = Pxz_x +// //PressTensorGrad[n+16*Np] = Pxz_y +// //PressTensorGrad[n+17*Np] = Pxz_z +// Pxx_x = PressTensorGrad[0*Np+n]; +// Pyy_y = PressTensorGrad[4*Np+n]; +// Pzz_z = PressTensorGrad[8*Np+n]; +// Pxy_x = PressTensorGrad[9*Np+n]; +// Pxz_x = PressTensorGrad[15*Np+n]; +// Pxy_y = PressTensorGrad[10*Np+n]; +// Pyz_y = PressTensorGrad[13*Np+n]; +// Pyz_z = PressTensorGrad[14*Np+n]; +// Pxz_z = PressTensorGrad[17*Np+n]; +// //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... +// //TODO double check if you need porosity as a fre-factor +// Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); +// Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); +// Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); +// // fluid-solid force +// Gfs_x = (nA-nB)*SolidForce[n+0*Np]; +// Gfs_y = (nA-nB)*SolidForce[n+1*Np]; +// Gfs_z = (nA-nB)*SolidForce[n+2*Np]; +// +// // local density +// rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); +// // local relaxation time +// tau=tauA + 0.5*(1.0-phi)*(tauB-tauA); +// rlx_setA = 1.f/tau; +// rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); +// tau_eff=tauA_eff + 0.5*(1.0-phi)*(tauB_eff-tauA_eff); +// mu_eff = (tau_eff-0.5)/3.f;//kinematic viscosity +// +// //........................................................................ +// // READ THE DISTRIBUTIONS +// // (read from opposite array due to previous swap operation) +// //........................................................................ +// // q=0 +// fq = dist[n]; +// m1 = -30.0*fq; +// m2 = 12.0*fq; +// +// // q=1 +// nr1 = neighborList[n]; // neighbor 2 ( > 10Np => odd part of dist) +// fq = dist[nr1]; // reading the f1 data into register fq +// pressure = fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jx = fq; +// m4 = -4.0*fq; +// m9 = 2.0*fq; +// m10 = -4.0*fq; +// +// // q=2 +// nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) +// fq = dist[nr2]; // reading the f2 data into register fq +// pressure += fq; +// m1 -= 11.0*(fq); +// m2 -= 4.0*(fq); +// jx -= fq; +// m4 += 4.0*(fq); +// m9 += 2.0*(fq); +// m10 -= 4.0*(fq); +// +// // q=3 +// nr3 = neighborList[n+2*Np]; // neighbor 4 +// fq = dist[nr3]; +// pressure += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jy = fq; +// m6 = -4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 = fq; +// m12 = -2.0*fq; +// +// // q = 4 +// nr4 = neighborList[n+3*Np]; // neighbor 3 +// fq = dist[nr4]; +// pressure += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jy -= fq; +// m6 += 4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 += fq; +// m12 -= 2.0*fq; +// +// // q=5 +// nr5 = neighborList[n+4*Np]; +// fq = dist[nr5]; +// pressure += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jz = fq; +// m8 = -4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 -= fq; +// m12 += 2.0*fq; +// +// // q = 6 +// nr6 = neighborList[n+5*Np]; +// fq = dist[nr6]; +// pressure += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jz -= fq; +// m8 += 4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 -= fq; +// m12 += 2.0*fq; +// +// // q=7 +// nread = neighborList[n+6*Np]; +// fq = dist[nread]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jy += fq; +// m6 += fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 = fq; +// m16 = fq; +// m17 = -fq; +// +// // q = 8 +// nread = neighborList[n+7*Np]; +// fq = dist[nread]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jy -= fq; +// m6 -= fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 += fq; +// m16 -= fq; +// m17 += fq; +// +// // q=9 +// nread = neighborList[n+8*Np]; +// fq = dist[nread]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jy -= fq; +// m6 -= fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 -= fq; +// m16 += fq; +// m17 += fq; +// +// // q = 10 +// nread = neighborList[n+9*Np]; +// fq = dist[nread]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jy += fq; +// m6 += fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 -= fq; +// m16 -= fq; +// m17 -= fq; +// +// // q=11 +// nread = neighborList[n+10*Np]; +// fq = dist[nread]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jz += fq; +// m8 += fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 = fq; +// m16 -= fq; +// m18 = fq; +// +// // q=12 +// nread = neighborList[n+11*Np]; +// fq = dist[nread]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jz -= fq; +// m8 -= fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 += fq; +// m16 += fq; +// m18 -= fq; +// +// // q=13 +// nread = neighborList[n+12*Np]; +// fq = dist[nread]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jz -= fq; +// m8 -= fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 -= fq; +// m16 -= fq; +// m18 -= fq; +// +// // q=14 +// nread = neighborList[n+13*Np]; +// fq = dist[nread]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jz += fq; +// m8 += fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 -= fq; +// m16 += fq; +// m18 += fq; +// +// // q=15 +// nread = neighborList[n+14*Np]; +// fq = dist[nread]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy += fq; +// m6 += fq; +// jz += fq; +// m8 += fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 = fq; +// m17 += fq; +// m18 -= fq; +// +// // q=16 +// nread = neighborList[n+15*Np]; +// fq = dist[nread]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy -= fq; +// m6 -= fq; +// jz -= fq; +// m8 -= fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 += fq; +// m17 -= fq; +// m18 += fq; +// +// // q=17 +// nread = neighborList[n+16*Np]; +// fq = dist[nread]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy += fq; +// m6 += fq; +// jz -= fq; +// m8 -= fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 -= fq; +// m17 += fq; +// m18 += fq; +// +// // q=18 +// nread = neighborList[n+17*Np]; +// fq = dist[nread]; +// pressure += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy -= fq; +// m6 -= fq; +// jz += fq; +// m8 += fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 -= fq; +// m17 -= fq; +// m18 -= fq; +// //---------------------------------------------------------------------// +// +// c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); +// if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes +// //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); +// c1 = porosity*0.5*GeoFun/sqrt(perm); +// if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes +// +// vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); +// vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); +// vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); +// v_mag=sqrt(vx*vx+vy*vy+vz*vz); +// ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); +// uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); +// uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); +// u_mag=sqrt(ux*ux+uy*uy+uz*uz); +// +// //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium +// Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); +// Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); +// Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); +// if (porosity==1.0){ +// Fx=rho0*(Gx + Gff_x + Gfs_x); +// Fy=rho0*(Gy + Gff_y + Gfs_y); +// Fz=rho0*(Gz + Gff_z + Gfs_z); +// } +// +// //Calculate pressure for Incompressible-MRT model +// pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); +// +//// //..............carry out relaxation process............................................... +//// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +//// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; +//// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +//// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; +//// jx = jx + Fx; +//// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) +//// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +//// jy = jy + Fy; +//// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) +//// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +//// jz = jz + Fz; +//// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) +//// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +//// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) +//// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; +//// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) +//// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; +//// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) +//// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; +//// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) +//// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; +//// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) +//// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; +//// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) +//// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; +//// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) +//// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; +//// m16 = m16 + rlx_setB*( - m16); +//// m17 = m17 + rlx_setB*( - m17); +//// m18 = m18 + rlx_setB*( - m18); +//// //....................................................................................................... +// +// //-------------------- IMRT collison where body force has NO higher-order terms -------------// +// //..............carry out relaxation process............................................... +// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); +// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); +// jx = jx + Fx; +// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +// jy = jy + Fy; +// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +// jz = jz + Fz; +// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); +// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); +// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); +// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); +// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); +// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); +// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); +// //....................................................................................................... +// +// +// //.................inverse transformation...................................................... +// // q=0 +// fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; +// dist[n] = fq; +// +// // q = 1 +// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); +// //nread = neighborList[n+Np]; +// dist[nr2] = fq; +// +// // q=2 +// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); +// //nread = neighborList[n]; +// dist[nr1] = fq; +// +// // q = 3 +// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); +// //nread = neighborList[n+3*Np]; +// dist[nr4] = fq; +// +// // q = 4 +// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); +// //nread = neighborList[n+2*Np]; +// dist[nr3] = fq; +// +// // q = 5 +// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); +// //nread = neighborList[n+5*Np]; +// dist[nr6] = fq; +// +// // q = 6 +// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); +// //nread = neighborList[n+4*Np]; +// dist[nr5] = fq; +// +// // q = 7 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); +// nread = neighborList[n+7*Np]; +// dist[nread] = fq; +// +// // q = 8 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); +// nread = neighborList[n+6*Np]; +// dist[nread] = fq; +// +// // q = 9 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); +// nread = neighborList[n+9*Np]; +// dist[nread] = fq; +// +// // q = 10 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); +// nread = neighborList[n+8*Np]; +// dist[nread] = fq; +// +// // q = 11 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); +// nread = neighborList[n+11*Np]; +// dist[nread] = fq; +// +// // q = 12 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); +// nread = neighborList[n+10*Np]; +// dist[nread]= fq; +// +// // q = 13 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); +// nread = neighborList[n+13*Np]; +// dist[nread] = fq; +// +// // q= 14 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); +// nread = neighborList[n+12*Np]; +// dist[nread] = fq; +// +// // q = 15 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); +// nread = neighborList[n+15*Np]; +// dist[nread] = fq; +// +// // q = 16 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); +// nread = neighborList[n+14*Np]; +// dist[nread] = fq; +// +// // q = 17 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); +// nread = neighborList[n+17*Np]; +// dist[nread] = fq; +// +// // q = 18 +// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); +// nread = neighborList[n+16*Np]; +// dist[nread] = fq; +// //........................................................................ +// +// //Update velocity on device +// Velocity[0*Np+n] = ux; +// Velocity[1*Np+n] = uy; +// Velocity[2*Np+n] = uz; +// //Update pressure on device +// Pressure[n] = pressure; +// +// //-----------------------Mass transport------------------------// +// // calcuale chemical potential +// chem_a = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-0.25*kappaA*phi_lap; +// chem_b = -lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*kappaB*phi_lap; +// rlx_massA = 3.f-sqrt(3.f); +// rlx_massB = 3.f-sqrt(3.f); +// +// //............................................... +// // q = 0,2,4 +// // Cq = {1,0,0}, {0,1,0}, {0,0,1} +// a1 = Aq[nr2]; +// b1 = Bq[nr2]; +// a2 = Aq[nr1]; +// b2 = Bq[nr1]; +// a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*ux)); +// b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*ux)); +// a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*ux)); +// b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*ux)); +// +// // q = 1 +// //nread = neighborList[n+Np]; +// Aq[nr2] = a1; +// Bq[nr2] = b1; +// // q=2 +// //nread = neighborList[n]; +// Aq[nr1] = a2; +// Bq[nr1] = b2; +// +// //............................................... +// // Cq = {0,1,0} +// a1 = Aq[nr4]; +// b1 = Bq[nr4]; +// a2 = Aq[nr3]; +// b2 = Bq[nr3]; +// a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uy)); +// b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uy)); +// a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uy)); +// b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uy)); +// +// // q = 3 +// //nread = neighborList[n+3*Np]; +// Aq[nr4] = a1; +// Bq[nr4] = b1; +// // q = 4 +// //nread = neighborList[n+2*Np]; +// Aq[nr3] = a2; +// Bq[nr3] = b2; +// +// //............................................... +// // q = 4 +// // Cq = {0,0,1} +// a1 = Aq[nr6]; +// b1 = Bq[nr6]; +// a2 = Aq[nr5]; +// b2 = Bq[nr5]; +// a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uz)); +// b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uz)); +// a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uz)); +// b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uz)); +// +// // q = 5 +// //nread = neighborList[n+5*Np]; +// Aq[nr6] = a1; +// Bq[nr6] = b1; +// // q = 6 +// //nread = neighborList[n+4*Np]; +// Aq[nr5] = a2; +// Bq[nr5] = b2; +// //............................................... +// +// // Instantiate mass transport distributions +// // Stationary value - distribution 0 +// a1=Aq[n]; +// b1=Bq[n]; +// Aq[n] = (1.0-rlx_massA)*a1+rlx_massA*(nA-3.0*gamma*chem_a); +// Bq[n] = (1.0-rlx_massB)*b1+rlx_massB*(nB-3.0*gamma*chem_b); +// +// +// } +// } +//} - //.................inverse transformation...................................................... - // q=0 - fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; - dist[n] = fq; - - // q = 1 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - dist[1*Np+n] = fq; - - // q=2 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); - dist[2*Np+n] = fq; - - // q = 3 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - dist[3*Np+n] = fq; - - // q = 4 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - dist[4*Np+n] = fq; - - // q = 5 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - dist[5*Np+n] = fq; - - // q = 6 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - dist[6*Np+n] = fq; - - // q = 7 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - dist[7*Np+n] = fq; - - // q = 8 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); - dist[8*Np+n] = fq; - - // q = 9 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - dist[9*Np+n] = fq; - - // q = 10 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - dist[10*Np+n] = fq; - - // q = 11 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); - dist[11*Np+n] = fq; - - // q = 12 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - dist[12*Np+n] = fq; - - // q = 13 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); - dist[13*Np+n] = fq; - - // q= 14 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); - dist[14*Np+n] = fq; - - // q = 15 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - dist[15*Np+n] = fq; - - // q = 16 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - dist[16*Np+n] = fq; - - // q = 17 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - dist[17*Np+n] = fq; - - // q = 18 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - dist[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] = pressure; - - //-----------------------Mass transport------------------------// - // calcuale chemical potential - chem_a = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-0.25*kappaA*phi_lap; - chem_b = -lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*kappaB*phi_lap; - rlx_massA = 3.f-sqrt(3.f); - rlx_massB = 3.f-sqrt(3.f); - - //............................................... - // q = 0,2,4 - // Cq = {1,0,0}, {0,1,0}, {0,0,1} - a1 = Aq[1*Np+n]; - b1 = Bq[1*Np+n]; - a2 = Aq[2*Np+n]; - b2 = Bq[2*Np+n]; - a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*ux)); - b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*ux)); - a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*ux)); - b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*ux)); - - Aq[1*Np+n] = a1; - Bq[1*Np+n] = b1; - Aq[2*Np+n] = a2; - Bq[2*Np+n] = b2; - - //............................................... - // q = 2 - // Cq = {0,1,0} - a1 = Aq[3*Np+n]; - b1 = Bq[3*Np+n]; - a2 = Aq[4*Np+n]; - b2 = Bq[4*Np+n]; - a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uy)); - b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uy)); - a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uy)); - b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uy)); - - Aq[3*Np+n] = a1; - Bq[3*Np+n] = b1; - Aq[4*Np+n] = a2; - Bq[4*Np+n] = b2; - //............................................... - // q = 4 - // Cq = {0,0,1} - a1 = Aq[5*Np+n]; - b1 = Bq[5*Np+n]; - a2 = Aq[6*Np+n]; - b2 = Bq[6*Np+n]; - a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uz)); - b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uz)); - a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uz)); - b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uz)); - - Aq[5*Np+n] = a1; - Bq[5*Np+n] = b1; - Aq[6*Np+n] = a2; - Bq[6*Np+n] = b2; - //............................................... - - // Instantiate mass transport distributions - // Stationary value - distribution 0 - a1=Aq[n]; - b1=Bq[n]; - Aq[n] = (1.0-rlx_massA)*a1+rlx_massA*(nA-3.0*gamma*chem_a); - Bq[n] = (1.0-rlx_massB)*b1+rlx_massB*(nB-3.0*gamma*chem_b); - - - } - } -} - -__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, +__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Cq, double *Phi, double *Den,double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ @@ -1995,11 +2682,13 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou double phi; double phi_lap;//laplacian of phase field double nA,nB; - double a1,b1,a2,b2; + //double a1,b1,a2,b2; double Gfs_x,Gfs_y,Gfs_z; double Gff_x,Gff_y,Gff_z; - double chem_a,chem_b; - double rlx_massA,rlx_massB; + double chem; + //double rlx_massA,rlx_massB; + double rlx_phi; + double a1,a2;//PDF of phase field // *---------------------------------Pressure Tensor Gradient------------------------------------*// double Pxx_x,Pyy_y,Pzz_z; double Pxy_x,Pxy_y; @@ -2030,8 +2719,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // read the component number densities nA = Den[n]; nB = Den[Np + n]; - // compute phase indicator field - phi=(nA-nB)/(nA+nB); + // read phase field + phi = Phi[n]; // load laplacian of phase field phi_lap = PhiLap[n]; // Load voxel porosity and perm @@ -2576,82 +3265,678 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou //-----------------------Mass transport------------------------// // calcuale chemical potential - chem_a = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-0.25*kappaA*phi_lap; - chem_b = -lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*kappaB*phi_lap; - rlx_massA = 3.f-sqrt(3.f); - rlx_massB = 3.f-sqrt(3.f); + chem = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*(kappaA+kappaB)*phi_lap; + rlx_phi = 3.f-sqrt(3.f); //............................................... // q = 0,2,4 // Cq = {1,0,0}, {0,1,0}, {0,0,1} - a1 = Aq[nr2]; - b1 = Bq[nr2]; - a2 = Aq[nr1]; - b2 = Bq[nr1]; - a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*ux)); - b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*ux)); - a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*ux)); - b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*ux)); + a1 = Cq[nr2]; + a2 = Cq[nr1]; + a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*ux)); + a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*ux)); // q = 1 //nread = neighborList[n+Np]; - Aq[nr2] = a1; - Bq[nr2] = b1; + Cq[nr2] = a1; // q=2 //nread = neighborList[n]; - Aq[nr1] = a2; - Bq[nr1] = b2; + Cq[nr1] = a2; //............................................... // Cq = {0,1,0} - a1 = Aq[nr4]; - b1 = Bq[nr4]; - a2 = Aq[nr3]; - b2 = Bq[nr3]; - a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uy)); - b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uy)); - a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uy)); - b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uy)); + a1 = Cq[nr4]; + a2 = Cq[nr3]; + a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uy)); + a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uy)); // q = 3 //nread = neighborList[n+3*Np]; - Aq[nr4] = a1; - Bq[nr4] = b1; + Cq[nr4] = a1; // q = 4 //nread = neighborList[n+2*Np]; - Aq[nr3] = a2; - Bq[nr3] = b2; + Cq[nr3] = a2; //............................................... // q = 4 // Cq = {0,0,1} - a1 = Aq[nr6]; - b1 = Bq[nr6]; - a2 = Aq[nr5]; - b2 = Bq[nr5]; - a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uz)); - b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uz)); - a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uz)); - b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uz)); + a1 = Cq[nr6]; + a2 = Cq[nr5]; + a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uz)); + a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uz)); // q = 5 //nread = neighborList[n+5*Np]; - Aq[nr6] = a1; - Bq[nr6] = b1; + Cq[nr6] = a1; // q = 6 //nread = neighborList[n+4*Np]; - Aq[nr5] = a2; - Bq[nr5] = b2; + Cq[nr5] = a2; //............................................... // Instantiate mass transport distributions // Stationary value - distribution 0 - a1=Aq[n]; - b1=Bq[n]; - Aq[n] = (1.0-rlx_massA)*a1+rlx_massA*(nA-3.0*gamma*chem_a); - Bq[n] = (1.0-rlx_massB)*b1+rlx_massB*(nB-3.0*gamma*chem_b); + a1=Cq[n]; + Cq[n] = (1.0-rlx_phi)*a1+rlx_phi*(a1-3.0*gamma*chem); + + } + } +} + +__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, double *Phi, double *Den,double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, + double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ + int n; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + // currently disable 'GeoFun' + double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double tau,tau_eff,rlx_setA,rlx_setB; + double mu_eff;//effective kinematic viscosity for Darcy term + double rho0; + double phi; + double phi_lap;//laplacian of phase field + double nA,nB; + //double a1,b1,a2,b2; + double Gfs_x,Gfs_y,Gfs_z; + double Gff_x,Gff_y,Gff_z; + double chem; + //double rlx_massA,rlx_massB; + double rlx_phi; + double a1,a2;//PDF of phase field + // *---------------------------------Pressure Tensor Gradient------------------------------------*// + double Pxx_x,Pyy_y,Pzz_z; + double Pxy_x,Pxy_y; + double Pyz_y,Pyz_z; + double Pxz_x,Pxz_z; + double px,py,pz; //pressure gradient + 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; s0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); + + //Load pressure gradient + px=PressureGrad[0*Np+n]; + py=PressureGrad[1*Np+n]; + pz=PressureGrad[2*Np+n]; + + //Load pressure tensor gradient + //For reference full list of PressTensorGrad + //PressTensorGrad[n+0*Np] = Pxx_x + //PressTensorGrad[n+1*Np] = Pxx_y + //PressTensorGrad[n+2*Np] = Pxx_z + //PressTensorGrad[n+3*Np] = Pyy_x + //PressTensorGrad[n+4*Np] = Pyy_y + //PressTensorGrad[n+5*Np] = Pyy_z + //PressTensorGrad[n+6*Np] = Pzz_x + //PressTensorGrad[n+7*Np] = Pzz_y + //PressTensorGrad[n+8*Np] = Pzz_z + //PressTensorGrad[n+9*Np] = Pxy_x + //PressTensorGrad[n+10*Np] = Pxy_y + //PressTensorGrad[n+11*Np] = Pxy_z + //PressTensorGrad[n+12*Np] = Pyz_x + //PressTensorGrad[n+13*Np] = Pyz_y + //PressTensorGrad[n+14*Np] = Pyz_z + //PressTensorGrad[n+15*Np] = Pxz_x + //PressTensorGrad[n+16*Np] = Pxz_y + //PressTensorGrad[n+17*Np] = Pxz_z + Pxx_x = PressTensorGrad[0*Np+n]; + Pyy_y = PressTensorGrad[4*Np+n]; + Pzz_z = PressTensorGrad[8*Np+n]; + Pxy_x = PressTensorGrad[9*Np+n]; + Pxz_x = PressTensorGrad[15*Np+n]; + Pxy_y = PressTensorGrad[10*Np+n]; + Pyz_y = PressTensorGrad[13*Np+n]; + Pyz_z = PressTensorGrad[14*Np+n]; + Pxz_z = PressTensorGrad[17*Np+n]; + //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... + //TODO double check if you need porosity as a fre-factor + Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); + Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); + Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); + // fluid-solid force + Gfs_x = (nA-nB)*SolidForce[n+0*Np]; + Gfs_y = (nA-nB)*SolidForce[n+1*Np]; + Gfs_z = (nA-nB)*SolidForce[n+2*Np]; + + // local density + rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); + // local relaxation time + tau=tauA + 0.5*(1.0-phi)*(tauB-tauA); + rlx_setA = 1.f/tau; + rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); + tau_eff=tauA_eff + 0.5*(1.0-phi)*(tauB_eff-tauA_eff); + mu_eff = (tau_eff-0.5)/3.f;//kinematic viscosity + + + //........................................................................ + // READ THE DISTRIBUTIONS + // (read from opposite array due to previous swap operation) + //........................................................................ + // q=0 + fq = dist[n]; + m1 = -30.0*fq; + m2 = 12.0*fq; + + // q=1 + fq = dist[2*Np+n]; + pressure = fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jx = fq; + m4 = -4.0*fq; + m9 = 2.0*fq; + m10 = -4.0*fq; + + // f2 = dist[10*Np+n]; + fq = dist[1*Np+n]; + pressure += fq; + m1 -= 11.0*(fq); + m2 -= 4.0*(fq); + jx -= fq; + m4 += 4.0*(fq); + m9 += 2.0*(fq); + m10 -= 4.0*(fq); + + // q=3 + fq = dist[4*Np+n]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy = fq; + m6 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 = fq; + m12 = -2.0*fq; + + // q = 4 + fq = dist[3*Np+n]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy -= fq; + m6 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 += fq; + m12 -= 2.0*fq; + + // q=5 + fq = dist[6*Np+n]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz = fq; + m8 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q = 6 + fq = dist[5*Np+n]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz -= fq; + m8 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q=7 + fq = dist[8*Np+n]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 = fq; + m16 = fq; + m17 = -fq; + + // q = 8 + fq = dist[7*Np+n]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 += fq; + m16 -= fq; + m17 += fq; + + // q=9 + fq = dist[10*Np+n]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 += fq; + m17 += fq; + + // q = 10 + fq = dist[9*Np+n]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 -= fq; + m17 -= fq; + + // q=11 + fq = dist[12*Np+n]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 = fq; + m16 -= fq; + m18 = fq; + + // q=12 + fq = dist[11*Np+n]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 += fq; + m16 += fq; + m18 -= fq; + + // q=13 + fq = dist[14*Np+n]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 -= fq; + m18 -= fq; + + // q=14 + fq = dist[13*Np+n]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 += fq; + m18 += fq; + + // q=15 + fq = dist[16*Np+n]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 = fq; + m17 += fq; + m18 -= fq; + + // q=16 + fq = dist[15*Np+n]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 += fq; + m17 -= fq; + m18 += fq; + + // q=17 + fq = dist[18*Np+n]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 += fq; + m18 += fq; + + // q=18 + fq = dist[17*Np+n]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 -= fq; + m18 -= fq; + //---------------------------------------------------------------------// + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); + vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); + vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); + if (porosity==1.0){ + Fx=rho0*(Gx + Gff_x + Gfs_x); + Fy=rho0*(Gy + Gff_y + Gfs_y); + Fz=rho0*(Gz + Gff_z + Gfs_z); + } + + //Calculate pressure for Incompressible-MRT model + pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); + +// //..............carry out relaxation process............................................... +// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; +// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; +// jx = jx + Fx; +// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +// jy = jy + Fy; +// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +// jz = jz + Fz; +// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) +// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; +// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) +// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; +// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) +// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; +// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) +// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; +// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) +// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; +// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) +// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; +// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) +// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); +// //....................................................................................................... + + //-------------------- IMRT collison where body force has NO higher-order terms -------------// + //..............carry out relaxation process............................................... + m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); + m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); + m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); + m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); + m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + dist[1*Np+n] = fq; + + // q=2 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + dist[2*Np+n] = fq; + + // q = 3 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + dist[3*Np+n] = fq; + + // q = 4 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + dist[4*Np+n] = fq; + + // q = 5 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + dist[5*Np+n] = fq; + + // q = 6 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + dist[6*Np+n] = fq; + + // q = 7 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + dist[7*Np+n] = fq; + + // q = 8 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); + dist[8*Np+n] = fq; + + // q = 9 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + dist[9*Np+n] = fq; + + // q = 10 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + dist[10*Np+n] = fq; + + // q = 11 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); + dist[11*Np+n] = fq; + + // q = 12 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + dist[12*Np+n] = fq; + + // q = 13 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); + dist[13*Np+n] = fq; + + // q= 14 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); + dist[14*Np+n] = fq; + + // q = 15 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + dist[15*Np+n] = fq; + + // q = 16 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + dist[16*Np+n] = fq; + + // q = 17 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + dist[17*Np+n] = fq; + + // q = 18 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + dist[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] = pressure; + + //-----------------------Mass transport------------------------// + // calcuale chemical potential + chem = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*(kappaA+kappaB)*phi_lap; + rlx_phi = 3.f-sqrt(3.f); + + //............................................... + // q = 0,2,4 + // Cq = {1,0,0}, {0,1,0}, {0,0,1} + a1 = Cq[1*Np+n]; + a2 = Cq[2*Np+n]; + a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*ux)); + a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*ux)); + + Cq[1*Np+n] = a1; + Cq[2*Np+n] = a2; + + //............................................... + // q = 2 + // Cq = {0,1,0} + a1 = Cq[3*Np+n]; + a2 = Cq[4*Np+n]; + a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uy)); + a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uy)); + + Cq[3*Np+n] = a1; + Cq[4*Np+n] = a2; + //............................................... + // q = 4 + // Cq = {0,0,1} + a1 = Cq[5*Np+n]; + a2 = Cq[6*Np+n]; + a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uz)); + a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uz)); + + Cq[5*Np+n] = a1; + Cq[6*Np+n] = a2; + //............................................... + + // Instantiate mass transport distributions + // Stationary value - distribution 0 + a1=Cq[n]; + Cq[n] = (1.0-rlx_phi)*a1+rlx_phi*(a1-3.0*gamma*chem); } } } @@ -2694,9 +3979,43 @@ __global__ void dvc_ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, d } } -__global__ void dvc_ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, double *Phi, int start, int finish, int Np){ +//__global__ void dvc_ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, double *Phi, int start, int finish, int Np){ +// int idx; +// double nA,nB; +// +// int S = Np/NBLOCKS/NTHREADS + 1; +// for (int s=0; s>>(dist, Aq, Bq, Den, SolidForce, start, finish, Np, +// tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); +// +// cudaError_t err = cudaGetLastError(); +// if (cudaSuccess != err){ +// printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleColorChem: %s \n",cudaGetErrorString(err)); +// } +//} +// +//extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, +// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, +// double Gx, double Gy, double Gz, +// double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ +// +// dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem<<>>(neighborList, dist, Aq, Bq, Den, SolidForce, start, finish, Np, +// tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, +// Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); +// +// cudaError_t err = cudaGetLastError(); +// if (cudaSuccess != err){ +// printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleColorChem: %s \n",cudaGetErrorString(err)); +// } +//} + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, double *Phi, double *Den,double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem<<>>(dist, Aq, Bq, Den, SolidForce, start, finish, Np, + dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem<<>>(dist, Cq, Phi, Den, SolidForce, start, finish, Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); cudaError_t err = cudaGetLastError(); @@ -3126,12 +4567,12 @@ extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Aq, } } -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Cq, double *Phi, double *Den,double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem<<>>(neighborList, dist, Aq, Bq, Den, SolidForce, start, finish, Np, + dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem<<>>(neighborList, dist, Cq, Phi, Den, SolidForce, start, finish, Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); @@ -3141,9 +4582,16 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double } } +//extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, double *Phi, int start, int finish, int Np){ +// dvc_ScaLBL_D3Q7_GreyColorIMRT_Init<<>>(Den, Aq, Bq, Phi, start, finish, Np); +// cudaError_t err = cudaGetLastError(); +// if (cudaSuccess != err){ +// printf("CUDA error in ScaLBL_D3Q7_GreyColorIMRT_Init: %s \n",cudaGetErrorString(err)); +// } +//} -extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, double *Phi, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_GreyColorIMRT_Init<<>>(Den, Aq, Bq, Phi, start, finish, Np); +extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Cq, double *Phi, int start, int finish, int Np){ + dvc_ScaLBL_D3Q7_GreyColorIMRT_Init<<>>(Den, Cq, Phi, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ printf("CUDA error in ScaLBL_D3Q7_GreyColorIMRT_Init: %s \n",cudaGetErrorString(err)); @@ -3177,6 +4625,25 @@ extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, } } +extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(int *NeighborList, double *Cq, double *Den, double *Phi, int start, int finish, int Np){ + + dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorPhi<<>>(NeighborList, Cq, Den, Phi, start, finish, Np); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q7_AAodd_GreyscaleColorPhi: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(double *Cq, double *Den, double *Phi, int start, int finish, int Np){ + + dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorPhi<<>>(Cq, Den, Phi, start, finish, Np); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q7_AAeven_GreyscaleColorPhi: %s \n",cudaGetErrorString(err)); + } +} + extern "C" void ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np){ dvc_ScaLBL_D3Q19_GreyscaleColor_Gradient<<>>(neighborList, Den, DenGrad, start, finish, Np); diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 26c6d783..6dc77451 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -561,8 +561,9 @@ void ScaLBL_GreyscaleColorModel::Create(){ ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &PressureGrad, 3*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Aq, 7*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Bq, 7*sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &Aq, 7*sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &Bq, 7*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Cq, 7*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Den, 2*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Phi, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &PhiLap, sizeof(double)*Np);//laplacian of phase field @@ -622,8 +623,10 @@ void ScaLBL_GreyscaleColorModel::Initialize(){ ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); //TODO need to initialize velocity field ! //this is required for calculating the pressure_dvc @@ -632,8 +635,10 @@ void ScaLBL_GreyscaleColorModel::Initialize(){ else{ if (rank==0) printf ("Initializing density field \n"); DensityField_Init();//initialize density field - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); if (rank==0) printf ("Initializing distributions \n"); ScaLBL_D3Q19_GreyColorIMRT_Init(fq, Den, rhoA, rhoB, Np); @@ -695,11 +700,15 @@ void ScaLBL_GreyscaleColorModel::Run(){ timestep++; // Compute the density field // Read for Aq, Bq happens in this routine (requires communication) - ScaLBL_Comm->BiSendD3Q7AA(Aq,Bq); //READ FROM NORMAL - ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(NeighborList, Aq, Bq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->BiRecvD3Q7AA(Aq,Bq); //WRITE INTO OPPOSITE + //ScaLBL_Comm->BiSendD3Q7AA(Aq,Bq); //READ FROM NORMAL + ScaLBL_Comm->SendD3Q7AA(Cq); //READ FROM NORMAL + //ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(NeighborList, Aq, Bq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(NeighborList, Cq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + //ScaLBL_Comm->BiRecvD3Q7AA(Aq,Bq); //WRITE INTO OPPOSITE + ScaLBL_Comm->RecvD3Q7AA(Cq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); - ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(NeighborList, Aq, Bq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); + //ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(NeighborList, Aq, Bq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(NeighborList, Cq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); // Update local pressure ScaLBL_D3Q19_GreyscaleColor_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); @@ -763,7 +772,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL // ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, // tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); - ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Aq, Bq, Den, SolidForce, + ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Cq, Phi, Den, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); @@ -777,7 +786,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ // } // ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, // tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); - ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Aq, Bq, Den, SolidForce, + ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Cq, Phi, Den, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); @@ -788,11 +797,15 @@ void ScaLBL_GreyscaleColorModel::Run(){ timestep++; // Compute the density field // Read for Aq, Bq happens in this routine (requires communication) - ScaLBL_Comm->BiSendD3Q7AA(Aq,Bq); //READ FROM NORMAL - ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(Aq, Bq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->BiRecvD3Q7AA(Aq,Bq); //WRITE INTO OPPOSITE + //ScaLBL_Comm->BiSendD3Q7AA(Aq,Bq); //READ FROM NORMAL + ScaLBL_Comm->SendD3Q7AA(Cq); //READ FROM NORMAL + //ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(Aq, Bq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(Cq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + //ScaLBL_Comm->BiRecvD3Q7AA(Aq,Bq); //WRITE INTO OPPOSITE + ScaLBL_Comm->RecvD3Q7AA(Cq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); - ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(Aq, Bq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); + //ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(Aq, Bq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(Cq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); // Update local pressure ScaLBL_D3Q19_GreyscaleColor_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); @@ -855,7 +868,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL // ScaLBL_D3Q19_AAeven_GreyscaleColor(fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, // tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); - ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Aq, Bq, Den, SolidForce, + ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Cq, Phi, Den, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); @@ -869,7 +882,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ // } // ScaLBL_D3Q19_AAeven_GreyscaleColor(fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, // tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); - ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Aq, Bq, Den, SolidForce, + ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Cq, Phi, Den, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h index 374920d0..0e5a4af0 100644 --- a/models/GreyscaleColorModel.h +++ b/models/GreyscaleColorModel.h @@ -65,7 +65,8 @@ public: signed char *id; int *NeighborList; - double *fq,*Aq,*Bq; + //double *fq,*Aq,*Bq; + double *fq,*Cq; double *Den; double *Permeability;//grey voxel permeability double *Porosity; From 389c60a06f9e5caf07c79ef0a253fe890fc90685 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sun, 19 Apr 2020 22:21:43 -0400 Subject: [PATCH 14/75] GPU version; save the work; mass is not conserved --- common/ScaLBL.h | 2 +- gpu/GreyscaleColor.cu | 288 +++++++++++++++++++++++---------- models/GreyscaleColorModel.cpp | 25 ++- models/GreyscaleColorModel.h | 2 +- 4 files changed, 222 insertions(+), 95 deletions(-) diff --git a/common/ScaLBL.h b/common/ScaLBL.h index d3251740..4557adb3 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -105,7 +105,7 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); //extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, double *Phi, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Cq, double *Phi, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np); extern "C" void ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np); diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu index 489b8a6b..74fe1923 100644 --- a/gpu/GreyscaleColor.cu +++ b/gpu/GreyscaleColor.cu @@ -3266,7 +3266,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou //-----------------------Mass transport------------------------// // calcuale chemical potential chem = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*(kappaA+kappaB)*phi_lap; - rlx_phi = 3.f-sqrt(3.f); + //rlx_phi = 3.f-sqrt(3.f); + rlx_phi = 1.0; //............................................... // q = 0,2,4 @@ -3898,7 +3899,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double //-----------------------Mass transport------------------------// // calcuale chemical potential chem = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*(kappaA+kappaB)*phi_lap; - rlx_phi = 3.f-sqrt(3.f); + //rlx_phi = 3.f-sqrt(3.f); + rlx_phi = 1.0; //............................................... // q = 0,2,4 @@ -4012,11 +4014,13 @@ __global__ void dvc_ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, d // } //} -__global__ void dvc_ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Cq, double *Phi, int start, int finish, int Np){ +__global__ void dvc_ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, + int start, int finish, int Np){ int idx; double nA,nB; double phi; - + double phi_lap;//laplacian of the phase field + double chem;//chemical potential int S = Np/NBLOCKS/NTHREADS + 1; for (int s=0; s>>(Den, Cq, Phi, start, finish, Np); +extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np){ + dvc_ScaLBL_D3Q7_GreyColorIMRT_Init<<>>(Den, Cq, PhiLap,gamma,kappaA,kappaB,lambdaA,lambdaB, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ printf("CUDA error in ScaLBL_D3Q7_GreyColorIMRT_Init: %s \n",cudaGetErrorString(err)); diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 6dc77451..6ac69b91 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -455,7 +455,7 @@ void ScaLBL_GreyscaleColorModel::AssignComponentLabels(double *Porosity, double } } -void ScaLBL_GreyscaleColorModel::DensityField_Init(){ +void ScaLBL_GreyscaleColorModel::Density_and_Phase_Init(){ size_t NLABELS=0; signed char VALUE=0; @@ -482,6 +482,10 @@ void ScaLBL_GreyscaleColorModel::DensityField_Init(){ double nA=0.5;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. double nB=0.5; + double *Phi_temp; + Phi_temp=new double [Np]; + double phi = 0.0; + for (int k=1; k1.0)) ERROR("Error: Initial saturation for grey nodes must be between [0.0, 1.0]! \n"); nB=Sw; nA=1.0-Sw; + phi = nA-nB; idx = NLABELS; } } if (VALUE==1){//label=1 reserved for NW phase nA=1.0; nB=0.0; + phi = nA-nB; } else if(VALUE==2){//label=2 reserved for W phase nA=0.0; nB=1.0; + phi = nA-nB; } int idx = Map(i,j,k); Den_temp[idx+0*Np] = nA; Den_temp[idx+1*Np] = nB; + Phi_temp[idx] = phi; } } } } //copy to device ScaLBL_CopyToDevice(Den, Den_temp, 2*Np*sizeof(double)); + ScaLBL_CopyToDevice(Phi, Phi_temp, 1*Np*sizeof(double)); ScaLBL_DeviceBarrier(); delete [] Den_temp; } @@ -625,8 +634,10 @@ void ScaLBL_GreyscaleColorModel::Initialize(){ //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); //TODO need to initialize velocity field ! //this is required for calculating the pressure_dvc @@ -634,11 +645,13 @@ void ScaLBL_GreyscaleColorModel::Initialize(){ } else{ if (rank==0) printf ("Initializing density field \n"); - DensityField_Init();//initialize density field + Density_and_Phase_Init();//initialize density field //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); if (rank==0) printf ("Initializing distributions \n"); ScaLBL_D3Q19_GreyColorIMRT_Init(fq, Den, rhoA, rhoB, Np); diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h index 0e5a4af0..8b0cd85e 100644 --- a/models/GreyscaleColorModel.h +++ b/models/GreyscaleColorModel.h @@ -102,7 +102,7 @@ private: void AssignComponentLabels(double *Porosity, double *Permeablity, double *SolidPotential); void AssignSolidForce(double *SolidPotential, double *SolidForce); - void DensityField_Init(); + void Density_and_Phase_Init(); }; From 74e858f005f167ef5cca6422f7e02e5e8839e21e Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sun, 19 Apr 2020 22:49:33 -0400 Subject: [PATCH 15/75] fix dumb bugs --- models/GreyscaleColorModel.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 6ac69b91..1680939b 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -344,9 +344,9 @@ void ScaLBL_GreyscaleColorModel::AssignComponentLabels(double *Porosity, double //Populate the poroisty map, NOTE only for node_ID > 0, i.e. open or grey nodes //For node_ID <= 0: these are solid nodes of various wettability - for (int k=1;k 0, i.e. open or grey nodes //For node_ID <= 0: these are solid nodes of various wettability - for (int k=1;kid[n]; if (VALUE>0){ @@ -525,6 +525,7 @@ void ScaLBL_GreyscaleColorModel::Density_and_Phase_Init(){ ScaLBL_CopyToDevice(Phi, Phi_temp, 1*Np*sizeof(double)); ScaLBL_DeviceBarrier(); delete [] Den_temp; + delete [] Phi_temp; } void ScaLBL_GreyscaleColorModel::Create(){ From cc61cb940d99e4037e2dac073be0d8ca9d7c1d2d Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sun, 19 Apr 2020 23:35:37 -0400 Subject: [PATCH 16/75] fix another dumb bug --- gpu/GreyscaleColor.cu | 1 + 1 file changed, 1 insertion(+) diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu index 74fe1923..b9519cd7 100644 --- a/gpu/GreyscaleColor.cu +++ b/gpu/GreyscaleColor.cu @@ -4029,6 +4029,7 @@ __global__ void dvc_ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Cq, doub nA = Den[idx]; nB = Den[idx+Np]; phi = nA-nB; + phi_lap = PhiLap[idx]; chem = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*(kappaA+kappaB)*phi_lap; Cq[1*Np+idx]=0.5*gamma*chem; From eaf9e828ea289dce4125ce584f5d00979a3d12ff Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Fri, 24 Apr 2020 16:20:52 -0400 Subject: [PATCH 17/75] GPU only; save the work; greyscaleFE works only conditionally; --- common/ScaLBL.cpp | 27 +- common/ScaLBL.h | 21 +- gpu/GreyscaleColor.cu | 1834 ++++---------------------------- models/GreyscaleColorModel.cpp | 171 ++- 4 files changed, 280 insertions(+), 1773 deletions(-) diff --git a/common/ScaLBL.cpp b/common/ScaLBL.cpp index e0f3879c..0feb5558 100644 --- a/common/ScaLBL.cpp +++ b/common/ScaLBL.cpp @@ -1151,41 +1151,39 @@ void ScaLBL_Communicator::SendD3Q7AA(double *Aq){ //...Packing for x face(2,8,10,12,14)................................ ScaLBL_D3Q19_Pack(2,dvcSendList_x,0,sendCount_x,sendbuf_x,Aq,N); - req1[0] = MPI_COMM_SCALBL.Isend(sendbuf_x, 2*sendCount_x,rank_x,sendtag); - req2[0] = MPI_COMM_SCALBL.Irecv(recvbuf_X, 2*recvCount_X,rank_X,recvtag); + req1[0] = MPI_COMM_SCALBL.Isend(sendbuf_x, sendCount_x,rank_x,sendtag); + req2[0] = MPI_COMM_SCALBL.Irecv(recvbuf_X, recvCount_X,rank_X,recvtag); //...Packing for X face(1,7,9,11,13)................................ ScaLBL_D3Q19_Pack(1,dvcSendList_X,0,sendCount_X,sendbuf_X,Aq,N); - req1[1] = MPI_COMM_SCALBL.Isend(sendbuf_X, 2*sendCount_X,rank_X,sendtag); - req2[1] = MPI_COMM_SCALBL.Irecv(recvbuf_x, 2*recvCount_x,rank_x,recvtag); + req1[1] = MPI_COMM_SCALBL.Isend(sendbuf_X, sendCount_X,rank_X,sendtag); + req2[1] = MPI_COMM_SCALBL.Irecv(recvbuf_x, recvCount_x,rank_x,recvtag); //...Packing for y face(4,8,9,16,18)................................. ScaLBL_D3Q19_Pack(4,dvcSendList_y,0,sendCount_y,sendbuf_y,Aq,N); - req1[2] = MPI_COMM_SCALBL.Isend(sendbuf_y, 2*sendCount_y,rank_y,sendtag); - req2[2] = MPI_COMM_SCALBL.Irecv(recvbuf_Y, 2*recvCount_Y,rank_Y,recvtag); + req1[2] = MPI_COMM_SCALBL.Isend(sendbuf_y, sendCount_y,rank_y,sendtag); + req2[2] = MPI_COMM_SCALBL.Irecv(recvbuf_Y, recvCount_Y,rank_Y,recvtag); //...Packing for Y face(3,7,10,15,17)................................. ScaLBL_D3Q19_Pack(3,dvcSendList_Y,0,sendCount_Y,sendbuf_Y,Aq,N); - req1[3] = MPI_COMM_SCALBL.Isend(sendbuf_Y, 2*sendCount_Y,rank_Y,sendtag); - req2[3] = MPI_COMM_SCALBL.Irecv(recvbuf_y, 2*recvCount_y,rank_y,recvtag); + req1[3] = MPI_COMM_SCALBL.Isend(sendbuf_Y, sendCount_Y,rank_Y,sendtag); + req2[3] = MPI_COMM_SCALBL.Irecv(recvbuf_y, recvCount_y,rank_y,recvtag); //...Packing for z face(6,12,13,16,17)................................ ScaLBL_D3Q19_Pack(6,dvcSendList_z,0,sendCount_z,sendbuf_z,Aq,N); - req1[4] = MPI_COMM_SCALBL.Isend(sendbuf_z, 2*sendCount_z,rank_z,sendtag); - req2[4] = MPI_COMM_SCALBL.Irecv(recvbuf_Z, 2*recvCount_Z,rank_Z,recvtag); + req1[4] = MPI_COMM_SCALBL.Isend(sendbuf_z, sendCount_z,rank_z,sendtag); + req2[4] = MPI_COMM_SCALBL.Irecv(recvbuf_Z, recvCount_Z,rank_Z,recvtag); //...Packing for Z face(5,11,14,15,18)................................ ScaLBL_D3Q19_Pack(5,dvcSendList_Z,0,sendCount_Z,sendbuf_Z,Aq,N); + req1[5] = MPI_COMM_SCALBL.Isend(sendbuf_Z, sendCount_Z,rank_Z,sendtag); + req2[5] = MPI_COMM_SCALBL.Irecv(recvbuf_z, recvCount_z,rank_z,recvtag); //................................................................................... - // Send all the distributions - req1[5] = MPI_COMM_SCALBL.Isend(sendbuf_Z, 2*sendCount_Z,rank_Z,sendtag); - req2[5] = MPI_COMM_SCALBL.Irecv(recvbuf_z, 2*recvCount_z,rank_z,recvtag); - } void ScaLBL_Communicator::RecvD3Q7AA(double *Aq){ @@ -1194,6 +1192,7 @@ void ScaLBL_Communicator::RecvD3Q7AA(double *Aq){ //................................................................................... // Wait for completion of D3Q19 communication MPI_COMM_SCALBL.waitAll(6,req1); + MPI_COMM_SCALBL.waitAll(6,req2); ScaLBL_DeviceBarrier(); //................................................................................... diff --git a/common/ScaLBL.h b/common/ScaLBL.h index 4557adb3..849b8252 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -84,27 +84,16 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double *dis double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure); -//extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, -// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, -// double Gx, double Gy, double Gz, -// double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); -// -//extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, -// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, -// double Gx, double Gy, double Gz, -// double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); - -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, double *Phi, double *Den,double *SolidForce, int start, int finish, int Np, +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Cq, double *Phi, double *Den,double *SolidForce, int start, int finish, int Np, +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); -//extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, double *Phi, int start, int finish, int Np); extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np); extern "C" void ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np); @@ -113,9 +102,9 @@ extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *NeighborList, doubl extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(int *NeighborList, double *Cq, double *Den, double *Phi, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(int *NeighborList, double *Cq, double *Phi, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(double *Cq, double *Den, double *Phi, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(double *Cq, double *Phi, int start, int finish, int Np); extern "C" void ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np); @@ -124,7 +113,7 @@ extern "C" void ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, double extern "C" void ScaLBL_D3Q19_GreyscaleColor_Pressure(double *dist, double *Den, double *Porosity,double *Velocity, double *Pressure, double rhoA,double rhoB, int Np); -extern "C" void ScaLBL_D3Q19_GreyscaleColor_PressureTensor(int *neighborList, double *Phi, double *PressTensor, double *PhiLap, +extern "C" void ScaLBL_D3Q19_GreyscaleColor_PressureTensor(int *neighborList, double *Phi,double *Pressure, double *PressTensor, double *PhiLap, double kappaA,double kappaB,double lambdaA,double lambdaB, int start, int finish, int Np); // MRT MODEL diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu index b9519cd7..4841e212 100644 --- a/gpu/GreyscaleColor.cu +++ b/gpu/GreyscaleColor.cu @@ -1329,1334 +1329,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double } } -//__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, -// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, -// double Gx, double Gy, double Gz, -// double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ -// int n; -// double vx,vy,vz,v_mag; -// double ux,uy,uz,u_mag; -// double pressure;//defined for this incompressible model -// // conserved momemnts -// double jx,jy,jz; -// // non-conserved moments -// double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; -// double fq; -// // currently disable 'GeoFun' -// double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) -// double porosity; -// double perm;//voxel permeability -// double c0, c1; //Guo's model parameters -// double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) -// double tau,tau_eff,rlx_setA,rlx_setB; -// double mu_eff;//effective kinematic viscosity for Darcy term -// double rho0; -// double phi; -// double phi_lap;//laplacian of phase field -// double nA,nB; -// double a1,b1,a2,b2; -// double Gfs_x,Gfs_y,Gfs_z; -// double Gff_x,Gff_y,Gff_z; -// double chem_a,chem_b; -// double rlx_massA,rlx_massB; -// // *---------------------------------Pressure Tensor Gradient------------------------------------*// -// double Pxx_x,Pyy_y,Pzz_z; -// double Pxy_x,Pxy_y; -// double Pyz_y,Pyz_z; -// double Pxz_x,Pxz_z; -// double px,py,pz; //pressure gradient -// -// -// 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; s0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); -// -// //Load pressure gradient -// px=PressureGrad[0*Np+n]; -// py=PressureGrad[1*Np+n]; -// pz=PressureGrad[2*Np+n]; -// -// //Load pressure tensor gradient -// //For reference full list of PressTensorGrad -// //PressTensorGrad[n+0*Np] = Pxx_x -// //PressTensorGrad[n+1*Np] = Pxx_y -// //PressTensorGrad[n+2*Np] = Pxx_z -// //PressTensorGrad[n+3*Np] = Pyy_x -// //PressTensorGrad[n+4*Np] = Pyy_y -// //PressTensorGrad[n+5*Np] = Pyy_z -// //PressTensorGrad[n+6*Np] = Pzz_x -// //PressTensorGrad[n+7*Np] = Pzz_y -// //PressTensorGrad[n+8*Np] = Pzz_z -// //PressTensorGrad[n+9*Np] = Pxy_x -// //PressTensorGrad[n+10*Np] = Pxy_y -// //PressTensorGrad[n+11*Np] = Pxy_z -// //PressTensorGrad[n+12*Np] = Pyz_x -// //PressTensorGrad[n+13*Np] = Pyz_y -// //PressTensorGrad[n+14*Np] = Pyz_z -// //PressTensorGrad[n+15*Np] = Pxz_x -// //PressTensorGrad[n+16*Np] = Pxz_y -// //PressTensorGrad[n+17*Np] = Pxz_z -// Pxx_x = PressTensorGrad[0*Np+n]; -// Pyy_y = PressTensorGrad[4*Np+n]; -// Pzz_z = PressTensorGrad[8*Np+n]; -// Pxy_x = PressTensorGrad[9*Np+n]; -// Pxz_x = PressTensorGrad[15*Np+n]; -// Pxy_y = PressTensorGrad[10*Np+n]; -// Pyz_y = PressTensorGrad[13*Np+n]; -// Pyz_z = PressTensorGrad[14*Np+n]; -// Pxz_z = PressTensorGrad[17*Np+n]; -// //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... -// //TODO double check if you need porosity as a fre-factor -// Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); -// Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); -// Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); -// // fluid-solid force -// Gfs_x = (nA-nB)*SolidForce[n+0*Np]; -// Gfs_y = (nA-nB)*SolidForce[n+1*Np]; -// Gfs_z = (nA-nB)*SolidForce[n+2*Np]; -// -// // local density -// rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); -// // local relaxation time -// tau=tauA + 0.5*(1.0-phi)*(tauB-tauA); -// rlx_setA = 1.f/tau; -// rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); -// tau_eff=tauA_eff + 0.5*(1.0-phi)*(tauB_eff-tauA_eff); -// mu_eff = (tau_eff-0.5)/3.f;//kinematic viscosity -// -// -// //........................................................................ -// // READ THE DISTRIBUTIONS -// // (read from opposite array due to previous swap operation) -// //........................................................................ -// // q=0 -// fq = dist[n]; -// m1 = -30.0*fq; -// m2 = 12.0*fq; -// -// // q=1 -// fq = dist[2*Np+n]; -// pressure = fq; -// m1 -= 11.0*fq; -// m2 -= 4.0*fq; -// jx = fq; -// m4 = -4.0*fq; -// m9 = 2.0*fq; -// m10 = -4.0*fq; -// -// // f2 = dist[10*Np+n]; -// fq = dist[1*Np+n]; -// pressure += fq; -// m1 -= 11.0*(fq); -// m2 -= 4.0*(fq); -// jx -= fq; -// m4 += 4.0*(fq); -// m9 += 2.0*(fq); -// m10 -= 4.0*(fq); -// -// // q=3 -// fq = dist[4*Np+n]; -// pressure += fq; -// m1 -= 11.0*fq; -// m2 -= 4.0*fq; -// jy = fq; -// m6 = -4.0*fq; -// m9 -= fq; -// m10 += 2.0*fq; -// m11 = fq; -// m12 = -2.0*fq; -// -// // q = 4 -// fq = dist[3*Np+n]; -// pressure += fq; -// m1 -= 11.0*fq; -// m2 -= 4.0*fq; -// jy -= fq; -// m6 += 4.0*fq; -// m9 -= fq; -// m10 += 2.0*fq; -// m11 += fq; -// m12 -= 2.0*fq; -// -// // q=5 -// fq = dist[6*Np+n]; -// pressure += fq; -// m1 -= 11.0*fq; -// m2 -= 4.0*fq; -// jz = fq; -// m8 = -4.0*fq; -// m9 -= fq; -// m10 += 2.0*fq; -// m11 -= fq; -// m12 += 2.0*fq; -// -// // q = 6 -// fq = dist[5*Np+n]; -// pressure += fq; -// m1 -= 11.0*fq; -// m2 -= 4.0*fq; -// jz -= fq; -// m8 += 4.0*fq; -// m9 -= fq; -// m10 += 2.0*fq; -// m11 -= fq; -// m12 += 2.0*fq; -// -// // q=7 -// fq = dist[8*Np+n]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx += fq; -// m4 += fq; -// jy += fq; -// m6 += fq; -// m9 += fq; -// m10 += fq; -// m11 += fq; -// m12 += fq; -// m13 = fq; -// m16 = fq; -// m17 = -fq; -// -// // q = 8 -// fq = dist[7*Np+n]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx -= fq; -// m4 -= fq; -// jy -= fq; -// m6 -= fq; -// m9 += fq; -// m10 += fq; -// m11 += fq; -// m12 += fq; -// m13 += fq; -// m16 -= fq; -// m17 += fq; -// -// // q=9 -// fq = dist[10*Np+n]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx += fq; -// m4 += fq; -// jy -= fq; -// m6 -= fq; -// m9 += fq; -// m10 += fq; -// m11 += fq; -// m12 += fq; -// m13 -= fq; -// m16 += fq; -// m17 += fq; -// -// // q = 10 -// fq = dist[9*Np+n]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx -= fq; -// m4 -= fq; -// jy += fq; -// m6 += fq; -// m9 += fq; -// m10 += fq; -// m11 += fq; -// m12 += fq; -// m13 -= fq; -// m16 -= fq; -// m17 -= fq; -// -// // q=11 -// fq = dist[12*Np+n]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx += fq; -// m4 += fq; -// jz += fq; -// m8 += fq; -// m9 += fq; -// m10 += fq; -// m11 -= fq; -// m12 -= fq; -// m15 = fq; -// m16 -= fq; -// m18 = fq; -// -// // q=12 -// fq = dist[11*Np+n]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx -= fq; -// m4 -= fq; -// jz -= fq; -// m8 -= fq; -// m9 += fq; -// m10 += fq; -// m11 -= fq; -// m12 -= fq; -// m15 += fq; -// m16 += fq; -// m18 -= fq; -// -// // q=13 -// fq = dist[14*Np+n]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx += fq; -// m4 += fq; -// jz -= fq; -// m8 -= fq; -// m9 += fq; -// m10 += fq; -// m11 -= fq; -// m12 -= fq; -// m15 -= fq; -// m16 -= fq; -// m18 -= fq; -// -// // q=14 -// fq = dist[13*Np+n]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx -= fq; -// m4 -= fq; -// jz += fq; -// m8 += fq; -// m9 += fq; -// m10 += fq; -// m11 -= fq; -// m12 -= fq; -// m15 -= fq; -// m16 += fq; -// m18 += fq; -// -// // q=15 -// fq = dist[16*Np+n]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jy += fq; -// m6 += fq; -// jz += fq; -// m8 += fq; -// m9 -= 2.0*fq; -// m10 -= 2.0*fq; -// m14 = fq; -// m17 += fq; -// m18 -= fq; -// -// // q=16 -// fq = dist[15*Np+n]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jy -= fq; -// m6 -= fq; -// jz -= fq; -// m8 -= fq; -// m9 -= 2.0*fq; -// m10 -= 2.0*fq; -// m14 += fq; -// m17 -= fq; -// m18 += fq; -// -// // q=17 -// fq = dist[18*Np+n]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jy += fq; -// m6 += fq; -// jz -= fq; -// m8 -= fq; -// m9 -= 2.0*fq; -// m10 -= 2.0*fq; -// m14 -= fq; -// m17 += fq; -// m18 += fq; -// -// // q=18 -// fq = dist[17*Np+n]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jy -= fq; -// m6 -= fq; -// jz += fq; -// m8 += fq; -// m9 -= 2.0*fq; -// m10 -= 2.0*fq; -// m14 -= fq; -// m17 -= fq; -// m18 -= fq; -// //---------------------------------------------------------------------// -// -// c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); -// if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes -// //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); -// c1 = porosity*0.5*GeoFun/sqrt(perm); -// if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes -// -// vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); -// vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); -// vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); -// v_mag=sqrt(vx*vx+vy*vy+vz*vz); -// ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); -// uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); -// uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); -// u_mag=sqrt(ux*ux+uy*uy+uz*uz); -// -// //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium -// Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); -// Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); -// Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); -// if (porosity==1.0){ -// Fx=rho0*(Gx + Gff_x + Gfs_x); -// Fy=rho0*(Gy + Gff_y + Gfs_y); -// Fz=rho0*(Gz + Gff_z + Gfs_z); -// } -// -// //Calculate pressure for Incompressible-MRT model -// pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); -// -//// //..............carry out relaxation process............................................... -//// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) -//// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -//// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) -//// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; -//// jx = jx + Fx; -//// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) -//// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -//// jy = jy + Fy; -//// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) -//// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -//// jz = jz + Fz; -//// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) -//// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -//// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) -//// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; -//// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) -//// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; -//// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) -//// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; -//// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) -//// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; -//// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) -//// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; -//// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) -//// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; -//// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) -//// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; -//// m16 = m16 + rlx_setB*( - m16); -//// m17 = m17 + rlx_setB*( - m17); -//// m18 = m18 + rlx_setB*( - m18); -//// //....................................................................................................... -// -// //-------------------- IMRT collison where body force has NO higher-order terms -------------// -// //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); -// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); -// jx = jx + Fx; -// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -// jy = jy + Fy; -// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -// jz = jz + Fz; -// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); -// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); -// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); -// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); -// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); -// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); -// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); -// //....................................................................................................... -// -// //.................inverse transformation...................................................... -// // q=0 -// fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; -// dist[n] = fq; -// -// // q = 1 -// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); -// dist[1*Np+n] = fq; -// -// // q=2 -// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); -// dist[2*Np+n] = fq; -// -// // q = 3 -// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); -// dist[3*Np+n] = fq; -// -// // q = 4 -// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); -// dist[4*Np+n] = fq; -// -// // q = 5 -// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); -// dist[5*Np+n] = fq; -// -// // q = 6 -// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); -// dist[6*Np+n] = fq; -// -// // q = 7 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); -// dist[7*Np+n] = fq; -// -// // q = 8 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); -// dist[8*Np+n] = fq; -// -// // q = 9 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); -// dist[9*Np+n] = fq; -// -// // q = 10 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); -// dist[10*Np+n] = fq; -// -// // q = 11 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); -// dist[11*Np+n] = fq; -// -// // q = 12 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); -// dist[12*Np+n] = fq; -// -// // q = 13 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); -// dist[13*Np+n] = fq; -// -// // q= 14 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); -// dist[14*Np+n] = fq; -// -// // q = 15 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); -// dist[15*Np+n] = fq; -// -// // q = 16 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); -// dist[16*Np+n] = fq; -// -// // q = 17 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); -// dist[17*Np+n] = fq; -// -// // q = 18 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); -// dist[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] = pressure; -// -// //-----------------------Mass transport------------------------// -// // calcuale chemical potential -// chem_a = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-0.25*kappaA*phi_lap; -// chem_b = -lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*kappaB*phi_lap; -// rlx_massA = 3.f-sqrt(3.f); -// rlx_massB = 3.f-sqrt(3.f); -// -// //............................................... -// // q = 0,2,4 -// // Cq = {1,0,0}, {0,1,0}, {0,0,1} -// a1 = Aq[1*Np+n]; -// b1 = Bq[1*Np+n]; -// a2 = Aq[2*Np+n]; -// b2 = Bq[2*Np+n]; -// a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*ux)); -// b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*ux)); -// a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*ux)); -// b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*ux)); -// -// Aq[1*Np+n] = a1; -// Bq[1*Np+n] = b1; -// Aq[2*Np+n] = a2; -// Bq[2*Np+n] = b2; -// -// //............................................... -// // q = 2 -// // Cq = {0,1,0} -// a1 = Aq[3*Np+n]; -// b1 = Bq[3*Np+n]; -// a2 = Aq[4*Np+n]; -// b2 = Bq[4*Np+n]; -// a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uy)); -// b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uy)); -// a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uy)); -// b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uy)); -// -// Aq[3*Np+n] = a1; -// Bq[3*Np+n] = b1; -// Aq[4*Np+n] = a2; -// Bq[4*Np+n] = b2; -// //............................................... -// // q = 4 -// // Cq = {0,0,1} -// a1 = Aq[5*Np+n]; -// b1 = Bq[5*Np+n]; -// a2 = Aq[6*Np+n]; -// b2 = Bq[6*Np+n]; -// a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uz)); -// b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uz)); -// a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uz)); -// b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uz)); -// -// Aq[5*Np+n] = a1; -// Bq[5*Np+n] = b1; -// Aq[6*Np+n] = a2; -// Bq[6*Np+n] = b2; -// //............................................... -// -// // Instantiate mass transport distributions -// // Stationary value - distribution 0 -// a1=Aq[n]; -// b1=Bq[n]; -// Aq[n] = (1.0-rlx_massA)*a1+rlx_massA*(nA-3.0*gamma*chem_a); -// Bq[n] = (1.0-rlx_massB)*b1+rlx_massB*(nB-3.0*gamma*chem_b); -// -// -// } -// } -//} - -//__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, -// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, -// double Gx, double Gy, double Gz, -// double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ -// -// int n, nread, nr1,nr2,nr3,nr4,nr5,nr6; -// double vx,vy,vz,v_mag; -// double ux,uy,uz,u_mag; -// double pressure;//defined for this incompressible model -// // conserved momemnts -// double jx,jy,jz; -// // non-conserved moments -// double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; -// double fq; -// // currently disable 'GeoFun' -// double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) -// double porosity; -// double perm;//voxel permeability -// double c0, c1; //Guo's model parameters -// double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) -// double tau,tau_eff,rlx_setA,rlx_setB; -// double mu_eff;//effective kinematic viscosity for Darcy term -// double rho0; -// double phi; -// double phi_lap;//laplacian of phase field -// double nA,nB; -// double a1,b1,a2,b2; -// double Gfs_x,Gfs_y,Gfs_z; -// double Gff_x,Gff_y,Gff_z; -// double chem_a,chem_b; -// double rlx_massA,rlx_massB; -// // *---------------------------------Pressure Tensor Gradient------------------------------------*// -// double Pxx_x,Pyy_y,Pzz_z; -// double Pxy_x,Pxy_y; -// double Pyz_y,Pyz_z; -// double Pxz_x,Pxz_z; -// double px,py,pz; //pressure gradient -// -// 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; s0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); -// -// //Load pressure gradient -// px=PressureGrad[0*Np+n]; -// py=PressureGrad[1*Np+n]; -// pz=PressureGrad[2*Np+n]; -// -// //Load pressure tensor gradient -// //For reference full list of PressTensorGrad -// //PressTensorGrad[n+0*Np] = Pxx_x -// //PressTensorGrad[n+1*Np] = Pxx_y -// //PressTensorGrad[n+2*Np] = Pxx_z -// //PressTensorGrad[n+3*Np] = Pyy_x -// //PressTensorGrad[n+4*Np] = Pyy_y -// //PressTensorGrad[n+5*Np] = Pyy_z -// //PressTensorGrad[n+6*Np] = Pzz_x -// //PressTensorGrad[n+7*Np] = Pzz_y -// //PressTensorGrad[n+8*Np] = Pzz_z -// //PressTensorGrad[n+9*Np] = Pxy_x -// //PressTensorGrad[n+10*Np] = Pxy_y -// //PressTensorGrad[n+11*Np] = Pxy_z -// //PressTensorGrad[n+12*Np] = Pyz_x -// //PressTensorGrad[n+13*Np] = Pyz_y -// //PressTensorGrad[n+14*Np] = Pyz_z -// //PressTensorGrad[n+15*Np] = Pxz_x -// //PressTensorGrad[n+16*Np] = Pxz_y -// //PressTensorGrad[n+17*Np] = Pxz_z -// Pxx_x = PressTensorGrad[0*Np+n]; -// Pyy_y = PressTensorGrad[4*Np+n]; -// Pzz_z = PressTensorGrad[8*Np+n]; -// Pxy_x = PressTensorGrad[9*Np+n]; -// Pxz_x = PressTensorGrad[15*Np+n]; -// Pxy_y = PressTensorGrad[10*Np+n]; -// Pyz_y = PressTensorGrad[13*Np+n]; -// Pyz_z = PressTensorGrad[14*Np+n]; -// Pxz_z = PressTensorGrad[17*Np+n]; -// //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... -// //TODO double check if you need porosity as a fre-factor -// Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); -// Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); -// Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); -// // fluid-solid force -// Gfs_x = (nA-nB)*SolidForce[n+0*Np]; -// Gfs_y = (nA-nB)*SolidForce[n+1*Np]; -// Gfs_z = (nA-nB)*SolidForce[n+2*Np]; -// -// // local density -// rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); -// // local relaxation time -// tau=tauA + 0.5*(1.0-phi)*(tauB-tauA); -// rlx_setA = 1.f/tau; -// rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); -// tau_eff=tauA_eff + 0.5*(1.0-phi)*(tauB_eff-tauA_eff); -// mu_eff = (tau_eff-0.5)/3.f;//kinematic viscosity -// -// //........................................................................ -// // READ THE DISTRIBUTIONS -// // (read from opposite array due to previous swap operation) -// //........................................................................ -// // q=0 -// fq = dist[n]; -// m1 = -30.0*fq; -// m2 = 12.0*fq; -// -// // q=1 -// nr1 = neighborList[n]; // neighbor 2 ( > 10Np => odd part of dist) -// fq = dist[nr1]; // reading the f1 data into register fq -// pressure = fq; -// m1 -= 11.0*fq; -// m2 -= 4.0*fq; -// jx = fq; -// m4 = -4.0*fq; -// m9 = 2.0*fq; -// m10 = -4.0*fq; -// -// // q=2 -// nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) -// fq = dist[nr2]; // reading the f2 data into register fq -// pressure += fq; -// m1 -= 11.0*(fq); -// m2 -= 4.0*(fq); -// jx -= fq; -// m4 += 4.0*(fq); -// m9 += 2.0*(fq); -// m10 -= 4.0*(fq); -// -// // q=3 -// nr3 = neighborList[n+2*Np]; // neighbor 4 -// fq = dist[nr3]; -// pressure += fq; -// m1 -= 11.0*fq; -// m2 -= 4.0*fq; -// jy = fq; -// m6 = -4.0*fq; -// m9 -= fq; -// m10 += 2.0*fq; -// m11 = fq; -// m12 = -2.0*fq; -// -// // q = 4 -// nr4 = neighborList[n+3*Np]; // neighbor 3 -// fq = dist[nr4]; -// pressure += fq; -// m1 -= 11.0*fq; -// m2 -= 4.0*fq; -// jy -= fq; -// m6 += 4.0*fq; -// m9 -= fq; -// m10 += 2.0*fq; -// m11 += fq; -// m12 -= 2.0*fq; -// -// // q=5 -// nr5 = neighborList[n+4*Np]; -// fq = dist[nr5]; -// pressure += fq; -// m1 -= 11.0*fq; -// m2 -= 4.0*fq; -// jz = fq; -// m8 = -4.0*fq; -// m9 -= fq; -// m10 += 2.0*fq; -// m11 -= fq; -// m12 += 2.0*fq; -// -// // q = 6 -// nr6 = neighborList[n+5*Np]; -// fq = dist[nr6]; -// pressure += fq; -// m1 -= 11.0*fq; -// m2 -= 4.0*fq; -// jz -= fq; -// m8 += 4.0*fq; -// m9 -= fq; -// m10 += 2.0*fq; -// m11 -= fq; -// m12 += 2.0*fq; -// -// // q=7 -// nread = neighborList[n+6*Np]; -// fq = dist[nread]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx += fq; -// m4 += fq; -// jy += fq; -// m6 += fq; -// m9 += fq; -// m10 += fq; -// m11 += fq; -// m12 += fq; -// m13 = fq; -// m16 = fq; -// m17 = -fq; -// -// // q = 8 -// nread = neighborList[n+7*Np]; -// fq = dist[nread]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx -= fq; -// m4 -= fq; -// jy -= fq; -// m6 -= fq; -// m9 += fq; -// m10 += fq; -// m11 += fq; -// m12 += fq; -// m13 += fq; -// m16 -= fq; -// m17 += fq; -// -// // q=9 -// nread = neighborList[n+8*Np]; -// fq = dist[nread]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx += fq; -// m4 += fq; -// jy -= fq; -// m6 -= fq; -// m9 += fq; -// m10 += fq; -// m11 += fq; -// m12 += fq; -// m13 -= fq; -// m16 += fq; -// m17 += fq; -// -// // q = 10 -// nread = neighborList[n+9*Np]; -// fq = dist[nread]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx -= fq; -// m4 -= fq; -// jy += fq; -// m6 += fq; -// m9 += fq; -// m10 += fq; -// m11 += fq; -// m12 += fq; -// m13 -= fq; -// m16 -= fq; -// m17 -= fq; -// -// // q=11 -// nread = neighborList[n+10*Np]; -// fq = dist[nread]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx += fq; -// m4 += fq; -// jz += fq; -// m8 += fq; -// m9 += fq; -// m10 += fq; -// m11 -= fq; -// m12 -= fq; -// m15 = fq; -// m16 -= fq; -// m18 = fq; -// -// // q=12 -// nread = neighborList[n+11*Np]; -// fq = dist[nread]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx -= fq; -// m4 -= fq; -// jz -= fq; -// m8 -= fq; -// m9 += fq; -// m10 += fq; -// m11 -= fq; -// m12 -= fq; -// m15 += fq; -// m16 += fq; -// m18 -= fq; -// -// // q=13 -// nread = neighborList[n+12*Np]; -// fq = dist[nread]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx += fq; -// m4 += fq; -// jz -= fq; -// m8 -= fq; -// m9 += fq; -// m10 += fq; -// m11 -= fq; -// m12 -= fq; -// m15 -= fq; -// m16 -= fq; -// m18 -= fq; -// -// // q=14 -// nread = neighborList[n+13*Np]; -// fq = dist[nread]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jx -= fq; -// m4 -= fq; -// jz += fq; -// m8 += fq; -// m9 += fq; -// m10 += fq; -// m11 -= fq; -// m12 -= fq; -// m15 -= fq; -// m16 += fq; -// m18 += fq; -// -// // q=15 -// nread = neighborList[n+14*Np]; -// fq = dist[nread]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jy += fq; -// m6 += fq; -// jz += fq; -// m8 += fq; -// m9 -= 2.0*fq; -// m10 -= 2.0*fq; -// m14 = fq; -// m17 += fq; -// m18 -= fq; -// -// // q=16 -// nread = neighborList[n+15*Np]; -// fq = dist[nread]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jy -= fq; -// m6 -= fq; -// jz -= fq; -// m8 -= fq; -// m9 -= 2.0*fq; -// m10 -= 2.0*fq; -// m14 += fq; -// m17 -= fq; -// m18 += fq; -// -// // q=17 -// nread = neighborList[n+16*Np]; -// fq = dist[nread]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jy += fq; -// m6 += fq; -// jz -= fq; -// m8 -= fq; -// m9 -= 2.0*fq; -// m10 -= 2.0*fq; -// m14 -= fq; -// m17 += fq; -// m18 += fq; -// -// // q=18 -// nread = neighborList[n+17*Np]; -// fq = dist[nread]; -// pressure += fq; -// m1 += 8.0*fq; -// m2 += fq; -// jy -= fq; -// m6 -= fq; -// jz += fq; -// m8 += fq; -// m9 -= 2.0*fq; -// m10 -= 2.0*fq; -// m14 -= fq; -// m17 -= fq; -// m18 -= fq; -// //---------------------------------------------------------------------// -// -// c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); -// if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes -// //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); -// c1 = porosity*0.5*GeoFun/sqrt(perm); -// if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes -// -// vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); -// vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); -// vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); -// v_mag=sqrt(vx*vx+vy*vy+vz*vz); -// ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); -// uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); -// uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); -// u_mag=sqrt(ux*ux+uy*uy+uz*uz); -// -// //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium -// Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); -// Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); -// Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); -// if (porosity==1.0){ -// Fx=rho0*(Gx + Gff_x + Gfs_x); -// Fy=rho0*(Gy + Gff_y + Gfs_y); -// Fz=rho0*(Gz + Gff_z + Gfs_z); -// } -// -// //Calculate pressure for Incompressible-MRT model -// pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); -// -//// //..............carry out relaxation process............................................... -//// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) -//// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -//// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) -//// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; -//// jx = jx + Fx; -//// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) -//// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -//// jy = jy + Fy; -//// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) -//// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -//// jz = jz + Fz; -//// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) -//// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -//// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) -//// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; -//// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) -//// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; -//// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) -//// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; -//// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) -//// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; -//// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) -//// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; -//// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) -//// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; -//// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) -//// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; -//// m16 = m16 + rlx_setB*( - m16); -//// m17 = m17 + rlx_setB*( - m17); -//// m18 = m18 + rlx_setB*( - m18); -//// //....................................................................................................... -// -// //-------------------- IMRT collison where body force has NO higher-order terms -------------// -// //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); -// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); -// jx = jx + Fx; -// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -// jy = jy + Fy; -// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -// jz = jz + Fz; -// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); -// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); -// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); -// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); -// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); -// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); -// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); -// //....................................................................................................... -// -// -// //.................inverse transformation...................................................... -// // q=0 -// fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; -// dist[n] = fq; -// -// // q = 1 -// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); -// //nread = neighborList[n+Np]; -// dist[nr2] = fq; -// -// // q=2 -// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); -// //nread = neighborList[n]; -// dist[nr1] = fq; -// -// // q = 3 -// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); -// //nread = neighborList[n+3*Np]; -// dist[nr4] = fq; -// -// // q = 4 -// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); -// //nread = neighborList[n+2*Np]; -// dist[nr3] = fq; -// -// // q = 5 -// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); -// //nread = neighborList[n+5*Np]; -// dist[nr6] = fq; -// -// // q = 6 -// fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); -// //nread = neighborList[n+4*Np]; -// dist[nr5] = fq; -// -// // q = 7 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); -// nread = neighborList[n+7*Np]; -// dist[nread] = fq; -// -// // q = 8 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); -// nread = neighborList[n+6*Np]; -// dist[nread] = fq; -// -// // q = 9 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); -// nread = neighborList[n+9*Np]; -// dist[nread] = fq; -// -// // q = 10 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); -// nread = neighborList[n+8*Np]; -// dist[nread] = fq; -// -// // q = 11 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); -// nread = neighborList[n+11*Np]; -// dist[nread] = fq; -// -// // q = 12 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); -// nread = neighborList[n+10*Np]; -// dist[nread]= fq; -// -// // q = 13 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); -// nread = neighborList[n+13*Np]; -// dist[nread] = fq; -// -// // q= 14 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); -// nread = neighborList[n+12*Np]; -// dist[nread] = fq; -// -// // q = 15 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); -// nread = neighborList[n+15*Np]; -// dist[nread] = fq; -// -// // q = 16 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); -// nread = neighborList[n+14*Np]; -// dist[nread] = fq; -// -// // q = 17 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); -// nread = neighborList[n+17*Np]; -// dist[nread] = fq; -// -// // q = 18 -// fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); -// nread = neighborList[n+16*Np]; -// dist[nread] = fq; -// //........................................................................ -// -// //Update velocity on device -// Velocity[0*Np+n] = ux; -// Velocity[1*Np+n] = uy; -// Velocity[2*Np+n] = uz; -// //Update pressure on device -// Pressure[n] = pressure; -// -// //-----------------------Mass transport------------------------// -// // calcuale chemical potential -// chem_a = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-0.25*kappaA*phi_lap; -// chem_b = -lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*kappaB*phi_lap; -// rlx_massA = 3.f-sqrt(3.f); -// rlx_massB = 3.f-sqrt(3.f); -// -// //............................................... -// // q = 0,2,4 -// // Cq = {1,0,0}, {0,1,0}, {0,0,1} -// a1 = Aq[nr2]; -// b1 = Bq[nr2]; -// a2 = Aq[nr1]; -// b2 = Bq[nr1]; -// a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*ux)); -// b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*ux)); -// a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*ux)); -// b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*ux)); -// -// // q = 1 -// //nread = neighborList[n+Np]; -// Aq[nr2] = a1; -// Bq[nr2] = b1; -// // q=2 -// //nread = neighborList[n]; -// Aq[nr1] = a2; -// Bq[nr1] = b2; -// -// //............................................... -// // Cq = {0,1,0} -// a1 = Aq[nr4]; -// b1 = Bq[nr4]; -// a2 = Aq[nr3]; -// b2 = Bq[nr3]; -// a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uy)); -// b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uy)); -// a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uy)); -// b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uy)); -// -// // q = 3 -// //nread = neighborList[n+3*Np]; -// Aq[nr4] = a1; -// Bq[nr4] = b1; -// // q = 4 -// //nread = neighborList[n+2*Np]; -// Aq[nr3] = a2; -// Bq[nr3] = b2; -// -// //............................................... -// // q = 4 -// // Cq = {0,0,1} -// a1 = Aq[nr6]; -// b1 = Bq[nr6]; -// a2 = Aq[nr5]; -// b2 = Bq[nr5]; -// a1 = (1.0-rlx_massA)*a1+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a+nA*uz)); -// b1 = (1.0-rlx_massB)*b1+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b+nB*uz)); -// a2 = (1.0-rlx_massA)*a2+rlx_massA*(0.1111111111111111*4.5*(gamma*chem_a-nA*uz)); -// b2 = (1.0-rlx_massB)*b2+rlx_massB*(0.1111111111111111*4.5*(gamma*chem_b-nB*uz)); -// -// // q = 5 -// //nread = neighborList[n+5*Np]; -// Aq[nr6] = a1; -// Bq[nr6] = b1; -// // q = 6 -// //nread = neighborList[n+4*Np]; -// Aq[nr5] = a2; -// Bq[nr5] = b2; -// //............................................... -// -// // Instantiate mass transport distributions -// // Stationary value - distribution 0 -// a1=Aq[n]; -// b1=Bq[n]; -// Aq[n] = (1.0-rlx_massA)*a1+rlx_massA*(nA-3.0*gamma*chem_a); -// Bq[n] = (1.0-rlx_massB)*b1+rlx_massB*(nB-3.0*gamma*chem_b); -// -// -// } -// } -//} - -__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Cq, double *Phi, double *Den,double *SolidForce, int start, int finish, int Np, +__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ @@ -2678,15 +1351,13 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) double tau,tau_eff,rlx_setA,rlx_setB; double mu_eff;//effective kinematic viscosity for Darcy term - double rho0; + double rho,rho0; double phi; double phi_lap;//laplacian of phase field double nA,nB; - //double a1,b1,a2,b2; double Gfs_x,Gfs_y,Gfs_z; double Gff_x,Gff_y,Gff_z; double chem; - //double rlx_massA,rlx_massB; double rlx_phi; double a1,a2;//PDF of phase field // *---------------------------------Pressure Tensor Gradient------------------------------------*// @@ -2716,11 +1387,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou if ( n 10Np => odd part of dist) fq = dist[nr1]; // reading the f1 data into register fq - pressure = fq; + rho += fq; m1 -= 11.0*fq; m2 -= 4.0*fq; jx = fq; @@ -2804,7 +1475,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=2 nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) fq = dist[nr2]; // reading the f2 data into register fq - pressure += fq; + rho += fq; m1 -= 11.0*(fq); m2 -= 4.0*(fq); jx -= fq; @@ -2815,7 +1486,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=3 nr3 = neighborList[n+2*Np]; // neighbor 4 fq = dist[nr3]; - pressure += fq; + rho += fq; m1 -= 11.0*fq; m2 -= 4.0*fq; jy = fq; @@ -2828,7 +1499,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q = 4 nr4 = neighborList[n+3*Np]; // neighbor 3 fq = dist[nr4]; - pressure += fq; + rho += fq; m1 -= 11.0*fq; m2 -= 4.0*fq; jy -= fq; @@ -2841,7 +1512,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=5 nr5 = neighborList[n+4*Np]; fq = dist[nr5]; - pressure += fq; + rho += fq; m1 -= 11.0*fq; m2 -= 4.0*fq; jz = fq; @@ -2854,7 +1525,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q = 6 nr6 = neighborList[n+5*Np]; fq = dist[nr6]; - pressure += fq; + rho += fq; m1 -= 11.0*fq; m2 -= 4.0*fq; jz -= fq; @@ -2867,7 +1538,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=7 nread = neighborList[n+6*Np]; fq = dist[nread]; - pressure += fq; + rho += fq; m1 += 8.0*fq; m2 += fq; jx += fq; @@ -2885,7 +1556,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q = 8 nread = neighborList[n+7*Np]; fq = dist[nread]; - pressure += fq; + rho += fq; m1 += 8.0*fq; m2 += fq; jx -= fq; @@ -2903,7 +1574,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=9 nread = neighborList[n+8*Np]; fq = dist[nread]; - pressure += fq; + rho += fq; m1 += 8.0*fq; m2 += fq; jx += fq; @@ -2921,7 +1592,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q = 10 nread = neighborList[n+9*Np]; fq = dist[nread]; - pressure += fq; + rho += fq; m1 += 8.0*fq; m2 += fq; jx -= fq; @@ -2939,7 +1610,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=11 nread = neighborList[n+10*Np]; fq = dist[nread]; - pressure += fq; + rho += fq; m1 += 8.0*fq; m2 += fq; jx += fq; @@ -2957,7 +1628,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=12 nread = neighborList[n+11*Np]; fq = dist[nread]; - pressure += fq; + rho += fq; m1 += 8.0*fq; m2 += fq; jx -= fq; @@ -2975,7 +1646,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=13 nread = neighborList[n+12*Np]; fq = dist[nread]; - pressure += fq; + rho += fq; m1 += 8.0*fq; m2 += fq; jx += fq; @@ -2993,7 +1664,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=14 nread = neighborList[n+13*Np]; fq = dist[nread]; - pressure += fq; + rho += fq; m1 += 8.0*fq; m2 += fq; jx -= fq; @@ -3011,7 +1682,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=15 nread = neighborList[n+14*Np]; fq = dist[nread]; - pressure += fq; + rho += fq; m1 += 8.0*fq; m2 += fq; jy += fq; @@ -3027,7 +1698,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=16 nread = neighborList[n+15*Np]; fq = dist[nread]; - pressure += fq; + rho += fq; m1 += 8.0*fq; m2 += fq; jy -= fq; @@ -3043,7 +1714,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=17 nread = neighborList[n+16*Np]; fq = dist[nread]; - pressure += fq; + rho += fq; m1 += 8.0*fq; m2 += fq; jy += fq; @@ -3059,7 +1730,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // q=18 nread = neighborList[n+17*Np]; fq = dist[nread]; - pressure += fq; + rho += fq; m1 += 8.0*fq; m2 += fq; jy -= fq; @@ -3099,159 +1770,127 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou } //Calculate pressure for Incompressible-MRT model - pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); + //pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); + pressure=rho/3.0; -// //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) -// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) -// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; -// jx = jx + Fx; -// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -// jy = jy + Fy; -// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -// jz = jz + Fz; -// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) -// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; -// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) -// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; -// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) -// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; -// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) -// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; -// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) -// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; -// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) -// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; -// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) -// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); -// //....................................................................................................... - //-------------------- IMRT collison where body force has NO higher-order terms -------------// //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho0 - 11*rho) - m1); + m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho0)- m2); jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) + m4 = m4 + rlx_setB*((-0.6666666666666666*jx)- m4) + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) + m6 = m6 + rlx_setB*((-0.6666666666666666*jy)- m6) + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) + m8 = m8 + rlx_setB*((-0.6666666666666666*jz)- m8) + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); - m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); - m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); - m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); - m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); + m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho0) - m9); + m10 = m10 + rlx_setA*( - m10); + m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho0) - m11); + m12 = m12 + rlx_setA*( - m12); + m13 = m13 + rlx_setA*( (jx*jy/rho0) - m13); + m14 = m14 + rlx_setA*( (jy*jz/rho0) - m14); + m15 = m15 + rlx_setA*( (jx*jz/rho0) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); //....................................................................................................... //.................inverse transformation...................................................... // q=0 - fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; + fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; dist[n] = fq; // q = 1 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); //nread = neighborList[n+Np]; dist[nr2] = fq; // q=2 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); //nread = neighborList[n]; dist[nr1] = fq; // q = 3 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); //nread = neighborList[n+3*Np]; dist[nr4] = fq; // q = 4 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); //nread = neighborList[n+2*Np]; dist[nr3] = fq; // q = 5 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); //nread = neighborList[n+5*Np]; dist[nr6] = fq; // q = 6 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); //nread = neighborList[n+4*Np]; dist[nr5] = fq; // q = 7 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); nread = neighborList[n+7*Np]; dist[nread] = fq; // q = 8 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); nread = neighborList[n+6*Np]; dist[nread] = fq; // q = 9 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); nread = neighborList[n+9*Np]; dist[nread] = fq; // q = 10 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); nread = neighborList[n+8*Np]; dist[nread] = fq; // q = 11 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); nread = neighborList[n+11*Np]; dist[nread] = fq; // q = 12 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); nread = neighborList[n+10*Np]; dist[nread]= fq; // q = 13 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); nread = neighborList[n+13*Np]; dist[nread] = fq; // q= 14 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); nread = neighborList[n+12*Np]; dist[nread] = fq; // q = 15 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); nread = neighborList[n+15*Np]; dist[nread] = fq; // q = 16 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); nread = neighborList[n+14*Np]; dist[nread] = fq; // q = 17 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); nread = neighborList[n+17*Np]; dist[nread] = fq; // q = 18 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); nread = neighborList[n+16*Np]; dist[nread] = fq; //........................................................................ @@ -3265,17 +1904,19 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou //-----------------------Mass transport------------------------// // calcuale chemical potential - chem = lambdaA*(nA*nA*nA-1.5*nA*nA+0.5*nA)-lambdaB*(nB*nB*nB-1.5*nB*nB+0.5*nB)-0.25*(kappaA+kappaB)*phi_lap; + chem = 0.125*(lambdaA+lambdaB)*(-phi+phi*phi*phi)-0.25*(kappaA+kappaB)*phi_lap; //rlx_phi = 3.f-sqrt(3.f); rlx_phi = 1.0; //............................................... // q = 0,2,4 // Cq = {1,0,0}, {0,1,0}, {0,0,1} - a1 = Cq[nr2]; - a2 = Cq[nr1]; - a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*ux)); - a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*ux)); + //a1 = Cq[nr2]; + //a2 = Cq[nr1]; + //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*ux)); + //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*ux)); + a1 = 0.1111111111111111*4.5*(gamma*chem+phi*ux); + a2 = 0.1111111111111111*4.5*(gamma*chem-phi*ux); // q = 1 //nread = neighborList[n+Np]; @@ -3286,10 +1927,12 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou //............................................... // Cq = {0,1,0} - a1 = Cq[nr4]; - a2 = Cq[nr3]; - a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uy)); - a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uy)); + //a1 = Cq[nr4]; + //a2 = Cq[nr3]; + //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uy)); + //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uy)); + a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uy); + a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uy); // q = 3 //nread = neighborList[n+3*Np]; @@ -3301,10 +1944,12 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou //............................................... // q = 4 // Cq = {0,0,1} - a1 = Cq[nr6]; - a2 = Cq[nr5]; - a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uz)); - a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uz)); + //a1 = Cq[nr6]; + //a2 = Cq[nr5]; + //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uz)); + //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uz)); + a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uz); + a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uz); // q = 5 //nread = neighborList[n+5*Np]; @@ -3316,14 +1961,15 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou // Instantiate mass transport distributions // Stationary value - distribution 0 - a1=Cq[n]; - Cq[n] = (1.0-rlx_phi)*a1+rlx_phi*(a1-3.0*gamma*chem); + //a1=Cq[n]; + //Cq[n] = (1.0-rlx_phi)*a1+rlx_phi*(phi-3.0*gamma*chem); + Cq[n] = phi-3.0*gamma*chem; } } } -__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, double *Phi, double *Den,double *SolidForce, int start, int finish, int Np, +__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ @@ -3344,15 +1990,13 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) double tau,tau_eff,rlx_setA,rlx_setB; double mu_eff;//effective kinematic viscosity for Darcy term - double rho0; + double rho,rho0; double phi; double phi_lap;//laplacian of phase field double nA,nB; - //double a1,b1,a2,b2; double Gfs_x,Gfs_y,Gfs_z; double Gff_x,Gff_y,Gff_z; double chem; - //double rlx_massA,rlx_massB; double rlx_phi; double a1,a2;//PDF of phase field // *---------------------------------Pressure Tensor Gradient------------------------------------*// @@ -3384,12 +2028,10 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double if ( n>>(dist, Aq, Bq, Den, SolidForce, start, finish, Np, -// tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); -// -// cudaError_t err = cudaGetLastError(); -// if (cudaSuccess != err){ -// printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleColorChem: %s \n",cudaGetErrorString(err)); -// } -//} -// -//extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Aq, double *Bq, double *Den,double *SolidForce, int start, int finish, int Np, -// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, -// double Gx, double Gy, double Gz, -// double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ -// -// dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem<<>>(neighborList, dist, Aq, Bq, Den, SolidForce, start, finish, Np, -// tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, -// Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); -// -// cudaError_t err = cudaGetLastError(); -// if (cudaSuccess != err){ -// printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleColorChem: %s \n",cudaGetErrorString(err)); -// } -//} - -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, double *Phi, double *Den,double *SolidForce, int start, int finish, int Np, +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem<<>>(dist, Cq, Phi, Den, SolidForce, start, finish, Np, + dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem<<>>(dist, Cq, Phi, SolidForce, start, finish, Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); cudaError_t err = cudaGetLastError(); @@ -4682,12 +3232,12 @@ extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, } } -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Cq, double *Phi, double *Den,double *SolidForce, int start, int finish, int Np, +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem<<>>(neighborList, dist, Cq, Phi, Den, SolidForce, start, finish, Np, + dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem<<>>(neighborList, dist, Cq, Phi, SolidForce, start, finish, Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); @@ -4697,16 +3247,8 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double } } -//extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Aq, double *Bq, double *Phi, int start, int finish, int Np){ -// dvc_ScaLBL_D3Q7_GreyColorIMRT_Init<<>>(Den, Aq, Bq, Phi, start, finish, Np); -// cudaError_t err = cudaGetLastError(); -// if (cudaSuccess != err){ -// printf("CUDA error in ScaLBL_D3Q7_GreyColorIMRT_Init: %s \n",cudaGetErrorString(err)); -// } -//} - -extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_GreyColorIMRT_Init<<>>(Den, Cq, PhiLap,gamma,kappaA,kappaB,lambdaA,lambdaB, start, finish, Np); +extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Phi, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np){ + dvc_ScaLBL_D3Q7_GreyColorIMRT_Init<<>>(Phi, Cq, PhiLap,gamma,kappaA,kappaB,lambdaA,lambdaB, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ printf("CUDA error in ScaLBL_D3Q7_GreyColorIMRT_Init: %s \n",cudaGetErrorString(err)); @@ -4740,9 +3282,9 @@ extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, } } -extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(int *NeighborList, double *Cq, double *Den, double *Phi, int start, int finish, int Np){ +extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(int *NeighborList, double *Cq, double *Phi, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorPhi<<>>(NeighborList, Cq, Den, Phi, start, finish, Np); + dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorPhi<<>>(NeighborList, Cq, Phi, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ @@ -4750,9 +3292,9 @@ extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(int *NeighborList, double *C } } -extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(double *Cq, double *Den, double *Phi, int start, int finish, int Np){ +extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(double *Cq, double *Phi, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorPhi<<>>(Cq, Den, Phi, start, finish, Np); + dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorPhi<<>>(Cq, Phi, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ printf("CUDA error in ScaLBL_D3Q7_AAeven_GreyscaleColorPhi: %s \n",cudaGetErrorString(err)); @@ -4786,9 +3328,9 @@ extern "C" void ScaLBL_D3Q19_GreyscaleColor_Pressure(double *dist, double *Den, } } -extern "C" void ScaLBL_D3Q19_GreyscaleColor_PressureTensor(int *neighborList, double *Phi, double *PressTensor, double *PhiLap, +extern "C" void ScaLBL_D3Q19_GreyscaleColor_PressureTensor(int *neighborList, double *Phi,double *Pressure, double *PressTensor, double *PhiLap, double kappaA,double kappaB,double lambdaA,double lambdaB, int start, int finish, int Np){ - dvc_ScaLBL_D3Q19_GreyscaleColor_PressureTensor<<>>(neighborList,Phi,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,start,finish,Np); + dvc_ScaLBL_D3Q19_GreyscaleColor_PressureTensor<<>>(neighborList,Phi,Pressure,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,start,finish,Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ printf("CUDA error in ScaLBL_D3Q19_GreyscaleColor_PressureTensor: %s \n",cudaGetErrorString(err)); diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 1680939b..1827b961 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -74,9 +74,6 @@ void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ if (greyscaleColor_db->keyExists( "rhoB" )){ rhoB = greyscaleColor_db->getScalar( "rhoB" ); } -// if (greyscaleColor_db->keyExists( "Gsc" )){ -// Gsc = greyscaleColor_db->getScalar( "Gsc" ); -// } if (greyscaleColor_db->keyExists( "gamma" )){ gamma = greyscaleColor_db->getScalar( "gamma" ); } @@ -477,8 +474,8 @@ void ScaLBL_GreyscaleColorModel::Density_and_Phase_Init(){ ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); } - double *Den_temp; - Den_temp=new double [2*Np]; +// double *Den_temp; +// Den_temp=new double [2*Np]; double nA=0.5;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. double nB=0.5; @@ -513,18 +510,18 @@ void ScaLBL_GreyscaleColorModel::Density_and_Phase_Init(){ phi = nA-nB; } int idx = Map(i,j,k); - Den_temp[idx+0*Np] = nA; - Den_temp[idx+1*Np] = nB; + //Den_temp[idx+0*Np] = nA; + //Den_temp[idx+1*Np] = nB; Phi_temp[idx] = phi; } } } } //copy to device - ScaLBL_CopyToDevice(Den, Den_temp, 2*Np*sizeof(double)); + //ScaLBL_CopyToDevice(Den, Den_temp, 2*Np*sizeof(double)); ScaLBL_CopyToDevice(Phi, Phi_temp, 1*Np*sizeof(double)); ScaLBL_DeviceBarrier(); - delete [] Den_temp; + //delete [] Den_temp; delete [] Phi_temp; } @@ -566,20 +563,20 @@ void ScaLBL_GreyscaleColorModel::Create(){ //........................................................................... ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); ScaLBL_AllocateDeviceMemory((void **) &fq, 19*dist_mem_size); + ScaLBL_AllocateDeviceMemory((void **) &Cq, 7*sizeof(double)*Np);//phase field distribution ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &PressureGrad, 3*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &Aq, 7*sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &Bq, 7*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Cq, 7*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Den, 2*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Phi, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &PhiLap, sizeof(double)*Np);//laplacian of phase field ScaLBL_AllocateDeviceMemory((void **) &SolidForce, 3*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &PressTensor, 6*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &PressTensorGrad, 18*sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &Den, 2*sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &Aq, 7*sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &Bq, 7*sizeof(double)*Np); //ScaLBL_AllocateDeviceMemory((void **) &DenGradA, 3*sizeof(double)*Np); //ScaLBL_AllocateDeviceMemory((void **) &DenGradB, 3*sizeof(double)*Np); //ScaLBL_AllocateDeviceMemory((void **) &DenLapA, sizeof(double)*Np); @@ -613,6 +610,7 @@ void ScaLBL_GreyscaleColorModel::Create(){ void ScaLBL_GreyscaleColorModel::Initialize(){ if (Restart == true){ + //TODO: Restart funtion is currently not working; need updates if (rank==0){ printf("Initializing density field and distributions from Restart! \n"); } @@ -635,10 +633,10 @@ void ScaLBL_GreyscaleColorModel::Initialize(){ //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + //ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, 0, ScaLBL_Comm->LastExterior(), Np); + //ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); //TODO need to initialize velocity field ! //this is required for calculating the pressure_dvc @@ -651,20 +649,21 @@ void ScaLBL_GreyscaleColorModel::Initialize(){ //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_GreyColorIMRT_Init(Phi, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + ScaLBL_D3Q7_GreyColorIMRT_Init(Phi, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); if (rank==0) printf ("Initializing distributions \n"); - ScaLBL_D3Q19_GreyColorIMRT_Init(fq, Den, rhoA, rhoB, Np); + //ScaLBL_D3Q19_GreyColorIMRT_Init(fq, Den, rhoA, rhoB, Np); + ScaLBL_D3Q19_Init(fq, Np); - //Velocity also needs initialization - if (rank==0) printf ("Initializing velocity field \n"); - double *vel_init; - vel_init = new double [3*Np]; - for (int i=0;i<3*Np;i++) vel_init[i]=0.0; - ScaLBL_CopyToDevice(Velocity,vel_init,3*Np*sizeof(double)); - ScaLBL_DeviceBarrier(); - delete [] vel_init; + //Velocity also needs initialization (for old incompressible momentum transport) + //if (rank==0) printf ("Initializing velocity field \n"); + //double *vel_init; + //vel_init = new double [3*Np]; + //for (int i=0;i<3*Np;i++) vel_init[i]=0.0; + //ScaLBL_CopyToDevice(Velocity,vel_init,3*Np*sizeof(double)); + //ScaLBL_DeviceBarrier(); + //delete [] vel_init; } } @@ -714,18 +713,15 @@ void ScaLBL_GreyscaleColorModel::Run(){ timestep++; // Compute the density field // Read for Aq, Bq happens in this routine (requires communication) - //ScaLBL_Comm->BiSendD3Q7AA(Aq,Bq); //READ FROM NORMAL ScaLBL_Comm->SendD3Q7AA(Cq); //READ FROM NORMAL - //ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(NeighborList, Aq, Bq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(NeighborList, Cq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - //ScaLBL_Comm->BiRecvD3Q7AA(Aq,Bq); //WRITE INTO OPPOSITE + ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(NeighborList, Cq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->RecvD3Q7AA(Cq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); - //ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(NeighborList, Aq, Bq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(NeighborList, Cq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(NeighborList, Cq, Phi, 0, ScaLBL_Comm->LastExterior(), Np); // Update local pressure - ScaLBL_D3Q19_GreyscaleColor_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); + //ScaLBL_D3Q19_GreyscaleColor_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); + ScaLBL_D3Q19_Pressure(fq, Pressure_dvc, Np); // Compute pressure gradient ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(Pressure_dvc); @@ -733,11 +729,13 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_Comm->RecvGrad(Pressure_dvc,PressureGrad); ScaLBL_DeviceBarrier(); // Compute Pressure Tensor - ScaLBL_Comm->SendHalo(Phi); - ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(),Np); - ScaLBL_Comm->RecvHalo(Phi); - ScaLBL_DeviceBarrier(); - ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,0,ScaLBL_Comm->LastExterior(),Np); + //NOTE send and recv halo causes problems - it errorneously changes Phi + //ScaLBL_Comm->SendHalo(Phi); + ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(),Np); + //ScaLBL_Comm->RecvHalo(Phi); + //ScaLBL_DeviceBarrier(); + ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,0,ScaLBL_Comm->LastExterior(),Np); + /* Compute gradient of the pressure tensor */ // call the recv Grad function once per tensor element // 1st tensor element @@ -771,22 +769,9 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[5*Np],&PressTensorGrad[15*Np]); -// //compute Den gradients - component A -// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); -// ScaLBL_Comm->SendHalo(&Den[0*Np]); -// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); -// ScaLBL_Comm->RecvGrad(&Den[0*Np],DenGradA); -// //compute Den gradients - component B -// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); -// ScaLBL_Comm->SendHalo(&Den[1*Np]); -// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); -// ScaLBL_Comm->RecvGrad(&Den[1*Np],DenGradB); - ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL -// ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, -// tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); - ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Cq, Phi, Den, SolidForce, + ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Cq, Phi, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); @@ -798,31 +783,27 @@ void ScaLBL_GreyscaleColorModel::Run(){ // ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); // ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); // } -// ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, -// tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); - ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Cq, Phi, Den, SolidForce, + ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Cq, Phi, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + // *************EVEN TIMESTEP*************// timestep++; // Compute the density field // Read for Aq, Bq happens in this routine (requires communication) - //ScaLBL_Comm->BiSendD3Q7AA(Aq,Bq); //READ FROM NORMAL ScaLBL_Comm->SendD3Q7AA(Cq); //READ FROM NORMAL - //ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(Aq, Bq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(Cq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - //ScaLBL_Comm->BiRecvD3Q7AA(Aq,Bq); //WRITE INTO OPPOSITE + ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(Cq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->RecvD3Q7AA(Cq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); - //ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(Aq, Bq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(Cq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(Cq, Phi, 0, ScaLBL_Comm->LastExterior(), Np); // Update local pressure - ScaLBL_D3Q19_GreyscaleColor_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); + //ScaLBL_D3Q19_GreyscaleColor_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); + ScaLBL_D3Q19_Pressure(fq, Pressure_dvc, Np); // Compute pressure gradient ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(Pressure_dvc); @@ -830,11 +811,12 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_Comm->RecvGrad(Pressure_dvc,PressureGrad); ScaLBL_DeviceBarrier(); // Compute Pressure Tensor - ScaLBL_Comm->SendHalo(Phi); - ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(),Np); - ScaLBL_Comm->RecvHalo(Phi); - ScaLBL_DeviceBarrier(); - ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,0,ScaLBL_Comm->LastExterior(),Np); + //ScaLBL_Comm->SendHalo(Phi); + //NOTE send and recv halo causes problems - it errorneously changes Phi + ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(),Np); + //ScaLBL_Comm->RecvHalo(Phi); + //ScaLBL_DeviceBarrier(); + ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,0,ScaLBL_Comm->LastExterior(),Np); /* Compute gradient of the pressure tensor */ // call the recv Grad function once per tensor element // 1st tensor element @@ -868,21 +850,9 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[5*Np],&PressTensorGrad[15*Np]); -// //compute Den gradients - component A -// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); -// ScaLBL_Comm->SendHalo(&Den[0*Np]); -// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[0*Np], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); -// ScaLBL_Comm->RecvGrad(&Den[0*Np],DenGradA); -// //compute Den gradients - component B -// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); -// ScaLBL_Comm->SendHalo(&Den[1*Np]); -// ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &Den[1*Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); -// ScaLBL_Comm->RecvGrad(&Den[1*Np],DenGradB); ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL -// ScaLBL_D3Q19_AAeven_GreyscaleColor(fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, -// tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); - ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Cq, Phi, Den, SolidForce, + ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Cq, Phi, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); @@ -894,9 +864,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ // ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); // ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); // } -// ScaLBL_D3Q19_AAeven_GreyscaleColor(fq, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, -// tauA,tauB,tauA_eff,tauB_eff,rhoA,rhoB,Gsc,Fx,Fy,Fz,Porosity,Permeability,Velocity,Pressure_dvc); - ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Cq, Phi, Den, SolidForce, + ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Cq, Phi, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); @@ -1219,19 +1187,20 @@ void ScaLBL_GreyscaleColorModel::WriteDebug(){ // fwrite(PhaseField.data(),8,N,OUTFILE); // fclose(OUTFILE); // - ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); - FILE *AFILE; - sprintf(LocalRankFilename,"A.%05i.raw",rank); - AFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,AFILE); - fclose(AFILE); - ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); - FILE *BFILE; - sprintf(LocalRankFilename,"B.%05i.raw",rank); - BFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,BFILE); - fclose(BFILE); +// ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); +// FILE *AFILE; +// sprintf(LocalRankFilename,"A.%05i.raw",rank); +// AFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,AFILE); +// fclose(AFILE); +// +// ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); +// FILE *BFILE; +// sprintf(LocalRankFilename,"B.%05i.raw",rank); +// BFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,BFILE); +// fclose(BFILE); ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,PhaseField); FILE *PFILE; @@ -1261,6 +1230,14 @@ void ScaLBL_GreyscaleColorModel::WriteDebug(){ fwrite(PhaseField.data(),8,N,VELZ_FILE); fclose(VELZ_FILE); + + ScaLBL_Comm->RegularLayout(Map,Phi,PhaseField); + FILE *PhiFILE; + sprintf(LocalRankFilename,"Phase.%05i.raw",rank); + PhiFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,PhiFILE); + fclose(PhiFILE); + // ScaLBL_Comm->RegularLayout(Map,&Porosity[0],PhaseField); // FILE *POROS_FILE; // sprintf(LocalRankFilename,"Porosity.%05i.raw",rank); From 4a1059ca27d1849e25a5de6a55eb40a0f92d10ae Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Fri, 24 Apr 2020 16:53:47 -0400 Subject: [PATCH 18/75] fix miscellaneous bugs and clean up the code --- models/GreyscaleModel.cpp | 51 +++++++-------------------------------- models/GreyscaleModel.h | 1 - 2 files changed, 9 insertions(+), 43 deletions(-) diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index 11d92c80..09e52601 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -199,9 +199,9 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, double *Perm for (int idx=0; idxLastExterior(); idx++){ - int n = TmpMap[idx]; - if (n > Nx*Ny*Nz){ - printf("Bad value! idx=%i \n"); - TmpMap[idx] = Nx*Ny*Nz-1; - } - } - for (int idx=ScaLBL_Comm->FirstInterior(); idxLastInterior(); idx++){ - int n = TmpMap[idx]; - if (n > Nx*Ny*Nz){ - printf("Bad value! idx=%i \n"); - TmpMap[idx] = Nx*Ny*Nz-1; - } - } - ScaLBL_CopyToDevice(dvcMap, TmpMap, sizeof(int)*Np); - ScaLBL_DeviceBarrier(); - delete [] TmpMap; // copy the neighbor list ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); // initialize phi based on PhaseLabel (include solid component labels) double *Poros, *Perm; Poros = new double[Np]; - Perm = new double[Np]; + Perm = new double[Np]; AssignComponentLabels(Poros,Perm); ScaLBL_CopyToDevice(Porosity, Poros, Np*sizeof(double)); ScaLBL_CopyToDevice(Permeability, Perm, Np*sizeof(double)); + delete [] Poros; + delete [] Perm; } @@ -595,11 +567,6 @@ void ScaLBL_GreyscaleModel::Run(){ } } } - //MPI_Allreduce(&vax_loc,&vax,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - //MPI_Allreduce(&vay_loc,&vay,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - //MPI_Allreduce(&vaz_loc,&vaz,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - //MPI_Allreduce(&count_loc,&count,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - vax = Mask->Comm.sumReduce( vax_loc ); vay = Mask->Comm.sumReduce( vay_loc ); vaz = Mask->Comm.sumReduce( vaz_loc ); diff --git a/models/GreyscaleModel.h b/models/GreyscaleModel.h index a99925b1..3e883b16 100644 --- a/models/GreyscaleModel.h +++ b/models/GreyscaleModel.h @@ -62,7 +62,6 @@ public: signed char *id; int *NeighborList; - int *dvcMap; double *fq; double *Permeability;//grey voxel permeability double *Porosity; From 4c84ab8eb9ae86812b3da7d925fc9d6744d6a850 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sat, 25 Apr 2020 17:01:01 -0400 Subject: [PATCH 19/75] GPU ONLY; clean up the two-phase greyscale code; rename the old greyscaleColor to greyscaleFE --- common/ScaLBL.h | 28 +-- gpu/GreyscaleColor.cu | 114 ++++++------ models/GreyscaleColorModel.cpp | 235 ++++++++++++------------ models/GreyscaleColorModel.h | 8 +- tests/lbpm_greyscaleColor_simulator.cpp | 18 +- 5 files changed, 198 insertions(+), 205 deletions(-) diff --git a/common/ScaLBL.h b/common/ScaLBL.h index 849b8252..7ebeffa5 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -74,46 +74,46 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double *dis // GREYSCALE COLOR MODEL -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(double *dist, double *Aq, double *Bq, double *Den, +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFE(double *dist, double *Aq, double *Bq, double *Den, double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure); -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFE(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure); -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFEChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFEChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); -extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Den, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_GreyscaleFE_Init(double *Den, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np); +extern "C" void ScaLBL_D3Q19_GreyscaleFE_IMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np); -extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *NeighborList, double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleFEDensity(int *NeighborList, double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleFEDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(int *NeighborList, double *Cq, double *Phi, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleFEPhi(int *NeighborList, double *Cq, double *Phi, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(double *Cq, double *Phi, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleFEPhi(double *Cq, double *Phi, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q19_GreyscaleFE_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q19_GreyscaleFE_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q19_GreyscaleColor_Pressure(double *dist, double *Den, double *Porosity,double *Velocity, +extern "C" void ScaLBL_D3Q19_GreyscaleFE_Pressure(double *dist, double *Den, double *Porosity,double *Velocity, double *Pressure, double rhoA,double rhoB, int Np); -extern "C" void ScaLBL_D3Q19_GreyscaleColor_PressureTensor(int *neighborList, double *Phi,double *Pressure, double *PressTensor, double *PhiLap, +extern "C" void ScaLBL_D3Q19_GreyscaleFE_PressureTensor(int *neighborList, double *Phi,double *Pressure, double *PressTensor, double *PhiLap, double kappaA,double kappaB,double lambdaA,double lambdaB, int start, int finish, int Np); // MRT MODEL diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu index 4841e212..c6c35654 100644 --- a/gpu/GreyscaleColor.cu +++ b/gpu/GreyscaleColor.cu @@ -3,7 +3,7 @@ #define NBLOCKS 1024 #define NTHREADS 256 -__global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Pressure(double *dist, double *Den, double *Poros,double *Velocity, +__global__ void dvc_ScaLBL_D3Q19_GreyscaleFE_Pressure(double *dist, double *Den, double *Poros,double *Velocity, double *Pressure, double rhoA,double rhoB, int N){ int n; @@ -66,7 +66,7 @@ __global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Pressure(double *dist, double *D } -__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(double *dist, double *Aq, double *Bq, double *Den, +__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleFE(double *dist, double *Aq, double *Bq, double *Den, double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure){ @@ -675,7 +675,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(double *dist, double *Aq, } } -__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, +__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleFE(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure){ @@ -1329,7 +1329,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double } } -__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, +__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleFEChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ @@ -1969,7 +1969,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, dou } } -__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, +__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleFEChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ @@ -2561,7 +2561,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double } } -__global__ void dvc_ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np){ +__global__ void dvc_ScaLBL_D3Q19_GreyscaleFE_IMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np){ int n; int S = Np/NBLOCKS/NTHREADS + 1; double phi; @@ -2599,7 +2599,7 @@ __global__ void dvc_ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, d } } -__global__ void dvc_ScaLBL_D3Q7_GreyColorIMRT_Init(double *Phi, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, +__global__ void dvc_ScaLBL_D3Q7_GreyscaleFE_Init(double *Phi, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np){ int idx; //double nA,nB; @@ -2627,7 +2627,7 @@ __global__ void dvc_ScaLBL_D3Q7_GreyColorIMRT_Init(double *Phi, double *Cq, doub } } -__global__ void dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *neighborList, double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ +__global__ void dvc_ScaLBL_D3Q7_AAodd_GreyscaleFEDensity(int *neighborList, double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ int n,nread; double fq,nA,nB; @@ -2694,7 +2694,7 @@ __global__ void dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *neighborList, } } -__global__ void dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ +__global__ void dvc_ScaLBL_D3Q7_AAeven_GreyscaleFEDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ int n; double fq,nA,nB; @@ -2755,7 +2755,7 @@ __global__ void dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double } } -__global__ void dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(int *neighborList, double *Cq, double *Phi, int start, int finish, int Np){ +__global__ void dvc_ScaLBL_D3Q7_AAodd_GreyscaleFEPhi(int *neighborList, double *Cq, double *Phi, int start, int finish, int Np){ int n,nread; double fq,phi; @@ -2805,7 +2805,7 @@ __global__ void dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(int *neighborList, doub } } -__global__ void dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(double *Cq, double *Phi, int start, int finish, int Np){ +__global__ void dvc_ScaLBL_D3Q7_AAeven_GreyscaleFEPhi(double *Cq, double *Phi, int start, int finish, int Np){ int n; double fq,phi; @@ -2849,7 +2849,7 @@ __global__ void dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(double *Cq, double *Ph } } -__global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np){ +__global__ void dvc_ScaLBL_D3Q19_GreyscaleFE_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np){ int n,nn; // distributions @@ -2948,7 +2948,7 @@ __global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, doub } } -__global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np){ +__global__ void dvc_ScaLBL_D3Q19_GreyscaleFE_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np){ int n,nn; // distributions @@ -3042,9 +3042,9 @@ __global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, dou } } -__global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_PressureTensor(int *neighborList, double *Phi,double *Pressure, double *PressTensor, double *PhiLap, +__global__ void dvc_ScaLBL_D3Q19_GreyscaleFE_PressureTensor(int *neighborList, double *Phi,double *Pressure, double *PressTensor, double *PhiLap, double kappaA,double kappaB,double lambdaA,double lambdaB, int start, int finish, int Np){ - //**GreyscaleColor model related parameters: + //**GreyscaleFE model related parameters: //kappaA, kappaB: characterize interfacial tension //lambdaA, lambdaB: characterize bulk free energy //nA: concentration of liquid 1; @@ -3190,149 +3190,149 @@ __global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_PressureTensor(int *neighborLis } -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(double *dist, double *Aq, double *Bq, double *Den, +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFE(double *dist, double *Aq, double *Bq, double *Den, double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure){ - dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor<<>>(dist, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, start, finish, Np, + dvc_ScaLBL_D3Q19_AAeven_GreyscaleFE<<>>(dist, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, start, finish, Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, Gsc, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleColor: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleFE: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFE(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure){ - dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor<<>>(neighborList, dist, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, start, finish, Np, + dvc_ScaLBL_D3Q19_AAodd_GreyscaleFE<<>>(neighborList, dist, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, start, finish, Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, Gsc, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleColor: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleFE: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColorChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFEChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - dvc_ScaLBL_D3Q19_AAeven_GreyscaleColorChem<<>>(dist, Cq, Phi, SolidForce, start, finish, Np, + dvc_ScaLBL_D3Q19_AAeven_GreyscaleFEChem<<>>(dist, Cq, Phi, SolidForce, start, finish, Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleColorChem: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleFEChem: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColorChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFEChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, double Gx, double Gy, double Gz, double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - dvc_ScaLBL_D3Q19_AAodd_GreyscaleColorChem<<>>(neighborList, dist, Cq, Phi, SolidForce, start, finish, Np, + dvc_ScaLBL_D3Q19_AAodd_GreyscaleFEChem<<>>(neighborList, dist, Cq, Phi, SolidForce, start, finish, Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleColorChem: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleFEChem: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q7_GreyColorIMRT_Init(double *Phi, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_GreyColorIMRT_Init<<>>(Phi, Cq, PhiLap,gamma,kappaA,kappaB,lambdaA,lambdaB, start, finish, Np); +extern "C" void ScaLBL_D3Q7_GreyscaleFE_Init(double *Phi, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np){ + dvc_ScaLBL_D3Q7_GreyscaleFE_Init<<>>(Phi, Cq, PhiLap,gamma,kappaA,kappaB,lambdaA,lambdaB, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q7_GreyColorIMRT_Init: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q7_GreyscaleFE_Init: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q19_GreyColorIMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np){ - dvc_ScaLBL_D3Q19_GreyColorIMRT_Init<<>>(dist,Den,rhoA,rhoB,Np); +extern "C" void ScaLBL_D3Q19_GreyscaleFE_IMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np){ + dvc_ScaLBL_D3Q19_GreyscaleFE_IMRT_Init<<>>(dist,Den,rhoA,rhoB,Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyColorIMRT_Init: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q19_GreyscaleFE_IMRT_Init: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorDensity(int *NeighborList, double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ +extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleFEDensity(int *NeighborList, double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorDensity<<>>(NeighborList, Aq, Bq, Den, Phi, start, finish, Np); + dvc_ScaLBL_D3Q7_AAodd_GreyscaleFEDensity<<>>(NeighborList, Aq, Bq, Den, Phi, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q7_AAodd_GreyscaleColorDensity: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q7_AAodd_GreyscaleFEDensity: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ +extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleFEDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorDensity<<>>(Aq, Bq, Den, Phi, start, finish, Np); + dvc_ScaLBL_D3Q7_AAeven_GreyscaleFEDensity<<>>(Aq, Bq, Den, Phi, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q7_AAeven_GreyscaleColorDensity: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q7_AAeven_GreyscaleFEDensity: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(int *NeighborList, double *Cq, double *Phi, int start, int finish, int Np){ +extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleFEPhi(int *NeighborList, double *Cq, double *Phi, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_AAodd_GreyscaleColorPhi<<>>(NeighborList, Cq, Phi, start, finish, Np); + dvc_ScaLBL_D3Q7_AAodd_GreyscaleFEPhi<<>>(NeighborList, Cq, Phi, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q7_AAodd_GreyscaleColorPhi: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q7_AAodd_GreyscaleFEPhi: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(double *Cq, double *Phi, int start, int finish, int Np){ +extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleFEPhi(double *Cq, double *Phi, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_AAeven_GreyscaleColorPhi<<>>(Cq, Phi, start, finish, Np); + dvc_ScaLBL_D3Q7_AAeven_GreyscaleFEPhi<<>>(Cq, Phi, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q7_AAeven_GreyscaleColorPhi: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q7_AAeven_GreyscaleFEPhi: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q19_GreyscaleColor_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np){ +extern "C" void ScaLBL_D3Q19_GreyscaleFE_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np){ - dvc_ScaLBL_D3Q19_GreyscaleColor_Gradient<<>>(neighborList, Den, DenGrad, start, finish, Np); + dvc_ScaLBL_D3Q19_GreyscaleFE_Gradient<<>>(neighborList, Den, DenGrad, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyscaleColor_Gradient: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q19_GreyscaleFE_Gradient: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q19_GreyscaleColor_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np){ - dvc_ScaLBL_D3Q19_GreyscaleColor_Laplacian<<>>(neighborList, Den, DenLap, start, finish, Np); +extern "C" void ScaLBL_D3Q19_GreyscaleFE_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np){ + dvc_ScaLBL_D3Q19_GreyscaleFE_Laplacian<<>>(neighborList, Den, DenLap, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyscaleColor_Laplacian: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q19_GreyscaleFE_Laplacian: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q19_GreyscaleColor_Pressure(double *dist, double *Den, double *Porosity,double *Velocity, +extern "C" void ScaLBL_D3Q19_GreyscaleFE_Pressure(double *dist, double *Den, double *Porosity,double *Velocity, double *Pressure, double rhoA,double rhoB, int Np){ - dvc_ScaLBL_D3Q19_GreyscaleColor_Pressure<<>>(dist, Den, Porosity, Velocity, Pressure, rhoA, rhoB, Np); + dvc_ScaLBL_D3Q19_GreyscaleFE_Pressure<<>>(dist, Den, Porosity, Velocity, Pressure, rhoA, rhoB, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyscaleColor_Pressure: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q19_GreyscaleFE_Pressure: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q19_GreyscaleColor_PressureTensor(int *neighborList, double *Phi,double *Pressure, double *PressTensor, double *PhiLap, +extern "C" void ScaLBL_D3Q19_GreyscaleFE_PressureTensor(int *neighborList, double *Phi,double *Pressure, double *PressTensor, double *PhiLap, double kappaA,double kappaB,double lambdaA,double lambdaB, int start, int finish, int Np){ - dvc_ScaLBL_D3Q19_GreyscaleColor_PressureTensor<<>>(neighborList,Phi,Pressure,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,start,finish,Np); + dvc_ScaLBL_D3Q19_GreyscaleFE_PressureTensor<<>>(neighborList,Phi,Pressure,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,start,finish,Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyscaleColor_PressureTensor: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q19_GreyscaleFE_PressureTensor: %s \n",cudaGetErrorString(err)); } } diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 1827b961..0cce81ec 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -13,7 +13,7 @@ void DeleteArray( const TYPE *p ) delete [] p; } -ScaLBL_GreyscaleColorModel::ScaLBL_GreyscaleColorModel(int RANK, int NP, MPI_Comm COMM): +ScaLBL_GreyscaleFEModel::ScaLBL_GreyscaleFEModel(int RANK, int NP, MPI_Comm COMM): rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0), rhoA(0),rhoB(0),gamma(0),kappaA(0),kappaB(0),lambdaA(0),lambdaB(0), Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),GreyPorosity(0), @@ -23,15 +23,15 @@ Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0), SignDist.fill(0); } -ScaLBL_GreyscaleColorModel::~ScaLBL_GreyscaleColorModel(){ +ScaLBL_GreyscaleFEModel::~ScaLBL_GreyscaleFEModel(){ } -void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ +void ScaLBL_GreyscaleFEModel::ReadParams(string filename){ // read the input database db = std::make_shared( filename ); domain_db = db->getDatabase( "Domain" ); - greyscaleColor_db = db->getDatabase( "GreyscaleColor" ); + greyscaleFE_db = db->getDatabase( "GreyscaleFE" ); analysis_db = db->getDatabase( "Analysis" ); vis_db = db->getDatabase( "Visualization" ); @@ -57,62 +57,62 @@ void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ lambdaB = 1.0e-3; // ---------------------- Greyscale Model parameters -----------------------// - if (greyscaleColor_db->keyExists( "timestepMax" )){ - timestepMax = greyscaleColor_db->getScalar( "timestepMax" ); + if (greyscaleFE_db->keyExists( "timestepMax" )){ + timestepMax = greyscaleFE_db->getScalar( "timestepMax" ); } - if (greyscaleColor_db->keyExists( "tauA" )){ - tauA = greyscaleColor_db->getScalar( "tauA" ); + if (greyscaleFE_db->keyExists( "tauA" )){ + tauA = greyscaleFE_db->getScalar( "tauA" ); } - if (greyscaleColor_db->keyExists( "tauB" )){ - tauB = greyscaleColor_db->getScalar( "tauB" ); + if (greyscaleFE_db->keyExists( "tauB" )){ + tauB = greyscaleFE_db->getScalar( "tauB" ); } - tauA_eff = greyscaleColor_db->getWithDefault( "tauA_eff", tauA); - tauB_eff = greyscaleColor_db->getWithDefault( "tauB_eff", tauB); - if (greyscaleColor_db->keyExists( "rhoA" )){ - rhoA = greyscaleColor_db->getScalar( "rhoA" ); + tauA_eff = greyscaleFE_db->getWithDefault( "tauA_eff", tauA); + tauB_eff = greyscaleFE_db->getWithDefault( "tauB_eff", tauB); + if (greyscaleFE_db->keyExists( "rhoA" )){ + rhoA = greyscaleFE_db->getScalar( "rhoA" ); } - if (greyscaleColor_db->keyExists( "rhoB" )){ - rhoB = greyscaleColor_db->getScalar( "rhoB" ); + if (greyscaleFE_db->keyExists( "rhoB" )){ + rhoB = greyscaleFE_db->getScalar( "rhoB" ); } - if (greyscaleColor_db->keyExists( "gamma" )){ - gamma = greyscaleColor_db->getScalar( "gamma" ); + if (greyscaleFE_db->keyExists( "gamma" )){ + gamma = greyscaleFE_db->getScalar( "gamma" ); } - if (greyscaleColor_db->keyExists( "kappaA" )){ - kappaA = greyscaleColor_db->getScalar( "kappaA" ); + if (greyscaleFE_db->keyExists( "kappaA" )){ + kappaA = greyscaleFE_db->getScalar( "kappaA" ); } - if (greyscaleColor_db->keyExists( "kappaB" )){ - kappaB = greyscaleColor_db->getScalar( "kappaB" ); + if (greyscaleFE_db->keyExists( "kappaB" )){ + kappaB = greyscaleFE_db->getScalar( "kappaB" ); } - if (greyscaleColor_db->keyExists( "lambdaA" )){ - lambdaA = greyscaleColor_db->getScalar( "lambdaA" ); + if (greyscaleFE_db->keyExists( "lambdaA" )){ + lambdaA = greyscaleFE_db->getScalar( "lambdaA" ); } - if (greyscaleColor_db->keyExists( "lambdaB" )){ - lambdaB = greyscaleColor_db->getScalar( "lambdaB" ); + if (greyscaleFE_db->keyExists( "lambdaB" )){ + lambdaB = greyscaleFE_db->getScalar( "lambdaB" ); } - if (greyscaleColor_db->keyExists( "dp" )){ - dp = greyscaleColor_db->getScalar( "dp" ); + if (greyscaleFE_db->keyExists( "dp" )){ + dp = greyscaleFE_db->getScalar( "dp" ); } - if (greyscaleColor_db->keyExists( "F" )){ - Fx = greyscaleColor_db->getVector( "F" )[0]; - Fy = greyscaleColor_db->getVector( "F" )[1]; - Fz = greyscaleColor_db->getVector( "F" )[2]; + if (greyscaleFE_db->keyExists( "F" )){ + Fx = greyscaleFE_db->getVector( "F" )[0]; + Fy = greyscaleFE_db->getVector( "F" )[1]; + Fz = greyscaleFE_db->getVector( "F" )[2]; } - if (greyscaleColor_db->keyExists( "Restart" )){ - Restart = greyscaleColor_db->getScalar( "Restart" ); + if (greyscaleFE_db->keyExists( "Restart" )){ + Restart = greyscaleFE_db->getScalar( "Restart" ); } - if (greyscaleColor_db->keyExists( "din" )){ - din = greyscaleColor_db->getScalar( "din" ); + if (greyscaleFE_db->keyExists( "din" )){ + din = greyscaleFE_db->getScalar( "din" ); } - if (greyscaleColor_db->keyExists( "dout" )){ - dout = greyscaleColor_db->getScalar( "dout" ); + if (greyscaleFE_db->keyExists( "dout" )){ + dout = greyscaleFE_db->getScalar( "dout" ); } - if (greyscaleColor_db->keyExists( "flux" )){ - flux = greyscaleColor_db->getScalar( "flux" ); + if (greyscaleFE_db->keyExists( "flux" )){ + flux = greyscaleFE_db->getScalar( "flux" ); } - if (greyscaleColor_db->keyExists( "tolerance" )){ - tolerance = greyscaleColor_db->getScalar( "tolerance" ); + if (greyscaleFE_db->keyExists( "tolerance" )){ + tolerance = greyscaleFE_db->getScalar( "tolerance" ); } - //auto collision = greyscaleColor_db->getWithDefault( "collision", "IMRT" ); + //auto collision = greyscaleFE_db->getWithDefault( "collision", "IMRT" ); //if (collision == "BGK"){ // CollisionType=2; //} @@ -126,7 +126,7 @@ void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ // ------------------------------------------------------------------------// } -void ScaLBL_GreyscaleColorModel::SetDomain(){ +void ScaLBL_GreyscaleFEModel::SetDomain(){ Dm = std::shared_ptr(new Domain(domain_db,comm)); // full domain for analysis Mask = std::shared_ptr(new Domain(domain_db,comm)); // mask domain removes immobile phases // domain parameters @@ -157,7 +157,7 @@ void ScaLBL_GreyscaleColorModel::SetDomain(){ nprocz = Dm->nprocz(); } -void ScaLBL_GreyscaleColorModel::ReadInput(){ +void ScaLBL_GreyscaleFEModel::ReadInput(){ sprintf(LocalRankString,"%05d",rank); sprintf(LocalRankFilename,"%s%s","ID.",LocalRankString); @@ -206,7 +206,7 @@ void ScaLBL_GreyscaleColorModel::ReadInput(){ if (rank == 0) cout << "Domain set." << endl; } -void ScaLBL_GreyscaleColorModel::AssignSolidForce(double *SolidPotential, double *SolidForce){ +void ScaLBL_GreyscaleFEModel::AssignSolidForce(double *SolidPotential, double *SolidForce){ double *Dst; Dst = new double [3*3*3]; @@ -303,7 +303,7 @@ void ScaLBL_GreyscaleColorModel::AssignSolidForce(double *SolidPotential, double } -void ScaLBL_GreyscaleColorModel::AssignComponentLabels(double *Porosity, double *Permeability, double *SolidPotential) +void ScaLBL_GreyscaleFEModel::AssignComponentLabels(double *Porosity, double *Permeability, double *SolidPotential) { size_t NLABELS=0; signed char VALUE=0; @@ -311,10 +311,10 @@ void ScaLBL_GreyscaleColorModel::AssignComponentLabels(double *Porosity, double double PERMEABILITY=0.f; double AFFINITY=0.f; - auto LabelList = greyscaleColor_db->getVector( "ComponentLabels" ); - auto AffinityList = greyscaleColor_db->getVector( "ComponentAffinity" ); - auto PorosityList = greyscaleColor_db->getVector( "PorosityList" ); - auto PermeabilityList = greyscaleColor_db->getVector( "PermeabilityList" ); + auto LabelList = greyscaleFE_db->getVector( "ComponentLabels" ); + auto AffinityList = greyscaleFE_db->getVector( "ComponentAffinity" ); + auto PorosityList = greyscaleFE_db->getVector( "PorosityList" ); + auto PermeabilityList = greyscaleFE_db->getVector( "PermeabilityList" ); //1. Requirement for "ComponentLabels": // *labels can be a nagative integer, 0, 1, 2, or a positive integer >= 3 @@ -452,7 +452,7 @@ void ScaLBL_GreyscaleColorModel::AssignComponentLabels(double *Porosity, double } } -void ScaLBL_GreyscaleColorModel::Density_and_Phase_Init(){ +void ScaLBL_GreyscaleFEModel::Density_and_Phase_Init(){ size_t NLABELS=0; signed char VALUE=0; @@ -460,13 +460,13 @@ void ScaLBL_GreyscaleColorModel::Density_and_Phase_Init(){ vector LabelList{1,2}; vector SwList{0.0,1.0}; - if (greyscaleColor_db->keyExists( "GreyNodeLabels" )){ + if (greyscaleFE_db->keyExists( "GreyNodeLabels" )){ LabelList.clear(); - LabelList = greyscaleColor_db->getVector( "GreyNodeLabels" ); + LabelList = greyscaleFE_db->getVector( "GreyNodeLabels" ); } - if (greyscaleColor_db->keyExists( "GreyNodeSw" )){ + if (greyscaleFE_db->keyExists( "GreyNodeSw" )){ SwList.clear(); - SwList = greyscaleColor_db->getVector( "GreyNodeSw" ); + SwList = greyscaleFE_db->getVector( "GreyNodeSw" ); } NLABELS=LabelList.size(); @@ -525,7 +525,7 @@ void ScaLBL_GreyscaleColorModel::Density_and_Phase_Init(){ delete [] Phi_temp; } -void ScaLBL_GreyscaleColorModel::Create(){ +void ScaLBL_GreyscaleFEModel::Create(){ /* * This function creates the variables needed to run a LBM */ @@ -608,7 +608,7 @@ void ScaLBL_GreyscaleColorModel::Create(){ } -void ScaLBL_GreyscaleColorModel::Initialize(){ +void ScaLBL_GreyscaleFEModel::Initialize(){ if (Restart == true){ //TODO: Restart funtion is currently not working; need updates if (rank==0){ @@ -631,12 +631,7 @@ void ScaLBL_GreyscaleColorModel::Initialize(){ ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - //ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, 0, ScaLBL_Comm->LastExterior(), Np); - //ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + //TODO need proper initialization ! //TODO need to initialize velocity field ! //this is required for calculating the pressure_dvc @@ -645,12 +640,10 @@ void ScaLBL_GreyscaleColorModel::Initialize(){ else{ if (rank==0) printf ("Initializing density field \n"); Density_and_Phase_Init();//initialize density field - //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - //ScaLBL_D3Q7_GreyColorIMRT_Init(Den, Aq, Bq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_D3Q19_GreyscaleColor_Laplacian(NeighborList, Phi, PhiLap, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_D3Q7_GreyColorIMRT_Init(Phi, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - ScaLBL_D3Q7_GreyColorIMRT_Init(Phi, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Laplacian(NeighborList, Phi, PhiLap, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Laplacian(NeighborList, Phi, PhiLap, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_GreyscaleFE_Init(Phi, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components + ScaLBL_D3Q7_GreyscaleFE_Init(Phi, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); if (rank==0) printf ("Initializing distributions \n"); //ScaLBL_D3Q19_GreyColorIMRT_Init(fq, Den, rhoA, rhoB, Np); @@ -667,7 +660,7 @@ void ScaLBL_GreyscaleColorModel::Initialize(){ } } -void ScaLBL_GreyscaleColorModel::Run(){ +void ScaLBL_GreyscaleFEModel::Run(){ int nprocs=nprocx*nprocy*nprocz; const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); @@ -683,8 +676,8 @@ void ScaLBL_GreyscaleColorModel::Run(){ if (analysis_db->keyExists( "restart_interval" )){ restart_interval = analysis_db->getScalar( "restart_interval" ); } - if (greyscaleColor_db->keyExists( "timestep" )){ - timestep = greyscaleColor_db->getScalar( "timestep" ); + if (greyscaleFE_db->keyExists( "timestep" )){ + timestep = greyscaleFE_db->getScalar( "timestep" ); } if (rank==0){ @@ -714,64 +707,64 @@ void ScaLBL_GreyscaleColorModel::Run(){ // Compute the density field // Read for Aq, Bq happens in this routine (requires communication) ScaLBL_Comm->SendD3Q7AA(Cq); //READ FROM NORMAL - ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(NeighborList, Cq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_AAodd_GreyscaleFEPhi(NeighborList, Cq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->RecvD3Q7AA(Cq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); - ScaLBL_D3Q7_AAodd_GreyscaleColorPhi(NeighborList, Cq, Phi, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q7_AAodd_GreyscaleFEPhi(NeighborList, Cq, Phi, 0, ScaLBL_Comm->LastExterior(), Np); // Update local pressure - //ScaLBL_D3Q19_GreyscaleColor_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); + //ScaLBL_D3Q19_GreyscaleFE_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); ScaLBL_D3Q19_Pressure(fq, Pressure_dvc, Np); // Compute pressure gradient - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, Pressure_dvc, PressureGrad, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(Pressure_dvc); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, Pressure_dvc, PressureGrad, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(Pressure_dvc,PressureGrad); ScaLBL_DeviceBarrier(); // Compute Pressure Tensor //NOTE send and recv halo causes problems - it errorneously changes Phi //ScaLBL_Comm->SendHalo(Phi); - ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(),Np); + ScaLBL_D3Q19_GreyscaleFE_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(),Np); //ScaLBL_Comm->RecvHalo(Phi); //ScaLBL_DeviceBarrier(); - ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,0,ScaLBL_Comm->LastExterior(),Np); + ScaLBL_D3Q19_GreyscaleFE_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,0,ScaLBL_Comm->LastExterior(),Np); /* Compute gradient of the pressure tensor */ // call the recv Grad function once per tensor element // 1st tensor element - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(&PressTensor[0*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[0*Np],&PressTensorGrad[0*Np]); // 2nd tensor element - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(&PressTensor[1*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[1*Np],&PressTensorGrad[3*Np]); // 3rd tensor element - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(&PressTensor[2*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[2*Np],&PressTensorGrad[6*Np]); // 4th tensor element - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(&PressTensor[3*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[3*Np],&PressTensorGrad[9*Np]); // 5th tensor element - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(&PressTensor[4*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[4*Np],&PressTensorGrad[12*Np]); // 6th tensor element - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(&PressTensor[5*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[5*Np],&PressTensorGrad[15*Np]); ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL - ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Cq, Phi, SolidForce, + ScaLBL_D3Q19_AAodd_GreyscaleFEChem(NeighborList, fq, Cq, Phi, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); @@ -783,7 +776,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ // ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); // ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); // } - ScaLBL_D3Q19_AAodd_GreyscaleColorChem(NeighborList, fq, Cq, Phi, SolidForce, + ScaLBL_D3Q19_AAodd_GreyscaleFEChem(NeighborList, fq, Cq, Phi, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); @@ -796,63 +789,63 @@ void ScaLBL_GreyscaleColorModel::Run(){ // Compute the density field // Read for Aq, Bq happens in this routine (requires communication) ScaLBL_Comm->SendD3Q7AA(Cq); //READ FROM NORMAL - ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(Cq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q7_AAeven_GreyscaleFEPhi(Cq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->RecvD3Q7AA(Cq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); - ScaLBL_D3Q7_AAeven_GreyscaleColorPhi(Cq, Phi, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q7_AAeven_GreyscaleFEPhi(Cq, Phi, 0, ScaLBL_Comm->LastExterior(), Np); // Update local pressure - //ScaLBL_D3Q19_GreyscaleColor_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); + //ScaLBL_D3Q19_GreyscaleFE_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); ScaLBL_D3Q19_Pressure(fq, Pressure_dvc, Np); // Compute pressure gradient - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, Pressure_dvc, PressureGrad, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(Pressure_dvc); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, Pressure_dvc, PressureGrad, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, Pressure_dvc, PressureGrad, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(Pressure_dvc,PressureGrad); ScaLBL_DeviceBarrier(); // Compute Pressure Tensor //ScaLBL_Comm->SendHalo(Phi); //NOTE send and recv halo causes problems - it errorneously changes Phi - ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(),Np); + ScaLBL_D3Q19_GreyscaleFE_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(),Np); //ScaLBL_Comm->RecvHalo(Phi); //ScaLBL_DeviceBarrier(); - ScaLBL_D3Q19_GreyscaleColor_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,0,ScaLBL_Comm->LastExterior(),Np); + ScaLBL_D3Q19_GreyscaleFE_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,0,ScaLBL_Comm->LastExterior(),Np); /* Compute gradient of the pressure tensor */ // call the recv Grad function once per tensor element // 1st tensor element - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(&PressTensor[0*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[0*Np],&PressTensorGrad[0*Np]); // 2nd tensor element - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(&PressTensor[1*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[1*Np],&PressTensorGrad[3*Np]); // 3rd tensor element - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(&PressTensor[2*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[2*Np],&PressTensorGrad[6*Np]); // 4th tensor element - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(&PressTensor[3*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[3*Np],&PressTensorGrad[9*Np]); // 5th tensor element - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(&PressTensor[4*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[4*Np],&PressTensorGrad[12*Np]); // 6th tensor element - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->SendHalo(&PressTensor[5*Np]); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&PressTensor[5*Np],&PressTensorGrad[15*Np]); ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL - ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Cq, Phi, SolidForce, + ScaLBL_D3Q19_AAeven_GreyscaleFEChem(fq, Cq, Phi, SolidForce, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); @@ -864,7 +857,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ // ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); // ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); // } - ScaLBL_D3Q19_AAeven_GreyscaleColorChem(fq, Cq, Phi, SolidForce, + ScaLBL_D3Q19_AAeven_GreyscaleFEChem(fq, Cq, Phi, SolidForce, 0, ScaLBL_Comm->LastExterior(), Np, tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); @@ -1012,9 +1005,9 @@ void ScaLBL_GreyscaleColorModel::Run(){ if (timestep%restart_interval==0){ //Use rank=0 write out Restart.db if (rank==0) { - greyscaleColor_db->putScalar("timestep",timestep); - greyscaleColor_db->putScalar( "Restart", true ); - current_db->putDatabase("GreyscaleColor", greyscaleColor_db); + greyscaleFE_db->putScalar("timestep",timestep); + greyscaleFE_db->putScalar( "Restart", true ); + current_db->putDatabase("GreyscaleFE", greyscaleFE_db); std::ofstream OutStream("Restart.db"); current_db->print(OutStream, ""); OutStream.close(); @@ -1038,7 +1031,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ } PROFILE_STOP("Loop"); - PROFILE_SAVE("lbpm_greyscaleColor_simulator",1); + PROFILE_SAVE("lbpm_greyscaleFE_simulator",1); //************************************************************************ ScaLBL_DeviceBarrier(); MPI_Barrier(comm); @@ -1059,7 +1052,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ // ************************************************************************ } -void ScaLBL_GreyscaleColorModel::VelocityField(){ +void ScaLBL_GreyscaleFEModel::VelocityField(){ /* Minkowski Morphology(Mask); int SIZE=Np*sizeof(double); @@ -1175,7 +1168,7 @@ void ScaLBL_GreyscaleColorModel::VelocityField(){ } -void ScaLBL_GreyscaleColorModel::WriteDebug(){ +void ScaLBL_GreyscaleFEModel::WriteDebug(){ // Copy back final phase indicator field and convert to regular layout DoubleArray PhaseField(Nx,Ny,Nz); diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h index 8b0cd85e..f98d1b9b 100644 --- a/models/GreyscaleColorModel.h +++ b/models/GreyscaleColorModel.h @@ -16,10 +16,10 @@ Implementation of multicomponent greyscale lattice boltzmann model #include "ProfilerApp.h" #include "threadpool/thread_pool.h" -class ScaLBL_GreyscaleColorModel{ +class ScaLBL_GreyscaleFEModel{ public: - ScaLBL_GreyscaleColorModel(int RANK, int NP, MPI_Comm COMM); - ~ScaLBL_GreyscaleColorModel(); + ScaLBL_GreyscaleFEModel(int RANK, int NP, MPI_Comm COMM); + ~ScaLBL_GreyscaleFEModel(); // functions in they should be run void ReadParams(string filename); @@ -59,7 +59,7 @@ public: // input database std::shared_ptr db; std::shared_ptr domain_db; - std::shared_ptr greyscaleColor_db; + std::shared_ptr greyscaleFE_db; std::shared_ptr analysis_db; std::shared_ptr vis_db; diff --git a/tests/lbpm_greyscaleColor_simulator.cpp b/tests/lbpm_greyscaleColor_simulator.cpp index b836e03c..41c08774 100644 --- a/tests/lbpm_greyscaleColor_simulator.cpp +++ b/tests/lbpm_greyscaleColor_simulator.cpp @@ -41,16 +41,16 @@ int main(int argc, char **argv) ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - ScaLBL_GreyscaleColorModel GreyscaleColor(rank,nprocs,comm); + ScaLBL_GreyscaleFEModel GreyscaleFE(rank,nprocs,comm); auto filename = argv[1]; - GreyscaleColor.ReadParams(filename); - GreyscaleColor.SetDomain(); // this reads in the domain - GreyscaleColor.ReadInput(); - GreyscaleColor.Create(); // creating the model will create data structure to match the pore structure and allocate variables - GreyscaleColor.Initialize(); // initializing the model will set initial conditions for variables - GreyscaleColor.Run(); - //GreyscaleColor.VelocityField(); - GreyscaleColor.WriteDebug(); + GreyscaleFE.ReadParams(filename); + GreyscaleFE.SetDomain(); // this reads in the domain + GreyscaleFE.ReadInput(); + GreyscaleFE.Create(); // creating the model will create data structure to match the pore structure and allocate variables + GreyscaleFE.Initialize(); // initializing the model will set initial conditions for variables + GreyscaleFE.Run(); + //GreyscaleFE.VelocityField(); + GreyscaleFE.WriteDebug(); } // **************************************************** MPI_Barrier(comm); From d5ccfb628d9ed9f3d5f9c7999a905130cbd3df9c Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sat, 25 Apr 2020 17:01:59 -0400 Subject: [PATCH 20/75] rename the two-phase FE-based greyscale model --- models/{GreyscaleColorModel.cpp => GreyscaleFEModel.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename models/{GreyscaleColorModel.cpp => GreyscaleFEModel.cpp} (100%) diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleFEModel.cpp similarity index 100% rename from models/GreyscaleColorModel.cpp rename to models/GreyscaleFEModel.cpp From 0d3436047a9bb750b4138e178d71a37a650fb1e8 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sat, 25 Apr 2020 17:02:43 -0400 Subject: [PATCH 21/75] rename the two-phase FE-based greyscale mode; step 2 --- models/{GreyscaleColorModel.h => GreyscaleFEModel.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename models/{GreyscaleColorModel.h => GreyscaleFEModel.h} (100%) diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleFEModel.h similarity index 100% rename from models/GreyscaleColorModel.h rename to models/GreyscaleFEModel.h From 86c3217a0fddf24e1a536e91260e64a53d887003 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sat, 25 Apr 2020 17:03:17 -0400 Subject: [PATCH 22/75] rename the two-phase FE-based greyscale model; step 3 --- ...reyscaleColor_simulator.cpp => lbpm_greyscaleFE_simulator.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{lbpm_greyscaleColor_simulator.cpp => lbpm_greyscaleFE_simulator.cpp} (100%) diff --git a/tests/lbpm_greyscaleColor_simulator.cpp b/tests/lbpm_greyscaleFE_simulator.cpp similarity index 100% rename from tests/lbpm_greyscaleColor_simulator.cpp rename to tests/lbpm_greyscaleFE_simulator.cpp From 5a8f4f60fcfb101919923b378b0254e9bda36aed Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sat, 25 Apr 2020 17:12:43 -0400 Subject: [PATCH 23/75] GPU only;complete renaming everything about the old greyscaleColor model to greyscaleFE --- models/GreyscaleFEModel.cpp | 2 +- models/GreyscaleFEModel.h | 2 +- tests/CMakeLists.txt | 2 +- tests/lbpm_greyscaleFE_simulator.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/models/GreyscaleFEModel.cpp b/models/GreyscaleFEModel.cpp index 0cce81ec..97ed0f98 100644 --- a/models/GreyscaleFEModel.cpp +++ b/models/GreyscaleFEModel.cpp @@ -1,7 +1,7 @@ /* Greyscale lattice boltzmann model */ -#include "models/GreyscaleColorModel.h" +#include "models/GreyscaleFEModel.h" #include "analysis/distance.h" #include "analysis/morphology.h" #include diff --git a/models/GreyscaleFEModel.h b/models/GreyscaleFEModel.h index f98d1b9b..34a6f999 100644 --- a/models/GreyscaleFEModel.h +++ b/models/GreyscaleFEModel.h @@ -1,5 +1,5 @@ /* -Implementation of multicomponent greyscale lattice boltzmann model +Implementation of multicomponent greyscale free-energy based lattice boltzmann model */ #include #include diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 56eda802..ca88274a 100755 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -4,7 +4,7 @@ ADD_LBPM_EXECUTABLE( lbpm_color_simulator ) ADD_LBPM_EXECUTABLE( lbpm_permeability_simulator ) ADD_LBPM_EXECUTABLE( lbpm_greyscale_simulator ) -ADD_LBPM_EXECUTABLE( lbpm_greyscaleColor_simulator ) +ADD_LBPM_EXECUTABLE( lbpm_greyscaleFE_simulator ) #ADD_LBPM_EXECUTABLE( lbpm_BGK_simulator ) #ADD_LBPM_EXECUTABLE( lbpm_color_macro_simulator ) ADD_LBPM_EXECUTABLE( lbpm_dfh_simulator ) diff --git a/tests/lbpm_greyscaleFE_simulator.cpp b/tests/lbpm_greyscaleFE_simulator.cpp index 41c08774..22157bee 100644 --- a/tests/lbpm_greyscaleFE_simulator.cpp +++ b/tests/lbpm_greyscaleFE_simulator.cpp @@ -9,7 +9,7 @@ #include "common/ScaLBL.h" #include "common/Communication.h" #include "common/MPI.h" -#include "models/GreyscaleColorModel.h" +#include "models/GreyscaleFEModel.h" //#define WRITE_SURFACES using namespace std; From 6a37aa9e590b5bf8d5c02bd7f1628fdcc88087af Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Mon, 27 Apr 2020 11:03:40 -0400 Subject: [PATCH 24/75] rename greyscale FE model GPU code --- gpu/{GreyscaleColor.cu => GreyscaleFE.cu} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename gpu/{GreyscaleColor.cu => GreyscaleFE.cu} (100%) diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleFE.cu similarity index 100% rename from gpu/GreyscaleColor.cu rename to gpu/GreyscaleFE.cu From 85158fab52a01336dda2c961823de78031eb2c6d Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Mon, 27 Apr 2020 11:12:12 -0400 Subject: [PATCH 25/75] Initialize greyscale SC model --- gpu/GreyscaleSC.cu | 1671 +++++++++++++++++++++++++++++++++++ models/GreyscaleSCModel.cpp | 864 ++++++++++++++++++ models/GreyscaleSCModel.h | 91 ++ 3 files changed, 2626 insertions(+) create mode 100644 gpu/GreyscaleSC.cu create mode 100644 models/GreyscaleSCModel.cpp create mode 100644 models/GreyscaleSCModel.h diff --git a/gpu/GreyscaleSC.cu b/gpu/GreyscaleSC.cu new file mode 100644 index 00000000..a3fba989 --- /dev/null +++ b/gpu/GreyscaleSC.cu @@ -0,0 +1,1671 @@ +#include + +#define NBLOCKS 1024 +#define NTHREADS 256 + +__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity, double *Pressure){ + int n; + // conserved momemnts + double rho,vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure; + //double uu; + // non-conserved moments + double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; + double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s 10Np => odd part of dist) + f1 = dist[nr1]; // reading the f1 data into register fq + + nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + f2 = dist[nr2]; // reading the f2 data into register fq + + // q=3 + nr3 = neighborList[n+2*Np]; // neighbor 4 + f3 = dist[nr3]; + + // q = 4 + nr4 = neighborList[n+3*Np]; // neighbor 3 + f4 = dist[nr4]; + + // q=5 + nr5 = neighborList[n+4*Np]; + f5 = dist[nr5]; + + // q = 6 + nr6 = neighborList[n+5*Np]; + f6 = dist[nr6]; + + // q=7 + nr7 = neighborList[n+6*Np]; + f7 = dist[nr7]; + + // q = 8 + nr8 = neighborList[n+7*Np]; + f8 = dist[nr8]; + + // q=9 + nr9 = neighborList[n+8*Np]; + f9 = dist[nr9]; + + // q = 10 + nr10 = neighborList[n+9*Np]; + f10 = dist[nr10]; + + // q=11 + nr11 = neighborList[n+10*Np]; + f11 = dist[nr11]; + + // q=12 + nr12 = neighborList[n+11*Np]; + f12 = dist[nr12]; + + // q=13 + nr13 = neighborList[n+12*Np]; + f13 = dist[nr13]; + + // q=14 + nr14 = neighborList[n+13*Np]; + f14 = dist[nr14]; + + // q=15 + nr15 = neighborList[n+14*Np]; + f15 = dist[nr15]; + + // q=16 + nr16 = neighborList[n+15*Np]; + f16 = dist[nr16]; + + // q=17 + //fq = dist[18*Np+n]; + nr17 = neighborList[n+16*Np]; + f17 = dist[nr17]; + + // q=18 + nr18 = neighborList[n+17*Np]; + f18 = dist[nr18]; + + porosity = Poros[n]; + perm = Perm[n]; + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + rho = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; + pressure = rho/porosity/3.0; + vx = (f1-f2+f7-f8+f9-f10+f11-f12+f13-f14)/rho+0.5*porosity*Gx; + vy = (f3-f4+f7-f8-f9+f10+f15-f16+f17-f18)/rho+0.5*porosity*Gy; + vz = (f5-f6+f11-f12-f13+f14+f15-f16-f17+f18)/rho+0.5*porosity*Gz; + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the body force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = -porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx; + Fy = -porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy; + Fz = -porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz; + if (porosity==1.0){ + Fx=Gx; + Fy=Gy; + Fz=Gz; + } + + //------------------------ BGK collison where body force has higher-order terms ----------------------------------------------------------// +// // q=0 +// dist[n] = f0*(1.0-rlx) + rlx*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// + 0.3333333333333333*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); +// +// // q = 1 +// dist[nr2] = f1*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); +// +// // q=2 +// dist[nr1] = f2*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(-3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); +// +// // q = 3 +// dist[nr4] = f3*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); +// +// // q = 4 +// dist[nr3] = f4*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); +// +// // q = 5 +// dist[nr6] = f5*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(3. + (6.*uz)/porosity)); +// +// // q = 6 +// dist[nr5] = f6*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) +// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(-3. + (6.*uz)/porosity)); +// +// // q = 7 +// dist[nr8] = f7*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) + +// Fz*(0. - (3.*uz)/porosity)); +// +// // q = 8 +// dist[nr7] = f8*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + Fy*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) + +// Fz*(0. - (3.*uz)/porosity)); +// +// // q = 9 +// dist[nr10] = f9*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + Fy*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) + +// Fz*(0. - (3.*uz)/porosity)); +// +// // q = 10 +// dist[nr9] = f10*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) + +// Fz*(0. - (3.*uz)/porosity)); +// +// // q = 11 +// dist[nr12] = f11*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) + +// Fz*(3. - (3.*uz)/porosity + (9.*(ux + uz))/porosity)); +// +// // q = 12 +// dist[nr11] = f12*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) + +// Fz*(-3. - (9.*(-ux - uz))/porosity - (3.*uz)/porosity)); +// +// // q = 13 +// dist[nr14] = f13*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) + +// Fz*(-3. - (9.*(ux - uz))/porosity - (3.*uz)/porosity)); +// +// // q= 14 +// dist[nr13] = f14*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) + +// Fz*(3. - (3.*uz)/porosity + (9.*(-ux + uz))/porosity)); +// +// // q = 15 +// dist[nr16] = f15*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) + +// Fz*(3. - (3.*uz)/porosity + (9.*(uy + uz))/porosity)); +// +// // q = 16 +// dist[nr15] = f16*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) + +// Fz*(-3. - (9.*(-uy - uz))/porosity - (3.*uz)/porosity)); +// +// // q = 17 +// dist[nr18] = f17*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) + +// Fz*(-3. - (9.*(uy - uz))/porosity - (3.*uz)/porosity)); +// +// // q = 18 +// dist[nr17] = f18*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) +// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) + +// Fz*(3. - (3.*uz)/porosity + (9.*(-uy + uz))/porosity)); + //----------------------------------------------------------------------------------------------------------------------------------------// + + + //------------------------ BGK collison where body force has NO higher-order terms ----------------------------------------------------------// + // q=0 + dist[n] = f0*(1.0-rlx) + rlx*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity); + + // q = 1 + dist[nr2] = f1*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(3.)); + + // q=2 + dist[nr1] = f2*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(-3.)); + + // q = 3 + dist[nr4] = f3*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fy*(3.)); + + // q = 4 + dist[nr3] = f4*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fy*(-3.)); + + // q = 5 + dist[nr6] = f5*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fz*(3.)); + + // q = 6 + dist[nr5] = f6*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) + +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fz*(-3.)); + + // q = 7 + dist[nr8] = f7*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fy*(3.)); + + // q = 8 + dist[nr7] = f8*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fy*(-3.)); + + // q = 9 + dist[nr10] = f9*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fy*(-3.)); + + // q = 10 + dist[nr9] = f10*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fy*(3.)); + + // q = 11 + dist[nr12] = f11*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fz*(3.)); + + // q = 12 + dist[nr11] = f12*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fz*(-3.)); + + // q = 13 + dist[nr14] = f13*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fz*(-3.)); + + // q= 14 + dist[nr13] = f14*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fz*(3.)); + + // q = 15 + dist[nr16] = f15*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(3.) + Fz*(3.)); + + // q = 16 + dist[nr15] = f16*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(-3.) + Fz*(-3.)); + + // q = 17 + dist[nr18] = f17*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(3.) + Fz*(-3.)); + + // q = 18 + dist[nr17] = f18*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) + +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(-3.) + Fz*(3.)); + //-------------------------------------------------------------------------------------------------------------------------------------------// + + + //Update velocity on device + Velocity[0*Np+n] = ux; + Velocity[1*Np+n] = uy; + Velocity[2*Np+n] = uz; + //Update pressure on device + Pressure[n] = pressure; + } + } +} + +__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity, double Den, double *Pressure){ + + int n; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; + double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double rlx_setA = rlx; + double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); + + const double mrt_V1=0.05263157894736842; + const double mrt_V2=0.012531328320802; + const double mrt_V3=0.04761904761904762; + const double mrt_V4=0.004594820384294068; + const double mrt_V5=0.01587301587301587; + const double mrt_V6=0.0555555555555555555555555; + const double mrt_V7=0.02777777777777778; + const double mrt_V8=0.08333333333333333; + const double mrt_V9=0.003341687552213868; + const double mrt_V10=0.003968253968253968; + const double mrt_V11=0.01388888888888889; + const double mrt_V12=0.04166666666666666; + + + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s 10Np => odd part of dist) + fq = dist[nread]; // reading the f1 data into register fq + pressure = fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jx = fq; + m4 = -4.0*fq; + m9 = 2.0*fq; + m10 = -4.0*fq; + + // q=2 + nread = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nread]; // reading the f2 data into register fq + pressure += fq; + m1 -= 11.0*(fq); + m2 -= 4.0*(fq); + jx -= fq; + m4 += 4.0*(fq); + m9 += 2.0*(fq); + m10 -= 4.0*(fq); + + // q=3 + nread = neighborList[n+2*Np]; // neighbor 4 + fq = dist[nread]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy = fq; + m6 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 = fq; + m12 = -2.0*fq; + + // q = 4 + nread = neighborList[n+3*Np]; // neighbor 3 + fq = dist[nread]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy -= fq; + m6 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 += fq; + m12 -= 2.0*fq; + + // q=5 + nread = neighborList[n+4*Np]; + fq = dist[nread]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz = fq; + m8 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q = 6 + nread = neighborList[n+5*Np]; + fq = dist[nread]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz -= fq; + m8 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q=7 + nread = neighborList[n+6*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 = fq; + m16 = fq; + m17 = -fq; + + // q = 8 + nread = neighborList[n+7*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 += fq; + m16 -= fq; + m17 += fq; + + // q=9 + nread = neighborList[n+8*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 += fq; + m17 += fq; + + // q = 10 + nread = neighborList[n+9*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 -= fq; + m17 -= fq; + + // q=11 + nread = neighborList[n+10*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 = fq; + m16 -= fq; + m18 = fq; + + // q=12 + nread = neighborList[n+11*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 += fq; + m16 += fq; + m18 -= fq; + + // q=13 + nread = neighborList[n+12*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 -= fq; + m18 -= fq; + + // q=14 + nread = neighborList[n+13*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 += fq; + m18 += fq; + + // q=15 + nread = neighborList[n+14*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 = fq; + m17 += fq; + m18 -= fq; + + // q=16 + nread = neighborList[n+15*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 += fq; + m17 -= fq; + m18 += fq; + + // q=17 + nread = neighborList[n+16*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 += fq; + m18 += fq; + + // q=18 + nread = neighborList[n+17*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 -= fq; + m18 -= fq; + //---------------------------------------------------------------------// + + porosity = Poros[n]; + perm = Perm[n]; + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/Den+0.5*porosity*Gx; + vy = jy/Den+0.5*porosity*Gy; + vz = jz/Den+0.5*porosity*Gz; + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = Den*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx); + Fy = Den*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy); + Fz = Den*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz); + if (porosity==1.0){ + Fx=Den*Gx; + Fy=Den*Gy; + Fz=Den*Gz; + } + + //Calculate pressure for Incompressible-MRT model + pressure=0.5/porosity*(pressure-0.5*Den*u_mag*u_mag/porosity); + +// //..............carry out relaxation process............................................... +// m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; +// m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; +// jx = jx + Fx; +// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +// jy = jy + Fy; +// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*Den) - m6) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +// jz = jz + Fz; +// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*Den) - m8) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +// m9 = m9 + rlx_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) +// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; +// m10 = m10 + rlx_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) +// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; +// m11 = m11 + rlx_setA*((Den*(uy*uy-uz*uz)/porosity) - m11) +// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; +// m12 = m12 + rlx_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12) +// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; +// m13 = m13 + rlx_setA*((Den*ux*uy/porosity) - m13) +// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; +// m14 = m14 + rlx_setA*((Den*uy*uz/porosity) - m14) +// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; +// m15 = m15 + rlx_setA*((Den*ux*uz/porosity) - m15) +// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); +// //....................................................................................................... + + //-------------------- IMRT collison where body force has NO higher-order terms -------------// + //..............carry out relaxation process............................................... + m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*uy*Den) - m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*uz*Den) - m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); + m10 = m10 + rlx_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + rlx_setA*((Den*(uy*uy-uz*uz)/porosity) - m11); + m12 = m12 + rlx_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_setA*((Den*ux*uy/porosity) - m13); + m14 = m14 + rlx_setA*((Den*uy*uz/porosity) - m14); + m15 = m15 + rlx_setA*((Den*ux*uz/porosity) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... + + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*Den-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + nread = neighborList[n+Np]; + dist[nread] = fq; + + // q=2 + fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + nread = neighborList[n]; + dist[nread] = fq; + + // q = 3 + fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + nread = neighborList[n+3*Np]; + dist[nread] = fq; + + // q = 4 + fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + nread = neighborList[n+2*Np]; + dist[nread] = fq; + + // q = 5 + fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + nread = neighborList[n+5*Np]; + dist[nread] = fq; + + // q = 6 + fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + nread = neighborList[n+4*Np]; + dist[nread] = fq; + + // q = 7 + fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + nread = neighborList[n+7*Np]; + dist[nread] = fq; + + // q = 8 + fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); + nread = neighborList[n+6*Np]; + dist[nread] = fq; + + // q = 9 + fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + nread = neighborList[n+9*Np]; + dist[nread] = fq; + + // q = 10 + fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + nread = neighborList[n+8*Np]; + dist[nread] = fq; + + // q = 11 + fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); + nread = neighborList[n+11*Np]; + dist[nread] = fq; + + // q = 12 + fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + nread = neighborList[n+10*Np]; + dist[nread]= fq; + + // q = 13 + fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); + nread = neighborList[n+13*Np]; + dist[nread] = fq; + + // q= 14 + fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); + nread = neighborList[n+12*Np]; + dist[nread] = fq; + + // q = 15 + fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + nread = neighborList[n+15*Np]; + dist[nread] = fq; + + // q = 16 + fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + nread = neighborList[n+14*Np]; + dist[nread] = fq; + + // q = 17 + fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + nread = neighborList[n+17*Np]; + dist[nread] = fq; + + // q = 18 + fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + nread = neighborList[n+16*Np]; + dist[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] = pressure; + + } + } +} + +__global__ void dvc_ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den) +{ + int n; + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s>>(dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Pressure); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAeven_Greyscale: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_AAodd_Greyscale(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double *Pressure){ + + dvc_ScaLBL_D3Q19_AAodd_Greyscale<<>>(neighborList,dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Pressure); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAodd_Greyscale: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double Den,double *Pressure){ + + dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT<<>>(dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Den,Pressure); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAeven_Greyscale_IMRT: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double Den,double *Pressure){ + + dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT<<>>(neighborList,dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Den,Pressure); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAodd_Greyscale_IMRT: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den){ + dvc_ScaLBL_D3Q19_GreyIMRT_Init<<>>(dist, Np, Den); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_GreyIMRT_Init: %s \n",cudaGetErrorString(err)); + } +} diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp new file mode 100644 index 00000000..08cf09b5 --- /dev/null +++ b/models/GreyscaleSCModel.cpp @@ -0,0 +1,864 @@ +/* +Greyscale lattice boltzmann model + */ +#include "models/GreyscaleModel.h" +#include "analysis/distance.h" +#include "analysis/morphology.h" +#include +#include + +template +void DeleteArray( const TYPE *p ) +{ + delete [] p; +} + +ScaLBL_GreyscaleModel::ScaLBL_GreyscaleModel(int RANK, int NP, MPI_Comm COMM): +rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tau(0),tau_eff(0),Den(0),Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),GreyPorosity(0), +Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) +{ + SignDist.resize(Nx,Ny,Nz); + SignDist.fill(0); + +} +ScaLBL_GreyscaleModel::~ScaLBL_GreyscaleModel(){ + +} + +void ScaLBL_GreyscaleModel::ReadParams(string filename){ + // read the input database + db = std::make_shared( filename ); + domain_db = db->getDatabase( "Domain" ); + greyscale_db = db->getDatabase( "Greyscale" ); + analysis_db = db->getDatabase( "Analysis" ); + vis_db = db->getDatabase( "Visualization" ); + + // set defaults + timestepMax = 100000; + tau = 1.0; + tau_eff = tau; + Den = 1.0;//constant density + tolerance = 0.01; + Fx = Fy = Fz = 0.0; + Restart=false; + din=dout=1.0; + flux=0.0; + dp = 10.0; //unit of 'dp': voxel + CollisionType = 1; //1: IMRT; 2: BGK + + // ---------------------- Greyscale Model parameters -----------------------// + if (greyscale_db->keyExists( "timestepMax" )){ + timestepMax = greyscale_db->getScalar( "timestepMax" ); + } + if (greyscale_db->keyExists( "tau" )){ + tau = greyscale_db->getScalar( "tau" ); + } + tau_eff = greyscale_db->getWithDefault( "tau_eff", tau ); + if (greyscale_db->keyExists( "Den" )){ + Den = greyscale_db->getScalar( "Den" ); + } + if (greyscale_db->keyExists( "dp" )){ + dp = greyscale_db->getScalar( "dp" ); + } + if (greyscale_db->keyExists( "F" )){ + Fx = greyscale_db->getVector( "F" )[0]; + Fy = greyscale_db->getVector( "F" )[1]; + Fz = greyscale_db->getVector( "F" )[2]; + } + if (greyscale_db->keyExists( "Restart" )){ + Restart = greyscale_db->getScalar( "Restart" ); + } + if (greyscale_db->keyExists( "din" )){ + din = greyscale_db->getScalar( "din" ); + } + if (greyscale_db->keyExists( "dout" )){ + dout = greyscale_db->getScalar( "dout" ); + } + if (greyscale_db->keyExists( "flux" )){ + flux = greyscale_db->getScalar( "flux" ); + } + if (greyscale_db->keyExists( "tolerance" )){ + tolerance = greyscale_db->getScalar( "tolerance" ); + } + auto collision = greyscale_db->getWithDefault( "collision", "IMRT" ); + if (collision == "BGK"){ + CollisionType=2; + } + // ------------------------------------------------------------------------// + + //------------------------ Other Domain parameters ------------------------// + BoundaryCondition = 0; + if (domain_db->keyExists( "BC" )){ + BoundaryCondition = domain_db->getScalar( "BC" ); + } + // ------------------------------------------------------------------------// +} + +void ScaLBL_GreyscaleModel::SetDomain(){ + Dm = std::shared_ptr(new Domain(domain_db,comm)); // full domain for analysis + Mask = std::shared_ptr(new Domain(domain_db,comm)); // mask domain removes immobile phases + // domain parameters + Nx = Dm->Nx; + Ny = Dm->Ny; + Nz = Dm->Nz; + Lx = Dm->Lx; + Ly = Dm->Ly; + Lz = Dm->Lz; + N = Nx*Ny*Nz; + + SignDist.resize(Nx,Ny,Nz); + Velocity_x.resize(Nx,Ny,Nz); + Velocity_y.resize(Nx,Ny,Nz); + Velocity_z.resize(Nx,Ny,Nz); + PorosityMap.resize(Nx,Ny,Nz); + Pressure.resize(Nx,Ny,Nz); + + id = new signed char [N]; + for (int i=0; iid[i] = 1; // initialize this way + MPI_Barrier(comm); + Dm->CommInit(); + MPI_Barrier(comm); + // Read domain parameters + rank = Dm->rank(); + nprocx = Dm->nprocx(); + nprocy = Dm->nprocy(); + nprocz = Dm->nprocz(); +} + +void ScaLBL_GreyscaleModel::ReadInput(){ + + sprintf(LocalRankString,"%05d",rank); + sprintf(LocalRankFilename,"%s%s","ID.",LocalRankString); + sprintf(LocalRestartFile,"%s%s","Restart.",LocalRankString); + + if (domain_db->keyExists( "Filename" )){ + auto Filename = domain_db->getScalar( "Filename" ); + Mask->Decomp(Filename); + } + else{ + if (rank==0) printf("Filename of input image is not found, reading ID.0* instead."); + Mask->ReadIDs(); + } + for (int i=0; iid[i]; // save what was read + + // Generate the signed distance map + // Initialize the domain and communication + Array id_solid(Nx,Ny,Nz); + int count = 0; + // Solve for the position of the solid phase + for (int k=0;kid[n]; + if (label > 0) id_solid(i,j,k) = 1; + else id_solid(i,j,k) = 0; + } + } + } + // Initialize the signed distance function + for (int k=0;kgetVector( "ComponentLabels" ); + auto PorosityList = greyscale_db->getVector( "PorosityList" ); + auto PermeabilityList = greyscale_db->getVector( "PermeabilityList" ); + + NLABELS=LabelList.size(); + if (NLABELS != PorosityList.size()){ + ERROR("Error: ComponentLabels and PorosityList must be the same length! \n"); + } + + double label_count[NLABELS]; + double label_count_global[NLABELS]; + // Assign the labels + + for (int idx=0; idxid[n] = 0; // set mask to zero since this is an immobile component + } + } + int idx = Map(i,j,k); + if (!(idx < 0)){ + if (POROSITY<=0.0){ + ERROR("Error: Porosity for grey voxels must be 0.0 < Porosity <= 1.0 !\n"); + } + else{ + Porosity[idx] = POROSITY; + } + } + } + } + } + + if (NLABELS != PermeabilityList.size()){ + ERROR("Error: ComponentLabels and PermeabilityList must be the same length! \n"); + } + for (int k=0;kid[n] = 0; // set mask to zero since this is an immobile component + } + } + int idx = Map(i,j,k); + if (!(idx < 0)){ + if (PERMEABILITY<=0.0){ + ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); + } + else{ + Permeability[idx] = PERMEABILITY/Dm->voxel_length/Dm->voxel_length; + } + } + } + } + } + + + // Set Dm to match Mask + for (int i=0; iid[i] = Mask->id[i]; + + for (int idx=0; idxComm.sumReduce(label_count[idx]); + + //Initialize a weighted porosity after considering grey voxels + GreyPorosity=0.0; + for (unsigned int idx=0; idxvoxel_length); + printf("Component labels: %lu \n",NLABELS); + for (unsigned int idx=0; idxvoxel_length/Dm->voxel_length,volume_fraction); + printf(" effective porosity=%.3g\n",volume_fraction*POROSITY); + } + printf("The weighted porosity, considering both open and grey voxels, is %.3g\n",GreyPorosity); + } +} + + +void ScaLBL_GreyscaleModel::Create(){ + /* + * This function creates the variables needed to run a LBM + */ + //......................................................... + // don't perform computations at the eight corners + //id[0] = id[Nx-1] = id[(Ny-1)*Nx] = id[(Ny-1)*Nx + Nx-1] = 0; + //id[(Nz-1)*Nx*Ny] = id[(Nz-1)*Nx*Ny+Nx-1] = id[(Nz-1)*Nx*Ny+(Ny-1)*Nx] = id[(Nz-1)*Nx*Ny+(Ny-1)*Nx + Nx-1] = 0; + + //......................................................... + // Initialize communication structures in averaging domain + for (int i=0; iid[i] = Mask->id[i]; + Mask->CommInit(); + Np=Mask->PoreCount(); + //........................................................................... + if (rank==0) printf ("Create ScaLBL_Communicator \n"); + // Create a communicator for the device (will use optimized layout) + // ScaLBL_Communicator ScaLBL_Comm(Mask); // original + ScaLBL_Comm = std::shared_ptr(new ScaLBL_Communicator(Mask)); + + int Npad=(Np/16 + 2)*16; + if (rank==0) printf ("Set up memory efficient layout, %i | %i | %i \n", Np, Npad, N); + Map.resize(Nx,Ny,Nz); Map.fill(-2); + auto neighborList= new int[18*Npad]; + Np = ScaLBL_Comm->MemoryOptimizedLayoutAA(Map,neighborList,Mask->id,Np); + MPI_Barrier(comm); + + //........................................................................... + // MAIN VARIABLES ALLOCATED HERE + //........................................................................... + // LBM variables + if (rank==0) printf ("Allocating distributions \n"); + //......................device distributions................................. + dist_mem_size = Np*sizeof(double); + neighborSize=18*(Np*sizeof(int)); + //........................................................................... + ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); + ScaLBL_AllocateDeviceMemory((void **) &fq, 19*dist_mem_size); + ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); + //........................................................................... + // Update GPU data structures + if (rank==0) printf ("Setting up device neighbor list \n"); + fflush(stdout); + // copy the neighbor list + ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); + // initialize phi based on PhaseLabel (include solid component labels) + double *Poros, *Perm; + Poros = new double[Np]; + Perm = new double[Np]; + AssignComponentLabels(Poros,Perm); + ScaLBL_CopyToDevice(Porosity, Poros, Np*sizeof(double)); + ScaLBL_CopyToDevice(Permeability, Perm, Np*sizeof(double)); + delete [] Poros; + delete [] Perm; +} + + +void ScaLBL_GreyscaleModel::Initialize(){ + if (rank==0) printf ("Initializing distributions \n"); + //TODO: for BGK, you need to consider voxel porosity + // for IMRT, the whole set of feq is different + // if in the future you have different collison mode, need to write two set of initialization functions + if (CollisionType==1){ + ScaLBL_D3Q19_GreyIMRT_Init(fq, Np, Den); + if (rank==0) printf("Collision model: Incompressible MRT.\n"); + } + else if (CollisionType==2){ + ScaLBL_D3Q19_Init(fq, Np); + if (rank==0) printf("Collision model: BGK.\n"); + } + else{ + if (rank==0) printf("Unknown collison type! IMRT collision is used.\n"); + ScaLBL_D3Q19_GreyIMRT_Init(fq, Np, Den); + CollisionType=1; + greyscale_db->putScalar( "collision", "IMRT" ); + } + + if (Restart == true){ + if (rank==0){ + printf("Initializing distributions from Restart! \n"); + } + // Read in the restart file to CPU buffers + std::shared_ptr cfq; + cfq = std::shared_ptr(new double[19*Np],DeleteArray); + FILE *File; + File=fopen(LocalRestartFile,"rb"); + fread(cfq.get(),sizeof(double),19*Np,File); + fclose(File); + + // Copy the restart data to the GPU + ScaLBL_CopyToDevice(fq,cfq.get(),19*Np*sizeof(double)); + ScaLBL_DeviceBarrier(); + + MPI_Barrier(comm); + } +} + +void ScaLBL_GreyscaleModel::Run(){ + int nprocs=nprocx*nprocy*nprocz; + const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); + + int analysis_interval = 1000; // number of timesteps in between in situ analysis + int visualization_interval = 1000; + int restart_interval = 10000; // number of timesteps in between in saving distributions for restart + if (analysis_db->keyExists( "analysis_interval" )){ + analysis_interval = analysis_db->getScalar( "analysis_interval" ); + } + if (analysis_db->keyExists( "visualization_interval" )){ + visualization_interval = analysis_db->getScalar( "visualization_interval" ); + } + if (analysis_db->keyExists( "restart_interval" )){ + restart_interval = analysis_db->getScalar( "restart_interval" ); + } + if (greyscale_db->keyExists( "timestep" )){ + timestep = greyscale_db->getScalar( "timestep" ); + } + + if (rank==0){ + printf("********************************************************\n"); + printf("No. of timesteps: %i \n", timestepMax); + fflush(stdout); + } + + //.......create and start timer............ + double starttime,stoptime,cputime; + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); + starttime = MPI_Wtime(); + //......................................... + + Minkowski Morphology(Mask); + + //************ MAIN ITERATION LOOP ***************************************/ + PROFILE_START("Loop"); + auto current_db = db->cloneDatabase(); + double rlx = 1.0/tau; + double rlx_eff = 1.0/tau_eff; + double error = 1.0; + double flow_rate_previous = 0.0; + while (timestep < timestepMax && error > tolerance) { + //************************************************************************/ + // *************ODD TIMESTEP*************// + timestep++; + ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL + switch (CollisionType){ + case 1: + ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + case 2: + ScaLBL_D3Q19_AAodd_Greyscale(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); + break; + default: + ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + } + ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + // Set BCs + if (BoundaryCondition == 3){ + ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); + ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); + } + switch (CollisionType){ + case 1: + ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + case 2: + ScaLBL_D3Q19_AAodd_Greyscale(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); + break; + default: + ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + } + ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + + // *************EVEN TIMESTEP*************// + timestep++; + ScaLBL_Comm->SendD3Q19AA(fq); //READ FORM NORMAL + switch (CollisionType){ + case 1: + ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + case 2: + ScaLBL_D3Q19_AAeven_Greyscale(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); + break; + default: + ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + } + ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + // Set BCs + if (BoundaryCondition == 3){ + ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); + ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); + } + switch (CollisionType){ + case 1: + ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + case 2: + ScaLBL_D3Q19_AAeven_Greyscale(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); + break; + default: + ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; + } + ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + //************************************************************************/ + + if (timestep%analysis_interval==0){ + ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); + ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); + ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); + //ScaLBL_Comm->RegularLayout(Map,Porosity,PorosityMap); + //ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); + + double count_loc=0; + double count; + double vax,vay,vaz; + double vax_loc,vay_loc,vaz_loc; + //double px_loc,py_loc,pz_loc; + //double px,py,pz; + //double mass_loc,mass_glb; + + //parameters for domain average + int64_t i,j,k,n,imin,jmin,kmin,kmax; + // If external boundary conditions are set, do not average over the inlet and outlet + kmin=1; kmax=Nz-1; + //In case user forgets to specify the inlet/outlet buffer layers for BC>0 + if (BoundaryCondition > 0 && Dm->kproc() == 0) kmin=4; + if (BoundaryCondition > 0 && Dm->kproc() == Dm->nprocz()-1) kmax=Nz-4; + + imin=jmin=1; + // If inlet/outlet layers exist use these as default + //if (Dm->inlet_layers_x > 0) imin = Dm->inlet_layers_x; + //if (Dm->inlet_layers_y > 0) jmin = Dm->inlet_layers_y; + if (BoundaryCondition > 0 && Dm->inlet_layers_z > 0 && Dm->kproc() == 0) kmin = 1 + Dm->inlet_layers_z;//"1" indicates the halo layer + if (BoundaryCondition > 0 && Dm->outlet_layers_z > 0 && Dm->kproc() == Dm->nprocz()-1) kmax = Nz-1 - Dm->outlet_layers_z; + +// px_loc = py_loc = pz_loc = 0.f; +// mass_loc = 0.f; +// for (int k=kmin; k 0){ +// px_loc += Velocity_x(i,j,k)*Den*PorosityMap(i,j,k); +// py_loc += Velocity_y(i,j,k)*Den*PorosityMap(i,j,k); +// pz_loc += Velocity_z(i,j,k)*Den*PorosityMap(i,j,k); +// mass_loc += Den*PorosityMap(i,j,k); +// } +// } +// } +// } +// MPI_Allreduce(&px_loc, &px, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// MPI_Allreduce(&py_loc, &py, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// MPI_Allreduce(&pz_loc, &pz, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// MPI_Allreduce(&mass_loc,&mass_glb,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// +// vax = px/mass_glb; +// vay = py/mass_glb; +// vaz = pz/mass_glb; + + vax_loc = vay_loc = vaz_loc = 0.f; + for (int k=kmin; k 0){ + vax_loc += Velocity_x(i,j,k); + vay_loc += Velocity_y(i,j,k); + vaz_loc += Velocity_z(i,j,k); + count_loc+=1.0; + } + } + } + } + vax = Mask->Comm.sumReduce( vax_loc ); + vay = Mask->Comm.sumReduce( vay_loc ); + vaz = Mask->Comm.sumReduce( vaz_loc ); + count = Mask->Comm.sumReduce( count_loc ); + + vax /= count; + vay /= count; + vaz /= count; + + double force_mag = sqrt(Fx*Fx+Fy*Fy+Fz*Fz); + double dir_x = Fx/force_mag; + double dir_y = Fy/force_mag; + double dir_z = Fz/force_mag; + if (force_mag == 0.0){ + // default to z direction + dir_x = 0.0; + dir_y = 0.0; + dir_z = 1.0; + force_mag = 1.0; + } + //double flow_rate = (px*dir_x + py*dir_y + pz*dir_z)/mass_glb; + double flow_rate = (vax*dir_x + vay*dir_y + vaz*dir_z); + + error = fabs(flow_rate - flow_rate_previous) / fabs(flow_rate); + flow_rate_previous = flow_rate; + + //if (rank==0) printf("Computing Minkowski functionals \n"); + Morphology.ComputeScalar(SignDist,0.f); + //Morphology.PrintAll(); + double mu = (tau-0.5)/3.f; + double Vs = Morphology.V(); + double As = Morphology.A(); + double Hs = Morphology.H(); + double Xs = Morphology.X(); + Vs = Dm->Comm.sumReduce( Vs); + As = Dm->Comm.sumReduce( As); + Hs = Dm->Comm.sumReduce( Hs); + Xs = Dm->Comm.sumReduce( Xs); + + double h = Dm->voxel_length; + //double absperm = h*h*mu*Mask->Porosity()*flow_rate / force_mag; + double absperm = h*h*mu*GreyPorosity*flow_rate / force_mag; + + if (rank==0){ + printf(" AbsPerm = %.5g [micron^2]\n",absperm); + bool WriteHeader=false; + FILE * log_file = fopen("Permeability.csv","r"); + if (log_file != NULL) + fclose(log_file); + else + WriteHeader=true; + log_file = fopen("Permeability.csv","a"); + if (WriteHeader) + fprintf(log_file,"timestep Fx Fy Fz mu Vs As Hs Xs vax vay vaz AbsPerm \n", + timestep,Fx,Fy,Fz,mu,h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz,absperm); + + fprintf(log_file,"%i %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",timestep, Fx, Fy, Fz, mu, + h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz, absperm); + fclose(log_file); + } + } + + if (timestep%visualization_interval==0){ + VelocityField(); + } + + if (timestep%restart_interval==0){ + //Use rank=0 write out Restart.db + if (rank==0) { + greyscale_db->putScalar("timestep",timestep); + greyscale_db->putScalar( "Restart", true ); + current_db->putDatabase("Greyscale", greyscale_db); + std::ofstream OutStream("Restart.db"); + current_db->print(OutStream, ""); + OutStream.close(); + + } + //Write out Restart data. + std::shared_ptr cfq; + cfq = std::shared_ptr(new double[19*Np],DeleteArray); + ScaLBL_CopyToHost(cfq.get(),fq,19*Np*sizeof(double));// Copy restart data to the CPU + + FILE *RESTARTFILE; + RESTARTFILE=fopen(LocalRestartFile,"wb"); + fwrite(cfq.get(),sizeof(double),19*Np,RESTARTFILE); + fclose(RESTARTFILE); + MPI_Barrier(comm); + } + } + + PROFILE_STOP("Loop"); + PROFILE_SAVE("lbpm_greyscale_simulator",1); + //************************************************************************ + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); + stoptime = MPI_Wtime(); + if (rank==0) printf("-------------------------------------------------------------------\n"); + // Compute the walltime per timestep + cputime = (stoptime - starttime)/timestep; + // Performance obtained from each node + double MLUPS = double(Np)/cputime/1000000; + + if (rank==0) printf("********************************************************\n"); + if (rank==0) printf("CPU time = %f \n", cputime); + if (rank==0) printf("Lattice update rate (per core)= %f MLUPS \n", MLUPS); + MLUPS *= nprocs; + if (rank==0) printf("Lattice update rate (total)= %f MLUPS \n", MLUPS); + if (rank==0) printf("********************************************************\n"); + + // ************************************************************************ +} + +void ScaLBL_GreyscaleModel::VelocityField(){ + +/* Minkowski Morphology(Mask); + int SIZE=Np*sizeof(double); + ScaLBL_D3Q19_Momentum(fq,Velocity, Np); + ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + ScaLBL_CopyToHost(&VELOCITY[0],&Velocity[0],3*SIZE); + + memcpy(Morphology.SDn.data(), Distance.data(), Nx*Ny*Nz*sizeof(double)); + Morphology.Initialize(); + Morphology.UpdateMeshValues(); + Morphology.ComputeLocal(); + Morphology.Reduce(); + + double count_loc=0; + double count; + double vax,vay,vaz; + double vax_loc,vay_loc,vaz_loc; + vax_loc = vay_loc = vaz_loc = 0.f; + for (int n=0; nLastExterior(); n++){ + vax_loc += VELOCITY[n]; + vay_loc += VELOCITY[Np+n]; + vaz_loc += VELOCITY[2*Np+n]; + count_loc+=1.0; + } + + for (int n=ScaLBL_Comm->FirstInterior(); nLastInterior(); n++){ + vax_loc += VELOCITY[n]; + vay_loc += VELOCITY[Np+n]; + vaz_loc += VELOCITY[2*Np+n]; + count_loc+=1.0; + } + MPI_Allreduce(&vax_loc,&vax,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + MPI_Allreduce(&vay_loc,&vay,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + MPI_Allreduce(&vaz_loc,&vaz,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + MPI_Allreduce(&count_loc,&count,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + + vax /= count; + vay /= count; + vaz /= count; + + double mu = (tau-0.5)/3.f; + if (rank==0) printf("Fx Fy Fz mu Vs As Js Xs vx vy vz\n"); + if (rank==0) printf("%.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",Fx, Fy, Fz, mu, + Morphology.V(),Morphology.A(),Morphology.J(),Morphology.X(),vax,vay,vaz); + */ + + std::vector visData; + fillHalo fillData(Dm->Comm,Dm->rank_info,{Dm->Nx-2,Dm->Ny-2,Dm->Nz-2},{1,1,1},0,1); + + auto VxVar = std::make_shared(); + auto VyVar = std::make_shared(); + auto VzVar = std::make_shared(); + auto SignDistVar = std::make_shared(); + auto PressureVar = std::make_shared(); + + IO::initialize("","silo","false"); + // Create the MeshDataStruct + visData.resize(1); + visData[0].meshName = "domain"; + visData[0].mesh = std::make_shared( Dm->rank_info,Dm->Nx-2,Dm->Ny-2,Dm->Nz-2,Dm->Lx,Dm->Ly,Dm->Lz ); + SignDistVar->name = "SignDist"; + SignDistVar->type = IO::VariableType::VolumeVariable; + SignDistVar->dim = 1; + SignDistVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(SignDistVar); + + VxVar->name = "Velocity_x"; + VxVar->type = IO::VariableType::VolumeVariable; + VxVar->dim = 1; + VxVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(VxVar); + VyVar->name = "Velocity_y"; + VyVar->type = IO::VariableType::VolumeVariable; + VyVar->dim = 1; + VyVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(VyVar); + VzVar->name = "Velocity_z"; + VzVar->type = IO::VariableType::VolumeVariable; + VzVar->dim = 1; + VzVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(VzVar); + + PressureVar->name = "Pressure"; + PressureVar->type = IO::VariableType::VolumeVariable; + PressureVar->dim = 1; + PressureVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(PressureVar); + + Array& SignData = visData[0].vars[0]->data; + Array& VelxData = visData[0].vars[1]->data; + Array& VelyData = visData[0].vars[2]->data; + Array& VelzData = visData[0].vars[3]->data; + Array& PressureData = visData[0].vars[4]->data; + + ASSERT(visData[0].vars[0]->name=="SignDist"); + ASSERT(visData[0].vars[1]->name=="Velocity_x"); + ASSERT(visData[0].vars[2]->name=="Velocity_y"); + ASSERT(visData[0].vars[3]->name=="Velocity_z"); + ASSERT(visData[0].vars[4]->name=="Pressure"); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); + ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); + ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); + ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); + + fillData.copy(SignDist,SignData); + fillData.copy(Velocity_x,VelxData); + fillData.copy(Velocity_y,VelyData); + fillData.copy(Velocity_z,VelzData); + fillData.copy(Pressure,PressureData); + + IO::writeData( timestep, visData, Dm->Comm ); + +} + +void ScaLBL_GreyscaleModel::WriteDebug(){ + // Copy back final phase indicator field and convert to regular layout + DoubleArray PhaseField(Nx,Ny,Nz); + + //ScaLBL_CopyToHost(Porosity.data(), Poros, sizeof(double)*N); + +// FILE *OUTFILE; +// sprintf(LocalRankFilename,"Phase.%05i.raw",rank); +// OUTFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,OUTFILE); +// fclose(OUTFILE); +// +// ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); +// FILE *AFILE; +// sprintf(LocalRankFilename,"A.%05i.raw",rank); +// AFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,AFILE); +// fclose(AFILE); +// +// ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); +// FILE *BFILE; +// sprintf(LocalRankFilename,"B.%05i.raw",rank); +// BFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,BFILE); +// fclose(BFILE); +// +// ScaLBL_Comm->RegularLayout(Map,Pressure,PhaseField); +// FILE *PFILE; +// sprintf(LocalRankFilename,"Pressure.%05i.raw",rank); +// PFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,PFILE); +// fclose(PFILE); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[0],PhaseField); + FILE *VELX_FILE; + sprintf(LocalRankFilename,"Velocity_X.%05i.raw",rank); + VELX_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,VELX_FILE); + fclose(VELX_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],PhaseField); + FILE *VELY_FILE; + sprintf(LocalRankFilename,"Velocity_Y.%05i.raw",rank); + VELY_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,VELY_FILE); + fclose(VELY_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],PhaseField); + FILE *VELZ_FILE; + sprintf(LocalRankFilename,"Velocity_Z.%05i.raw",rank); + VELZ_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,VELZ_FILE); + fclose(VELZ_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Porosity[0],PhaseField); + FILE *POROS_FILE; + sprintf(LocalRankFilename,"Porosity.%05i.raw",rank); + POROS_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,POROS_FILE); + fclose(POROS_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Permeability[0],PhaseField); + FILE *PERM_FILE; + sprintf(LocalRankFilename,"Permeability.%05i.raw",rank); + PERM_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,PERM_FILE); + fclose(PERM_FILE); +} diff --git a/models/GreyscaleSCModel.h b/models/GreyscaleSCModel.h new file mode 100644 index 00000000..3e883b16 --- /dev/null +++ b/models/GreyscaleSCModel.h @@ -0,0 +1,91 @@ +/* +Implementation of color lattice boltzmann model + */ +#include +#include +#include +#include +#include +#include +#include + +#include "common/Communication.h" +#include "common/MPI.h" +#include "common/Database.h" +#include "common/ScaLBL.h" +#include "ProfilerApp.h" +#include "threadpool/thread_pool.h" + +class ScaLBL_GreyscaleModel{ +public: + ScaLBL_GreyscaleModel(int RANK, int NP, MPI_Comm COMM); + ~ScaLBL_GreyscaleModel(); + + // functions in they should be run + void ReadParams(string filename); + void ReadParams(std::shared_ptr db0); + void SetDomain(); + void ReadInput(); + void Create(); + void Initialize(); + void Run(); + void WriteDebug(); + void VelocityField(); + + bool Restart,pBC; + int timestep,timestepMax; + int BoundaryCondition; + int CollisionType; + double tau; + double tau_eff; + double Den;//constant density + double tolerance; + double Fx,Fy,Fz,flux; + double din,dout; + double dp;//solid particle diameter, unit in voxel + double GreyPorosity; + + int Nx,Ny,Nz,N,Np; + int rank,nprocx,nprocy,nprocz,nprocs; + double Lx,Ly,Lz; + + std::shared_ptr Dm; // this domain is for analysis + std::shared_ptr Mask; // this domain is for lbm + std::shared_ptr ScaLBL_Comm; + + // input database + std::shared_ptr db; + std::shared_ptr domain_db; + std::shared_ptr greyscale_db; + std::shared_ptr analysis_db; + std::shared_ptr vis_db; + + signed char *id; + int *NeighborList; + double *fq; + double *Permeability;//grey voxel permeability + double *Porosity; + double *Velocity; + double *Pressure_dvc; + IntArray Map; + DoubleArray SignDist; + DoubleArray Velocity_x; + DoubleArray Velocity_y; + DoubleArray Velocity_z; + DoubleArray PorosityMap; + DoubleArray Pressure; + +private: + MPI_Comm comm; + + int dist_mem_size; + int neighborSize; + // filenames + char LocalRankString[8]; + char LocalRankFilename[40]; + char LocalRestartFile[40]; + + void AssignComponentLabels(double *Porosity, double *Permeablity); + +}; + From 8e2efa8f0595fe4ebb27a8baa101943f839db813 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Thu, 30 Apr 2020 23:42:17 -0400 Subject: [PATCH 26/75] GreyscaleSC model;GPU only;save the work;model does not function correctly --- common/ScaLBL.cpp | 434 ++- common/ScaLBL.h | 25 +- gpu/GreyscaleSC.cu | 3851 ++++++++++++++++---------- models/GreyscaleSCModel.cpp | 1034 ++++--- models/GreyscaleSCModel.h | 26 +- tests/CMakeLists.txt | 1 + tests/lbpm_greyscaleSC_simulator.cpp | 59 + 7 files changed, 3568 insertions(+), 1862 deletions(-) create mode 100644 tests/lbpm_greyscaleSC_simulator.cpp diff --git a/common/ScaLBL.cpp b/common/ScaLBL.cpp index 0feb5558..8d868218 100644 --- a/common/ScaLBL.cpp +++ b/common/ScaLBL.cpp @@ -78,43 +78,43 @@ ScaLBL_Communicator::ScaLBL_Communicator(std::shared_ptr Dm){ BoundaryCondition = Dm->BoundaryCondition; //...................................................................................... - ScaLBL_AllocateZeroCopy((void **) &sendbuf_x, 5*sendCount_x*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_X, 5*sendCount_X*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_y, 5*sendCount_y*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_Y, 5*sendCount_Y*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_z, 5*sendCount_z*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_Z, 5*sendCount_Z*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_xy, sendCount_xy*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_xY, sendCount_xY*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_Xy, sendCount_Xy*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_XY, sendCount_XY*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_xz, sendCount_xz*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_xZ, sendCount_xZ*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_Xz, sendCount_Xz*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_XZ, sendCount_XZ*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_yz, sendCount_yz*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_yZ, sendCount_yZ*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_Yz, sendCount_Yz*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &sendbuf_YZ, sendCount_YZ*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_x, 2*5*sendCount_x*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_X, 2*5*sendCount_X*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_y, 2*5*sendCount_y*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_Y, 2*5*sendCount_Y*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_z, 2*5*sendCount_z*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_Z, 2*5*sendCount_Z*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_xy, 2*sendCount_xy*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_xY, 2*sendCount_xY*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_Xy, 2*sendCount_Xy*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_XY, 2*sendCount_XY*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_xz, 2*sendCount_xz*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_xZ, 2*sendCount_xZ*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_Xz, 2*sendCount_Xz*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_XZ, 2*sendCount_XZ*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_yz, 2*sendCount_yz*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_yZ, 2*sendCount_yZ*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_Yz, 2*sendCount_Yz*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &sendbuf_YZ, 2*sendCount_YZ*sizeof(double)); // Allocate device memory //...................................................................................... - ScaLBL_AllocateZeroCopy((void **) &recvbuf_x, 5*recvCount_x*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_X, 5*recvCount_X*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_y, 5*recvCount_y*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_Y, 5*recvCount_Y*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_z, 5*recvCount_z*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_Z, 5*recvCount_Z*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_xy, recvCount_xy*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_xY, recvCount_xY*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_Xy, recvCount_Xy*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_XY, recvCount_XY*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_xz, recvCount_xz*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_xZ, recvCount_xZ*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_Xz, recvCount_Xz*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_XZ, recvCount_XZ*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_yz, recvCount_yz*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_yZ, recvCount_yZ*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_Yz, recvCount_Yz*sizeof(double)); // Allocate device memory - ScaLBL_AllocateZeroCopy((void **) &recvbuf_YZ, recvCount_YZ*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_x, 2*5*recvCount_x*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_X, 2*5*recvCount_X*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_y, 2*5*recvCount_y*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_Y, 2*5*recvCount_Y*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_z, 2*5*recvCount_z*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_Z, 2*5*recvCount_Z*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_xy, 2*recvCount_xy*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_xY, 2*recvCount_xY*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_Xy, 2*recvCount_Xy*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_XY, 2*recvCount_XY*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_xz, 2*recvCount_xz*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_xZ, 2*recvCount_xZ*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_Xz, 2*recvCount_Xz*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_XZ, 2*recvCount_XZ*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_yz, 2*recvCount_yz*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_yZ, 2*recvCount_yZ*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_Yz, 2*recvCount_Yz*sizeof(double)); // Allocate device memory + ScaLBL_AllocateZeroCopy((void **) &recvbuf_YZ, 2*recvCount_YZ*sizeof(double)); // Allocate device memory //...................................................................................... ScaLBL_AllocateZeroCopy((void **) &dvcSendList_x, sendCount_x*sizeof(int)); // Allocate device memory ScaLBL_AllocateZeroCopy((void **) &dvcSendList_X, sendCount_X*sizeof(int)); // Allocate device memory @@ -1052,6 +1052,368 @@ void ScaLBL_Communicator::RecvD3Q19AA(double *dist){ } +void ScaLBL_Communicator::BiSendD3Q19AA(double *Aq, double *Bq){ + + // NOTE: the center distribution f0 must NOT be at the start of feven, provide offset to start of f2 + if (Lock==true){ + ERROR("ScaLBL Error (SendD3Q19): ScaLBL_Communicator is locked -- did you forget to match Send/Recv calls?"); + } + else{ + Lock=true; + } + // assign tag of 19 to D3Q19 communication + sendtag = recvtag = 38; + ScaLBL_DeviceBarrier(); + // Pack the distributions + //...Packing for x face(2,8,10,12,14)................................ + ScaLBL_D3Q19_Pack(2 ,dvcSendList_x,0*sendCount_x,sendCount_x,sendbuf_x,Aq,N); + ScaLBL_D3Q19_Pack(8 ,dvcSendList_x,1*sendCount_x,sendCount_x,sendbuf_x,Aq,N); + ScaLBL_D3Q19_Pack(10,dvcSendList_x,2*sendCount_x,sendCount_x,sendbuf_x,Aq,N); + ScaLBL_D3Q19_Pack(12,dvcSendList_x,3*sendCount_x,sendCount_x,sendbuf_x,Aq,N); + ScaLBL_D3Q19_Pack(14,dvcSendList_x,4*sendCount_x,sendCount_x,sendbuf_x,Aq,N); + ScaLBL_D3Q19_Pack(2 ,dvcSendList_x,5*sendCount_x,sendCount_x,sendbuf_x,Bq,N); + ScaLBL_D3Q19_Pack(8 ,dvcSendList_x,6*sendCount_x,sendCount_x,sendbuf_x,Bq,N); + ScaLBL_D3Q19_Pack(10,dvcSendList_x,7*sendCount_x,sendCount_x,sendbuf_x,Bq,N); + ScaLBL_D3Q19_Pack(12,dvcSendList_x,8*sendCount_x,sendCount_x,sendbuf_x,Bq,N); + ScaLBL_D3Q19_Pack(14,dvcSendList_x,9*sendCount_x,sendCount_x,sendbuf_x,Bq,N); + + req1[0] = MPI_COMM_SCALBL.Isend(sendbuf_x, 10*sendCount_x,rank_x,sendtag); + req2[0] = MPI_COMM_SCALBL.Irecv(recvbuf_X, 10*recvCount_X,rank_X,recvtag); + + //...Packing for X face(1,7,9,11,13)................................ + ScaLBL_D3Q19_Pack(1 ,dvcSendList_X,0*sendCount_X,sendCount_X,sendbuf_X,Aq,N); + ScaLBL_D3Q19_Pack(7 ,dvcSendList_X,1*sendCount_X,sendCount_X,sendbuf_X,Aq,N); + ScaLBL_D3Q19_Pack(9 ,dvcSendList_X,2*sendCount_X,sendCount_X,sendbuf_X,Aq,N); + ScaLBL_D3Q19_Pack(11,dvcSendList_X,3*sendCount_X,sendCount_X,sendbuf_X,Aq,N); + ScaLBL_D3Q19_Pack(13,dvcSendList_X,4*sendCount_X,sendCount_X,sendbuf_X,Aq,N); + ScaLBL_D3Q19_Pack(1 ,dvcSendList_X,5*sendCount_X,sendCount_X,sendbuf_X,Bq,N); + ScaLBL_D3Q19_Pack(7 ,dvcSendList_X,6*sendCount_X,sendCount_X,sendbuf_X,Bq,N); + ScaLBL_D3Q19_Pack(9 ,dvcSendList_X,7*sendCount_X,sendCount_X,sendbuf_X,Bq,N); + ScaLBL_D3Q19_Pack(11,dvcSendList_X,8*sendCount_X,sendCount_X,sendbuf_X,Bq,N); + ScaLBL_D3Q19_Pack(13,dvcSendList_X,9*sendCount_X,sendCount_X,sendbuf_X,Bq,N); + + req1[1] = MPI_COMM_SCALBL.Isend(sendbuf_X, 10*sendCount_X,rank_X,sendtag); + req2[1] = MPI_COMM_SCALBL.Irecv(recvbuf_x, 10*recvCount_x,rank_x,recvtag); + + //...Packing for y face(4,8,9,16,18)................................. + ScaLBL_D3Q19_Pack(4 ,dvcSendList_y,0*sendCount_y,sendCount_y,sendbuf_y,Aq,N); + ScaLBL_D3Q19_Pack(8 ,dvcSendList_y,1*sendCount_y,sendCount_y,sendbuf_y,Aq,N); + ScaLBL_D3Q19_Pack(9 ,dvcSendList_y,2*sendCount_y,sendCount_y,sendbuf_y,Aq,N); + ScaLBL_D3Q19_Pack(16,dvcSendList_y,3*sendCount_y,sendCount_y,sendbuf_y,Aq,N); + ScaLBL_D3Q19_Pack(18,dvcSendList_y,4*sendCount_y,sendCount_y,sendbuf_y,Aq,N); + ScaLBL_D3Q19_Pack(4 ,dvcSendList_y,5*sendCount_y,sendCount_y,sendbuf_y,Bq,N); + ScaLBL_D3Q19_Pack(8 ,dvcSendList_y,6*sendCount_y,sendCount_y,sendbuf_y,Bq,N); + ScaLBL_D3Q19_Pack(9 ,dvcSendList_y,7*sendCount_y,sendCount_y,sendbuf_y,Bq,N); + ScaLBL_D3Q19_Pack(16,dvcSendList_y,8*sendCount_y,sendCount_y,sendbuf_y,Bq,N); + ScaLBL_D3Q19_Pack(18,dvcSendList_y,9*sendCount_y,sendCount_y,sendbuf_y,Bq,N); + + req1[2] = MPI_COMM_SCALBL.Isend(sendbuf_y, 10*sendCount_y,rank_y,sendtag); + req2[2] = MPI_COMM_SCALBL.Irecv(recvbuf_Y, 10*recvCount_Y,rank_Y,recvtag); + + //...Packing for Y face(3,7,10,15,17)................................. + ScaLBL_D3Q19_Pack(3 ,dvcSendList_Y,0*sendCount_Y,sendCount_Y,sendbuf_Y,Aq,N); + ScaLBL_D3Q19_Pack(7 ,dvcSendList_Y,1*sendCount_Y,sendCount_Y,sendbuf_Y,Aq,N); + ScaLBL_D3Q19_Pack(10,dvcSendList_Y,2*sendCount_Y,sendCount_Y,sendbuf_Y,Aq,N); + ScaLBL_D3Q19_Pack(15,dvcSendList_Y,3*sendCount_Y,sendCount_Y,sendbuf_Y,Aq,N); + ScaLBL_D3Q19_Pack(17,dvcSendList_Y,4*sendCount_Y,sendCount_Y,sendbuf_Y,Aq,N); + ScaLBL_D3Q19_Pack(3 ,dvcSendList_Y,5*sendCount_Y,sendCount_Y,sendbuf_Y,Bq,N); + ScaLBL_D3Q19_Pack(7 ,dvcSendList_Y,6*sendCount_Y,sendCount_Y,sendbuf_Y,Bq,N); + ScaLBL_D3Q19_Pack(10,dvcSendList_Y,7*sendCount_Y,sendCount_Y,sendbuf_Y,Bq,N); + ScaLBL_D3Q19_Pack(15,dvcSendList_Y,8*sendCount_Y,sendCount_Y,sendbuf_Y,Bq,N); + ScaLBL_D3Q19_Pack(17,dvcSendList_Y,9*sendCount_Y,sendCount_Y,sendbuf_Y,Bq,N); + + req1[3] = MPI_COMM_SCALBL.Isend(sendbuf_Y, 10*sendCount_Y,rank_Y,sendtag); + req2[3] = MPI_COMM_SCALBL.Irecv(recvbuf_y, 10*recvCount_y,rank_y,recvtag); + + //...Packing for z face(6,12,13,16,17)................................ + ScaLBL_D3Q19_Pack(6 ,dvcSendList_z,0*sendCount_z,sendCount_z,sendbuf_z,Aq,N); + ScaLBL_D3Q19_Pack(12,dvcSendList_z,1*sendCount_z,sendCount_z,sendbuf_z,Aq,N); + ScaLBL_D3Q19_Pack(13,dvcSendList_z,2*sendCount_z,sendCount_z,sendbuf_z,Aq,N); + ScaLBL_D3Q19_Pack(16,dvcSendList_z,3*sendCount_z,sendCount_z,sendbuf_z,Aq,N); + ScaLBL_D3Q19_Pack(17,dvcSendList_z,4*sendCount_z,sendCount_z,sendbuf_z,Aq,N); + ScaLBL_D3Q19_Pack(6 ,dvcSendList_z,5*sendCount_z,sendCount_z,sendbuf_z,Bq,N); + ScaLBL_D3Q19_Pack(12,dvcSendList_z,6*sendCount_z,sendCount_z,sendbuf_z,Bq,N); + ScaLBL_D3Q19_Pack(13,dvcSendList_z,7*sendCount_z,sendCount_z,sendbuf_z,Bq,N); + ScaLBL_D3Q19_Pack(16,dvcSendList_z,8*sendCount_z,sendCount_z,sendbuf_z,Bq,N); + ScaLBL_D3Q19_Pack(17,dvcSendList_z,9*sendCount_z,sendCount_z,sendbuf_z,Bq,N); + + req1[4] = MPI_COMM_SCALBL.Isend(sendbuf_z, 10*sendCount_z,rank_z,sendtag); + req2[4] = MPI_COMM_SCALBL.Irecv(recvbuf_Z, 10*recvCount_Z,rank_Z,recvtag); + + //...Packing for Z face(5,11,14,15,18)................................ + ScaLBL_D3Q19_Pack(5 ,dvcSendList_Z,0*sendCount_Z,sendCount_Z,sendbuf_Z,Aq,N); + ScaLBL_D3Q19_Pack(11,dvcSendList_Z,1*sendCount_Z,sendCount_Z,sendbuf_Z,Aq,N); + ScaLBL_D3Q19_Pack(14,dvcSendList_Z,2*sendCount_Z,sendCount_Z,sendbuf_Z,Aq,N); + ScaLBL_D3Q19_Pack(15,dvcSendList_Z,3*sendCount_Z,sendCount_Z,sendbuf_Z,Aq,N); + ScaLBL_D3Q19_Pack(18,dvcSendList_Z,4*sendCount_Z,sendCount_Z,sendbuf_Z,Aq,N); + ScaLBL_D3Q19_Pack(5 ,dvcSendList_Z,5*sendCount_Z,sendCount_Z,sendbuf_Z,Bq,N); + ScaLBL_D3Q19_Pack(11,dvcSendList_Z,6*sendCount_Z,sendCount_Z,sendbuf_Z,Bq,N); + ScaLBL_D3Q19_Pack(14,dvcSendList_Z,7*sendCount_Z,sendCount_Z,sendbuf_Z,Bq,N); + ScaLBL_D3Q19_Pack(15,dvcSendList_Z,8*sendCount_Z,sendCount_Z,sendbuf_Z,Bq,N); + ScaLBL_D3Q19_Pack(18,dvcSendList_Z,9*sendCount_Z,sendCount_Z,sendbuf_Z,Bq,N); + + req1[5] = MPI_COMM_SCALBL.Isend(sendbuf_Z, 10*sendCount_Z,rank_Z,sendtag); + req2[5] = MPI_COMM_SCALBL.Irecv(recvbuf_z, 10*recvCount_z,rank_z,recvtag); + + //...Pack the xy edge (8)................................ + ScaLBL_D3Q19_Pack(8,dvcSendList_xy,0*sendCount_xy,sendCount_xy,sendbuf_xy,Aq,N); + ScaLBL_D3Q19_Pack(8,dvcSendList_xy,1*sendCount_xy,sendCount_xy,sendbuf_xy,Bq,N); + req1[6] = MPI_COMM_SCALBL.Isend(sendbuf_xy, 2*sendCount_xy,rank_xy,sendtag); + req2[6] = MPI_COMM_SCALBL.Irecv(recvbuf_XY, 2*recvCount_XY,rank_XY,recvtag); + + //...Pack the Xy edge (9)................................ + ScaLBL_D3Q19_Pack(9,dvcSendList_Xy,0*sendCount_Xy,sendCount_Xy,sendbuf_Xy,Aq,N); + ScaLBL_D3Q19_Pack(9,dvcSendList_Xy,1*sendCount_Xy,sendCount_Xy,sendbuf_Xy,Bq,N); + req1[8] = MPI_COMM_SCALBL.Isend(sendbuf_Xy, 2*sendCount_Xy,rank_Xy,sendtag); + req2[8] = MPI_COMM_SCALBL.Irecv(recvbuf_xY, 2*recvCount_xY,rank_xY,recvtag); + + //...Pack the xY edge (10)................................ + ScaLBL_D3Q19_Pack(10,dvcSendList_xY,0*sendCount_xY,sendCount_xY,sendbuf_xY,Aq,N); + ScaLBL_D3Q19_Pack(10,dvcSendList_xY,1*sendCount_xY,sendCount_xY,sendbuf_xY,Bq,N); + req1[9] = MPI_COMM_SCALBL.Isend(sendbuf_xY, 2*sendCount_xY,rank_xY,sendtag); + req2[9] = MPI_COMM_SCALBL.Irecv(recvbuf_Xy, 2*recvCount_Xy,rank_Xy,recvtag); + + //...Pack the XY edge (7)................................ + ScaLBL_D3Q19_Pack(7,dvcSendList_XY,0*sendCount_XY,sendCount_XY,sendbuf_XY,Aq,N); + ScaLBL_D3Q19_Pack(7,dvcSendList_XY,1*sendCount_XY,sendCount_XY,sendbuf_XY,Bq,N); + req1[7] = MPI_COMM_SCALBL.Isend(sendbuf_XY, 2*sendCount_XY,rank_XY,sendtag); + req2[7] = MPI_COMM_SCALBL.Irecv(recvbuf_xy, 2*recvCount_xy,rank_xy,recvtag); + + //...Pack the xz edge (12)................................ + ScaLBL_D3Q19_Pack(12,dvcSendList_xz,0*sendCount_xz,sendCount_xz,sendbuf_xz,Aq,N); + ScaLBL_D3Q19_Pack(12,dvcSendList_xz,1*sendCount_xz,sendCount_xz,sendbuf_xz,Bq,N); + req1[10] = MPI_COMM_SCALBL.Isend(sendbuf_xz, 2*sendCount_xz,rank_xz,sendtag); + req2[10] = MPI_COMM_SCALBL.Irecv(recvbuf_XZ, 2*recvCount_XZ,rank_XZ,recvtag); + + //...Pack the xZ edge (14)................................ + ScaLBL_D3Q19_Pack(14,dvcSendList_xZ,0*sendCount_xZ,sendCount_xZ,sendbuf_xZ,Aq,N); + ScaLBL_D3Q19_Pack(14,dvcSendList_xZ,1*sendCount_xZ,sendCount_xZ,sendbuf_xZ,Bq,N); + req1[13] = MPI_COMM_SCALBL.Isend(sendbuf_xZ, 2*sendCount_xZ,rank_xZ,sendtag); + req2[13] = MPI_COMM_SCALBL.Irecv(recvbuf_Xz, 2*recvCount_Xz,rank_Xz,recvtag); + + //...Pack the Xz edge (13)................................ + ScaLBL_D3Q19_Pack(13,dvcSendList_Xz,0*sendCount_Xz,sendCount_Xz,sendbuf_Xz,Aq,N); + ScaLBL_D3Q19_Pack(13,dvcSendList_Xz,1*sendCount_Xz,sendCount_Xz,sendbuf_Xz,Bq,N); + req1[12] = MPI_COMM_SCALBL.Isend(sendbuf_Xz, 2*sendCount_Xz,rank_Xz,sendtag); + req2[12] = MPI_COMM_SCALBL.Irecv(recvbuf_xZ, 2*recvCount_xZ,rank_xZ,recvtag); + + //...Pack the XZ edge (11)................................ + ScaLBL_D3Q19_Pack(11,dvcSendList_XZ,0*sendCount_XZ,sendCount_XZ,sendbuf_XZ,Aq,N); + ScaLBL_D3Q19_Pack(11,dvcSendList_XZ,1*sendCount_XZ,sendCount_XZ,sendbuf_XZ,Bq,N); + req1[11] = MPI_COMM_SCALBL.Isend(sendbuf_XZ, 2*sendCount_XZ,rank_XZ,sendtag); + req2[11] = MPI_COMM_SCALBL.Irecv(recvbuf_xz, 2*recvCount_xz,rank_xz,recvtag); + + //...Pack the yz edge (16)................................ + ScaLBL_D3Q19_Pack(16,dvcSendList_yz,0*sendCount_yz,sendCount_yz,sendbuf_yz,Aq,N); + ScaLBL_D3Q19_Pack(16,dvcSendList_yz,1*sendCount_yz,sendCount_yz,sendbuf_yz,Bq,N); + req1[14] = MPI_COMM_SCALBL.Isend(sendbuf_yz, 2*sendCount_yz,rank_yz,sendtag); + req2[14] = MPI_COMM_SCALBL.Irecv(recvbuf_YZ, 2*recvCount_YZ,rank_YZ,recvtag); + + //...Pack the yZ edge (18)................................ + ScaLBL_D3Q19_Pack(18,dvcSendList_yZ,0*sendCount_yZ,sendCount_yZ,sendbuf_yZ,Aq,N); + ScaLBL_D3Q19_Pack(18,dvcSendList_yZ,1*sendCount_yZ,sendCount_yZ,sendbuf_yZ,Bq,N); + req1[17] = MPI_COMM_SCALBL.Isend(sendbuf_yZ, 2*sendCount_yZ,rank_yZ,sendtag); + req2[17] = MPI_COMM_SCALBL.Irecv(recvbuf_Yz, 2*recvCount_Yz,rank_Yz,recvtag); + + //...Pack the Yz edge (17)................................ + ScaLBL_D3Q19_Pack(17,dvcSendList_Yz,0*sendCount_Yz,sendCount_Yz,sendbuf_Yz,Aq,N); + ScaLBL_D3Q19_Pack(17,dvcSendList_Yz,1*sendCount_Yz,sendCount_Yz,sendbuf_Yz,Bq,N); + req1[16] = MPI_COMM_SCALBL.Isend(sendbuf_Yz, 2*sendCount_Yz,rank_Yz,sendtag); + req2[16] = MPI_COMM_SCALBL.Irecv(recvbuf_yZ, 2*recvCount_yZ,rank_yZ,recvtag); + + //...Pack the YZ edge (15)................................ + ScaLBL_D3Q19_Pack(15,dvcSendList_YZ,0*sendCount_YZ,sendCount_YZ,sendbuf_YZ,Aq,N); + ScaLBL_D3Q19_Pack(15,dvcSendList_YZ,1*sendCount_YZ,sendCount_YZ,sendbuf_YZ,Bq,N); + req1[15] = MPI_COMM_SCALBL.Isend(sendbuf_YZ, 2*sendCount_YZ,rank_YZ,sendtag); + req2[15] = MPI_COMM_SCALBL.Irecv(recvbuf_yz, 2*recvCount_yz,rank_yz,recvtag); + //................................................................................... +} + +void ScaLBL_Communicator::BiRecvD3Q19AA(double *Aq, double *Bq){ + + // NOTE: the center distribution f0 must NOT be at the start of feven, provide offset to start of f2 + //................................................................................... + // Wait for completion of D3Q19 communication + MPI_COMM_SCALBL.waitAll(18,req1); + MPI_COMM_SCALBL.waitAll(18,req2); + ScaLBL_DeviceBarrier(); + + //................................................................................... + // NOTE: AA Routine writes to opposite + // Unpack the distributions on the device + //................................................................................... + //...Unpacking for x face(2,8,10,12,14)................................ + ScaLBL_D3Q19_Unpack(2, dvcRecvDist_x,0*recvCount_x,recvCount_x,recvbuf_x,Aq,N); + ScaLBL_D3Q19_Unpack(8, dvcRecvDist_x,1*recvCount_x,recvCount_x,recvbuf_x,Aq,N); + ScaLBL_D3Q19_Unpack(10,dvcRecvDist_x,2*recvCount_x,recvCount_x,recvbuf_x,Aq,N); + ScaLBL_D3Q19_Unpack(12,dvcRecvDist_x,3*recvCount_x,recvCount_x,recvbuf_x,Aq,N); + ScaLBL_D3Q19_Unpack(14,dvcRecvDist_x,4*recvCount_x,recvCount_x,recvbuf_x,Aq,N); + ScaLBL_D3Q19_Unpack(2, dvcRecvDist_x,0*recvCount_x,recvCount_x,&recvbuf_x[5*recvCount_x],Bq,N); + ScaLBL_D3Q19_Unpack(8, dvcRecvDist_x,1*recvCount_x,recvCount_x,&recvbuf_x[5*recvCount_x],Bq,N); + ScaLBL_D3Q19_Unpack(10,dvcRecvDist_x,2*recvCount_x,recvCount_x,&recvbuf_x[5*recvCount_x],Bq,N); + ScaLBL_D3Q19_Unpack(12,dvcRecvDist_x,3*recvCount_x,recvCount_x,&recvbuf_x[5*recvCount_x],Bq,N); + ScaLBL_D3Q19_Unpack(14,dvcRecvDist_x,4*recvCount_x,recvCount_x,&recvbuf_x[5*recvCount_x],Bq,N); + //................................................................................... + //...Packing for X face(1,7,9,11,13)................................ + ScaLBL_D3Q19_Unpack(1, dvcRecvDist_X,0*recvCount_X,recvCount_X,recvbuf_X,Aq,N); + ScaLBL_D3Q19_Unpack(7, dvcRecvDist_X,1*recvCount_X,recvCount_X,recvbuf_X,Aq,N); + ScaLBL_D3Q19_Unpack(9, dvcRecvDist_X,2*recvCount_X,recvCount_X,recvbuf_X,Aq,N); + ScaLBL_D3Q19_Unpack(11,dvcRecvDist_X,3*recvCount_X,recvCount_X,recvbuf_X,Aq,N); + ScaLBL_D3Q19_Unpack(13,dvcRecvDist_X,4*recvCount_X,recvCount_X,recvbuf_X,Aq,N); + ScaLBL_D3Q19_Unpack(1, dvcRecvDist_X,0*recvCount_X,recvCount_X,&recvbuf_X[5*recvCount_X],Bq,N); + ScaLBL_D3Q19_Unpack(7, dvcRecvDist_X,1*recvCount_X,recvCount_X,&recvbuf_X[5*recvCount_X],Bq,N); + ScaLBL_D3Q19_Unpack(9, dvcRecvDist_X,2*recvCount_X,recvCount_X,&recvbuf_X[5*recvCount_X],Bq,N); + ScaLBL_D3Q19_Unpack(11,dvcRecvDist_X,3*recvCount_X,recvCount_X,&recvbuf_X[5*recvCount_X],Bq,N); + ScaLBL_D3Q19_Unpack(13,dvcRecvDist_X,4*recvCount_X,recvCount_X,&recvbuf_X[5*recvCount_X],Bq,N); + //................................................................................... + //...Packing for y face(4,8,9,16,18)................................. + ScaLBL_D3Q19_Unpack(4, dvcRecvDist_y,0*recvCount_y,recvCount_y,recvbuf_y,Aq,N); + ScaLBL_D3Q19_Unpack(8, dvcRecvDist_y,1*recvCount_y,recvCount_y,recvbuf_y,Aq,N); + ScaLBL_D3Q19_Unpack(9, dvcRecvDist_y,2*recvCount_y,recvCount_y,recvbuf_y,Aq,N); + ScaLBL_D3Q19_Unpack(16,dvcRecvDist_y,3*recvCount_y,recvCount_y,recvbuf_y,Aq,N); + ScaLBL_D3Q19_Unpack(18,dvcRecvDist_y,4*recvCount_y,recvCount_y,recvbuf_y,Aq,N); + ScaLBL_D3Q19_Unpack(4, dvcRecvDist_y,0*recvCount_y,recvCount_y,&recvbuf_y[5*recvCount_y],Bq,N); + ScaLBL_D3Q19_Unpack(8, dvcRecvDist_y,1*recvCount_y,recvCount_y,&recvbuf_y[5*recvCount_y],Bq,N); + ScaLBL_D3Q19_Unpack(9, dvcRecvDist_y,2*recvCount_y,recvCount_y,&recvbuf_y[5*recvCount_y],Bq,N); + ScaLBL_D3Q19_Unpack(16,dvcRecvDist_y,3*recvCount_y,recvCount_y,&recvbuf_y[5*recvCount_y],Bq,N); + ScaLBL_D3Q19_Unpack(18,dvcRecvDist_y,4*recvCount_y,recvCount_y,&recvbuf_y[5*recvCount_y],Bq,N); + //................................................................................... + //...Packing for Y face(3,7,10,15,17)................................. + ScaLBL_D3Q19_Unpack(3, dvcRecvDist_Y,0*recvCount_Y,recvCount_Y,recvbuf_Y,Aq,N); + ScaLBL_D3Q19_Unpack(7, dvcRecvDist_Y,1*recvCount_Y,recvCount_Y,recvbuf_Y,Aq,N); + ScaLBL_D3Q19_Unpack(10,dvcRecvDist_Y,2*recvCount_Y,recvCount_Y,recvbuf_Y,Aq,N); + ScaLBL_D3Q19_Unpack(15,dvcRecvDist_Y,3*recvCount_Y,recvCount_Y,recvbuf_Y,Aq,N); + ScaLBL_D3Q19_Unpack(17,dvcRecvDist_Y,4*recvCount_Y,recvCount_Y,recvbuf_Y,Aq,N); + ScaLBL_D3Q19_Unpack(3, dvcRecvDist_Y,0*recvCount_Y,recvCount_Y,&recvbuf_Y[5*recvCount_Y],Bq,N); + ScaLBL_D3Q19_Unpack(7, dvcRecvDist_Y,1*recvCount_Y,recvCount_Y,&recvbuf_Y[5*recvCount_Y],Bq,N); + ScaLBL_D3Q19_Unpack(10,dvcRecvDist_Y,2*recvCount_Y,recvCount_Y,&recvbuf_Y[5*recvCount_Y],Bq,N); + ScaLBL_D3Q19_Unpack(15,dvcRecvDist_Y,3*recvCount_Y,recvCount_Y,&recvbuf_Y[5*recvCount_Y],Bq,N); + ScaLBL_D3Q19_Unpack(17,dvcRecvDist_Y,4*recvCount_Y,recvCount_Y,&recvbuf_Y[5*recvCount_Y],Bq,N); + //................................................................................... + + //...Pack the xy edge (8)................................ + ScaLBL_D3Q19_Unpack(8,dvcRecvDist_xy,0,recvCount_xy,recvbuf_xy,Aq,N); + ScaLBL_D3Q19_Unpack(8,dvcRecvDist_xy,0,recvCount_xy,&recvbuf_xy[recvCount_xy],Bq,N); + + //...Pack the Xy edge (9)................................ + ScaLBL_D3Q19_Unpack(9,dvcRecvDist_Xy,0,recvCount_Xy,recvbuf_Xy,Aq,N); + ScaLBL_D3Q19_Unpack(9,dvcRecvDist_Xy,0,recvCount_Xy,&recvbuf_Xy[recvCount_Xy],Bq,N); + + //...Pack the xY edge (10)................................ + ScaLBL_D3Q19_Unpack(10,dvcRecvDist_xY,0,recvCount_xY,recvbuf_xY,Aq,N); + ScaLBL_D3Q19_Unpack(10,dvcRecvDist_xY,0,recvCount_xY,&recvbuf_xY[recvCount_xY],Bq,N); + + //...Pack the XY edge (7)................................ + ScaLBL_D3Q19_Unpack(7,dvcRecvDist_XY,0,recvCount_XY,recvbuf_XY,Aq,N); + ScaLBL_D3Q19_Unpack(7,dvcRecvDist_XY,0,recvCount_XY,&recvbuf_XY[recvCount_XY],Bq,N); + + if (BoundaryCondition > 0 && kproc == 0){ + // don't unpack little z + //...Packing for Z face(5,11,14,15,18)................................ + ScaLBL_D3Q19_Unpack(5, dvcRecvDist_Z,0*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); + ScaLBL_D3Q19_Unpack(11,dvcRecvDist_Z,1*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); + ScaLBL_D3Q19_Unpack(14,dvcRecvDist_Z,2*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); + ScaLBL_D3Q19_Unpack(15,dvcRecvDist_Z,3*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); + ScaLBL_D3Q19_Unpack(18,dvcRecvDist_Z,4*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); + ScaLBL_D3Q19_Unpack(5, dvcRecvDist_Z,0*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); + ScaLBL_D3Q19_Unpack(11,dvcRecvDist_Z,1*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); + ScaLBL_D3Q19_Unpack(14,dvcRecvDist_Z,2*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); + ScaLBL_D3Q19_Unpack(15,dvcRecvDist_Z,3*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); + ScaLBL_D3Q19_Unpack(18,dvcRecvDist_Z,4*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); + //...Pack the xZ edge (14)................................ + ScaLBL_D3Q19_Unpack(14,dvcRecvDist_xZ,0,recvCount_xZ,recvbuf_xZ,Aq,N); + ScaLBL_D3Q19_Unpack(14,dvcRecvDist_xZ,0,recvCount_xZ,&recvbuf_xZ[recvCount_xZ],Bq,N); + //...Pack the XZ edge (11)................................ + ScaLBL_D3Q19_Unpack(11,dvcRecvDist_XZ,0,recvCount_XZ,recvbuf_XZ,Aq,N); + ScaLBL_D3Q19_Unpack(11,dvcRecvDist_XZ,0,recvCount_XZ,&recvbuf_XZ[recvCount_XZ],Bq,N); + //...Pack the yZ edge (18)................................ + ScaLBL_D3Q19_Unpack(18,dvcRecvDist_yZ,0,recvCount_yZ,recvbuf_yZ,Aq,N); + ScaLBL_D3Q19_Unpack(18,dvcRecvDist_yZ,0,recvCount_yZ,&recvbuf_yZ[recvCount_yZ],Bq,N); + //...Pack the YZ edge (15)................................ + ScaLBL_D3Q19_Unpack(15,dvcRecvDist_YZ,0,recvCount_YZ,recvbuf_YZ,Aq,N); + ScaLBL_D3Q19_Unpack(15,dvcRecvDist_YZ,0,recvCount_YZ,&recvbuf_YZ[recvCount_YZ],Bq,N); + } + else if (BoundaryCondition > 0 && kproc == nprocz-1){ + // don't unpack big Z + //...Packing for z face(6,12,13,16,17)................................ + ScaLBL_D3Q19_Unpack(6, dvcRecvDist_z,0*recvCount_z,recvCount_z,recvbuf_z,Aq,N); + ScaLBL_D3Q19_Unpack(12,dvcRecvDist_z,1*recvCount_z,recvCount_z,recvbuf_z,Aq,N); + ScaLBL_D3Q19_Unpack(13,dvcRecvDist_z,2*recvCount_z,recvCount_z,recvbuf_z,Aq,N); + ScaLBL_D3Q19_Unpack(16,dvcRecvDist_z,3*recvCount_z,recvCount_z,recvbuf_z,Aq,N); + ScaLBL_D3Q19_Unpack(17,dvcRecvDist_z,4*recvCount_z,recvCount_z,recvbuf_z,Aq,N); + ScaLBL_D3Q19_Unpack(6, dvcRecvDist_z,0*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); + ScaLBL_D3Q19_Unpack(12,dvcRecvDist_z,1*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); + ScaLBL_D3Q19_Unpack(13,dvcRecvDist_z,2*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); + ScaLBL_D3Q19_Unpack(16,dvcRecvDist_z,3*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); + ScaLBL_D3Q19_Unpack(17,dvcRecvDist_z,4*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); + //...Pack the xz edge (12)................................ + ScaLBL_D3Q19_Unpack(12,dvcRecvDist_xz,0,recvCount_xz,recvbuf_xz,Aq,N); + ScaLBL_D3Q19_Unpack(12,dvcRecvDist_xz,0,recvCount_xz,&recvbuf_xz[recvCount_xz],Bq,N); + //...Pack the Xz edge (13)................................ + ScaLBL_D3Q19_Unpack(13,dvcRecvDist_Xz,0,recvCount_Xz,recvbuf_Xz,Aq,N); + ScaLBL_D3Q19_Unpack(13,dvcRecvDist_Xz,0,recvCount_Xz,&recvbuf_Xz[recvCount_Xz],Bq,N); + //...Pack the yz edge (16)................................ + ScaLBL_D3Q19_Unpack(16,dvcRecvDist_yz,0,recvCount_yz,recvbuf_yz,Aq,N); + ScaLBL_D3Q19_Unpack(16,dvcRecvDist_yz,0,recvCount_yz,&recvbuf_yz[recvCount_yz],Bq,N); + //...Pack the Yz edge (17)................................ + ScaLBL_D3Q19_Unpack(17,dvcRecvDist_Yz,0,recvCount_Yz,recvbuf_Yz,Aq,N); + ScaLBL_D3Q19_Unpack(17,dvcRecvDist_Yz,0,recvCount_Yz,&recvbuf_Yz[recvCount_Yz],Bq,N); + } + else { + //...Packing for z face(6,12,13,16,17)................................ + ScaLBL_D3Q19_Unpack(6, dvcRecvDist_z,0*recvCount_z,recvCount_z,recvbuf_z,Aq,N); + ScaLBL_D3Q19_Unpack(12,dvcRecvDist_z,1*recvCount_z,recvCount_z,recvbuf_z,Aq,N); + ScaLBL_D3Q19_Unpack(13,dvcRecvDist_z,2*recvCount_z,recvCount_z,recvbuf_z,Aq,N); + ScaLBL_D3Q19_Unpack(16,dvcRecvDist_z,3*recvCount_z,recvCount_z,recvbuf_z,Aq,N); + ScaLBL_D3Q19_Unpack(17,dvcRecvDist_z,4*recvCount_z,recvCount_z,recvbuf_z,Aq,N); + ScaLBL_D3Q19_Unpack(6, dvcRecvDist_z,0*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); + ScaLBL_D3Q19_Unpack(12,dvcRecvDist_z,1*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); + ScaLBL_D3Q19_Unpack(13,dvcRecvDist_z,2*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); + ScaLBL_D3Q19_Unpack(16,dvcRecvDist_z,3*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); + ScaLBL_D3Q19_Unpack(17,dvcRecvDist_z,4*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); + //...Packing for Z face(5,11,14,15,18)................................ + ScaLBL_D3Q19_Unpack(5, dvcRecvDist_Z,0*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); + ScaLBL_D3Q19_Unpack(11,dvcRecvDist_Z,1*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); + ScaLBL_D3Q19_Unpack(14,dvcRecvDist_Z,2*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); + ScaLBL_D3Q19_Unpack(15,dvcRecvDist_Z,3*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); + ScaLBL_D3Q19_Unpack(18,dvcRecvDist_Z,4*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); + ScaLBL_D3Q19_Unpack(5, dvcRecvDist_Z,0*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); + ScaLBL_D3Q19_Unpack(11,dvcRecvDist_Z,1*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); + ScaLBL_D3Q19_Unpack(14,dvcRecvDist_Z,2*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); + ScaLBL_D3Q19_Unpack(15,dvcRecvDist_Z,3*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); + ScaLBL_D3Q19_Unpack(18,dvcRecvDist_Z,4*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); + //...Pack the xZ edge (14)................................ + ScaLBL_D3Q19_Unpack(14,dvcRecvDist_xZ,0,recvCount_xZ,recvbuf_xZ,Aq,N); + ScaLBL_D3Q19_Unpack(14,dvcRecvDist_xZ,0,recvCount_xZ,&recvbuf_xZ[recvCount_xZ],Bq,N); + //...Pack the XZ edge (11)................................ + ScaLBL_D3Q19_Unpack(11,dvcRecvDist_XZ,0,recvCount_XZ,recvbuf_XZ,Aq,N); + ScaLBL_D3Q19_Unpack(11,dvcRecvDist_XZ,0,recvCount_XZ,&recvbuf_XZ[recvCount_XZ],Bq,N); + //...Pack the yZ edge (18)................................ + ScaLBL_D3Q19_Unpack(18,dvcRecvDist_yZ,0,recvCount_yZ,recvbuf_yZ,Aq,N); + ScaLBL_D3Q19_Unpack(18,dvcRecvDist_yZ,0,recvCount_yZ,&recvbuf_yZ[recvCount_yZ],Bq,N); + //...Pack the YZ edge (15)................................ + ScaLBL_D3Q19_Unpack(15,dvcRecvDist_YZ,0,recvCount_YZ,recvbuf_YZ,Aq,N); + ScaLBL_D3Q19_Unpack(15,dvcRecvDist_YZ,0,recvCount_YZ,&recvbuf_YZ[recvCount_YZ],Bq,N); + //...Pack the xz edge (12)................................ + ScaLBL_D3Q19_Unpack(12,dvcRecvDist_xz,0,recvCount_xz,recvbuf_xz,Aq,N); + ScaLBL_D3Q19_Unpack(12,dvcRecvDist_xz,0,recvCount_xz,&recvbuf_xz[recvCount_xz],Bq,N); + //...Pack the Xz edge (13)................................ + ScaLBL_D3Q19_Unpack(13,dvcRecvDist_Xz,0,recvCount_Xz,recvbuf_Xz,Aq,N); + ScaLBL_D3Q19_Unpack(13,dvcRecvDist_Xz,0,recvCount_Xz,&recvbuf_Xz[recvCount_Xz],Bq,N); + //...Pack the yz edge (16)................................ + ScaLBL_D3Q19_Unpack(16,dvcRecvDist_yz,0,recvCount_yz,recvbuf_yz,Aq,N); + ScaLBL_D3Q19_Unpack(16,dvcRecvDist_yz,0,recvCount_yz,&recvbuf_yz[recvCount_yz],Bq,N); + //...Pack the Yz edge (17)................................ + ScaLBL_D3Q19_Unpack(17,dvcRecvDist_Yz,0,recvCount_Yz,recvbuf_Yz,Aq,N); + ScaLBL_D3Q19_Unpack(17,dvcRecvDist_Yz,0,recvCount_Yz,&recvbuf_Yz[recvCount_Yz],Bq,N); + } + + //................................................................................... + Lock=false; // unlock the communicator after communications complete + //................................................................................... + +} + void ScaLBL_Communicator::RecvGrad(double *phi, double *grad){ // Recieves halo and incorporates into D3Q19 based stencil gradient computation diff --git a/common/ScaLBL.h b/common/ScaLBL.h index 7ebeffa5..5220bed2 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -56,7 +56,7 @@ extern "C" void ScaLBL_D3Q19_AAeven_BGK(double *dist, int start, int finish, int extern "C" void ScaLBL_D3Q19_AAodd_BGK(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double Fx, double Fy, double Fz); -// GREYSCALE MODEL +// GREYSCALE MODEL (Single-component) extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *Dist, int Np, double Den); @@ -72,7 +72,7 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, int extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz, double *Poros,double *Perm, double *Velocity,double Den,double *Pressure); -// GREYSCALE COLOR MODEL +// GREYSCALE FREE-ENERGY MODEL (Two-component) extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFE(double *dist, double *Aq, double *Bq, double *Den, double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, @@ -116,6 +116,25 @@ extern "C" void ScaLBL_D3Q19_GreyscaleFE_Pressure(double *dist, double *Den, dou extern "C" void ScaLBL_D3Q19_GreyscaleFE_PressureTensor(int *neighborList, double *Phi,double *Pressure, double *PressTensor, double *PhiLap, double kappaA,double kappaB,double lambdaA,double lambdaB, int start, int finish, int Np); +// GREYSCALE SHAN-CHEN MODEL (Two-component) + +extern "C" void ScaLBL_D3Q19_GreyscaleSC_Init(double *distA, double *distB, double *Den, int Np); + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(int *NeighborList, double *distA, double *distB, double *Den, int start, int finish, int Np); + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(double *distA, double *distB, double *Den, int start, int finish, int Np); + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *distA, double *distB, double *Den, 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); + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB, double *Den, 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); + + // MRT MODEL extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_setA, double rlx_setB, double Fx, double Fy, double Fz); @@ -225,6 +244,8 @@ public: // void RecvD3Q19AA(double *f_even, double *f_odd); void SendD3Q19AA(double *dist); void RecvD3Q19AA(double *dist); + void BiSendD3Q19AA(double *Aq, double *Bq); + void BiRecvD3Q19AA(double *Aq, double *Bq); // void BiSendD3Q7(double *A_even, double *A_odd, double *B_even, double *B_odd); // void BiRecvD3Q7(double *A_even, double *A_odd, double *B_even, double *B_odd); void SendD3Q7AA(double *Aq); diff --git a/gpu/GreyscaleSC.cu b/gpu/GreyscaleSC.cu index a3fba989..6219d42f 100644 --- a/gpu/GreyscaleSC.cu +++ b/gpu/GreyscaleSC.cu @@ -3,1083 +3,41 @@ #define NBLOCKS 1024 #define NTHREADS 256 -__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity, double *Pressure){ - int n; - // conserved momemnts - double rho,vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure; - //double uu; - // non-conserved moments - double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; - double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) - double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - - int S = Np/NBLOCKS/NTHREADS + 1; - for (int s=0; s 10Np => odd part of dist) - f1 = dist[nr1]; // reading the f1 data into register fq - - nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) - f2 = dist[nr2]; // reading the f2 data into register fq - - // q=3 - nr3 = neighborList[n+2*Np]; // neighbor 4 - f3 = dist[nr3]; - - // q = 4 - nr4 = neighborList[n+3*Np]; // neighbor 3 - f4 = dist[nr4]; - - // q=5 - nr5 = neighborList[n+4*Np]; - f5 = dist[nr5]; - - // q = 6 - nr6 = neighborList[n+5*Np]; - f6 = dist[nr6]; - - // q=7 - nr7 = neighborList[n+6*Np]; - f7 = dist[nr7]; - - // q = 8 - nr8 = neighborList[n+7*Np]; - f8 = dist[nr8]; - - // q=9 - nr9 = neighborList[n+8*Np]; - f9 = dist[nr9]; - - // q = 10 - nr10 = neighborList[n+9*Np]; - f10 = dist[nr10]; - - // q=11 - nr11 = neighborList[n+10*Np]; - f11 = dist[nr11]; - - // q=12 - nr12 = neighborList[n+11*Np]; - f12 = dist[nr12]; - - // q=13 - nr13 = neighborList[n+12*Np]; - f13 = dist[nr13]; - - // q=14 - nr14 = neighborList[n+13*Np]; - f14 = dist[nr14]; - - // q=15 - nr15 = neighborList[n+14*Np]; - f15 = dist[nr15]; - - // q=16 - nr16 = neighborList[n+15*Np]; - f16 = dist[nr16]; - - // q=17 - //fq = dist[18*Np+n]; - nr17 = neighborList[n+16*Np]; - f17 = dist[nr17]; - - // q=18 - nr18 = neighborList[n+17*Np]; - f18 = dist[nr18]; - - porosity = Poros[n]; - perm = Perm[n]; - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - rho = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; - pressure = rho/porosity/3.0; - vx = (f1-f2+f7-f8+f9-f10+f11-f12+f13-f14)/rho+0.5*porosity*Gx; - vy = (f3-f4+f7-f8-f9+f10+f15-f16+f17-f18)/rho+0.5*porosity*Gy; - vz = (f5-f6+f11-f12-f13+f14+f15-f16-f17+f18)/rho+0.5*porosity*Gz; - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the body force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = -porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx; - Fy = -porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy; - Fz = -porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz; - if (porosity==1.0){ - Fx=Gx; - Fy=Gy; - Fz=Gz; - } - - //------------------------ BGK collison where body force has higher-order terms ----------------------------------------------------------// -// // q=0 -// dist[n] = f0*(1.0-rlx) + rlx*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// + 0.3333333333333333*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q = 1 -// dist[nr2] = f1*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q=2 -// dist[nr1] = f2*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(-3. + (6.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q = 3 -// dist[nr4] = f3*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q = 4 -// dist[nr3] = f4*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. + (6.*uy)/porosity) + Fz*(0. - (3.*uz)/porosity)); -// -// // q = 5 -// dist[nr6] = f5*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(3. + (6.*uz)/porosity)); -// -// // q = 6 -// dist[nr5] = f6*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) -// +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(0. - (3.*uy)/porosity) + Fz*(-3. + (6.*uz)/porosity)); -// -// // q = 7 -// dist[nr8] = f7*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(ux + uy))/porosity) + -// Fz*(0. - (3.*uz)/porosity)); -// -// // q = 8 -// dist[nr7] = f8*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uy))/porosity) + Fy*(-3. - (9.*(-ux - uy))/porosity - (3.*uy)/porosity) + -// Fz*(0. - (3.*uz)/porosity)); -// -// // q = 9 -// dist[nr10] = f9*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3. - (3.*ux)/porosity + (9.*(ux - uy))/porosity) + Fy*(-3. - (9.*(ux - uy))/porosity - (3.*uy)/porosity) + -// Fz*(0. - (3.*uz)/porosity)); -// -// // q = 10 -// dist[nr9] = f10*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uy))/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(-ux + uy))/porosity) + -// Fz*(0. - (3.*uz)/porosity)); -// -// // q = 11 -// dist[nr12] = f11*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux + uz))/porosity) + -// Fz*(3. - (3.*uz)/porosity + (9.*(ux + uz))/porosity)); -// -// // q = 12 -// dist[nr11] = f12*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux - uz))/porosity) + -// Fz*(-3. - (9.*(-ux - uz))/porosity - (3.*uz)/porosity)); -// -// // q = 13 -// dist[nr14] = f13*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(3. - (3.*ux)/porosity + (9.*(ux - uz))/porosity) + -// Fz*(-3. - (9.*(ux - uz))/porosity - (3.*uz)/porosity)); -// -// // q= 14 -// dist[nr13] = f14*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(0. - (3.*uy)/porosity) + Fx*(-3. - (3.*ux)/porosity - (9.*(-ux + uz))/porosity) + -// Fz*(3. - (3.*uz)/porosity + (9.*(-ux + uz))/porosity)); -// -// // q = 15 -// dist[nr16] = f15*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy + uz))/porosity) + -// Fz*(3. - (3.*uz)/porosity + (9.*(uy + uz))/porosity)); -// -// // q = 16 -// dist[nr15] = f16*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy - uz))/porosity) + -// Fz*(-3. - (9.*(-uy - uz))/porosity - (3.*uz)/porosity)); -// -// // q = 17 -// dist[nr18] = f17*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(3. - (3.*uy)/porosity + (9.*(uy - uz))/porosity) + -// Fz*(-3. - (9.*(uy - uz))/porosity - (3.*uz)/porosity)); -// -// // q = 18 -// dist[nr17] = f18*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) -// +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(0. - (3.*ux)/porosity) + Fy*(-3. - (3.*uy)/porosity - (9.*(-uy + uz))/porosity) + -// Fz*(3. - (3.*uz)/porosity + (9.*(-uy + uz))/porosity)); - //----------------------------------------------------------------------------------------------------------------------------------------// - - - //------------------------ BGK collison where body force has NO higher-order terms ----------------------------------------------------------// - // q=0 - dist[n] = f0*(1.0-rlx) + rlx*0.3333333333333333*rho*(1. - (1.5*(ux*ux + uy*uy + uz*uz))/porosity); - - // q = 1 - dist[nr2] = f1*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(3.)); - - // q=2 - dist[nr1] = f2*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*ux + (4.5*ux*ux)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fx*(-3.)); - - // q = 3 - dist[nr4] = f3*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fy*(3.)); - - // q = 4 - dist[nr3] = f4*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uy + (4.5*uy*uy)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fy*(-3.)); - - // q = 5 - dist[nr6] = f5*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 + 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fz*(3.)); - - // q = 6 - dist[nr5] = f6*(1.0-rlx) + rlx*0.05555555555555555*rho*(1 - 3.*uz + (4.5*uz*uz)/porosity - (1.5*(ux*ux+ uy*uy + uz*uz))/porosity) - +0.05555555555555555*rho*(1. - 0.5*rlx)*(Fz*(-3.)); - - // q = 7 - dist[nr8] = f7*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uy) + (4.5*(ux + uy)*(ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fy*(3.)); - - // q = 8 - dist[nr7] = f8*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uy) + (4.5*(-ux - uy)*(-ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fy*(-3.)); - - // q = 9 - dist[nr10] = f9*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uy) + (4.5*(ux - uy)*(ux - uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fy*(-3.)); - - // q = 10 - dist[nr9] = f10*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uy) + (4.5*(-ux + uy)*(-ux + uy))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fy*(3.)); - - // q = 11 - dist[nr12] = f11*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux + uz) + (4.5*(ux + uz)*(ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fz*(3.)); - - // q = 12 - dist[nr11] = f12*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux - uz) + (4.5*(-ux - uz)*(-ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fz*(-3.)); - - // q = 13 - dist[nr14] = f13*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(ux - uz) + (4.5*(ux - uz)*(ux - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(3.) + Fz*(-3.)); - - // q= 14 - dist[nr13] = f14*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-ux + uz) + (4.5*(-ux + uz)*(-ux + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fx*(-3.) + Fz*(3.)); - - // q = 15 - dist[nr16] = f15*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy + uz) + (4.5*(uy + uz)*(uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(3.) + Fz*(3.)); - - // q = 16 - dist[nr15] = f16*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy - uz) + (4.5*(-uy - uz)*(-uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(-3.) + Fz*(-3.)); - - // q = 17 - dist[nr18] = f17*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(uy - uz) + (4.5*(uy - uz)*(uy - uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(3.) + Fz*(-3.)); - - // q = 18 - dist[nr17] = f18*(1.0-rlx) + rlx*0.027777777777777776*rho*(1 + 3.*(-uy + uz) + (4.5*(-uy + uz)*(-uy + uz))/porosity - (1.5*(ux*ux + uy*uy + uz*uz))/porosity) - +0.027777777777777776*rho*(1. - 0.5*rlx)*(Fy*(-3.) + Fz*(3.)); - //-------------------------------------------------------------------------------------------------------------------------------------------// - - - //Update velocity on device - Velocity[0*Np+n] = ux; - Velocity[1*Np+n] = uy; - Velocity[2*Np+n] = uz; - //Update pressure on device - Pressure[n] = pressure; - } - } -} - -__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity, double Den, double *Pressure){ - - int n; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; - double fq; - //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; - double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) - double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double rlx_setA = rlx; - double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); - - const double mrt_V1=0.05263157894736842; - const double mrt_V2=0.012531328320802; - const double mrt_V3=0.04761904761904762; - const double mrt_V4=0.004594820384294068; - const double mrt_V5=0.01587301587301587; - const double mrt_V6=0.0555555555555555555555555; - const double mrt_V7=0.02777777777777778; - const double mrt_V8=0.08333333333333333; - const double mrt_V9=0.003341687552213868; - const double mrt_V10=0.003968253968253968; - const double mrt_V11=0.01388888888888889; - const double mrt_V12=0.04166666666666666; - - - int S = Np/NBLOCKS/NTHREADS + 1; - for (int s=0; s 10Np => odd part of dist) - fq = dist[nread]; // reading the f1 data into register fq - pressure = fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jx = fq; - m4 = -4.0*fq; - m9 = 2.0*fq; - m10 = -4.0*fq; + // q=1 + nread = neighborList[n]; // neighbor 2 + fq = distA[nread]; // reading the f1 data into register fq + rhoA_next += 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 = dist[nread]; // reading the f2 data into register fq - pressure += fq; - m1 -= 11.0*(fq); - m2 -= 4.0*(fq); - jx -= fq; - m4 += 4.0*(fq); - m9 += 2.0*(fq); - m10 -= 4.0*(fq); + // q=2 + nread = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = distA[nread]; // reading the f2 data into register fq + rhoA_next += 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 = dist[nread]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy = fq; - m6 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 = fq; - m12 = -2.0*fq; + // q=3 + nread = neighborList[n+2*Np]; // neighbor 4 + fq = distA[nread]; + rhoA_next += 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 = dist[nread]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy -= fq; - m6 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 += fq; - m12 -= 2.0*fq; + // q = 4 + nread = neighborList[n+3*Np]; // neighbor 3 + fq = distA[nread]; + rhoA_next += 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 = dist[nread]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz = fq; - m8 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; + // q=5 + nread = neighborList[n+4*Np]; + fq = distA[nread]; + rhoA_next += 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 = dist[nread]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz -= fq; - m8 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - // q=7 - nread = neighborList[n+6*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 = fq; - m16 = fq; - m17 = -fq; + // q = 6 + nread = neighborList[n+5*Np]; + fq = distA[nread]; + rhoA_next += 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 = 8 - nread = neighborList[n+7*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 += fq; - m16 -= fq; - m17 += fq; + // q=7 + nread = neighborList[n+6*Np]; + fq = distA[nread]; + rhoA_next += 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 = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 += fq; - m17 += fq; + // q = 8 + nread = neighborList[n+7*Np]; + fq = distA[nread]; + rhoA_next += 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 = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 -= fq; - m17 -= fq; + // q=9 + nread = neighborList[n+8*Np]; + fq = distA[nread]; + rhoA_next += 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 = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 = fq; - m16 -= fq; - m18 = fq; + // q = 10 + nread = neighborList[n+9*Np]; + fq = distA[nread]; + rhoA_next += 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=12 - nread = neighborList[n+11*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 += fq; - m16 += fq; - m18 -= fq; + // q=11 + nread = neighborList[n+10*Np]; + fq = distA[nread]; + rhoA_next += 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 = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 -= fq; - m18 -= fq; + // q=12 + nread = neighborList[n+11*Np]; + fq = distA[nread]; + rhoA_next += 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 = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 += fq; - m18 += fq; + // q=13 + nread = neighborList[n+12*Np]; + fq = distA[nread]; + rhoA_next += 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 = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 = fq; - m17 += fq; - m18 -= fq; + // q=14 + nread = neighborList[n+13*Np]; + fq = distA[nread]; + rhoA_next += 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=16 - nread = neighborList[n+15*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 += fq; - m17 -= fq; - m18 += fq; + // q=15 + nread = neighborList[n+14*Np]; + fq = distA[nread]; + rhoA_next += 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 = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 += fq; - m18 += fq; + // q=16 + nread = neighborList[n+15*Np]; + fq = distA[nread]; + rhoA_next += 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 = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 -= fq; - m18 -= fq; + // q=17 + nread = neighborList[n+16*Np]; + fq = distA[nread]; + rhoA_next += 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_next += 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; //---------------------------------------------------------------------// - porosity = Poros[n]; - perm = Perm[n]; + // ------------------- Fluid component B ---------------------------------// + //........................................................................ + // READ THE DISTRIBUTIONS + // (read from opposite array due to previous swap operation) + //........................................................................ + // q=0 + fq = distB[n]; + rhoB_next = fq; + m1B = -30.0*fq; + m2B = 12.0*fq; - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + // q=1 + nread = neighborList[n]; // neighbor 2 + fq = distB[nread]; // reading the f1 data into register fq + rhoB_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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_next += 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*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 -----------------------// + 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(perm); + //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 = jx/Den+0.5*porosity*Gx; - vy = jy/Den+0.5*porosity*Gy; - vz = jz/Den+0.5*porosity*Gz; + vx = jxA/rhoA_next+0.5*(porosity*Gx+GffA_x+GfsA_x); + vy = jyA/rhoA_next+0.5*(porosity*Gy+GffA_y+GfsA_y); + vz = jzA/rhoA_next+0.5*(porosity*Gz+GffA_z+GfsA_z); v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); + 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 - Fx = Den*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx); - Fy = Den*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy); - Fz = Den*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz); + 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){ - Fx=Den*Gx; - Fy=Den*Gy; - Fz=Den*Gz; + 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 + 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_next+0.5*(porosity*Gx+GffB_x+GfsB_x); + vy = jyB/rhoB_next+0.5*(porosity*Gy+GffB_y+GfsB_y); + vz = jzB/rhoB_next+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 pressure for Incompressible-MRT model - pressure=0.5/porosity*(pressure-0.5*Den*u_mag*u_mag/porosity); + // Calculate barycentric velocity of the fluid mixture + ux = (rhoA_next*ux_A+rhoB_next*ux_B)/(rhoA_next+rhoB_next); + uy = (rhoA_next*uy_A+rhoB_next*uy_B)/(rhoA_next+rhoB_next); + uz = (rhoA_next*uz_A+rhoB_next*uz_B)/(rhoA_next+rhoB_next); // //..............carry out relaxation process............................................... // m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) @@ -1457,140 +770,1428 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double // m18 = m18 + rlx_setB*( - m18); // //....................................................................................................... - //-------------------- IMRT collison where body force has NO higher-order terms -------------// + // ------------------- 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............................................... - m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*uy*Den) - m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*uz*Den) - m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); - m10 = m10 + rlx_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA*((Den*(uy*uy-uz*uz)/porosity) - m11); - m12 = m12 + rlx_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA*((Den*ux*uy/porosity) - m13); - m14 = m14 + rlx_setA*((Den*uy*uz/porosity) - m14); - m15 = m15 + rlx_setA*((Den*ux*uz/porosity) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); + //TODO need to incoporate porosity + m1A = m1A + rlx_setA*((19*rhoA_next*(ux*ux+uy*uy+uz*uz) - 11*rhoA_next) - m1A) + + (1-0.5*rlx_setA)*38*(FxA*ux+FyA*uy+FzA*uz); + m2A = m2A + rlx_setA*((3*rhoA_next - 5.5*rhoA_next*(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_next)- m4A) + + (1-0.5*rlx_setB)*(-0.6666666666666666*FxA); + jyA = jyA + FyA; + m6A = m6A + rlx_setB*((-0.6666666666666666*uy*rhoA_next)- m6A) + + (1-0.5*rlx_setB)*(-0.6666666666666666*FyA); + jzA = jzA + FzA; + m8A = m8A + rlx_setB*((-0.6666666666666666*uz*rhoA_next)- m8A) + + (1-0.5*rlx_setB)*(-0.6666666666666666*FzA); + m9A = m9A + rlx_setA*((rhoA_next*(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); + m11A = m11A + rlx_setA*((rhoA_next*(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); + m13A = m13A + rlx_setA*( rhoA_next*(ux*uy) - m13A) + + (1-0.5*rlx_setA)*(FyA*ux+FxA*uy); + m14A = m14A + rlx_setA*( rhoA_next*(uy*uz) - m14A); + + (1-0.5*rlx_setA)*(FzA*uy+FyA*uz); + m15A = m15A + rlx_setA*( rhoA_next*(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*Den-mrt_V2*m1+mrt_V3*m2; - dist[n] = fq; + //fq = mrt_V1*rhoA_next-mrt_V2*m1A+mrt_V3*m2A; + f0 = mrt_V1*rhoA_next-mrt_V2*m1A+mrt_V3*m2A; + distA[n] = f0; // q = 1 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A); + f1 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A); nread = neighborList[n+Np]; - dist[nread] = fq; + distA[nread] = f1; // q=2 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A); + f2 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A); nread = neighborList[n]; - dist[nread] = fq; + distA[nread] = f2; // q = 3 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jyA-m6A)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); + f3 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jyA-m6A)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); nread = neighborList[n+3*Np]; - dist[nread] = fq; + distA[nread] = f3; // q = 4 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m6A-jyA)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); + f4 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m6A-jyA)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); nread = neighborList[n+2*Np]; - dist[nread] = fq; + distA[nread] = f4; // q = 5 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jzA-m8A)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); + f5 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jzA-m8A)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); nread = neighborList[n+5*Np]; - dist[nread] = fq; + distA[nread] = f5; // q = 6 - fq = mrt_V1*Den-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m8A-jzA)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); + f6 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m8A-jzA)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); nread = neighborList[n+4*Np]; - dist[nread] = fq; + distA[nread] = f6; // q = 7 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + //fq = mrt_V1*rhoA_next+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); + f7 = mrt_V1*rhoA_next+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]; - dist[nread] = fq; + distA[nread] = f7; // q = 8 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); + //fq = mrt_V1*rhoA_next+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); + f8 = mrt_V1*rhoA_next+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]; - dist[nread] = fq; + distA[nread] = f8; // q = 9 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + //fq = mrt_V1*rhoA_next+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); + f9 = mrt_V1*rhoA_next+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]; - dist[nread] = fq; + distA[nread] = f9; // q = 10 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + //fq = mrt_V1*rhoA_next+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); + f10 = mrt_V1*rhoA_next+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]; - dist[nread] = fq; + distA[nread] = f10; // q = 11 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); + //fq = mrt_V1*rhoA_next+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); + f11 = mrt_V1*rhoA_next+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]; - dist[nread] = fq; + distA[nread] = f11; // q = 12 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + //fq = mrt_V1*rhoA_next+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); + f12 = mrt_V1*rhoA_next+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]; - dist[nread]= fq; + distA[nread]= f12; // q = 13 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); + //fq = mrt_V1*rhoA_next+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); + f13 = mrt_V1*rhoA_next+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]; - dist[nread] = fq; + distA[nread] = f13; // q= 14 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); + //fq = mrt_V1*rhoA_next+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); + f14 = mrt_V1*rhoA_next+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]; - dist[nread] = fq; + distA[nread] = f14; // q = 15 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + //fq = mrt_V1*rhoA_next+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); + f15 = mrt_V1*rhoA_next+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]; - dist[nread] = fq; + distA[nread] = f15; // q = 16 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + //fq = mrt_V1*rhoA_next+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); + f16 = mrt_V1*rhoA_next+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]; - dist[nread] = fq; + distA[nread] = f16; // q = 17 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + //fq = mrt_V1*rhoA_next+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); + f17 = mrt_V1*rhoA_next+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]; - dist[nread] = fq; + distA[nread] = f17; // q = 18 - fq = mrt_V1*Den+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + //fq = mrt_V1*rhoA_next+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); + f18 = mrt_V1*rhoA_next+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]; - dist[nread] = fq; + distA[nread] = f18; //........................................................................ + + Den[n] = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; + + +// //..............carry out relaxation process............................................... +// m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; +// m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; +// jx = jx + Fx; +// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +// jy = jy + Fy; +// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*Den) - m6) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +// jz = jz + Fz; +// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*Den) - m8) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +// m9 = m9 + rlx_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) +// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; +// m10 = m10 + rlx_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) +// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; +// m11 = m11 + rlx_setA*((Den*(uy*uy-uz*uz)/porosity) - m11) +// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; +// m12 = m12 + rlx_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12) +// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; +// m13 = m13 + rlx_setA*((Den*ux*uy/porosity) - m13) +// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; +// m14 = m14 + rlx_setA*((Den*uy*uz/porosity) - m14) +// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; +// m15 = m15 + rlx_setA*((Den*ux*uz/porosity) - m15) +// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); +// //....................................................................................................... + + // ------------------- 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_next*(ux*ux+uy*uy+uz*uz) - 11*rhoB_next) - m1B) + + (1-0.5*rlx_setA)*38*(FxB*ux+FyB*uy+FzB*uz); + m2B = m2B + rlx_setA*((3*rhoB_next - 5.5*rhoB_next*(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_next)- m4B) + + (1-0.5*rlx_setB)*(-0.6666666666666666*FxB); + jyB = jyB + FyB; + m6B = m6B + rlx_setB*((-0.6666666666666666*uy*rhoB_next)- m6B) + + (1-0.5*rlx_setB)*(-0.6666666666666666*FyB); + jzB = jzB + FzB; + m8B = m8B + rlx_setB*((-0.6666666666666666*uz*rhoB_next)- m8B) + + (1-0.5*rlx_setB)*(-0.6666666666666666*FzB); + m9B = m9B + rlx_setA*((rhoB_next*(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); + m11B = m11B + rlx_setA*((rhoB_next*(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); + m13B = m13B + rlx_setA*( rhoB_next*(ux*uy) - m13B) + + (1-0.5*rlx_setA)*(FyB*ux+FxB*uy); + m14B = m14B + rlx_setA*( rhoB_next*(uy*uz) - m14B) + + (1-0.5*rlx_setA)*(FzB*uy+FyB*uz); + m15B = m15B + rlx_setA*( rhoB_next*(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_next-mrt_V2*m1B+mrt_V3*m2B; + f0 = mrt_V1*rhoB_next-mrt_V2*m1B+mrt_V3*m2B; + distB[n] = f0; + + // q = 1 + //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B); + f1 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B); + nread = neighborList[n+Np]; + distB[nread] = f1; + + // q=2 + //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B); + f2 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B); + nread = neighborList[n]; + distB[nread] = f2; + + // q = 3 + //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jyB-m6B)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); + f3 = mrt_V1*rhoB_next-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] = f3; + + // q = 4 + //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m6B-jyB)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); + f4 = mrt_V1*rhoB_next-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] = f4; + + // q = 5 + //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jzB-m8B)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); + f5 = mrt_V1*rhoB_next-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] = f5; + + // q = 6 + //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m8B-jzB)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); + f6 = mrt_V1*rhoB_next-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] = f6; + + // q = 7 + //fq = mrt_V1*rhoB_next+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); + f7 = mrt_V1*rhoB_next+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] = f7; + + // q = 8 + //fq = mrt_V1*rhoB_next+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); + f8 = mrt_V1*rhoB_next+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] = f8; + + // q = 9 + //fq = mrt_V1*rhoB_next+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); + f9 = mrt_V1*rhoB_next+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] = f9; + + // q = 10 + //fq = mrt_V1*rhoB_next+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); + f10 = mrt_V1*rhoB_next+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] = f10; + + // q = 11 + //fq = mrt_V1*rhoB_next+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); + f11 = mrt_V1*rhoB_next+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] = f11; + + // q = 12 + //fq = mrt_V1*rhoB_next+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); + f12 = mrt_V1*rhoB_next+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]= f12; + + // q = 13 + //fq = mrt_V1*rhoB_next+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); + f13 = mrt_V1*rhoB_next+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] = f13; + + // q= 14 + //fq = mrt_V1*rhoB_next+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); + f14 = mrt_V1*rhoB_next+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] = f14; + + // q = 15 + //fq = mrt_V1*rhoB_next+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); + f15 = mrt_V1*rhoB_next+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] = f15; + + // q = 16 + //fq = mrt_V1*rhoB_next+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); + f16 = mrt_V1*rhoB_next+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] = f16; + + // q = 17 + //fq = mrt_V1*rhoB_next+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); + f17 = mrt_V1*rhoB_next+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] = f17; + + // q = 18 + //fq = mrt_V1*rhoB_next+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); + f18 = mrt_V1*rhoB_next+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] = f18; + //........................................................................ + + Den[n+Np] = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; + //Update velocity on device Velocity[0*Np+n] = ux; Velocity[1*Np+n] = uy; Velocity[2*Np+n] = uz; //Update pressure on device - Pressure[n] = pressure; + Pressure[n] = (rhoA_next+rhoB_next+Gsc*rhoA_next*rhoB_next)/3.0; + //Update density + //Den[n] = rhoA_next; + //Den[n+Np] = rhoB_next; } } } -__global__ void dvc_ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den) +__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB, double *Den, 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; + 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 rhoA_next,rhoB_next; + // 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 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; + + const double mrt_V1=0.05263157894736842; + const double mrt_V2=0.012531328320802; + const double mrt_V3=0.04761904761904762; + const double mrt_V4=0.004594820384294068; + const double mrt_V5=0.01587301587301587; + const double mrt_V6=0.0555555555555555555555555; + const double mrt_V7=0.02777777777777778; + const double mrt_V8=0.08333333333333333; + const double mrt_V9=0.003341687552213868; + const double mrt_V10=0.003968253968253968; + const double mrt_V11=0.01388888888888889; + const double mrt_V12=0.04166666666666666; + + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s>>(dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Pressure); + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s>>(neighborList,dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Pressure); + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s>>(dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Den,Pressure); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAeven_Greyscale_IMRT: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double Den,double *Pressure){ - - dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT<<>>(neighborList,dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,Den,Pressure); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAodd_Greyscale_IMRT: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den){ - dvc_ScaLBL_D3Q19_GreyIMRT_Init<<>>(dist, Np, Den); +extern "C" void ScaLBL_D3Q19_GreyscaleSC_Init(double *distA,double *distB, double *Den, int Np){ + dvc_ScaLBL_D3Q19_GreyscaleSC_Init<<>>(distA,distB,Den,Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyIMRT_Init: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q19_GreyscaleSC_Init: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(int *NeighborList, double *distA, double *distB, double *Den, int start, int finish, int Np){ + + dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_Density<<>>(NeighborList, distA, distB, Den, start, finish, Np); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleSC_Density: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(double *distA, double *distB, double *Den, int start, int finish, int Np){ + + dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_Density<<>>(distA, distB, Den, start, finish, Np); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleSC_Density: %s \n",cudaGetErrorString(err)); + } +} + + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *distA, double *distB, double *Den, 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){ + + dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC<<>>(neighborList,distA,distB,Den,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, + tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleSC: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB, double *Den, 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){ + + dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC<<>>(distA,distB,Den,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, + tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleSC: %s \n",cudaGetErrorString(err)); } } diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp index 08cf09b5..da5d08e3 100644 --- a/models/GreyscaleSCModel.cpp +++ b/models/GreyscaleSCModel.cpp @@ -1,7 +1,7 @@ /* Greyscale lattice boltzmann model */ -#include "models/GreyscaleModel.h" +#include "models/GreyscaleSCModel.h" #include "analysis/distance.h" #include "analysis/morphology.h" #include @@ -13,76 +13,84 @@ void DeleteArray( const TYPE *p ) delete [] p; } -ScaLBL_GreyscaleModel::ScaLBL_GreyscaleModel(int RANK, int NP, MPI_Comm COMM): -rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tau(0),tau_eff(0),Den(0),Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),GreyPorosity(0), +ScaLBL_GreyscaleSCModel::ScaLBL_GreyscaleSCModel(int RANK, int NP, MPI_Comm COMM): +rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0),Gsc(0), +rhoA(0),rhoB(0),rhoA_minor(0),rhoB_minor(0),Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),GreyPorosity(0), Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) { SignDist.resize(Nx,Ny,Nz); SignDist.fill(0); } -ScaLBL_GreyscaleModel::~ScaLBL_GreyscaleModel(){ +ScaLBL_GreyscaleSCModel::~ScaLBL_GreyscaleSCModel(){ } -void ScaLBL_GreyscaleModel::ReadParams(string filename){ +void ScaLBL_GreyscaleSCModel::ReadParams(string filename){ // read the input database db = std::make_shared( filename ); domain_db = db->getDatabase( "Domain" ); - greyscale_db = db->getDatabase( "Greyscale" ); + greyscaleSC_db = db->getDatabase( "GreyscaleSC" ); analysis_db = db->getDatabase( "Analysis" ); vis_db = db->getDatabase( "Visualization" ); // set defaults timestepMax = 100000; - tau = 1.0; - tau_eff = tau; - Den = 1.0;//constant density + tauA = 1.0; + tauB = 1.0; + tauA_eff = tauA; + tauB_eff = tauB; + rhoA = rhoB = 1.0; + rhoA_minor = rhoB_minor = 0.01;//dissolved density + Gsc = 2.0;//SC fluid-fluid interaction coefficient tolerance = 0.01; Fx = Fy = Fz = 0.0; Restart=false; din=dout=1.0; flux=0.0; dp = 10.0; //unit of 'dp': voxel - CollisionType = 1; //1: IMRT; 2: BGK // ---------------------- Greyscale Model parameters -----------------------// - if (greyscale_db->keyExists( "timestepMax" )){ - timestepMax = greyscale_db->getScalar( "timestepMax" ); + if (greyscaleSC_db->keyExists( "timestepMax" )){ + timestepMax = greyscaleSC_db->getScalar( "timestepMax" ); } - if (greyscale_db->keyExists( "tau" )){ - tau = greyscale_db->getScalar( "tau" ); + if (greyscaleSC_db->keyExists( "tauA" )){ + tauA = greyscaleSC_db->getScalar( "tauA" ); } - tau_eff = greyscale_db->getWithDefault( "tau_eff", tau ); - if (greyscale_db->keyExists( "Den" )){ - Den = greyscale_db->getScalar( "Den" ); + if (greyscaleSC_db->keyExists( "tauB" )){ + tauB = greyscaleSC_db->getScalar( "tauB" ); } - if (greyscale_db->keyExists( "dp" )){ - dp = greyscale_db->getScalar( "dp" ); + tauA_eff = greyscaleSC_db->getWithDefault( "tauA_eff", tauA ); + tauB_eff = greyscaleSC_db->getWithDefault( "tauB_eff", tauB ); + rhoA = greyscaleSC_db->getWithDefault( "rhoA", rhoA ); + rhoB = greyscaleSC_db->getWithDefault( "rhoB", rhoB ); + rhoA_minor = greyscaleSC_db->getWithDefault( "rhoA_minor", rhoA_minor ); + rhoB_minor = greyscaleSC_db->getWithDefault( "rhoB_minor", rhoB_minor ); + if (greyscaleSC_db->keyExists( "Gsc" )){ + Gsc = greyscaleSC_db->getScalar( "Gsc" ); } - if (greyscale_db->keyExists( "F" )){ - Fx = greyscale_db->getVector( "F" )[0]; - Fy = greyscale_db->getVector( "F" )[1]; - Fz = greyscale_db->getVector( "F" )[2]; + if (greyscaleSC_db->keyExists( "dp" )){ + dp = greyscaleSC_db->getScalar( "dp" ); } - if (greyscale_db->keyExists( "Restart" )){ - Restart = greyscale_db->getScalar( "Restart" ); + if (greyscaleSC_db->keyExists( "F" )){ + Fx = greyscaleSC_db->getVector( "F" )[0]; + Fy = greyscaleSC_db->getVector( "F" )[1]; + Fz = greyscaleSC_db->getVector( "F" )[2]; } - if (greyscale_db->keyExists( "din" )){ - din = greyscale_db->getScalar( "din" ); + if (greyscaleSC_db->keyExists( "Restart" )){ + Restart = greyscaleSC_db->getScalar( "Restart" ); } - if (greyscale_db->keyExists( "dout" )){ - dout = greyscale_db->getScalar( "dout" ); + if (greyscaleSC_db->keyExists( "din" )){ + din = greyscaleSC_db->getScalar( "din" ); } - if (greyscale_db->keyExists( "flux" )){ - flux = greyscale_db->getScalar( "flux" ); + if (greyscaleSC_db->keyExists( "dout" )){ + dout = greyscaleSC_db->getScalar( "dout" ); } - if (greyscale_db->keyExists( "tolerance" )){ - tolerance = greyscale_db->getScalar( "tolerance" ); + if (greyscaleSC_db->keyExists( "flux" )){ + flux = greyscaleSC_db->getScalar( "flux" ); } - auto collision = greyscale_db->getWithDefault( "collision", "IMRT" ); - if (collision == "BGK"){ - CollisionType=2; + if (greyscaleSC_db->keyExists( "tolerance" )){ + tolerance = greyscaleSC_db->getScalar( "tolerance" ); } // ------------------------------------------------------------------------// @@ -94,7 +102,7 @@ void ScaLBL_GreyscaleModel::ReadParams(string filename){ // ------------------------------------------------------------------------// } -void ScaLBL_GreyscaleModel::SetDomain(){ +void ScaLBL_GreyscaleSCModel::SetDomain(){ Dm = std::shared_ptr(new Domain(domain_db,comm)); // full domain for analysis Mask = std::shared_ptr(new Domain(domain_db,comm)); // mask domain removes immobile phases // domain parameters @@ -125,7 +133,7 @@ void ScaLBL_GreyscaleModel::SetDomain(){ nprocz = Dm->nprocz(); } -void ScaLBL_GreyscaleModel::ReadInput(){ +void ScaLBL_GreyscaleSCModel::ReadInput(){ sprintf(LocalRankString,"%05d",rank); sprintf(LocalRankFilename,"%s%s","ID.",LocalRankString); @@ -174,44 +182,65 @@ void ScaLBL_GreyscaleModel::ReadInput(){ if (rank == 0) cout << "Domain set." << endl; } -/******************************************************** - * AssignComponentLabels * - ********************************************************/ -void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, double *Permeability) +void ScaLBL_GreyscaleSCModel::AssignGreyscaleAndSolidLabels() { + + double *Poros, *Perm; + Poros = new double[Np]; + Perm = new double[Np]; + double *SolidPotentialA_host = new double [Nx*Ny*Nz]; + double *SolidPotentialB_host = new double [Nx*Ny*Nz]; + double *SolidForceA_host = new double[3*Np]; + double *SolidForceB_host = new double[3*Np]; + size_t NLABELS=0; signed char VALUE=0; double POROSITY=0.f; double PERMEABILITY=0.f; + double AFFINITY_A=0.f; + double AFFINITY_B=0.f; - auto LabelList = greyscale_db->getVector( "ComponentLabels" ); - auto PorosityList = greyscale_db->getVector( "PorosityList" ); - auto PermeabilityList = greyscale_db->getVector( "PermeabilityList" ); + auto PorosityList = greyscaleSC_db->getVector( "PorosityList" ); + auto PermeabilityList = greyscaleSC_db->getVector( "PermeabilityList" ); + auto LabelList = greyscaleSC_db->getVector( "ComponentLabels" ); + auto AffinityListA = greyscaleSC_db->getVector( "ComponentAffinityA" ); + auto AffinityListB = greyscaleSC_db->getVector( "ComponentAffinityB" ); + + //1. Requirement for "ComponentLabels": + // *labels can be a nagative integer, 0, 1, 2, or a positive integer >= 3 + // *label = 1 and 2 are reserved for NW and W phase respectively. + //2. Requirement for "ComponentAffinity": + // *should be in the same length as "ComponentLabels" + // *could leave ComponentAffinityA and B=0.0 for label=1 and 2 + //3. Requirement for "PorosityList": + // *for ComponentLables <=0, put porosity value = 0.0; + // *for ComponentLabels >=3, put the corresponding sub-resolution porosity + // *for ComponentLabels =1, 2, put porosity=1 (or if users accidentally put other values it should still be fine) + //4. Requirement for "PermeabilityList": + // *for ComponentLabels <=2, does not matter, can leave it as 1.0 NLABELS=LabelList.size(); - if (NLABELS != PorosityList.size()){ - ERROR("Error: ComponentLabels and PorosityList must be the same length! \n"); + if (NLABELS != PorosityList.size() || NLABELS != PermeabilityList.size() || NLABELS != AffinityListA.size() || NLABELS != AffinityListB.size() ){ + ERROR("Error: ComponentLabels, ComponentAffinityA/B, PorosityList and PermeabilityList must all be the same length! \n"); } double label_count[NLABELS]; double label_count_global[NLABELS]; - // Assign the labels for (int idx=0; idx 0, i.e. open or grey nodes + //For node_ID <= 0: these are solid nodes of various wettability for (int k=0;k0) && (VALUE == LabelList[idx])){ POROSITY=PorosityList[idx]; label_count[idx] += 1.0; idx = NLABELS; - //Mask->id[n] = 0; // set mask to zero since this is an immobile component } } int idx = Map(i,j,k); @@ -220,16 +249,15 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, double *Perm ERROR("Error: Porosity for grey voxels must be 0.0 < Porosity <= 1.0 !\n"); } else{ - Porosity[idx] = POROSITY; + Poros[idx] = POROSITY; } } } } } - if (NLABELS != PermeabilityList.size()){ - ERROR("Error: ComponentLabels and PermeabilityList must be the same length! \n"); - } + //Populate the permeability map, NOTE only for node_ID > 0, i.e. open or grey nodes + //For node_ID <= 0: these are solid nodes of various wettability for (int k=0;k0) && (VALUE == LabelList[idx])){ PERMEABILITY=PermeabilityList[idx]; idx = NLABELS; //Mask->id[n] = 0; // set mask to zero since this is an immobile component @@ -250,13 +278,150 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, double *Perm ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); } else{ - Permeability[idx] = PERMEABILITY/Dm->voxel_length/Dm->voxel_length; + Perm[idx] = PERMEABILITY/Dm->voxel_length/Dm->voxel_length; } } } } } + //Populate the solid potential map, for ALL range of node_ID except node = 1,2, i.e. NW and W phase + for (int k=0;k=3){ + AFFINITY_A=AffinityListA[idx]*(1.0-PorosityList[idx]);//BE CAREFUL! Requires for node_ID<=0, user puts porosity=0.0 + AFFINITY_B=AffinityListB[idx]*(1.0-PorosityList[idx]);//BE CAREFUL! Requires for node_ID<=0, user puts porosity=0.0 + } + else{//i.e. label = 1 or 2 + AFFINITY_A=0.0; + AFFINITY_B=0.0; + } + idx = NLABELS; + } + } + //NOTE: node_ID = 1 and 2 are reserved + if ((VALUE == 1)||(VALUE == 2)){ + AFFINITY_A=0.0;//NOTE: still need this as users may forget to put label=1,2 in ComponentLabelLists + AFFINITY_B=0.0;//NOTE: still need this as users may forget to put label=1,2 in ComponentLabelLists + } + SolidPotentialA_host[n] = AFFINITY_A; + SolidPotentialB_host[n] = AFFINITY_B; + } + } + } + + // Calculate Shan-Chen fluid-solid forces + double *Dst; + Dst = new double [3*3*3]; + for (int kk=0; kk<3; kk++){ + for (int jj=0; jj<3; jj++){ + for (int ii=0; ii<3; ii++){ + int index = kk*9+jj*3+ii; + Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); + } + } + } + double w_face = 1.f/18.f; + double w_edge = 1.f/36.f; + double w_corner = 0.f; + //local + Dst[13] = 0.f; + //faces + Dst[4] = w_face; + Dst[10] = w_face; + Dst[12] = w_face; + Dst[14] = w_face; + Dst[16] = w_face; + Dst[22] = w_face; + // corners + Dst[0] = w_corner; + Dst[2] = w_corner; + Dst[6] = w_corner; + Dst[8] = w_corner; + Dst[18] = w_corner; + Dst[20] = w_corner; + Dst[24] = w_corner; + Dst[26] = w_corner; + // edges + Dst[1] = w_edge; + Dst[3] = w_edge; + Dst[5] = w_edge; + Dst[7] = w_edge; + Dst[9] = w_edge; + Dst[11] = w_edge; + Dst[15] = w_edge; + Dst[17] = w_edge; + Dst[19] = w_edge; + Dst[21] = w_edge; + Dst[23] = w_edge; + Dst[25] = w_edge; + + for (int k=1; kid[nn] <= 0)||(Mask->id[nn]>=3)){ + double vec_x = double(ii-1); + double vec_y = double(jj-1); + double vec_z = double(kk-1); + double GWNS_A=SolidPotentialA_host[nn]; + double GWNS_B=SolidPotentialB_host[nn]; + phi_x_A += GWNS_A*weight*vec_x; + phi_y_A += GWNS_A*weight*vec_y; + phi_z_A += GWNS_A*weight*vec_z; + phi_x_B += GWNS_B*weight*vec_x; + phi_y_B += GWNS_B*weight*vec_y; + phi_z_B += GWNS_B*weight*vec_z; + } + } + } + } + SolidForceA_host[idx+0*Np] = phi_x_A; + SolidForceA_host[idx+1*Np] = phi_y_A; + SolidForceA_host[idx+2*Np] = phi_z_A; + SolidForceB_host[idx+0*Np] = phi_x_B; + SolidForceB_host[idx+1*Np] = phi_y_B; + SolidForceB_host[idx+2*Np] = phi_z_B; + } + } + } + } // Set Dm to match Mask for (int i=0; iid[i] = Mask->id[i]; @@ -284,10 +449,98 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, double *Perm } printf("The weighted porosity, considering both open and grey voxels, is %.3g\n",GreyPorosity); } + + //Copy all data to device + ScaLBL_CopyToDevice(Porosity, Poros, Np*sizeof(double)); + ScaLBL_CopyToDevice(Permeability, Perm, Np*sizeof(double)); + ScaLBL_CopyToDevice(SolidForceA, SolidForceA_host, 3*Np*sizeof(double)); + ScaLBL_CopyToDevice(SolidForceB, SolidForceB_host, 3*Np*sizeof(double)); + ScaLBL_DeviceBarrier(); + delete [] SolidPotentialA_host; + delete [] SolidPotentialB_host; + delete [] SolidForceA_host; + delete [] SolidForceB_host; + delete [] Poros; + delete [] Perm; + delete [] Dst; } +void ScaLBL_GreyscaleSCModel::Density_Init(){ -void ScaLBL_GreyscaleModel::Create(){ + size_t NLABELS=0; + signed char VALUE=0; + + vector LabelList{1,2}; + vector SwList{0.0,1.0}; + + if (greyscaleSC_db->keyExists( "GreyNodeLabels" )){ + LabelList.clear(); + LabelList = greyscaleSC_db->getVector( "GreyNodeLabels" ); + } + if (greyscaleSC_db->keyExists( "GreyNodeSw" )){ + SwList.clear(); + SwList = greyscaleSC_db->getVector( "GreyNodeSw" ); + } + + NLABELS=LabelList.size(); + if (NLABELS != SwList.size()){ + ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); + } + + double *Den_temp; + Den_temp=new double [2*Np]; + double nA=0.5;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. + double nB=0.5; + + //double *Phi_temp; + //Phi_temp=new double [Np]; + //double phi = 0.0; + + for (int k=0; kid[n]; + if (VALUE>0){ + for (unsigned int idx=0; idx < NLABELS; idx++){ + if (VALUE == LabelList[idx]){ + double Sw = SwList[idx]; + if ((Sw<0.0) || (Sw>1.0)) ERROR("Error: Initial saturation for grey nodes must be between [0.0, 1.0]! \n"); + nB=Sw; + nA=1.0-Sw; + //phi = nA-nB; + idx = NLABELS; + } + } + if (VALUE==1){//label=1 reserved for NW phase + //TODO; maybe need rho_major and rho_minor initialization + nA=rhoA; + nB=rhoB_minor; + //phi = nA-nB; + } + else if(VALUE==2){//label=2 reserved for W phase + //TODO; maybe need rho_major and rho_minor initialization + nA=rhoA_minor; + nB=rhoB; + //phi = nA-nB; + } + int idx = Map(i,j,k); + Den_temp[idx+0*Np] = nA; + Den_temp[idx+1*Np] = nB; + //Phi_temp[idx] = phi; + } + } + } + } + //copy to device + ScaLBL_CopyToDevice(Den, Den_temp, 2*Np*sizeof(double)); + //ScaLBL_CopyToDevice(Phi, Phi_temp, 1*Np*sizeof(double)); + ScaLBL_DeviceBarrier(); + delete [] Den_temp; + //delete [] Phi_temp; +} + +void ScaLBL_GreyscaleSCModel::Create(){ /* * This function creates the variables needed to run a LBM */ @@ -324,70 +577,90 @@ void ScaLBL_GreyscaleModel::Create(){ neighborSize=18*(Np*sizeof(int)); //........................................................................... ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); - ScaLBL_AllocateDeviceMemory((void **) &fq, 19*dist_mem_size); + ScaLBL_AllocateDeviceMemory((void **) &fqA, 19*dist_mem_size); + ScaLBL_AllocateDeviceMemory((void **) &fqB, 19*dist_mem_size); + ScaLBL_AllocateDeviceMemory((void **) &Den, 2*sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &SolidForceA, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &SolidForceB, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &DenGradA, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &DenGradB, 3*sizeof(double)*Np); //........................................................................... // Update GPU data structures if (rank==0) printf ("Setting up device neighbor list \n"); fflush(stdout); // copy the neighbor list ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); - // initialize phi based on PhaseLabel (include solid component labels) - double *Poros, *Perm; - Poros = new double[Np]; - Perm = new double[Np]; - AssignComponentLabels(Poros,Perm); - ScaLBL_CopyToDevice(Porosity, Poros, Np*sizeof(double)); - ScaLBL_CopyToDevice(Permeability, Perm, Np*sizeof(double)); - delete [] Poros; - delete [] Perm; } - -void ScaLBL_GreyscaleModel::Initialize(){ - if (rank==0) printf ("Initializing distributions \n"); - //TODO: for BGK, you need to consider voxel porosity - // for IMRT, the whole set of feq is different - // if in the future you have different collison mode, need to write two set of initialization functions - if (CollisionType==1){ - ScaLBL_D3Q19_GreyIMRT_Init(fq, Np, Den); - if (rank==0) printf("Collision model: Incompressible MRT.\n"); - } - else if (CollisionType==2){ - ScaLBL_D3Q19_Init(fq, Np); - if (rank==0) printf("Collision model: BGK.\n"); - } - else{ - if (rank==0) printf("Unknown collison type! IMRT collision is used.\n"); - ScaLBL_D3Q19_GreyIMRT_Init(fq, Np, Den); - CollisionType=1; - greyscale_db->putScalar( "collision", "IMRT" ); - } - +void ScaLBL_GreyscaleSCModel::Initialize(){ if (Restart == true){ - if (rank==0){ - printf("Initializing distributions from Restart! \n"); - } - // Read in the restart file to CPU buffers - std::shared_ptr cfq; - cfq = std::shared_ptr(new double[19*Np],DeleteArray); - FILE *File; - File=fopen(LocalRestartFile,"rb"); - fread(cfq.get(),sizeof(double),19*Np,File); - fclose(File); - - // Copy the restart data to the GPU - ScaLBL_CopyToDevice(fq,cfq.get(),19*Np*sizeof(double)); - ScaLBL_DeviceBarrier(); - - MPI_Barrier(comm); +// //TODO: Restart funtion is currently not working; need updates +// if (rank==0){ +// printf("Initializing density field and distributions from Restart! \n"); +// } +// // Read in the restart file to CPU buffers +// std::shared_ptr cfq; +// cfq = std::shared_ptr(new double[19*Np],DeleteArray); +// std::shared_ptr cDen; +// cDen = std::shared_ptr(new double[2*Np],DeleteArray); +// FILE *File; +// File=fopen(LocalRestartFile,"rb"); +// fread(cfq.get(),sizeof(double),19*Np,File); +// fread(cDen.get(),sizeof(double),2*Np,File); +// fclose(File); +// +// // Copy the restart data to the GPU +// ScaLBL_CopyToDevice(fq,cfq.get(),19*Np*sizeof(double)); +// ScaLBL_CopyToDevice(Den,cDen.get(),2*Np*sizeof(double)); +// ScaLBL_DeviceBarrier(); +// MPI_Barrier(comm); +// +// //TODO need proper initialization ! +// +// //TODO need to initialize velocity field ! +// //this is required for calculating the pressure_dvc +// //can make a funciton to update velocity, such as ScaLBL_D3Q19_GreyColorIMRT_Velocity } + else{ + if (rank==0) printf ("Initializing solid affinities \n"); + AssignGreyscaleAndSolidLabels(); + if (rank==0) printf ("Initializing density field \n"); + Density_Init();//initialize density field + if (rank==0) printf ("Initializing distributions \n"); + ScaLBL_D3Q19_GreyscaleSC_Init(fqA, fqB, Den, Np); + + //debug + DoubleArray PhaseField(Nx,Ny,Nz); + ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + FILE *AFILE; + sprintf(LocalRankFilename,"A_init.%05i.raw",rank); + AFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,AFILE); + fclose(AFILE); + + ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + FILE *BFILE; + sprintf(LocalRankFilename,"B_init.%05i.raw",rank); + BFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,BFILE); + fclose(BFILE); + + //Velocity also needs initialization (for old incompressible momentum transport) + //if (rank==0) printf ("Initializing velocity field \n"); + //double *vel_init; + //vel_init = new double [3*Np]; + //for (int i=0;i<3*Np;i++) vel_init[i]=0.0; + //ScaLBL_CopyToDevice(Velocity,vel_init,3*Np*sizeof(double)); + //ScaLBL_DeviceBarrier(); + //delete [] vel_init; + } } -void ScaLBL_GreyscaleModel::Run(){ +void ScaLBL_GreyscaleSCModel::Run(){ int nprocs=nprocx*nprocy*nprocz; const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); @@ -403,8 +676,8 @@ void ScaLBL_GreyscaleModel::Run(){ if (analysis_db->keyExists( "restart_interval" )){ restart_interval = analysis_db->getScalar( "restart_interval" ); } - if (greyscale_db->keyExists( "timestep" )){ - timestep = greyscale_db->getScalar( "timestep" ); + if (greyscaleSC_db->keyExists( "timestep" )){ + timestep = greyscaleSC_db->getScalar( "timestep" ); } if (rank==0){ @@ -425,235 +698,310 @@ void ScaLBL_GreyscaleModel::Run(){ //************ MAIN ITERATION LOOP ***************************************/ PROFILE_START("Loop"); auto current_db = db->cloneDatabase(); - double rlx = 1.0/tau; - double rlx_eff = 1.0/tau_eff; double error = 1.0; double flow_rate_previous = 0.0; while (timestep < timestepMax && error > tolerance) { //************************************************************************/ // *************ODD TIMESTEP*************// timestep++; - ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL - switch (CollisionType){ - case 1: - ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - case 2: - ScaLBL_D3Q19_AAodd_Greyscale(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); - break; - default: - ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - } - ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE + // Compute the density field + // Read for Aq, Bq happens in this routine (requires communication) + //ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL + //ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, fqA, fqB, Den, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + //ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE + //ScaLBL_DeviceBarrier(); + //ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, fqA, fqB, Den, 0, ScaLBL_Comm->LastExterior(), Np); + + // Compute density gradient + // fluid component A + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&Den[0]); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[0],DenGradA); + ScaLBL_DeviceBarrier(); + // fluid component B + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&Den[Np]); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[Np],DenGradB); + ScaLBL_DeviceBarrier(); + + //debug + //DoubleArray PhaseField(Nx,Ny,Nz); + //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + //FILE *AFILE; + //sprintf(LocalRankFilename,"A_time_%i_prior.%05i.raw",timestep,rank); + //AFILE = fopen(LocalRankFilename,"wb"); + //fwrite(PhaseField.data(),8,N,AFILE); + //fclose(AFILE); + + //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + //FILE *BFILE; + //sprintf(LocalRankFilename,"B_time_%i_prior.%05i.raw",timestep,rank); + //BFILE = fopen(LocalRankFilename,"wb"); + //fwrite(PhaseField.data(),8,N,BFILE); + //fclose(BFILE); + + ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL + ScaLBL_D3Q19_AAodd_GreyscaleSC(NeighborList, fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, + ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); // Set BCs - if (BoundaryCondition == 3){ - ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); - ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); - } - switch (CollisionType){ - case 1: - ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - case 2: - ScaLBL_D3Q19_AAodd_Greyscale(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); - break; - default: - ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - } + //if (BoundaryCondition == 3){ + // ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); + // ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); + //} + ScaLBL_D3Q19_AAodd_GreyscaleSC(NeighborList, fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, + 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + + //debug + ////DoubleArray PhaseField(Nx,Ny,Nz); + //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + ////FILE *AFILE; + //sprintf(LocalRankFilename,"A_time_%i_after.%05i.raw",timestep,rank); + //AFILE = fopen(LocalRankFilename,"wb"); + //fwrite(PhaseField.data(),8,N,AFILE); + //fclose(AFILE); + + //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + ////FILE *BFILE; + //sprintf(LocalRankFilename,"B_time_%i_after.%05i.raw",timestep,rank); + //BFILE = fopen(LocalRankFilename,"wb"); + //fwrite(PhaseField.data(),8,N,BFILE); + //fclose(BFILE); // *************EVEN TIMESTEP*************// timestep++; - ScaLBL_Comm->SendD3Q19AA(fq); //READ FORM NORMAL - switch (CollisionType){ - case 1: - ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - case 2: - ScaLBL_D3Q19_AAeven_Greyscale(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); - break; - default: - ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - } - ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE + // Compute the density field + // Read for Aq, Bq happens in this routine (requires communication) + //ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL + //ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(fqA, fqB, Den, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + //ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE + //ScaLBL_DeviceBarrier(); + //ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(fqA, fqB, Den, 0, ScaLBL_Comm->LastExterior(), Np); + + // Compute density gradient + // fluid component A + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&Den[0]); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[0],DenGradA); + ScaLBL_DeviceBarrier(); + // fluid component B + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->SendHalo(&Den[Np]); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[Np],DenGradB); + ScaLBL_DeviceBarrier(); + + //debug + ////DoubleArray PhaseField(Nx,Ny,Nz); + //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + ////FILE *AFILE; + //sprintf(LocalRankFilename,"A_time_%i_prior.%05i.raw",timestep,rank); + //AFILE = fopen(LocalRankFilename,"wb"); + //fwrite(PhaseField.data(),8,N,AFILE); + //fclose(AFILE); + + //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + ////FILE *BFILE; + //sprintf(LocalRankFilename,"B_time_%i_prior.%05i.raw",timestep,rank); + //BFILE = fopen(LocalRankFilename,"wb"); + //fwrite(PhaseField.data(),8,N,BFILE); + //fclose(BFILE); + + ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL + ScaLBL_D3Q19_AAeven_GreyscaleSC(fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, + ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); // Set BCs - if (BoundaryCondition == 3){ - ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); - ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); - } - switch (CollisionType){ - case 1: - ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - case 2: - ScaLBL_D3Q19_AAeven_Greyscale(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); - break; - default: - ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); - break; - } - ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + //if (BoundaryCondition == 3){ + // ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); + // ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); + //} + ScaLBL_D3Q19_AAeven_GreyscaleSC(fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, + 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + + //debug + ////DoubleArray PhaseField(Nx,Ny,Nz); + //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + ////FILE *AFILE; + //sprintf(LocalRankFilename,"A_time_%i_after.%05i.raw",timestep,rank); + //AFILE = fopen(LocalRankFilename,"wb"); + //fwrite(PhaseField.data(),8,N,AFILE); + //fclose(AFILE); + + //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + ////FILE *BFILE; + //sprintf(LocalRankFilename,"B_time_%i_after.%05i.raw",timestep,rank); + //BFILE = fopen(LocalRankFilename,"wb"); + //fwrite(PhaseField.data(),8,N,BFILE); + //fclose(BFILE); + //************************************************************************/ - if (timestep%analysis_interval==0){ - ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); - ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); - ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); - //ScaLBL_Comm->RegularLayout(Map,Porosity,PorosityMap); - //ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); - - double count_loc=0; - double count; - double vax,vay,vaz; - double vax_loc,vay_loc,vaz_loc; - //double px_loc,py_loc,pz_loc; - //double px,py,pz; - //double mass_loc,mass_glb; - - //parameters for domain average - int64_t i,j,k,n,imin,jmin,kmin,kmax; - // If external boundary conditions are set, do not average over the inlet and outlet - kmin=1; kmax=Nz-1; - //In case user forgets to specify the inlet/outlet buffer layers for BC>0 - if (BoundaryCondition > 0 && Dm->kproc() == 0) kmin=4; - if (BoundaryCondition > 0 && Dm->kproc() == Dm->nprocz()-1) kmax=Nz-4; - - imin=jmin=1; - // If inlet/outlet layers exist use these as default - //if (Dm->inlet_layers_x > 0) imin = Dm->inlet_layers_x; - //if (Dm->inlet_layers_y > 0) jmin = Dm->inlet_layers_y; - if (BoundaryCondition > 0 && Dm->inlet_layers_z > 0 && Dm->kproc() == 0) kmin = 1 + Dm->inlet_layers_z;//"1" indicates the halo layer - if (BoundaryCondition > 0 && Dm->outlet_layers_z > 0 && Dm->kproc() == Dm->nprocz()-1) kmax = Nz-1 - Dm->outlet_layers_z; - -// px_loc = py_loc = pz_loc = 0.f; -// mass_loc = 0.f; +// if (timestep%analysis_interval==0){ +// ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); +// ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); +// ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); +// //ScaLBL_Comm->RegularLayout(Map,Porosity,PorosityMap); +// //ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); +// +// double count_loc=0; +// double count; +// double vax,vay,vaz; +// double vax_loc,vay_loc,vaz_loc; +// //double px_loc,py_loc,pz_loc; +// //double px,py,pz; +// //double mass_loc,mass_glb; +// +// //parameters for domain average +// int64_t i,j,k,n,imin,jmin,kmin,kmax; +// // If external boundary conditions are set, do not average over the inlet and outlet +// kmin=1; kmax=Nz-1; +// //In case user forgets to specify the inlet/outlet buffer layers for BC>0 +// if (BoundaryCondition > 0 && Dm->kproc() == 0) kmin=4; +// if (BoundaryCondition > 0 && Dm->kproc() == Dm->nprocz()-1) kmax=Nz-4; +// +// imin=jmin=1; +// // If inlet/outlet layers exist use these as default +// //if (Dm->inlet_layers_x > 0) imin = Dm->inlet_layers_x; +// //if (Dm->inlet_layers_y > 0) jmin = Dm->inlet_layers_y; +// if (BoundaryCondition > 0 && Dm->inlet_layers_z > 0 && Dm->kproc() == 0) kmin = 1 + Dm->inlet_layers_z;//"1" indicates the halo layer +// if (BoundaryCondition > 0 && Dm->outlet_layers_z > 0 && Dm->kproc() == Dm->nprocz()-1) kmax = Nz-1 - Dm->outlet_layers_z; +// +//// px_loc = py_loc = pz_loc = 0.f; +//// mass_loc = 0.f; +//// for (int k=kmin; k 0){ +//// px_loc += Velocity_x(i,j,k)*Den*PorosityMap(i,j,k); +//// py_loc += Velocity_y(i,j,k)*Den*PorosityMap(i,j,k); +//// pz_loc += Velocity_z(i,j,k)*Den*PorosityMap(i,j,k); +//// mass_loc += Den*PorosityMap(i,j,k); +//// } +//// } +//// } +//// } +//// MPI_Allreduce(&px_loc, &px, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +//// MPI_Allreduce(&py_loc, &py, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +//// MPI_Allreduce(&pz_loc, &pz, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +//// MPI_Allreduce(&mass_loc,&mass_glb,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +//// +//// vax = px/mass_glb; +//// vay = py/mass_glb; +//// vaz = pz/mass_glb; +// +// vax_loc = vay_loc = vaz_loc = 0.f; // for (int k=kmin; k 0){ -// px_loc += Velocity_x(i,j,k)*Den*PorosityMap(i,j,k); -// py_loc += Velocity_y(i,j,k)*Den*PorosityMap(i,j,k); -// pz_loc += Velocity_z(i,j,k)*Den*PorosityMap(i,j,k); -// mass_loc += Den*PorosityMap(i,j,k); +// vax_loc += Velocity_x(i,j,k); +// vay_loc += Velocity_y(i,j,k); +// vaz_loc += Velocity_z(i,j,k); +// count_loc+=1.0; // } // } // } // } -// MPI_Allreduce(&px_loc, &px, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -// MPI_Allreduce(&py_loc, &py, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -// MPI_Allreduce(&pz_loc, &pz, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -// MPI_Allreduce(&mass_loc,&mass_glb,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +// vax = Mask->Comm.sumReduce( vax_loc ); +// vay = Mask->Comm.sumReduce( vay_loc ); +// vaz = Mask->Comm.sumReduce( vaz_loc ); +// count = Mask->Comm.sumReduce( count_loc ); +// +// vax /= count; +// vay /= count; +// vaz /= count; +// +// double force_mag = sqrt(Fx*Fx+Fy*Fy+Fz*Fz); +// double dir_x = Fx/force_mag; +// double dir_y = Fy/force_mag; +// double dir_z = Fz/force_mag; +// if (force_mag == 0.0){ +// // default to z direction +// dir_x = 0.0; +// dir_y = 0.0; +// dir_z = 1.0; +// force_mag = 1.0; +// } +// //double flow_rate = (px*dir_x + py*dir_y + pz*dir_z)/mass_glb; +// double flow_rate = (vax*dir_x + vay*dir_y + vaz*dir_z); // -// vax = px/mass_glb; -// vay = py/mass_glb; -// vaz = pz/mass_glb; - - vax_loc = vay_loc = vaz_loc = 0.f; - for (int k=kmin; k 0){ - vax_loc += Velocity_x(i,j,k); - vay_loc += Velocity_y(i,j,k); - vaz_loc += Velocity_z(i,j,k); - count_loc+=1.0; - } - } - } - } - vax = Mask->Comm.sumReduce( vax_loc ); - vay = Mask->Comm.sumReduce( vay_loc ); - vaz = Mask->Comm.sumReduce( vaz_loc ); - count = Mask->Comm.sumReduce( count_loc ); - - vax /= count; - vay /= count; - vaz /= count; - - double force_mag = sqrt(Fx*Fx+Fy*Fy+Fz*Fz); - double dir_x = Fx/force_mag; - double dir_y = Fy/force_mag; - double dir_z = Fz/force_mag; - if (force_mag == 0.0){ - // default to z direction - dir_x = 0.0; - dir_y = 0.0; - dir_z = 1.0; - force_mag = 1.0; - } - //double flow_rate = (px*dir_x + py*dir_y + pz*dir_z)/mass_glb; - double flow_rate = (vax*dir_x + vay*dir_y + vaz*dir_z); - - error = fabs(flow_rate - flow_rate_previous) / fabs(flow_rate); - flow_rate_previous = flow_rate; - - //if (rank==0) printf("Computing Minkowski functionals \n"); - Morphology.ComputeScalar(SignDist,0.f); - //Morphology.PrintAll(); - double mu = (tau-0.5)/3.f; - double Vs = Morphology.V(); - double As = Morphology.A(); - double Hs = Morphology.H(); - double Xs = Morphology.X(); - Vs = Dm->Comm.sumReduce( Vs); - As = Dm->Comm.sumReduce( As); - Hs = Dm->Comm.sumReduce( Hs); - Xs = Dm->Comm.sumReduce( Xs); - - double h = Dm->voxel_length; - //double absperm = h*h*mu*Mask->Porosity()*flow_rate / force_mag; - double absperm = h*h*mu*GreyPorosity*flow_rate / force_mag; - - if (rank==0){ - printf(" AbsPerm = %.5g [micron^2]\n",absperm); - bool WriteHeader=false; - FILE * log_file = fopen("Permeability.csv","r"); - if (log_file != NULL) - fclose(log_file); - else - WriteHeader=true; - log_file = fopen("Permeability.csv","a"); - if (WriteHeader) - fprintf(log_file,"timestep Fx Fy Fz mu Vs As Hs Xs vax vay vaz AbsPerm \n", - timestep,Fx,Fy,Fz,mu,h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz,absperm); - - fprintf(log_file,"%i %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",timestep, Fx, Fy, Fz, mu, - h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz, absperm); - fclose(log_file); - } - } +// error = fabs(flow_rate - flow_rate_previous) / fabs(flow_rate); +// flow_rate_previous = flow_rate; +// +// //if (rank==0) printf("Computing Minkowski functionals \n"); +// Morphology.ComputeScalar(SignDist,0.f); +// //Morphology.PrintAll(); +// double mu = (tau-0.5)/3.f; +// double Vs = Morphology.V(); +// double As = Morphology.A(); +// double Hs = Morphology.H(); +// double Xs = Morphology.X(); +// Vs = Dm->Comm.sumReduce( Vs); +// As = Dm->Comm.sumReduce( As); +// Hs = Dm->Comm.sumReduce( Hs); +// Xs = Dm->Comm.sumReduce( Xs); +// +// double h = Dm->voxel_length; +// //double absperm = h*h*mu*Mask->Porosity()*flow_rate / force_mag; +// double absperm = h*h*mu*GreyPorosity*flow_rate / force_mag; +// +// if (rank==0){ +// printf(" AbsPerm = %.5g [micron^2]\n",absperm); +// bool WriteHeader=false; +// FILE * log_file = fopen("Permeability.csv","r"); +// if (log_file != NULL) +// fclose(log_file); +// else +// WriteHeader=true; +// log_file = fopen("Permeability.csv","a"); +// if (WriteHeader) +// fprintf(log_file,"timestep Fx Fy Fz mu Vs As Hs Xs vax vay vaz AbsPerm \n", +// timestep,Fx,Fy,Fz,mu,h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz,absperm); +// +// fprintf(log_file,"%i %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",timestep, Fx, Fy, Fz, mu, +// h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz, absperm); +// fclose(log_file); +// } +// } if (timestep%visualization_interval==0){ VelocityField(); } - if (timestep%restart_interval==0){ - //Use rank=0 write out Restart.db - if (rank==0) { - greyscale_db->putScalar("timestep",timestep); - greyscale_db->putScalar( "Restart", true ); - current_db->putDatabase("Greyscale", greyscale_db); - std::ofstream OutStream("Restart.db"); - current_db->print(OutStream, ""); - OutStream.close(); - - } - //Write out Restart data. - std::shared_ptr cfq; - cfq = std::shared_ptr(new double[19*Np],DeleteArray); - ScaLBL_CopyToHost(cfq.get(),fq,19*Np*sizeof(double));// Copy restart data to the CPU - - FILE *RESTARTFILE; - RESTARTFILE=fopen(LocalRestartFile,"wb"); - fwrite(cfq.get(),sizeof(double),19*Np,RESTARTFILE); - fclose(RESTARTFILE); - MPI_Barrier(comm); - } +// if (timestep%restart_interval==0){ +// //Use rank=0 write out Restart.db +// if (rank==0) { +// greyscaleSC_db->putScalar("timestep",timestep); +// greyscaleSC_db->putScalar( "Restart", true ); +// current_db->putDatabase("GreyscaleSC", greyscaleSC_db); +// std::ofstream OutStream("Restart.db"); +// current_db->print(OutStream, ""); +// OutStream.close(); +// +// } +// //Write out Restart data. +// std::shared_ptr cfq; +// cfq = std::shared_ptr(new double[19*Np],DeleteArray); +// ScaLBL_CopyToHost(cfq.get(),fq,19*Np*sizeof(double));// Copy restart data to the CPU +// +// FILE *RESTARTFILE; +// RESTARTFILE=fopen(LocalRestartFile,"wb"); +// fwrite(cfq.get(),sizeof(double),19*Np,RESTARTFILE); +// fclose(RESTARTFILE); +// MPI_Barrier(comm); +// } } PROFILE_STOP("Loop"); @@ -678,7 +1026,7 @@ void ScaLBL_GreyscaleModel::Run(){ // ************************************************************************ } -void ScaLBL_GreyscaleModel::VelocityField(){ +void ScaLBL_GreyscaleSCModel::VelocityField(){ /* Minkowski Morphology(Mask); int SIZE=Np*sizeof(double); @@ -794,7 +1142,7 @@ void ScaLBL_GreyscaleModel::VelocityField(){ } -void ScaLBL_GreyscaleModel::WriteDebug(){ +void ScaLBL_GreyscaleSCModel::WriteDebug(){ // Copy back final phase indicator field and convert to regular layout DoubleArray PhaseField(Nx,Ny,Nz); @@ -806,26 +1154,26 @@ void ScaLBL_GreyscaleModel::WriteDebug(){ // fwrite(PhaseField.data(),8,N,OUTFILE); // fclose(OUTFILE); // -// ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); -// FILE *AFILE; -// sprintf(LocalRankFilename,"A.%05i.raw",rank); -// AFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,AFILE); -// fclose(AFILE); -// -// ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); -// FILE *BFILE; -// sprintf(LocalRankFilename,"B.%05i.raw",rank); -// BFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,BFILE); -// fclose(BFILE); -// -// ScaLBL_Comm->RegularLayout(Map,Pressure,PhaseField); -// FILE *PFILE; -// sprintf(LocalRankFilename,"Pressure.%05i.raw",rank); -// PFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,PFILE); -// fclose(PFILE); + ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + FILE *AFILE; + sprintf(LocalRankFilename,"A.%05i.raw",rank); + AFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,AFILE); + fclose(AFILE); + + ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + FILE *BFILE; + sprintf(LocalRankFilename,"B.%05i.raw",rank); + BFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,BFILE); + fclose(BFILE); + + ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,PhaseField); + FILE *PFILE; + sprintf(LocalRankFilename,"Pressure.%05i.raw",rank); + PFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,PFILE); + fclose(PFILE); ScaLBL_Comm->RegularLayout(Map,&Velocity[0],PhaseField); FILE *VELX_FILE; @@ -848,17 +1196,17 @@ void ScaLBL_GreyscaleModel::WriteDebug(){ fwrite(PhaseField.data(),8,N,VELZ_FILE); fclose(VELZ_FILE); - ScaLBL_Comm->RegularLayout(Map,&Porosity[0],PhaseField); - FILE *POROS_FILE; - sprintf(LocalRankFilename,"Porosity.%05i.raw",rank); - POROS_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,POROS_FILE); - fclose(POROS_FILE); - - ScaLBL_Comm->RegularLayout(Map,&Permeability[0],PhaseField); - FILE *PERM_FILE; - sprintf(LocalRankFilename,"Permeability.%05i.raw",rank); - PERM_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,PERM_FILE); - fclose(PERM_FILE); +// ScaLBL_Comm->RegularLayout(Map,&Porosity[0],PhaseField); +// FILE *POROS_FILE; +// sprintf(LocalRankFilename,"Porosity.%05i.raw",rank); +// POROS_FILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,POROS_FILE); +// fclose(POROS_FILE); +// +// ScaLBL_Comm->RegularLayout(Map,&Permeability[0],PhaseField); +// FILE *PERM_FILE; +// sprintf(LocalRankFilename,"Permeability.%05i.raw",rank); +// PERM_FILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,PERM_FILE); +// fclose(PERM_FILE); } diff --git a/models/GreyscaleSCModel.h b/models/GreyscaleSCModel.h index 3e883b16..348490c4 100644 --- a/models/GreyscaleSCModel.h +++ b/models/GreyscaleSCModel.h @@ -16,10 +16,10 @@ Implementation of color lattice boltzmann model #include "ProfilerApp.h" #include "threadpool/thread_pool.h" -class ScaLBL_GreyscaleModel{ +class ScaLBL_GreyscaleSCModel{ public: - ScaLBL_GreyscaleModel(int RANK, int NP, MPI_Comm COMM); - ~ScaLBL_GreyscaleModel(); + ScaLBL_GreyscaleSCModel(int RANK, int NP, MPI_Comm COMM); + ~ScaLBL_GreyscaleSCModel(); // functions in they should be run void ReadParams(string filename); @@ -36,9 +36,11 @@ public: int timestep,timestepMax; int BoundaryCondition; int CollisionType; - double tau; - double tau_eff; - double Den;//constant density + double tauA,tauB; + double tauA_eff,tauB_eff; + double Gsc; + double rhoA,rhoB; + double rhoA_minor,rhoB_minor;//dissolved density double tolerance; double Fx,Fy,Fz,flux; double din,dout; @@ -56,17 +58,21 @@ public: // input database std::shared_ptr db; std::shared_ptr domain_db; - std::shared_ptr greyscale_db; + std::shared_ptr greyscaleSC_db; std::shared_ptr analysis_db; std::shared_ptr vis_db; signed char *id; int *NeighborList; - double *fq; + double *fqA, *fqB; double *Permeability;//grey voxel permeability double *Porosity; double *Velocity; double *Pressure_dvc; + double *Den; + double *DenGradA,*DenGradB; + double *SolidForceA,*SolidForceB; + IntArray Map; DoubleArray SignDist; DoubleArray Velocity_x; @@ -85,7 +91,7 @@ private: char LocalRankFilename[40]; char LocalRestartFile[40]; - void AssignComponentLabels(double *Porosity, double *Permeablity); - + void AssignGreyscaleAndSolidLabels(); + void Density_Init(); }; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ca88274a..362d020e 100755 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -5,6 +5,7 @@ ADD_LBPM_EXECUTABLE( lbpm_color_simulator ) ADD_LBPM_EXECUTABLE( lbpm_permeability_simulator ) ADD_LBPM_EXECUTABLE( lbpm_greyscale_simulator ) ADD_LBPM_EXECUTABLE( lbpm_greyscaleFE_simulator ) +ADD_LBPM_EXECUTABLE( lbpm_greyscaleSC_simulator ) #ADD_LBPM_EXECUTABLE( lbpm_BGK_simulator ) #ADD_LBPM_EXECUTABLE( lbpm_color_macro_simulator ) ADD_LBPM_EXECUTABLE( lbpm_dfh_simulator ) diff --git a/tests/lbpm_greyscaleSC_simulator.cpp b/tests/lbpm_greyscaleSC_simulator.cpp new file mode 100644 index 00000000..b95fff04 --- /dev/null +++ b/tests/lbpm_greyscaleSC_simulator.cpp @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "common/ScaLBL.h" +#include "common/Communication.h" +#include "common/MPI.h" +#include "models/GreyscaleSCModel.h" +//#define WRITE_SURFACES + +using namespace std; + + +int main(int argc, char **argv) +{ + //***************************************** + // ***** MPI STUFF **************** + //***************************************** + // Initialize MPI + int rank,nprocs; + MPI_Init(&argc,&argv); + MPI_Comm comm = MPI_COMM_WORLD; + MPI_Comm_rank(comm,&rank); + MPI_Comm_size(comm,&nprocs); + { + // parallel domain size (# of sub-domains) + int nprocx,nprocy,nprocz; + int iproc,jproc,kproc; + + if (rank == 0){ + printf("****************************************\n"); + printf("Running Greyscale Two-Phase Calculation \n"); + printf("****************************************\n"); + } + // Initialize compute device + int device=ScaLBL_SetDevice(rank); + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); + + ScaLBL_GreyscaleSCModel GreyscaleSC(rank,nprocs,comm); + auto filename = argv[1]; + GreyscaleSC.ReadParams(filename); + GreyscaleSC.SetDomain(); // this reads in the domain + GreyscaleSC.ReadInput(); + GreyscaleSC.Create(); // creating the model will create data structure to match the pore structure and allocate variables + GreyscaleSC.Initialize(); // initializing the model will set initial conditions for variables + GreyscaleSC.Run(); + //GreyscaleSC.VelocityField(); + GreyscaleSC.WriteDebug(); + } + // **************************************************** + MPI_Barrier(comm); + MPI_Finalize(); + // **************************************************** +} From c423d14e7418123db10e70411015c53e7d1c6431 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Fri, 1 May 2020 17:44:48 -0400 Subject: [PATCH 27/75] GreyscaleSC debugging: save the work; yet to function correctly --- gpu/GreyscaleSC.cu | 592 ++++++++++++++++++------------------ models/GreyscaleSCModel.cpp | 183 +++++------ 2 files changed, 367 insertions(+), 408 deletions(-) diff --git a/gpu/GreyscaleSC.cu b/gpu/GreyscaleSC.cu index 6219d42f..951b00e4 100644 --- a/gpu/GreyscaleSC.cu +++ b/gpu/GreyscaleSC.cu @@ -21,7 +21,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *di 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 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 @@ -687,9 +687,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *di c1 = porosity*0.5*GeoFun/sqrt(permA); if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - vx = jxA/rhoA_next+0.5*(porosity*Gx+GffA_x+GfsA_x); - vy = jyA/rhoA_next+0.5*(porosity*Gy+GffA_y+GfsA_y); - vz = jzA/rhoA_next+0.5*(porosity*Gz+GffA_z+GfsA_z); + 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)); @@ -713,9 +713,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *di c1 = porosity*0.5*GeoFun/sqrt(permB); if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - vx = jxB/rhoB_next+0.5*(porosity*Gx+GffB_x+GfsB_x); - vy = jyB/rhoB_next+0.5*(porosity*Gy+GffB_y+GfsB_y); - vz = jzB/rhoB_next+0.5*(porosity*Gz+GffB_z+GfsB_z); + 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)); @@ -733,9 +733,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *di } // Calculate barycentric velocity of the fluid mixture - ux = (rhoA_next*ux_A+rhoB_next*ux_B)/(rhoA_next+rhoB_next); - uy = (rhoA_next*uy_A+rhoB_next*uy_B)/(rhoA_next+rhoB_next); - uz = (rhoA_next*uz_A+rhoB_next*uz_B)/(rhoA_next+rhoB_next); + 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............................................... // m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) @@ -776,32 +776,32 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *di //-------------------- 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_next*(ux*ux+uy*uy+uz*uz) - 11*rhoA_next) - m1A) + m1A = m1A + rlx_setA*((19*rhoA*(ux*ux+uy*uy+uz*uz) - 11*rhoA_next) - m1A) + (1-0.5*rlx_setA)*38*(FxA*ux+FyA*uy+FzA*uz); - m2A = m2A + rlx_setA*((3*rhoA_next - 5.5*rhoA_next*(ux*ux+uy*uy+uz*uz))- m2A) + m2A = m2A + rlx_setA*((3*rhoA_next - 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_next)- m4A) + 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_next)- m6A) + 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_next)- m8A) + m8A = m8A + rlx_setB*((-0.6666666666666666*uz*rhoA)- m8A) + (1-0.5*rlx_setB)*(-0.6666666666666666*FzA); - m9A = m9A + rlx_setA*((rhoA_next*(2*ux*ux-uy*uy-uz*uz)) - m9A) + 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); - m11A = m11A + rlx_setA*((rhoA_next*(uy*uy-uz*uz)) - m11A) + 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); + m12A = m12A + rlx_setA*( - m12A) + (1-0.5*rlx_setA)*(-FyA*uy+FzA*uz); - m13A = m13A + rlx_setA*( rhoA_next*(ux*uy) - m13A) + m13A = m13A + rlx_setA*( rhoA*(ux*uy) - m13A) + (1-0.5*rlx_setA)*(FyA*ux+FxA*uy); - m14A = m14A + rlx_setA*( rhoA_next*(uy*uz) - m14A); + m14A = m14A + rlx_setA*( rhoA*(uy*uz) - m14A) + (1-0.5*rlx_setA)*(FzA*uy+FyA*uz); - m15A = m15A + rlx_setA*( rhoA_next*(ux*uz) - m15A) + 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); @@ -812,121 +812,121 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *di // ------------------- Fluid Component A -----------------------// //.................inverse transformation...................................................... // q=0 - //fq = mrt_V1*rhoA_next-mrt_V2*m1A+mrt_V3*m2A; - f0 = mrt_V1*rhoA_next-mrt_V2*m1A+mrt_V3*m2A; - distA[n] = f0; + fq = mrt_V1*rhoA_next-mrt_V2*m1A+mrt_V3*m2A; + //f0 = mrt_V1*rhoA_next-mrt_V2*m1A+mrt_V3*m2A; + distA[n] = fq; // q = 1 - //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A); - f1 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A); + fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A); + //f1 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A); nread = neighborList[n+Np]; - distA[nread] = f1; + distA[nread] = fq; // q=2 - //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A); - f2 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A); + fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A); + //f2 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A); nread = neighborList[n]; - distA[nread] = f2; + distA[nread] = fq; // q = 3 - //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jyA-m6A)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); - f3 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jyA-m6A)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); + fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jyA-m6A)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); + //f3 = mrt_V1*rhoA_next-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] = f3; + distA[nread] = fq; // q = 4 - //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m6A-jyA)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); - f4 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m6A-jyA)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); + fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m6A-jyA)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); + //f4 = mrt_V1*rhoA_next-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] = f4; + distA[nread] = fq; // q = 5 - //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jzA-m8A)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); - f5 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jzA-m8A)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); + fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jzA-m8A)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); + //f5 = mrt_V1*rhoA_next-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] = f5; + distA[nread] = fq; // q = 6 - //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m8A-jzA)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); - f6 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m8A-jzA)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); + fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m8A-jzA)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); + //f6 = mrt_V1*rhoA_next-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] = f6; + distA[nread] = fq; // q = 7 - //fq = mrt_V1*rhoA_next+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); - f7 = mrt_V1*rhoA_next+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); + fq = mrt_V1*rhoA_next+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); + //f7 = mrt_V1*rhoA_next+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] = f7; + distA[nread] = fq; // q = 8 - //fq = mrt_V1*rhoA_next+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); - f8 = mrt_V1*rhoA_next+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); + fq = mrt_V1*rhoA_next+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); + //f8 = mrt_V1*rhoA_next+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] = f8; + distA[nread] = fq; // q = 9 - //fq = mrt_V1*rhoA_next+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); - f9 = mrt_V1*rhoA_next+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); + fq = mrt_V1*rhoA_next+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); + //f9 = mrt_V1*rhoA_next+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] = f9; + distA[nread] = fq; // q = 10 - //fq = mrt_V1*rhoA_next+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); - f10 = mrt_V1*rhoA_next+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); + fq = mrt_V1*rhoA_next+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); + //f10 = mrt_V1*rhoA_next+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] = f10; + distA[nread] = fq; // q = 11 - //fq = mrt_V1*rhoA_next+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); - f11 = mrt_V1*rhoA_next+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); + fq = mrt_V1*rhoA_next+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); + //f11 = mrt_V1*rhoA_next+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] = f11; + distA[nread] = fq; // q = 12 - //fq = mrt_V1*rhoA_next+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); - f12 = mrt_V1*rhoA_next+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); + fq = mrt_V1*rhoA_next+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); + //f12 = mrt_V1*rhoA_next+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]= f12; + distA[nread]= fq; // q = 13 - //fq = mrt_V1*rhoA_next+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); - f13 = mrt_V1*rhoA_next+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); + fq = mrt_V1*rhoA_next+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); + //f13 = mrt_V1*rhoA_next+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] = f13; + distA[nread] = fq; // q= 14 - //fq = mrt_V1*rhoA_next+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); - f14 = mrt_V1*rhoA_next+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); + fq = mrt_V1*rhoA_next+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); + //f14 = mrt_V1*rhoA_next+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] = f14; + distA[nread] = fq; // q = 15 - //fq = mrt_V1*rhoA_next+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); - f15 = mrt_V1*rhoA_next+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); + fq = mrt_V1*rhoA_next+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); + //f15 = mrt_V1*rhoA_next+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] = f15; + distA[nread] = fq; // q = 16 - //fq = mrt_V1*rhoA_next+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); - f16 = mrt_V1*rhoA_next+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); + fq = mrt_V1*rhoA_next+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); + //f16 = mrt_V1*rhoA_next+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] = f16; + distA[nread] = fq; // q = 17 - //fq = mrt_V1*rhoA_next+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); - f17 = mrt_V1*rhoA_next+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); + fq = mrt_V1*rhoA_next+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); + //f17 = mrt_V1*rhoA_next+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] = f17; + distA[nread] = fq; // q = 18 - //fq = mrt_V1*rhoA_next+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); - f18 = mrt_V1*rhoA_next+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); + fq = mrt_V1*rhoA_next+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); + //f18 = mrt_V1*rhoA_next+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] = f18; + distA[nread] = fq; //........................................................................ - Den[n] = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; + //Den[n] = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; // //..............carry out relaxation process............................................... @@ -968,32 +968,32 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *di //-------------------- 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_next*(ux*ux+uy*uy+uz*uz) - 11*rhoB_next) - m1B) + m1B = m1B + rlx_setA*((19*rhoB*(ux*ux+uy*uy+uz*uz) - 11*rhoB_next) - m1B) + (1-0.5*rlx_setA)*38*(FxB*ux+FyB*uy+FzB*uz); - m2B = m2B + rlx_setA*((3*rhoB_next - 5.5*rhoB_next*(ux*ux+uy*uy+uz*uz))- m2B) + m2B = m2B + rlx_setA*((3*rhoB_next - 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_next)- m4B) + 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_next)- m6B) + 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_next)- m8B) + m8B = m8B + rlx_setB*((-0.6666666666666666*uz*rhoB)- m8B) + (1-0.5*rlx_setB)*(-0.6666666666666666*FzB); - m9B = m9B + rlx_setA*((rhoB_next*(2*ux*ux-uy*uy-uz*uz)) - m9B) + 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); - m11B = m11B + rlx_setA*((rhoB_next*(uy*uy-uz*uz)) - m11B) + 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); - m13B = m13B + rlx_setA*( rhoB_next*(ux*uy) - m13B) + m13B = m13B + rlx_setA*( rhoB*(ux*uy) - m13B) + (1-0.5*rlx_setA)*(FyB*ux+FxB*uy); - m14B = m14B + rlx_setA*( rhoB_next*(uy*uz) - m14B) + m14B = m14B + rlx_setA*( rhoB*(uy*uz) - m14B) + (1-0.5*rlx_setA)*(FzB*uy+FyB*uz); - m15B = m15B + rlx_setA*( rhoB_next*(ux*uz) - m15B) + 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); @@ -1004,127 +1004,127 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *di // ------------------- Fluid Component B -----------------------// //.................inverse transformation...................................................... // q=0 - //fq = mrt_V1*rhoB_next-mrt_V2*m1B+mrt_V3*m2B; - f0 = mrt_V1*rhoB_next-mrt_V2*m1B+mrt_V3*m2B; - distB[n] = f0; + fq = mrt_V1*rhoB_next-mrt_V2*m1B+mrt_V3*m2B; + //f0 = mrt_V1*rhoB_next-mrt_V2*m1B+mrt_V3*m2B; + distB[n] = fq; // q = 1 - //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B); - f1 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B); + fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B); + //f1 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B); nread = neighborList[n+Np]; - distB[nread] = f1; + distB[nread] = fq; // q=2 - //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B); - f2 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B); + fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B); + //f2 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B); nread = neighborList[n]; - distB[nread] = f2; + distB[nread] = fq; // q = 3 - //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jyB-m6B)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); - f3 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jyB-m6B)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); + fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jyB-m6B)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); + //f3 = mrt_V1*rhoB_next-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] = f3; + distB[nread] = fq; // q = 4 - //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m6B-jyB)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); - f4 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m6B-jyB)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); + fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m6B-jyB)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); + //f4 = mrt_V1*rhoB_next-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] = f4; + distB[nread] = fq; // q = 5 - //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jzB-m8B)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); - f5 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jzB-m8B)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); + fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jzB-m8B)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); + //f5 = mrt_V1*rhoB_next-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] = f5; + distB[nread] = fq; // q = 6 - //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m8B-jzB)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); - f6 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m8B-jzB)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); + fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m8B-jzB)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); + //f6 = mrt_V1*rhoB_next-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] = f6; + distB[nread] = fq; // q = 7 - //fq = mrt_V1*rhoB_next+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); - f7 = mrt_V1*rhoB_next+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); + fq = mrt_V1*rhoB_next+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); + //f7 = mrt_V1*rhoB_next+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] = f7; + distB[nread] = fq; // q = 8 - //fq = mrt_V1*rhoB_next+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); - f8 = mrt_V1*rhoB_next+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); + fq = mrt_V1*rhoB_next+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); + //f8 = mrt_V1*rhoB_next+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] = f8; + distB[nread] = fq; // q = 9 - //fq = mrt_V1*rhoB_next+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); - f9 = mrt_V1*rhoB_next+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); + fq = mrt_V1*rhoB_next+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); + //f9 = mrt_V1*rhoB_next+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] = f9; + distB[nread] = fq; // q = 10 - //fq = mrt_V1*rhoB_next+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); - f10 = mrt_V1*rhoB_next+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); + fq = mrt_V1*rhoB_next+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); + //f10 = mrt_V1*rhoB_next+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] = f10; + distB[nread] = fq; // q = 11 - //fq = mrt_V1*rhoB_next+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); - f11 = mrt_V1*rhoB_next+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); + fq = mrt_V1*rhoB_next+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); + //f11 = mrt_V1*rhoB_next+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] = f11; + distB[nread] = fq; // q = 12 - //fq = mrt_V1*rhoB_next+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); - f12 = mrt_V1*rhoB_next+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); + fq = mrt_V1*rhoB_next+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); + //f12 = mrt_V1*rhoB_next+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]= f12; + distB[nread]= fq; // q = 13 - //fq = mrt_V1*rhoB_next+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); - f13 = mrt_V1*rhoB_next+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); + fq = mrt_V1*rhoB_next+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); + //f13 = mrt_V1*rhoB_next+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] = f13; + distB[nread] = fq; // q= 14 - //fq = mrt_V1*rhoB_next+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); - f14 = mrt_V1*rhoB_next+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); + fq = mrt_V1*rhoB_next+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); + //f14 = mrt_V1*rhoB_next+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] = f14; + distB[nread] = fq; // q = 15 - //fq = mrt_V1*rhoB_next+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); - f15 = mrt_V1*rhoB_next+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); + fq = mrt_V1*rhoB_next+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); + //f15 = mrt_V1*rhoB_next+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] = f15; + distB[nread] = fq; // q = 16 - //fq = mrt_V1*rhoB_next+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); - f16 = mrt_V1*rhoB_next+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); + fq = mrt_V1*rhoB_next+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); + //f16 = mrt_V1*rhoB_next+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] = f16; + distB[nread] = fq; // q = 17 - //fq = mrt_V1*rhoB_next+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); - f17 = mrt_V1*rhoB_next+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); + fq = mrt_V1*rhoB_next+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); + //f17 = mrt_V1*rhoB_next+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] = f17; + distB[nread] = fq; // q = 18 - //fq = mrt_V1*rhoB_next+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); - f18 = mrt_V1*rhoB_next+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); + fq = mrt_V1*rhoB_next+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); + //f18 = mrt_V1*rhoB_next+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] = f18; + distB[nread] = fq; //........................................................................ - Den[n+Np] = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; + //Den[n+Np] = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; //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_next+rhoB_next+Gsc*rhoA_next*rhoB_next)/3.0; + Pressure[n] = (rhoA+rhoB+Gsc*rhoA*rhoB)/3.0; //Update density //Den[n] = rhoA_next; //Den[n+Np] = rhoB_next; @@ -1151,7 +1151,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB 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 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 @@ -1781,9 +1781,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB c1 = porosity*0.5*GeoFun/sqrt(permA); if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - vx = jxA/rhoA_next+0.5*(porosity*Gx+GffA_x+GfsA_x); - vy = jyA/rhoA_next+0.5*(porosity*Gy+GffA_y+GfsA_y); - vz = jzA/rhoA_next+0.5*(porosity*Gz+GffA_z+GfsA_z); + 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)); @@ -1807,9 +1807,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB c1 = porosity*0.5*GeoFun/sqrt(permB); if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - vx = jxB/rhoB_next+0.5*(porosity*Gx+GffB_x+GfsB_x); - vy = jyB/rhoB_next+0.5*(porosity*Gy+GffB_y+GfsB_y); - vz = jzB/rhoB_next+0.5*(porosity*Gz+GffB_z+GfsB_z); + 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)); @@ -1827,9 +1827,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB } // Calculate barycentric velocity of the fluid mixture - ux = (rhoA_next*ux_A+rhoB_next*ux_B)/(rhoA_next+rhoB_next); - uy = (rhoA_next*uy_A+rhoB_next*uy_B)/(rhoA_next+rhoB_next); - uz = (rhoA_next*uz_A+rhoB_next*uz_B)/(rhoA_next+rhoB_next); + 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............................................... @@ -1872,32 +1872,32 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB //-------------------- 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_next*(ux*ux+uy*uy+uz*uz) - 11*rhoA_next) - m1A) + m1A = m1A + rlx_setA*((19*rhoA*(ux*ux+uy*uy+uz*uz) - 11*rhoA_next) - m1A) + (1-0.5*rlx_setA)*38*(FxA*ux+FyA*uy+FzA*uz); - m2A = m2A + rlx_setA*((3*rhoA_next - 5.5*rhoA_next*(ux*ux+uy*uy+uz*uz))- m2A) + m2A = m2A + rlx_setA*((3*rhoA_next - 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_next)- m4A) + 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_next)- m6A) + 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_next)- m8A) + m8A = m8A + rlx_setB*((-0.6666666666666666*uz*rhoA)- m8A) + (1-0.5*rlx_setB)*(-0.6666666666666666*FzA); - m9A = m9A + rlx_setA*((rhoA_next*(2*ux*ux-uy*uy-uz*uz)) - m9A) + 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); - m11A = m11A + rlx_setA*((rhoA_next*(uy*uy-uz*uz)) - m11A) + 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); + m12A = m12A + rlx_setA*( - m12A) + (1-0.5*rlx_setA)*(-FyA*uy+FzA*uz); - m13A = m13A + rlx_setA*( rhoA_next*(ux*uy) - m13A) + m13A = m13A + rlx_setA*( rhoA*(ux*uy) - m13A) + (1-0.5*rlx_setA)*(FyA*ux+FxA*uy); - m14A = m14A + rlx_setA*( rhoA_next*(uy*uz) - m14A); + m14A = m14A + rlx_setA*( rhoA*(uy*uz) - m14A) + (1-0.5*rlx_setA)*(FzA*uy+FyA*uz); - m15A = m15A + rlx_setA*( rhoA_next*(ux*uz) - m15A) + 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); @@ -1908,102 +1908,102 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB // ------------------- Fluid Component A -----------------------// //.................inverse transformation...................................................... // q=0 - //fq = mrt_V1*rhoA_next-mrt_V2*m1A+mrt_V3*m2A; - f0 = mrt_V1*rhoA_next-mrt_V2*m1A+mrt_V3*m2A; - distA[n] = f0; + fq = mrt_V1*rhoA_next-mrt_V2*m1A+mrt_V3*m2A; + //f0 = mrt_V1*rhoA_next-mrt_V2*m1A+mrt_V3*m2A; + distA[n] = fq; // q = 1 - //fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A); - f1 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A); - distA[1*Np+n] = f1; + fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A); + //f1 = mrt_V1*rhoA_next-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_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A); - f2 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A); - distA[2*Np+n] = f2; + fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A); + //f2 = mrt_V1*rhoA_next-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_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jyA-m6A)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); - f3 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jyA-m6A)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); - distA[3*Np+n] = f3; + fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jyA-m6A)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); + //f3 = mrt_V1*rhoA_next-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_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m6A-jyA)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); - f4 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m6A-jyA)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); - distA[4*Np+n] = f4; + fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m6A-jyA)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); + //f4 = mrt_V1*rhoA_next-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_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jzA-m8A)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); - f5 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jzA-m8A)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); - distA[5*Np+n] = f5; + fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jzA-m8A)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); + //f5 = mrt_V1*rhoA_next-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_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m8A-jzA)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); - f6 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m8A-jzA)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); - distA[6*Np+n] = f6; + fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m8A-jzA)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); + //f6 = mrt_V1*rhoA_next-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_next+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); - f7 = mrt_V1*rhoA_next+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] = f7; + fq = mrt_V1*rhoA_next+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); + //f7 = mrt_V1*rhoA_next+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_next+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); - f8 = mrt_V1*rhoA_next+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] = f8; + fq = mrt_V1*rhoA_next+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); + //f8 = mrt_V1*rhoA_next+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_next+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); - f9 = mrt_V1*rhoA_next+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] = f9; + fq = mrt_V1*rhoA_next+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); + //f9 = mrt_V1*rhoA_next+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_next+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); - f10 = mrt_V1*rhoA_next+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] = f10; + fq = mrt_V1*rhoA_next+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); + //f10 = mrt_V1*rhoA_next+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_next+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); - f11 = mrt_V1*rhoA_next+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] = f11; + fq = mrt_V1*rhoA_next+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); + //f11 = mrt_V1*rhoA_next+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_next+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); - f12 = mrt_V1*rhoA_next+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] = f12; + fq = mrt_V1*rhoA_next+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); + //f12 = mrt_V1*rhoA_next+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_next+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); - f13 = mrt_V1*rhoA_next+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] = f13; + fq = mrt_V1*rhoA_next+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); + //f13 = mrt_V1*rhoA_next+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_next+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); - f14 = mrt_V1*rhoA_next+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] = f14; + fq = mrt_V1*rhoA_next+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); + //f14 = mrt_V1*rhoA_next+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_next+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); - f15 = mrt_V1*rhoA_next+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] = f15; + fq = mrt_V1*rhoA_next+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); + //f15 = mrt_V1*rhoA_next+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_next+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); - f16 = mrt_V1*rhoA_next+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] = f16; + fq = mrt_V1*rhoA_next+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); + //f16 = mrt_V1*rhoA_next+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_next+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); - f17 = mrt_V1*rhoA_next+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] = f17; + fq = mrt_V1*rhoA_next+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); + //f17 = mrt_V1*rhoA_next+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_next+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); - f18 = mrt_V1*rhoA_next+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] = f18; + fq = mrt_V1*rhoA_next+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); + //f18 = mrt_V1*rhoA_next+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; //........................................................................ - Den[n] = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; + //Den[n] = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; // //..............carry out relaxation process............................................... // m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) @@ -2045,32 +2045,32 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB //-------------------- 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_next*(ux*ux+uy*uy+uz*uz) - 11*rhoB_next) - m1B) + m1B = m1B + rlx_setA*((19*rhoB*(ux*ux+uy*uy+uz*uz) - 11*rhoB_next) - m1B) + (1-0.5*rlx_setA)*38*(FxB*ux+FyB*uy+FzB*uz); - m2B = m2B + rlx_setA*((3*rhoB_next - 5.5*rhoB_next*(ux*ux+uy*uy+uz*uz))- m2B) + m2B = m2B + rlx_setA*((3*rhoB_next - 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_next)- m4B) + 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_next)- m6B) + 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_next)- m8B) + m8B = m8B + rlx_setB*((-0.6666666666666666*uz*rhoB)- m8B) + (1-0.5*rlx_setB)*(-0.6666666666666666*FzB); - m9B = m9B + rlx_setA*((rhoB_next*(2*ux*ux-uy*uy-uz*uz)) - m9B) + 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); - m11B = m11B + rlx_setA*((rhoB_next*(uy*uy-uz*uz)) - m11B) + 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); - m13B = m13B + rlx_setA*( rhoB_next*(ux*uy) - m13B) + m13B = m13B + rlx_setA*( rhoB*(ux*uy) - m13B) + (1-0.5*rlx_setA)*(FyB*ux+FxB*uy); - m14B = m14B + rlx_setA*( rhoB_next*(uy*uz) - m14B) + m14B = m14B + rlx_setA*( rhoB*(uy*uz) - m14B) + (1-0.5*rlx_setA)*(FzB*uy+FyB*uz); - m15B = m15B + rlx_setA*( rhoB_next*(ux*uz) - m15B) + 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); @@ -2081,108 +2081,108 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB // ------------------- Fluid Component B -----------------------// //.................inverse transformation...................................................... // q=0 - //fq = mrt_V1*rhoB_next-mrt_V2*m1B+mrt_V3*m2B; - f0 = mrt_V1*rhoB_next-mrt_V2*m1B+mrt_V3*m2B; - distB[n] = f0; + fq = mrt_V1*rhoB_next-mrt_V2*m1B+mrt_V3*m2B; + //f0 = mrt_V1*rhoB_next-mrt_V2*m1B+mrt_V3*m2B; + distB[n] = fq; // q = 1 - //fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B); - f1 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B); - distB[1*Np+n] = f1; + fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B); + //f1 = mrt_V1*rhoB_next-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_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B); - f2 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B); - distB[2*Np+n] = f2; + fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B); + //f2 = mrt_V1*rhoB_next-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_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jyB-m6B)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); - f3 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jyB-m6B)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); - distB[3*Np+n] = f3; + fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jyB-m6B)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); + //f3 = mrt_V1*rhoB_next-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_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m6B-jyB)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); - f4 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m6B-jyB)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); - distB[4*Np+n] = f4; + fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m6B-jyB)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); + //f4 = mrt_V1*rhoB_next-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_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jzB-m8B)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); - f5 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jzB-m8B)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); - distB[5*Np+n] = f5; + fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jzB-m8B)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); + //f5 = mrt_V1*rhoB_next-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_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m8B-jzB)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); - f6 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m8B-jzB)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); - distB[6*Np+n] = f6; + fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m8B-jzB)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); + //f6 = mrt_V1*rhoB_next-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_next+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); - f7 = mrt_V1*rhoB_next+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] = f7; + fq = mrt_V1*rhoB_next+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); + //f7 = mrt_V1*rhoB_next+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_next+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); - f8 = mrt_V1*rhoB_next+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] = f8; + fq = mrt_V1*rhoB_next+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); + //f8 = mrt_V1*rhoB_next+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_next+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); - f9 = mrt_V1*rhoB_next+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] = f9; + fq = mrt_V1*rhoB_next+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); + //f9 = mrt_V1*rhoB_next+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_next+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); - f10 = mrt_V1*rhoB_next+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] = f10; + fq = mrt_V1*rhoB_next+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); + //f10 = mrt_V1*rhoB_next+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_next+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); - f11 = mrt_V1*rhoB_next+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] = f11; + fq = mrt_V1*rhoB_next+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); + //f11 = mrt_V1*rhoB_next+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_next+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); - f12 = mrt_V1*rhoB_next+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] = f12; + fq = mrt_V1*rhoB_next+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); + //f12 = mrt_V1*rhoB_next+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_next+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); - f13 = mrt_V1*rhoB_next+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] = f13; + fq = mrt_V1*rhoB_next+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); + //f13 = mrt_V1*rhoB_next+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_next+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); - f14 = mrt_V1*rhoB_next+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] = f14; + fq = mrt_V1*rhoB_next+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); + //f14 = mrt_V1*rhoB_next+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_next+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); - f15 = mrt_V1*rhoB_next+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] = f15; + fq = mrt_V1*rhoB_next+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); + //f15 = mrt_V1*rhoB_next+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_next+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); - f16 = mrt_V1*rhoB_next+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] = f16; + fq = mrt_V1*rhoB_next+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); + //f16 = mrt_V1*rhoB_next+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_next+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); - f17 = mrt_V1*rhoB_next+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] = f17; + fq = mrt_V1*rhoB_next+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); + //f17 = mrt_V1*rhoB_next+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_next+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); - f18 = mrt_V1*rhoB_next+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] = f18; + fq = mrt_V1*rhoB_next+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); + //f18 = mrt_V1*rhoB_next+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; //........................................................................ - Den[n+Np] = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; + //Den[n+Np] = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; //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_next+rhoB_next+Gsc*rhoA_next*rhoB_next)/3.0; + Pressure[n] = (rhoA+rhoB+Gsc*rhoA*rhoB)/3.0; //Update density //Den[n] = rhoA_next; //Den[n+Np] = rhoB_next; diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp index da5d08e3..a20f4bc9 100644 --- a/models/GreyscaleSCModel.cpp +++ b/models/GreyscaleSCModel.cpp @@ -706,21 +706,73 @@ void ScaLBL_GreyscaleSCModel::Run(){ timestep++; // Compute the density field // Read for Aq, Bq happens in this routine (requires communication) - //ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL - //ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, fqA, fqB, Den, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - //ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE - //ScaLBL_DeviceBarrier(); - //ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, fqA, fqB, Den, 0, ScaLBL_Comm->LastExterior(), Np); - + ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL + ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, fqA, fqB, Den, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, fqA, fqB, Den, 0, ScaLBL_Comm->LastExterior(), Np); // Compute density gradient // fluid component A ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + // fluid component B + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + // Compute density gradient ScaLBL_Comm->SendHalo(&Den[0]); ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&Den[0],DenGradA); ScaLBL_DeviceBarrier(); + ScaLBL_Comm->SendHalo(&Den[Np]); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[Np],DenGradB); + ScaLBL_DeviceBarrier(); + + //debug + DoubleArray PhaseField(Nx,Ny,Nz); + ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + FILE *AFILE; + sprintf(LocalRankFilename,"A_beforeCol_time_%i.%05i.raw",timestep,rank); + AFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,AFILE); + fclose(AFILE); + + ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + FILE *BFILE; + sprintf(LocalRankFilename,"B_beforeCol_time_%i.%05i.raw",timestep,rank); + BFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,BFILE); + fclose(BFILE); + + + // Collsion + ScaLBL_D3Q19_AAodd_GreyscaleSC(NeighborList, fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, + ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + + // Collsion + ScaLBL_D3Q19_AAodd_GreyscaleSC(NeighborList, fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, + 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + + // *************EVEN TIMESTEP*************// + timestep++; + // Compute the density field + // Read for Aq, Bq happens in this routine (requires communication) + ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL + ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(fqA, fqB, Den, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(fqA, fqB, Den, 0, ScaLBL_Comm->LastExterior(), Np); + // Compute density gradient + // fluid component A + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); // fluid component B ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + // Compute density gradient + ScaLBL_Comm->SendHalo(&Den[0]); + ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_Comm->RecvGrad(&Den[0],DenGradA); + ScaLBL_DeviceBarrier(); ScaLBL_Comm->SendHalo(&Den[Np]); ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_Comm->RecvGrad(&Den[Np],DenGradB); @@ -728,124 +780,31 @@ void ScaLBL_GreyscaleSCModel::Run(){ //debug //DoubleArray PhaseField(Nx,Ny,Nz); - //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); //FILE *AFILE; - //sprintf(LocalRankFilename,"A_time_%i_prior.%05i.raw",timestep,rank); - //AFILE = fopen(LocalRankFilename,"wb"); - //fwrite(PhaseField.data(),8,N,AFILE); - //fclose(AFILE); + sprintf(LocalRankFilename,"A_beforeCol_time_%i.%05i.raw",timestep,rank); + AFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,AFILE); + fclose(AFILE); - //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); //FILE *BFILE; - //sprintf(LocalRankFilename,"B_time_%i_prior.%05i.raw",timestep,rank); - //BFILE = fopen(LocalRankFilename,"wb"); - //fwrite(PhaseField.data(),8,N,BFILE); - //fclose(BFILE); + sprintf(LocalRankFilename,"B_beforeCol_time_%i.%05i.raw",timestep,rank); + BFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,BFILE); + fclose(BFILE); - ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL - ScaLBL_D3Q19_AAodd_GreyscaleSC(NeighborList, fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, - tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, - ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE - ScaLBL_DeviceBarrier(); - // Set BCs - //if (BoundaryCondition == 3){ - // ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); - // ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); - //} - ScaLBL_D3Q19_AAodd_GreyscaleSC(NeighborList, fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, - tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, - 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - - - //debug - ////DoubleArray PhaseField(Nx,Ny,Nz); - //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); - ////FILE *AFILE; - //sprintf(LocalRankFilename,"A_time_%i_after.%05i.raw",timestep,rank); - //AFILE = fopen(LocalRankFilename,"wb"); - //fwrite(PhaseField.data(),8,N,AFILE); - //fclose(AFILE); - - //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); - ////FILE *BFILE; - //sprintf(LocalRankFilename,"B_time_%i_after.%05i.raw",timestep,rank); - //BFILE = fopen(LocalRankFilename,"wb"); - //fwrite(PhaseField.data(),8,N,BFILE); - //fclose(BFILE); - // *************EVEN TIMESTEP*************// - timestep++; - // Compute the density field - // Read for Aq, Bq happens in this routine (requires communication) - //ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL - //ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(fqA, fqB, Den, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - //ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE - //ScaLBL_DeviceBarrier(); - //ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(fqA, fqB, Den, 0, ScaLBL_Comm->LastExterior(), Np); - - // Compute density gradient - // fluid component A - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&Den[0]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[0],DenGradA); - ScaLBL_DeviceBarrier(); - // fluid component B - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&Den[Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[Np],DenGradB); - ScaLBL_DeviceBarrier(); - - //debug - ////DoubleArray PhaseField(Nx,Ny,Nz); - //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); - ////FILE *AFILE; - //sprintf(LocalRankFilename,"A_time_%i_prior.%05i.raw",timestep,rank); - //AFILE = fopen(LocalRankFilename,"wb"); - //fwrite(PhaseField.data(),8,N,AFILE); - //fclose(AFILE); - - //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); - ////FILE *BFILE; - //sprintf(LocalRankFilename,"B_time_%i_prior.%05i.raw",timestep,rank); - //BFILE = fopen(LocalRankFilename,"wb"); - //fwrite(PhaseField.data(),8,N,BFILE); - //fclose(BFILE); - - ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL + // Collsion ScaLBL_D3Q19_AAeven_GreyscaleSC(fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE - ScaLBL_DeviceBarrier(); - // Set BCs - //if (BoundaryCondition == 3){ - // ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); - // ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); - //} + + // Collsion ScaLBL_D3Q19_AAeven_GreyscaleSC(fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - //debug - ////DoubleArray PhaseField(Nx,Ny,Nz); - //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); - ////FILE *AFILE; - //sprintf(LocalRankFilename,"A_time_%i_after.%05i.raw",timestep,rank); - //AFILE = fopen(LocalRankFilename,"wb"); - //fwrite(PhaseField.data(),8,N,AFILE); - //fclose(AFILE); - - //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); - ////FILE *BFILE; - //sprintf(LocalRankFilename,"B_time_%i_after.%05i.raw",timestep,rank); - //BFILE = fopen(LocalRankFilename,"wb"); - //fwrite(PhaseField.data(),8,N,BFILE); - //fclose(BFILE); - //************************************************************************/ // if (timestep%analysis_interval==0){ From 9f8af47d2bb35d68a299f7ed949e6a0293336073 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sun, 3 May 2020 18:03:44 -0400 Subject: [PATCH 28/75] continue GreyscaleSC debugging;save the work --- common/ScaLBL.h | 13 +- gpu/GreyscaleSC.cu | 878 +++++++++++++++++++++++++++++++++++- models/GreyscaleSCModel.cpp | 67 +-- 3 files changed, 907 insertions(+), 51 deletions(-) diff --git a/common/ScaLBL.h b/common/ScaLBL.h index 5220bed2..526ab5a4 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -124,16 +124,25 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(int *NeighborList, double extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(double *distA, double *distB, double *Den, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double *distA, double *distB, double *Den, 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); -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(double *distA, double *distB, double *Den, 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); +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(int *neighborList, double *distA, double *distB, double *Den, 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); + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(double *distA, double *distB, double *Den, 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); // MRT MODEL extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_setA, double rlx_setB, double Fx, diff --git a/gpu/GreyscaleSC.cu b/gpu/GreyscaleSC.cu index 951b00e4..dea5476f 100644 --- a/gpu/GreyscaleSC.cu +++ b/gpu/GreyscaleSC.cu @@ -3,7 +3,7 @@ #define NBLOCKS 1024 #define NTHREADS 256 -__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double *distA, double *distB, double *Den, 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){ @@ -791,11 +791,15 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *di + (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) + //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) + //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); @@ -983,11 +987,15 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *di + (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) + //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) + //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); @@ -1133,7 +1141,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC(int *neighborList, double *di } } -__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(double *distA, double *distB, double *Den, 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){ @@ -1887,11 +1895,15 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB + (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) + //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) + //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); @@ -2060,11 +2072,15 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB + (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) + //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) + //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); @@ -2191,6 +2207,808 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB } } +__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(int *neighborList, double *distA, double *distB, double *Den, 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 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; + + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s 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; + } + } +} + +__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(double *distA, double *distB, double *Den, 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; + 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; + + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s>>(neighborList,distA,distB,Den,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, + dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT<<>>(neighborList,distA,distB,Den,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleSC: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC(double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(double *distA, double *distB, double *Den, 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){ - dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC<<>>(distA,distB,Den,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, + dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT<<>>(distA,distB,Den,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleSC: %s \n",cudaGetErrorString(err)); + printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(int *neighborList, double *distA, double *distB, double *Den, 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){ + + dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK<<>>(neighborList,distA,distB,Den,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, + tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(double *distA, double *distB, double *Den, 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){ + + dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK<<>>(distA,distB,Den,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, + tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK: %s \n",cudaGetErrorString(err)); } } diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp index a20f4bc9..7e437b7b 100644 --- a/models/GreyscaleSCModel.cpp +++ b/models/GreyscaleSCModel.cpp @@ -727,33 +727,34 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_DeviceBarrier(); //debug - DoubleArray PhaseField(Nx,Ny,Nz); - ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); - FILE *AFILE; - sprintf(LocalRankFilename,"A_beforeCol_time_%i.%05i.raw",timestep,rank); - AFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,AFILE); - fclose(AFILE); - - ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); - FILE *BFILE; - sprintf(LocalRankFilename,"B_beforeCol_time_%i.%05i.raw",timestep,rank); - BFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,BFILE); - fclose(BFILE); +// DoubleArray PhaseField(Nx,Ny,Nz); +// ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); +// FILE *AFILE; +// sprintf(LocalRankFilename,"A_beforeCol_time_%i.%05i.raw",timestep,rank); +// AFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,AFILE); +// fclose(AFILE); +// +// ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); +// FILE *BFILE; +// sprintf(LocalRankFilename,"B_beforeCol_time_%i.%05i.raw",timestep,rank); +// BFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,BFILE); +// fclose(BFILE); // Collsion - ScaLBL_D3Q19_AAodd_GreyscaleSC(NeighborList, fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(NeighborList, fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); // Collsion - ScaLBL_D3Q19_AAodd_GreyscaleSC(NeighborList, fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(NeighborList, fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + // *************EVEN TIMESTEP*************// timestep++; // Compute the density field @@ -778,29 +779,29 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_Comm->RecvGrad(&Den[Np],DenGradB); ScaLBL_DeviceBarrier(); - //debug - //DoubleArray PhaseField(Nx,Ny,Nz); - ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); - //FILE *AFILE; - sprintf(LocalRankFilename,"A_beforeCol_time_%i.%05i.raw",timestep,rank); - AFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,AFILE); - fclose(AFILE); - - ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); - //FILE *BFILE; - sprintf(LocalRankFilename,"B_beforeCol_time_%i.%05i.raw",timestep,rank); - BFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,BFILE); - fclose(BFILE); +// //debug +// //DoubleArray PhaseField(Nx,Ny,Nz); +// ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); +// //FILE *AFILE; +// sprintf(LocalRankFilename,"A_beforeCol_time_%i.%05i.raw",timestep,rank); +// AFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,AFILE); +// fclose(AFILE); +// +// ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); +// //FILE *BFILE; +// sprintf(LocalRankFilename,"B_beforeCol_time_%i.%05i.raw",timestep,rank); +// BFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,BFILE); +// fclose(BFILE); // Collsion - ScaLBL_D3Q19_AAeven_GreyscaleSC(fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); // Collsion - ScaLBL_D3Q19_AAeven_GreyscaleSC(fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); From e83e7940218aa20e56e3f41fabe56781f0873fc2 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Mon, 4 May 2020 23:36:27 -0400 Subject: [PATCH 29/75] GreyscaleSC model;BGK works but MRT doesnt;save the work --- common/ScaLBL.h | 15 +- gpu/GreyscaleSC.cu | 930 ++++++++++++++++-------------------- models/GreyscaleSCModel.cpp | 240 +++++++--- models/GreyscaleSCModel.h | 4 +- 4 files changed, 579 insertions(+), 610 deletions(-) diff --git a/common/ScaLBL.h b/common/ScaLBL.h index 526ab5a4..bf2bb9dc 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -118,32 +118,33 @@ extern "C" void ScaLBL_D3Q19_GreyscaleFE_PressureTensor(int *neighborList, doubl // GREYSCALE SHAN-CHEN MODEL (Two-component) -extern "C" void ScaLBL_D3Q19_GreyscaleSC_Init(double *distA, double *distB, double *Den, int Np); +extern "C" void ScaLBL_D3Q19_GreyscaleSC_Init(int *Map, double *distA, double *distB, double *DenA, double *DenB, int Np); -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(int *NeighborList, double *distA, double *distB, double *Den, int start, int finish, int Np); +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); -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(double *distA, double *distB, double *Den, int start, int finish, int Np); +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(int *Map, double *distA, double *distB, double *DenA, double *DenB, int start, int finish, int Np); -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, int *Mpa, 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); -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +extern "C" void 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); -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(int *neighborList, double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +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); -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +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); +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); // MRT MODEL extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_setA, double rlx_setB, double Fx, double Fy, double Fz); diff --git a/gpu/GreyscaleSC.cu b/gpu/GreyscaleSC.cu index dea5476f..d0768f8c 100644 --- a/gpu/GreyscaleSC.cu +++ b/gpu/GreyscaleSC.cu @@ -3,11 +3,12 @@ #define NBLOCKS 1024 #define NTHREADS 256 -__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +__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; @@ -16,7 +17,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double double jxA,jyA,jzA; double jxB,jyB,jzB; double rhoA,rhoB; - double rhoA_next,rhoB_next; + 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; @@ -32,8 +33,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double 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 rhoA_gradx,rhoA_grady,rhoA_gradz; - double rhoB_gradx,rhoB_grady,rhoB_gradz; + 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; @@ -60,18 +61,19 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double if ( n even part of dist) fq = distA[nread]; // reading the f2 data into register fq - rhoA_next += fq; + rhoA += fq; m1A -= 11.0*(fq); m2A -= 4.0*(fq); jxA -= fq; @@ -109,7 +111,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=3 nread = neighborList[n+2*Np]; // neighbor 4 fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A -= 11.0*fq; m2A -= 4.0*fq; jyA = fq; @@ -122,7 +124,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q = 4 nread = neighborList[n+3*Np]; // neighbor 3 fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A -= 11.0*fq; m2A -= 4.0*fq; jyA -= fq; @@ -135,7 +137,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=5 nread = neighborList[n+4*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A -= 11.0*fq; m2A -= 4.0*fq; jzA = fq; @@ -149,7 +151,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q = 6 nread = neighborList[n+5*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A -= 11.0*fq; m2A -= 4.0*fq; jzA -= fq; @@ -162,7 +164,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=7 nread = neighborList[n+6*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A += 8.0*fq; m2A += fq; jxA += fq; @@ -180,7 +182,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q = 8 nread = neighborList[n+7*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A += 8.0*fq; m2A += fq; jxA -= fq; @@ -198,7 +200,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=9 nread = neighborList[n+8*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A += 8.0*fq; m2A += fq; jxA += fq; @@ -216,7 +218,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q = 10 nread = neighborList[n+9*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A += 8.0*fq; m2A += fq; jxA -= fq; @@ -234,7 +236,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=11 nread = neighborList[n+10*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A += 8.0*fq; m2A += fq; jxA += fq; @@ -252,7 +254,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=12 nread = neighborList[n+11*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A += 8.0*fq; m2A += fq; jxA -= fq; @@ -270,7 +272,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=13 nread = neighborList[n+12*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A += 8.0*fq; m2A += fq; jxA += fq; @@ -288,7 +290,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=14 nread = neighborList[n+13*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A += 8.0*fq; m2A += fq; jxA -= fq; @@ -306,7 +308,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=15 nread = neighborList[n+14*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A += 8.0*fq; m2A += fq; jyA += fq; @@ -322,7 +324,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=16 nread = neighborList[n+15*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A += 8.0*fq; m2A += fq; jyA -= fq; @@ -338,7 +340,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=17 nread = neighborList[n+16*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A += 8.0*fq; m2A += fq; jyA += fq; @@ -354,7 +356,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=18 nread = neighborList[n+17*Np]; fq = distA[nread]; - rhoA_next += fq; + rhoA += fq; m1A += 8.0*fq; m2A += fq; jyA -= fq; @@ -375,14 +377,14 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double //........................................................................ // q=0 fq = distB[n]; - rhoB_next = fq; + 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_next += fq; + rhoB += fq; m1B -= 11.0*fq; m2B -= 4.0*fq; jxB = fq; @@ -393,7 +395,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=2 nread = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) fq = distB[nread]; // reading the f2 data into register fq - rhoB_next += fq; + rhoB += fq; m1B -= 11.0*(fq); m2B -= 4.0*(fq); jxB -= fq; @@ -404,7 +406,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=3 nread = neighborList[n+2*Np]; // neighbor 4 fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B -= 11.0*fq; m2B -= 4.0*fq; jyB = fq; @@ -417,7 +419,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q = 4 nread = neighborList[n+3*Np]; // neighbor 3 fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B -= 11.0*fq; m2B -= 4.0*fq; jyB -= fq; @@ -430,7 +432,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=5 nread = neighborList[n+4*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B -= 11.0*fq; m2B -= 4.0*fq; jzB = fq; @@ -444,7 +446,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q = 6 nread = neighborList[n+5*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B -= 11.0*fq; m2B -= 4.0*fq; jzB -= fq; @@ -457,7 +459,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=7 nread = neighborList[n+6*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B += 8.0*fq; m2B += fq; jxB += fq; @@ -475,7 +477,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q = 8 nread = neighborList[n+7*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B += 8.0*fq; m2B += fq; jxB -= fq; @@ -493,7 +495,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=9 nread = neighborList[n+8*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B += 8.0*fq; m2B += fq; jxB += fq; @@ -511,7 +513,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q = 10 nread = neighborList[n+9*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B += 8.0*fq; m2B += fq; jxB -= fq; @@ -529,7 +531,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=11 nread = neighborList[n+10*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B += 8.0*fq; m2B += fq; jxB += fq; @@ -547,7 +549,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=12 nread = neighborList[n+11*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B += 8.0*fq; m2B += fq; jxB -= fq; @@ -565,7 +567,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=13 nread = neighborList[n+12*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B += 8.0*fq; m2B += fq; jxB += fq; @@ -583,7 +585,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=14 nread = neighborList[n+13*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B += 8.0*fq; m2B += fq; jxB -= fq; @@ -601,7 +603,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=15 nread = neighborList[n+14*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B += 8.0*fq; m2B += fq; jyB += fq; @@ -617,7 +619,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=16 nread = neighborList[n+15*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B += 8.0*fq; m2B += fq; jyB -= fq; @@ -633,7 +635,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=17 nread = neighborList[n+16*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B += 8.0*fq; m2B += fq; jyB += fq; @@ -649,7 +651,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // q=18 nread = neighborList[n+17*Np]; fq = distB[nread]; - rhoB_next += fq; + rhoB += fq; m1B += 8.0*fq; m2B += fq; jyB -= fq; @@ -665,12 +667,12 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // 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; + 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]; @@ -697,13 +699,13 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double 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); + 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=rhoA*(Gx + GffA_x + GfsA_x); - FyA=rhoA*(Gy + GffA_y + GfsA_y); - FzA=rhoA*(Gz + GffA_z + GfsA_z); + 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 @@ -723,62 +725,29 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double 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); + 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=rhoB*(Gx + GffB_x + GfsB_x); - FyB=rhoB*(Gy + GffB_y + GfsB_y); - FzB=rhoB*(Gz + GffB_z + GfsB_z); + 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 = (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); + 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); -// //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) -// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) -// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; -// jx = jx + Fx; -// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -// jy = jy + Fy; -// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*Den) - m6) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -// jz = jz + Fz; -// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*Den) - m8) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -// m9 = m9 + rlx_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) -// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; -// m10 = m10 + rlx_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) -// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; -// m11 = m11 + rlx_setA*((Den*(uy*uy-uz*uz)/porosity) - m11) -// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; -// m12 = m12 + rlx_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12) -// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; -// m13 = m13 + rlx_setA*((Den*ux*uy/porosity) - m13) -// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; -// m14 = m14 + rlx_setA*((Den*uy*uz/porosity) - m14) -// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; -// m15 = m15 + rlx_setA*((Den*ux*uz/porosity) - m15) -// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); -// //....................................................................................................... - // ------------------- 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_next) - m1A) + 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_next - 5.5*rhoA*(ux*ux+uy*uy+uz*uz))- m2A) + 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) @@ -816,165 +785,109 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // ------------------- Fluid Component A -----------------------// //.................inverse transformation...................................................... // q=0 - fq = mrt_V1*rhoA_next-mrt_V2*m1A+mrt_V3*m2A; - //f0 = mrt_V1*rhoA_next-mrt_V2*m1A+mrt_V3*m2A; + fq = mrt_V1*rhoA-mrt_V2*m1A+mrt_V3*m2A; distA[n] = fq; // q = 1 - fq = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A); - //f1 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jxA-m4A)+mrt_V6*(m9A-m10A); + 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_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A); - //f2 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m4A-jxA)+mrt_V6*(m9A-m10A); + 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_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jyA-m6A)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); - //f3 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jyA-m6A)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); + 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_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m6A-jyA)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); - //f4 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m6A-jyA)+mrt_V7*(m10A-m9A)+mrt_V8*(m11A-m12A); + 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_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jzA-m8A)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); - //f5 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(jzA-m8A)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); + 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_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m8A-jzA)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); - //f6 = mrt_V1*rhoA_next-mrt_V4*m1A-mrt_V5*m2A+0.1*(m8A-jzA)+mrt_V7*(m10A-m9A)+mrt_V8*(m12A-m11A); + 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_next+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); - //f7 = mrt_V1*rhoA_next+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); + 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_next+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); - //f8 = mrt_V1*rhoA_next+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); + 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_next+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); - //f9 = mrt_V1*rhoA_next+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); + 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_next+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); - //f10 = mrt_V1*rhoA_next+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); + 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_next+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); - //f11 = mrt_V1*rhoA_next+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); + 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_next+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); - //f12 = mrt_V1*rhoA_next+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); + 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_next+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); - //f13 = mrt_V1*rhoA_next+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); + 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_next+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); - //f14 = mrt_V1*rhoA_next+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); + 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_next+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); - //f15 = mrt_V1*rhoA_next+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); + 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_next+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); - //f16 = mrt_V1*rhoA_next+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); + 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_next+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); - //f17 = mrt_V1*rhoA_next+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); + 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_next+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); - //f18 = mrt_V1*rhoA_next+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); + 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; //........................................................................ - - //Den[n] = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; - - -// //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) -// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) -// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; -// jx = jx + Fx; -// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -// jy = jy + Fy; -// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*Den) - m6) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -// jz = jz + Fz; -// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*Den) - m8) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -// m9 = m9 + rlx_setA*((Den*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) -// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; -// m10 = m10 + rlx_setA*(-0.5*Den*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) -// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; -// m11 = m11 + rlx_setA*((Den*(uy*uy-uz*uz)/porosity) - m11) -// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; -// m12 = m12 + rlx_setA*(-0.5*(Den*(uy*uy-uz*uz)/porosity)- m12) -// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; -// m13 = m13 + rlx_setA*((Den*ux*uy/porosity) - m13) -// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; -// m14 = m14 + rlx_setA*((Den*uy*uz/porosity) - m14) -// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; -// m15 = m15 + rlx_setA*((Den*ux*uz/porosity) - m15) -// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); -// //....................................................................................................... - // ------------------- 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_next) - m1B) + 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_next - 5.5*rhoB*(ux*ux+uy*uy+uz*uz))- m2B) + 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) @@ -1012,140 +925,116 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double // ------------------- Fluid Component B -----------------------// //.................inverse transformation...................................................... // q=0 - fq = mrt_V1*rhoB_next-mrt_V2*m1B+mrt_V3*m2B; - //f0 = mrt_V1*rhoB_next-mrt_V2*m1B+mrt_V3*m2B; + fq = mrt_V1*rhoB-mrt_V2*m1B+mrt_V3*m2B; distB[n] = fq; // q = 1 - fq = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B); - //f1 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jxB-m4B)+mrt_V6*(m9B-m10B); + 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_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B); - //f2 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m4B-jxB)+mrt_V6*(m9B-m10B); + 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_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jyB-m6B)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); - //f3 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jyB-m6B)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); + 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_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m6B-jyB)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); - //f4 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m6B-jyB)+mrt_V7*(m10B-m9B)+mrt_V8*(m11B-m12B); + 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_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jzB-m8B)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); - //f5 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(jzB-m8B)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); + 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_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m8B-jzB)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); - //f6 = mrt_V1*rhoB_next-mrt_V4*m1B-mrt_V5*m2B+0.1*(m8B-jzB)+mrt_V7*(m10B-m9B)+mrt_V8*(m12B-m11B); + 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_next+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); - //f7 = mrt_V1*rhoB_next+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); + 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_next+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); - //f8 = mrt_V1*rhoB_next+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); + 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_next+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); - //f9 = mrt_V1*rhoB_next+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); + 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_next+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); - //f10 = mrt_V1*rhoB_next+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); + 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_next+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); - //f11 = mrt_V1*rhoB_next+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); + 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_next+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); - //f12 = mrt_V1*rhoB_next+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); + 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_next+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); - //f13 = mrt_V1*rhoB_next+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); + 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_next+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); - //f14 = mrt_V1*rhoB_next+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); + 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_next+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); - //f15 = mrt_V1*rhoB_next+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); + 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_next+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); - //f16 = mrt_V1*rhoB_next+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); + 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_next+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); - //f17 = mrt_V1*rhoB_next+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); + 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_next+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); - //f18 = mrt_V1*rhoB_next+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); + 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; //........................................................................ - //Den[n+Np] = f0+f2+f1+f4+f3+f6+f5+f8+f7+f10+f9+f12+f11+f14+f13+f16+f15+f18+f17; - //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; - //Update density - //Den[n] = rhoA_next; - //Den[n+Np] = rhoB_next; - + Pressure[n] = (nA+nB+Gsc*nA*nB)/3.0; } } } -__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +__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; @@ -1154,7 +1043,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(double *distA, double *d double jxA,jyA,jzA; double jxB,jyB,jzB; double rhoA,rhoB; - double rhoA_next,rhoB_next; + 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; @@ -1170,8 +1059,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(double *distA, double *d 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 rhoA_gradx,rhoA_grady,rhoA_gradz; - double rhoB_gradx,rhoB_grady,rhoB_gradz; + 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; @@ -1198,18 +1087,19 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(double *distA, double *d if ( n>>(distA,distB,Den,Np); +__global__ void dvc_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; + + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s>>(Map,distA,distB,DenA,DenB,Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ printf("CUDA error in ScaLBL_D3Q19_GreyscaleSC_Init: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(int *NeighborList, double *distA, double *distB, double *Den, int start, int finish, int Np){ +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){ - dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_Density<<>>(NeighborList, distA, distB, Den, start, finish, Np); + dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_Density<<>>(NeighborList, Map, distA, distB, DenA, DenB, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ @@ -3358,9 +3233,9 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(int *NeighborList, double } } -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(double *distA, double *distB, double *Den, int start, int finish, int Np){ +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(int *Map, double *distA, double *distB, double *DenA, double *DenB, int start, int finish, int Np){ - dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_Density<<>>(distA, distB, Den, start, finish, Np); + dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_Density<<>>(Map,distA, distB, DenA, DenB, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ @@ -3369,12 +3244,12 @@ extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(double *distA, double *d } -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +extern "C" void 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){ - dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT<<>>(neighborList,distA,distB,Den,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, + dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT<<>>(neighborList,Map,distA,distB,DenA,DenB,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); cudaError_t err = cudaGetLastError(); @@ -3383,12 +3258,12 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, double *di } } -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +extern "C" void 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){ - dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT<<>>(distA,distB,Den,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, + dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT<<>>(Map,distA,distB,DenA,DenB,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); cudaError_t err = cudaGetLastError(); @@ -3397,12 +3272,12 @@ extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(double *distA, double *distB } } -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(int *neighborList, double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +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){ - dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK<<>>(neighborList,distA,distB,Den,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, + dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK<<>>(neighborList,Map,distA,distB,DenA,DenB,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); cudaError_t err = cudaGetLastError(); @@ -3411,12 +3286,12 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(int *neighborList, double *di } } -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(double *distA, double *distB, double *Den, double *DenGradA, double *DenGradB, +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){ - dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK<<>>(distA,distB,Den,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, + dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK<<>>(Map,distA,distB,DenA,DenB,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); cudaError_t err = cudaGetLastError(); @@ -3424,3 +3299,12 @@ extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(double *distA, double *distB printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK: %s \n",cudaGetErrorString(err)); } } + +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){ + + dvc_ScaLBL_D3Q19_GreyscaleSC_Gradient<<>>(neighborList, Map, Den, DenGrad, strideY, strideZ,start, finish, Np); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_GreyscaleSC_Gradient: %s \n",cudaGetErrorString(err)); + } +} diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp index 7e437b7b..3f50dc34 100644 --- a/models/GreyscaleSCModel.cpp +++ b/models/GreyscaleSCModel.cpp @@ -465,6 +465,81 @@ void ScaLBL_GreyscaleSCModel::AssignGreyscaleAndSolidLabels() delete [] Dst; } +//void ScaLBL_GreyscaleSCModel::Density_Init(){ +// +// size_t NLABELS=0; +// signed char VALUE=0; +// +// vector LabelList{1,2}; +// vector SwList{0.0,1.0}; +// +// if (greyscaleSC_db->keyExists( "GreyNodeLabels" )){ +// LabelList.clear(); +// LabelList = greyscaleSC_db->getVector( "GreyNodeLabels" ); +// } +// if (greyscaleSC_db->keyExists( "GreyNodeSw" )){ +// SwList.clear(); +// SwList = greyscaleSC_db->getVector( "GreyNodeSw" ); +// } +// +// NLABELS=LabelList.size(); +// if (NLABELS != SwList.size()){ +// ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); +// } +// +// double *Den_temp; +// Den_temp=new double [2*Np]; +// double nA=0.5;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. +// double nB=0.5; +// +// //double *Phi_temp; +// //Phi_temp=new double [Np]; +// //double phi = 0.0; +// +// for (int k=0; kid[n]; +// if (VALUE>0){ +// for (unsigned int idx=0; idx < NLABELS; idx++){ +// if (VALUE == LabelList[idx]){ +// double Sw = SwList[idx]; +// if ((Sw<0.0) || (Sw>1.0)) ERROR("Error: Initial saturation for grey nodes must be between [0.0, 1.0]! \n"); +// nB=Sw; +// nA=1.0-Sw; +// //phi = nA-nB; +// idx = NLABELS; +// } +// } +// if (VALUE==1){//label=1 reserved for NW phase +// //TODO; maybe need rho_major and rho_minor initialization +// nA=rhoA; +// nB=rhoB_minor; +// //phi = nA-nB; +// } +// else if(VALUE==2){//label=2 reserved for W phase +// //TODO; maybe need rho_major and rho_minor initialization +// nA=rhoA_minor; +// nB=rhoB; +// //phi = nA-nB; +// } +// int idx = Map(i,j,k); +// Den_temp[idx+0*Np] = nA; +// Den_temp[idx+1*Np] = nB; +// //Phi_temp[idx] = phi; +// } +// } +// } +// } +// //copy to device +// ScaLBL_CopyToDevice(Den, Den_temp, 2*Np*sizeof(double)); +// //ScaLBL_CopyToDevice(Phi, Phi_temp, 1*Np*sizeof(double)); +// ScaLBL_DeviceBarrier(); +// delete [] Den_temp; +// //delete [] Phi_temp; +//} + void ScaLBL_GreyscaleSCModel::Density_Init(){ size_t NLABELS=0; @@ -487,10 +562,11 @@ void ScaLBL_GreyscaleSCModel::Density_Init(){ ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); } - double *Den_temp; - Den_temp=new double [2*Np]; - double nA=0.5;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. - double nB=0.5; + double *DenA_temp,*DenB_temp; + DenA_temp=new double [Nx*Ny*Nz]; + DenB_temp=new double [Nx*Ny*Nz]; + double nA=0.0;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. + double nB=0.0; //double *Phi_temp; //Phi_temp=new double [Np]; @@ -513,30 +589,32 @@ void ScaLBL_GreyscaleSCModel::Density_Init(){ } } if (VALUE==1){//label=1 reserved for NW phase - //TODO; maybe need rho_major and rho_minor initialization nA=rhoA; nB=rhoB_minor; //phi = nA-nB; } else if(VALUE==2){//label=2 reserved for W phase - //TODO; maybe need rho_major and rho_minor initialization nA=rhoA_minor; nB=rhoB; //phi = nA-nB; } - int idx = Map(i,j,k); - Den_temp[idx+0*Np] = nA; - Den_temp[idx+1*Np] = nB; - //Phi_temp[idx] = phi; + DenA_temp[n] = nA; + DenB_temp[n] = nB; + } + else{ //for ID<=0, i.e. all sorts of solid minerals, density is zero + DenA_temp[n] = 0.0; + DenB_temp[n] = 0.0; } } } } //copy to device - ScaLBL_CopyToDevice(Den, Den_temp, 2*Np*sizeof(double)); + ScaLBL_CopyToDevice(DenA, DenA_temp, Nx*Ny*Nz*sizeof(double)); + ScaLBL_CopyToDevice(DenB, DenB_temp, Nx*Ny*Nz*sizeof(double)); //ScaLBL_CopyToDevice(Phi, Phi_temp, 1*Np*sizeof(double)); ScaLBL_DeviceBarrier(); - delete [] Den_temp; + delete [] DenA_temp; + delete [] DenB_temp; //delete [] Phi_temp; } @@ -559,6 +637,7 @@ void ScaLBL_GreyscaleSCModel::Create(){ // Create a communicator for the device (will use optimized layout) // ScaLBL_Communicator ScaLBL_Comm(Mask); // original ScaLBL_Comm = std::shared_ptr(new ScaLBL_Communicator(Mask)); + ScaLBL_Comm_Regular = std::shared_ptr(new ScaLBL_Communicator(Mask)); int Npad=(Np/16 + 2)*16; if (rank==0) printf ("Set up memory efficient layout, %i | %i | %i \n", Np, Npad, N); @@ -577,9 +656,11 @@ void ScaLBL_GreyscaleSCModel::Create(){ neighborSize=18*(Np*sizeof(int)); //........................................................................... ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); + ScaLBL_AllocateDeviceMemory((void **) &dvcMap, sizeof(int)*Np); ScaLBL_AllocateDeviceMemory((void **) &fqA, 19*dist_mem_size); ScaLBL_AllocateDeviceMemory((void **) &fqB, 19*dist_mem_size); - ScaLBL_AllocateDeviceMemory((void **) &Den, 2*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &DenA, sizeof(double)*Nx*Ny*Nz); + ScaLBL_AllocateDeviceMemory((void **) &DenB, sizeof(double)*Nx*Ny*Nz); ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); @@ -592,6 +673,36 @@ void ScaLBL_GreyscaleSCModel::Create(){ // Update GPU data structures if (rank==0) printf ("Setting up device neighbor list \n"); fflush(stdout); + // Copy the Map to device + int *TmpMap; + TmpMap=new int[Np]; + for (int k=1; kLastExterior(); idx++){ + auto n = TmpMap[idx]; + if (n > Nx*Ny*Nz){ + printf("Bad value! idx=%i \n", n); + TmpMap[idx] = Nx*Ny*Nz-1; + } + } + for (int idx=ScaLBL_Comm->FirstInterior(); idxLastInterior(); idx++){ + auto n = TmpMap[idx]; + if ( n > Nx*Ny*Nz ){ + printf("Bad value! idx=%i \n",n); + TmpMap[idx] = Nx*Ny*Nz-1; + } + } + ScaLBL_CopyToDevice(dvcMap, TmpMap, sizeof(int)*Np); + ScaLBL_DeviceBarrier(); + delete [] TmpMap; // copy the neighbor list ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); } @@ -631,18 +742,20 @@ void ScaLBL_GreyscaleSCModel::Initialize(){ if (rank==0) printf ("Initializing density field \n"); Density_Init();//initialize density field if (rank==0) printf ("Initializing distributions \n"); - ScaLBL_D3Q19_GreyscaleSC_Init(fqA, fqB, Den, Np); + ScaLBL_D3Q19_GreyscaleSC_Init(dvcMap,fqA, fqB, DenA,DenB, Np); //debug DoubleArray PhaseField(Nx,Ny,Nz); - ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + ScaLBL_CopyToHost(PhaseField.data(), DenA, sizeof(double)*N); FILE *AFILE; sprintf(LocalRankFilename,"A_init.%05i.raw",rank); AFILE = fopen(LocalRankFilename,"wb"); fwrite(PhaseField.data(),8,N,AFILE); fclose(AFILE); - ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + ScaLBL_CopyToHost(PhaseField.data(), DenB, sizeof(double)*N); FILE *BFILE; sprintf(LocalRankFilename,"B_init.%05i.raw",rank); BFILE = fopen(LocalRankFilename,"wb"); @@ -707,49 +820,32 @@ void ScaLBL_GreyscaleSCModel::Run(){ // Compute the density field // Read for Aq, Bq happens in this routine (requires communication) ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL - ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, fqA, fqB, Den, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, dvcMap, fqA, fqB, DenA, DenB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); - ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, fqA, fqB, Den, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); + // Compute density gradient // fluid component A - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm_Regular->SendHalo(DenA); + ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm_Regular->RecvHalo(DenA); + ScaLBL_DeviceBarrier(); + ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); // fluid component B - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - // Compute density gradient - ScaLBL_Comm->SendHalo(&Den[0]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[0],DenGradA); + ScaLBL_Comm_Regular->SendHalo(DenB); + ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm_Regular->RecvHalo(DenB); ScaLBL_DeviceBarrier(); - ScaLBL_Comm->SendHalo(&Den[Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[Np],DenGradB); - ScaLBL_DeviceBarrier(); - - //debug -// DoubleArray PhaseField(Nx,Ny,Nz); -// ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); -// FILE *AFILE; -// sprintf(LocalRankFilename,"A_beforeCol_time_%i.%05i.raw",timestep,rank); -// AFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,AFILE); -// fclose(AFILE); -// -// ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); -// FILE *BFILE; -// sprintf(LocalRankFilename,"B_beforeCol_time_%i.%05i.raw",timestep,rank); -// BFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,BFILE); -// fclose(BFILE); - + ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); // Collsion - ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(NeighborList, fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); // Collsion - ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(NeighborList, fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); @@ -760,48 +856,32 @@ void ScaLBL_GreyscaleSCModel::Run(){ // Compute the density field // Read for Aq, Bq happens in this routine (requires communication) ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL - ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(fqA, fqB, Den, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(dvcMap, fqA, fqB, DenA, DenB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); - ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(fqA, fqB, Den, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); + // Compute density gradient // fluid component A - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm_Regular->SendHalo(DenA); + ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm_Regular->RecvHalo(DenA); + ScaLBL_DeviceBarrier(); + ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); // fluid component B - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - // Compute density gradient - ScaLBL_Comm->SendHalo(&Den[0]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[0], DenGradA, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[0],DenGradA); + ScaLBL_Comm_Regular->SendHalo(DenB); + ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm_Regular->RecvHalo(DenB); ScaLBL_DeviceBarrier(); - ScaLBL_Comm->SendHalo(&Den[Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &Den[Np], DenGradB, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&Den[Np],DenGradB); - ScaLBL_DeviceBarrier(); - -// //debug -// //DoubleArray PhaseField(Nx,Ny,Nz); -// ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); -// //FILE *AFILE; -// sprintf(LocalRankFilename,"A_beforeCol_time_%i.%05i.raw",timestep,rank); -// AFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,AFILE); -// fclose(AFILE); -// -// ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); -// //FILE *BFILE; -// sprintf(LocalRankFilename,"B_beforeCol_time_%i.%05i.raw",timestep,rank); -// BFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,BFILE); -// fclose(BFILE); + ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); // Collsion - ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); // Collsion - ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(fqA, fqB, Den, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); @@ -1114,14 +1194,16 @@ void ScaLBL_GreyscaleSCModel::WriteDebug(){ // fwrite(PhaseField.data(),8,N,OUTFILE); // fclose(OUTFILE); // - ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + ScaLBL_CopyToHost(PhaseField.data(), DenA, sizeof(double)*N); FILE *AFILE; sprintf(LocalRankFilename,"A.%05i.raw",rank); AFILE = fopen(LocalRankFilename,"wb"); fwrite(PhaseField.data(),8,N,AFILE); fclose(AFILE); - ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + ScaLBL_CopyToHost(PhaseField.data(), DenB, sizeof(double)*N); FILE *BFILE; sprintf(LocalRankFilename,"B.%05i.raw",rank); BFILE = fopen(LocalRankFilename,"wb"); diff --git a/models/GreyscaleSCModel.h b/models/GreyscaleSCModel.h index 348490c4..bc71dc01 100644 --- a/models/GreyscaleSCModel.h +++ b/models/GreyscaleSCModel.h @@ -54,6 +54,7 @@ public: std::shared_ptr Dm; // this domain is for analysis std::shared_ptr Mask; // this domain is for lbm std::shared_ptr ScaLBL_Comm; + std::shared_ptr ScaLBL_Comm_Regular; // input database std::shared_ptr db; @@ -64,12 +65,13 @@ public: signed char *id; int *NeighborList; + int *dvcMap; double *fqA, *fqB; double *Permeability;//grey voxel permeability double *Porosity; double *Velocity; double *Pressure_dvc; - double *Den; + double *DenA, *DenB; double *DenGradA,*DenGradB; double *SolidForceA,*SolidForceB; From 3a21a142c4580c27895cb924bce97e73f704e063 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Wed, 6 May 2020 11:12:50 -0400 Subject: [PATCH 30/75] fix bugs: add some missing terms in the IMRT collsion terms --- cpu/Greyscale.cpp | 16 ++++++++-------- gpu/Greyscale.cu | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cpu/Greyscale.cpp b/cpu/Greyscale.cpp index b4b017c8..9b68ed61 100644 --- a/cpu/Greyscale.cpp +++ b/cpu/Greyscale.cpp @@ -894,9 +894,9 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, int //-------------------- IMRT collison where body force has higher-order terms -------------// // //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) // + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) // + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; // jx = jx + Fx; // m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) @@ -929,8 +929,8 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, int //-------------------- IMRT collison where body force has NO higher-order terms -------------// //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); jx = jx + Fx; m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); @@ -1401,9 +1401,9 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double *dis //-------------------- IMRT collison where body force has higher-order terms -------------// // //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) // + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) // + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; // jx = jx + Fx; // m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) @@ -1436,8 +1436,8 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double *dis //-------------------- IMRT collison where body force has NO higher-order terms -------------// //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + m1 = m1 + rlx_setA*((-30*Den+19*Den(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); jx = jx + Fx; m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); diff --git a/gpu/Greyscale.cu b/gpu/Greyscale.cu index 0a9a63e0..f826d1e3 100644 --- a/gpu/Greyscale.cu +++ b/gpu/Greyscale.cu @@ -912,9 +912,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, pressure=0.5/porosity*(pressure-0.5*Den*u_mag*u_mag/porosity); // //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) // + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) // + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; // jx = jx + Fx; // m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) @@ -946,8 +946,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, //-------------------- IMRT collison where body force has NO higher-order terms -------------// //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); jx = jx + Fx; m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); @@ -1425,9 +1425,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double pressure=0.5/porosity*(pressure-0.5*Den*u_mag*u_mag/porosity); // //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) // + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) // + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; // jx = jx + Fx; // m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) @@ -1459,8 +1459,8 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double //-------------------- IMRT collison where body force has NO higher-order terms -------------// //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*Den+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*Den - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); jx = jx + Fx; m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); From 6d59bf7effc0434498c6cf7d545535baf8c7590a Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Thu, 7 May 2020 12:26:06 -0400 Subject: [PATCH 31/75] revert to BGK collision for greyscale SC model --- models/GreyscaleSCModel.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp index 3f50dc34..27e66bf7 100644 --- a/models/GreyscaleSCModel.cpp +++ b/models/GreyscaleSCModel.cpp @@ -840,12 +840,12 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); // Collsion - ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); // Collsion - ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); @@ -876,12 +876,12 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); // Collsion - ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); // Collsion - ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_DeviceBarrier(); MPI_Barrier(comm); From 88b560a876a6a349a596fe59c871230f4e231245 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Thu, 7 May 2020 17:07:35 -0400 Subject: [PATCH 32/75] make the SC fluid-solid force consistent with literature --- models/GreyscaleSCModel.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp index 27e66bf7..0faeee7d 100644 --- a/models/GreyscaleSCModel.cpp +++ b/models/GreyscaleSCModel.cpp @@ -402,12 +402,12 @@ void ScaLBL_GreyscaleSCModel::AssignGreyscaleAndSolidLabels() double vec_z = double(kk-1); double GWNS_A=SolidPotentialA_host[nn]; double GWNS_B=SolidPotentialB_host[nn]; - phi_x_A += GWNS_A*weight*vec_x; - phi_y_A += GWNS_A*weight*vec_y; - phi_z_A += GWNS_A*weight*vec_z; - phi_x_B += GWNS_B*weight*vec_x; - phi_y_B += GWNS_B*weight*vec_y; - phi_z_B += GWNS_B*weight*vec_z; + phi_x_A += -1.0*GWNS_A*weight*vec_x; + phi_y_A += -1.0*GWNS_A*weight*vec_y; + phi_z_A += -1.0*GWNS_A*weight*vec_z; + phi_x_B += -1.0*GWNS_B*weight*vec_x; + phi_y_B += -1.0*GWNS_B*weight*vec_y; + phi_z_B += -1.0*GWNS_B*weight*vec_z; } } } From 42277520edb4fe3c2bab9dab67f320c0723e033f Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Thu, 7 May 2020 19:09:26 -0400 Subject: [PATCH 33/75] update output writing --- models/GreyscaleSCModel.cpp | 61 +++++++++++++++++++--------- models/GreyscaleSCModel.h | 4 +- tests/lbpm_greyscaleSC_simulator.cpp | 1 - 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp index 0faeee7d..bb73fdbb 100644 --- a/models/GreyscaleSCModel.cpp +++ b/models/GreyscaleSCModel.cpp @@ -120,6 +120,8 @@ void ScaLBL_GreyscaleSCModel::SetDomain(){ Velocity_z.resize(Nx,Ny,Nz); PorosityMap.resize(Nx,Ny,Nz); Pressure.resize(Nx,Ny,Nz); + DenA_data.resize(Nx,Ny,Nz); + DenB_data.resize(Nx,Ny,Nz); id = new signed char [N]; for (int i=0; iid[i] = 1; // initialize this way @@ -744,23 +746,23 @@ void ScaLBL_GreyscaleSCModel::Initialize(){ if (rank==0) printf ("Initializing distributions \n"); ScaLBL_D3Q19_GreyscaleSC_Init(dvcMap,fqA, fqB, DenA,DenB, Np); - //debug - DoubleArray PhaseField(Nx,Ny,Nz); - //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); - ScaLBL_CopyToHost(PhaseField.data(), DenA, sizeof(double)*N); - FILE *AFILE; - sprintf(LocalRankFilename,"A_init.%05i.raw",rank); - AFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,AFILE); - fclose(AFILE); - - //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); - ScaLBL_CopyToHost(PhaseField.data(), DenB, sizeof(double)*N); - FILE *BFILE; - sprintf(LocalRankFilename,"B_init.%05i.raw",rank); - BFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,BFILE); - fclose(BFILE); +// //debug +// DoubleArray PhaseField(Nx,Ny,Nz); +// //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); +// ScaLBL_CopyToHost(PhaseField.data(), DenA, sizeof(double)*N); +// FILE *AFILE; +// sprintf(LocalRankFilename,"A_init.%05i.raw",rank); +// AFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,AFILE); +// fclose(AFILE); +// +// //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); +// ScaLBL_CopyToHost(PhaseField.data(), DenB, sizeof(double)*N); +// FILE *BFILE; +// sprintf(LocalRankFilename,"B_init.%05i.raw",rank); +// BFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,BFILE); +// fclose(BFILE); //Velocity also needs initialization (for old incompressible momentum transport) //if (rank==0) printf ("Initializing velocity field \n"); @@ -1017,7 +1019,7 @@ void ScaLBL_GreyscaleSCModel::Run(){ // } if (timestep%visualization_interval==0){ - VelocityField(); + WriteOutput(); } // if (timestep%restart_interval==0){ @@ -1066,7 +1068,7 @@ void ScaLBL_GreyscaleSCModel::Run(){ // ************************************************************************ } -void ScaLBL_GreyscaleSCModel::VelocityField(){ +void ScaLBL_GreyscaleSCModel::WriteOutput(){ /* Minkowski Morphology(Mask); int SIZE=Np*sizeof(double); @@ -1121,6 +1123,8 @@ void ScaLBL_GreyscaleSCModel::VelocityField(){ auto VzVar = std::make_shared(); auto SignDistVar = std::make_shared(); auto PressureVar = std::make_shared(); + auto DenAVar = std::make_shared(); + auto DenBVar = std::make_shared(); IO::initialize("","silo","false"); // Create the MeshDataStruct @@ -1155,28 +1159,47 @@ void ScaLBL_GreyscaleSCModel::VelocityField(){ PressureVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); visData[0].vars.push_back(PressureVar); + DenAVar->name = "DenA"; + DenAVar->type = IO::VariableType::VolumeVariable; + DenAVar->dim = 1; + DenAVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(DenAVar); + DenBVar->name = "DenB"; + DenBVar->type = IO::VariableType::VolumeVariable; + DenBVar->dim = 1; + DenBVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(DenBVar); + Array& SignData = visData[0].vars[0]->data; Array& VelxData = visData[0].vars[1]->data; Array& VelyData = visData[0].vars[2]->data; Array& VelzData = visData[0].vars[3]->data; Array& PressureData = visData[0].vars[4]->data; + Array& DenAData = visData[0].vars[5]->data; + Array& DenBData = visData[0].vars[6]->data; ASSERT(visData[0].vars[0]->name=="SignDist"); ASSERT(visData[0].vars[1]->name=="Velocity_x"); ASSERT(visData[0].vars[2]->name=="Velocity_y"); ASSERT(visData[0].vars[3]->name=="Velocity_z"); ASSERT(visData[0].vars[4]->name=="Pressure"); + ASSERT(visData[0].vars[5]->name=="DenA"); + ASSERT(visData[0].vars[6]->name=="DenB"); ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); + ScaLBL_CopyToHost(DenA_data.data(), DenA, sizeof(double)*N); + ScaLBL_CopyToHost(DenB_data.data(), DenB, sizeof(double)*N); fillData.copy(SignDist,SignData); fillData.copy(Velocity_x,VelxData); fillData.copy(Velocity_y,VelyData); fillData.copy(Velocity_z,VelzData); fillData.copy(Pressure,PressureData); + fillData.copy(DenA_data,DenAData); + fillData.copy(DenB_data,DenBData); IO::writeData( timestep, visData, Dm->Comm ); diff --git a/models/GreyscaleSCModel.h b/models/GreyscaleSCModel.h index bc71dc01..5de29c3d 100644 --- a/models/GreyscaleSCModel.h +++ b/models/GreyscaleSCModel.h @@ -30,7 +30,7 @@ public: void Initialize(); void Run(); void WriteDebug(); - void VelocityField(); + void WriteOutput(); bool Restart,pBC; int timestep,timestepMax; @@ -82,6 +82,8 @@ public: DoubleArray Velocity_z; DoubleArray PorosityMap; DoubleArray Pressure; + DoubleArray DenA_data; + DoubleArray DenB_data; private: MPI_Comm comm; diff --git a/tests/lbpm_greyscaleSC_simulator.cpp b/tests/lbpm_greyscaleSC_simulator.cpp index b95fff04..340be938 100644 --- a/tests/lbpm_greyscaleSC_simulator.cpp +++ b/tests/lbpm_greyscaleSC_simulator.cpp @@ -49,7 +49,6 @@ int main(int argc, char **argv) GreyscaleSC.Create(); // creating the model will create data structure to match the pore structure and allocate variables GreyscaleSC.Initialize(); // initializing the model will set initial conditions for variables GreyscaleSC.Run(); - //GreyscaleSC.VelocityField(); GreyscaleSC.WriteDebug(); } // **************************************************** From 16cc9cb5aab533125b25faee5cabd22b86498448 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Wed, 20 May 2020 22:57:42 -0400 Subject: [PATCH 34/75] GreyscaleSC: save the work; pressureBC does not work --- common/ScaLBL.cpp | 39 +++ common/ScaLBL.h | 23 +- gpu/GreyscaleSC.cu | 509 ++++++++++++++++++++++++++++++++++++ models/GreyscaleSCModel.cpp | 80 ++++-- models/GreyscaleSCModel.h | 4 +- 5 files changed, 636 insertions(+), 19 deletions(-) diff --git a/common/ScaLBL.cpp b/common/ScaLBL.cpp index 8d868218..c8feffbe 100644 --- a/common/ScaLBL.cpp +++ b/common/ScaLBL.cpp @@ -2075,3 +2075,42 @@ void ScaLBL_Communicator::PrintD3Q19(){ delete [] TempBuffer; } +void ScaLBL_Communicator::GreyscaleSC_BC_z(int *Map, double *DenA, double *DenB, double vA, double vB) +{ + if (kproc == 0) { + // Set the density field on the z inlet + ScaLBL_GreyscaleSC_BC_z(dvcSendList_z, Map, DenA, DenB, vA, vB, sendCount_z, N); + } +} + +void ScaLBL_Communicator::GreyscaleSC_BC_Z(int *Map, double *DenA, double *DenB, double vA, double vB) +{ + if (kproc == nprocz-1){ + // Set the density field on the Z outlet + ScaLBL_GreyscaleSC_BC_Z(dvcSendList_Z, Map, DenA, DenB, vA, vB, sendCount_Z, N); + } +} + +void ScaLBL_Communicator::GreyscaleSC_Pressure_BC_z(int *neighborList, double *fqA, double *fqB, double dinA, double dinB, int time) +{ + if (kproc == 0) { + if (time%2==0){ + ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z(dvcSendList_z, fqA, fqB, dinA, dinB, sendCount_z, N); + } + else{ + ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z(neighborList, dvcSendList_z, fqA, fqB, dinA, dinB, sendCount_z, N); + } + } +} + +void ScaLBL_Communicator::GreyscaleSC_Pressure_BC_Z(int *neighborList, double *fqA, double *fqB, double doutA, double doutB, int time) +{ + if (kproc == nprocz-1){ + if (time%2==0){ + ScaLBL_GreyscaleSC_AAeven_Pressure_BC_Z(dvcSendList_Z, fqA, fqB, doutA, doutB, sendCount_Z, N); + } + else{ + ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z(neighborList, dvcSendList_Z, fqA, fqB, doutA, doutB, sendCount_Z, N); + } + } +} diff --git a/common/ScaLBL.h b/common/ScaLBL.h index bf2bb9dc..0f31224b 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -145,6 +145,19 @@ extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(int *Map, double *distA, dou int start, int finish, int Np); 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); + +extern "C" void ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np); + +extern "C" void ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np); + +extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z(int *list, double *distA, double *distB, double dinA, double dinB, int count, int N); + +extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_Z(int *list, double *distA, double *distB, double doutA, double doutB, int count, int N); + +extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z(int *neighborList, int *list, double *distA, double *distB, double dinA, double dinB, int count, int N); + +extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z(int *neighborList, int *list, double *distA, double *distB, double doutA, double doutB, int count, int N); + // MRT MODEL extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_setA, double rlx_setB, double Fx, double Fy, double Fz); @@ -211,6 +224,11 @@ extern "C" void ScaLBL_Color_BC_Z(int *list, int *Map, double *Phi, double *Den, extern "C" void ScaLBL_SetSlice_z(double *Phi, double value, int Nx, int Ny, int Nz, int Slice); +extern "C" void ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np); + +extern "C" void ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np); + + class ScaLBL_Communicator{ public: //...................................................................................... @@ -275,7 +293,10 @@ public: void D3Q19_Pressure_BC_z(int *neighborList, double *fq, double din, int time); void D3Q19_Pressure_BC_Z(int *neighborList, double *fq, double dout, int time); double D3Q19_Flux_BC_z(int *neighborList, double *fq, double flux, int time); - + void GreyscaleSC_BC_z(int *Map, double *DenA, double *DenB, double vA, double vB); + void GreyscaleSC_BC_Z(int *Map, double *DenA, double *DenB, double vA, double vB); + void GreyscaleSC_Pressure_BC_z(int *neighborList, double *fqA, double *fqB, double dinA, double dinB, int time); + void GreyscaleSC_Pressure_BC_Z(int *neighborList, double *fqA, double *fqB, double doutA, double doutB, int time); // void TestSendD3Q19(double *f_even, double *f_odd); // void TestRecvD3Q19(double *f_even, double *f_odd); diff --git a/gpu/GreyscaleSC.cu b/gpu/GreyscaleSC.cu index d0768f8c..e22b7a50 100644 --- a/gpu/GreyscaleSC.cu +++ b/gpu/GreyscaleSC.cu @@ -3215,6 +3215,460 @@ __global__ void dvc_ScaLBL_D3Q19_GreyscaleSC_Gradient(int *neighborList, int *Ma } } +__global__ void dvc_ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np) +{ + int idx,n,nm; + // Fill the outlet with component b + idx = blockIdx.x*blockDim.x + threadIdx.x; + if (idx < count){ + n = list[idx]; + nm = Map[n]; + DenA[nm] = vA; + DenB[nm] = vB; + } +} + +__global__ void dvc_ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np) +{ + int idx,n,nm; + // Fill the outlet with component b + idx = blockIdx.x*blockDim.x + threadIdx.x; + if (idx < count){ + n = list[idx]; + nm = Map[n]; + DenA[nm] = vA; + DenB[nm] = vB; + } +} + +__global__ void dvc_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; + + idx = blockIdx.x*blockDim.x + threadIdx.x; + + if (idx < count){ + + 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; + } +} + +__global__ void dvc_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; + + idx = blockIdx.x*blockDim.x + threadIdx.x; + + // Loop over the boundary - threadblocks delineated by start...finish + if ( idx < count ){ + + 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; + //................................................... + } +} + +__global__ void dvc_ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z(int *d_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; + + idx = blockIdx.x*blockDim.x + threadIdx.x; + + if (idx < count){ + + n = list[idx]; + //........................................................................ + // Read distributions + //........................................................................ + f0A = distA[n]; + f0B = distB[n]; + + nread = d_neighborList[n]; + f1A = distA[nread]; + f1B = distB[nread]; + + nread = d_neighborList[n+2*Np]; + f3A = distA[nread]; + f3B = distB[nread]; + + nread = d_neighborList[n+6*Np]; + f7A = distA[nread]; + f7B = distB[nread]; + + nread = d_neighborList[n+8*Np]; + f9A = distA[nread]; + f9B = distB[nread]; + + nread = d_neighborList[n+12*Np]; + f13A = distA[nread]; + f13B = distB[nread]; + + nread = d_neighborList[n+16*Np]; + f17A = distA[nread]; + f17B = distB[nread]; + + nread = d_neighborList[n+Np]; + f2A = distA[nread]; + f2B = distB[nread]; + + nread = d_neighborList[n+3*Np]; + f4A = distA[nread]; + f4B = distB[nread]; + + nread = d_neighborList[n+5*Np]; + f6A = distA[nread]; + f6B = distB[nread]; + + nread = d_neighborList[n+7*Np]; + f8A = distA[nread]; + f8B = distB[nread]; + + nread = d_neighborList[n+9*Np]; + f10A = distA[nread]; + f10B = distB[nread]; + + nread = d_neighborList[n+11*Np]; + f12A = distA[nread]; + f12B = distB[nread]; + + nread = d_neighborList[n+15*Np]; + f16A = distA[nread]; + f16B = distB[nread]; + + // Unknown distributions + nr5 = d_neighborList[n+4*Np]; + nr11 = d_neighborList[n+10*Np]; + nr15 = d_neighborList[n+14*Np]; + nr14 = d_neighborList[n+13*Np]; + nr18 = d_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; + } +} + +__global__ void dvc_ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z(int *d_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; + + idx = blockIdx.x*blockDim.x + threadIdx.x; + + // Loop over the boundary - threadblocks delineated by start...finish + if ( idx < count ){ + + n = list[idx]; + //........................................................................ + // Read distributions + //........................................................................ + f0A = distA[n]; + f0B = distB[n]; + + nread = d_neighborList[n]; + f1A = distA[nread]; + f1B = distB[nread]; + + nread = d_neighborList[n+2*Np]; + f3A = distA[nread]; + f3B = distB[nread]; + + nread = d_neighborList[n+4*Np]; + f5A = distA[nread]; + f5B = distB[nread]; + + nread = d_neighborList[n+6*Np]; + f7A = distA[nread]; + f7B = distB[nread]; + + nread = d_neighborList[n+8*Np]; + f9A = distA[nread]; + f9B = distB[nread]; + + nread = d_neighborList[n+10*Np]; + f11A = distA[nread]; + f11B = distB[nread]; + + nread = d_neighborList[n+14*Np]; + f15A = distA[nread]; + f15B = distB[nread]; + + nread = d_neighborList[n+Np]; + f2A = distA[nread]; + f2B = distB[nread]; + + nread = d_neighborList[n+3*Np]; + f4A = distA[nread]; + f4B = distB[nread]; + + nread = d_neighborList[n+7*Np]; + f8A = distA[nread]; + f8B = distB[nread]; + + nread = d_neighborList[n+9*Np]; + f10A = distA[nread]; + f10B = distB[nread]; + + nread = d_neighborList[n+13*Np]; + f14A = distA[nread]; + f14B = distB[nread]; + + nread = d_neighborList[n+17*Np]; + f18A = distA[nread]; + f18B = distB[nread]; + + // unknown distributions + nr6 = d_neighborList[n+5*Np]; + nr12 = d_neighborList[n+11*Np]; + nr16 = d_neighborList[n+15*Np]; + nr17 = d_neighborList[n+16*Np]; + nr13 = d_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; + //................................................... + } +} + extern "C" void ScaLBL_D3Q19_GreyscaleSC_Init(int *Map, double *distA,double *distB, double *DenA, double *DenB, int Np){ dvc_ScaLBL_D3Q19_GreyscaleSC_Init<<>>(Map,distA,distB,DenA,DenB,Np); cudaError_t err = cudaGetLastError(); @@ -3308,3 +3762,58 @@ extern "C" void ScaLBL_D3Q19_GreyscaleSC_Gradient(int *neighborList, int *Map, d printf("CUDA error in ScaLBL_D3Q19_GreyscaleSC_Gradient: %s \n",cudaGetErrorString(err)); } } + + +extern "C" void ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np){ + int GRID = count / 512 + 1; + dvc_ScaLBL_GreyscaleSC_BC_z<<>>(list, Map, DenA, DenB, vA, vB, count, Np); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_GreyscaleSC_BC_z: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np){ + int GRID = count / 512 + 1; + dvc_ScaLBL_GreyscaleSC_BC_Z<<>>(list, Map, DenA, DenB, vA, vB, count, Np); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_GreyscaleSC_BC_Z: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z(int *list, double *distA, double *distB, double dinA, double dinB, int count, int N){ + int GRID = count / 512 + 1; + dvc_ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z<<>>(list, distA, distB, dinA, dinB, count, N); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z (kernel): %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_Z(int *list, double *distA, double *distB, double doutA, double doutB, int count, int N){ + int GRID = count / 512 + 1; + dvc_ScaLBL_GreyscaleSC_AAeven_Pressure_BC_Z<<>>(list, distA, distB, doutA, doutB, count, N); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_GreyscaleSC_AAeven_Pressure_BC_Z (kernel): %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z(int *neighborList, int *list, double *distA, double *distB, double dinA, double dinB, int count, int N){ + int GRID = count / 512 + 1; + dvc_ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z<<>>(neighborList, list, distA, distB, dinA, dinB, count, N); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z (kernel): %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z(int *neighborList, int *list, double *distA, double *distB, double doutA, double doutB, int count, int N){ + int GRID = count / 512 + 1; + dvc_ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z<<>>(neighborList, list, distA, distB, doutA, doutB, count, N); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z (kernel): %s \n",cudaGetErrorString(err)); + } +} diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp index bb73fdbb..8e01794f 100644 --- a/models/GreyscaleSCModel.cpp +++ b/models/GreyscaleSCModel.cpp @@ -15,7 +15,7 @@ void DeleteArray( const TYPE *p ) ScaLBL_GreyscaleSCModel::ScaLBL_GreyscaleSCModel(int RANK, int NP, MPI_Comm COMM): rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0),Gsc(0), -rhoA(0),rhoB(0),rhoA_minor(0),rhoB_minor(0),Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),GreyPorosity(0), +rhoA(0),rhoB(0),rhoA_minor(0),rhoB_minor(0),Fx(0),Fy(0),Fz(0),flux(0),dinA(0),doutA(0),dinB(0),doutB(0),GreyPorosity(0), Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) { SignDist.resize(Nx,Ny,Nz); @@ -46,9 +46,11 @@ void ScaLBL_GreyscaleSCModel::ReadParams(string filename){ tolerance = 0.01; Fx = Fy = Fz = 0.0; Restart=false; - din=dout=1.0; + dinA=rhoA;//inlet density for fluid A + dinB=rhoB_minor;//inlet density for fluid B + doutA=rhoA_minor;//outlet denisty for fluid A + doutB=rhoB;//outlet density for fluid B flux=0.0; - dp = 10.0; //unit of 'dp': voxel // ---------------------- Greyscale Model parameters -----------------------// if (greyscaleSC_db->keyExists( "timestepMax" )){ @@ -66,12 +68,13 @@ void ScaLBL_GreyscaleSCModel::ReadParams(string filename){ rhoB = greyscaleSC_db->getWithDefault( "rhoB", rhoB ); rhoA_minor = greyscaleSC_db->getWithDefault( "rhoA_minor", rhoA_minor ); rhoB_minor = greyscaleSC_db->getWithDefault( "rhoB_minor", rhoB_minor ); + dinA = greyscaleSC_db->getWithDefault( "dinA", dinA ); + dinB = greyscaleSC_db->getWithDefault( "dinB", dinB ); + doutA = greyscaleSC_db->getWithDefault( "doutA", doutA ); + doutB = greyscaleSC_db->getWithDefault( "doutB", doutB ); if (greyscaleSC_db->keyExists( "Gsc" )){ Gsc = greyscaleSC_db->getScalar( "Gsc" ); } - if (greyscaleSC_db->keyExists( "dp" )){ - dp = greyscaleSC_db->getScalar( "dp" ); - } if (greyscaleSC_db->keyExists( "F" )){ Fx = greyscaleSC_db->getVector( "F" )[0]; Fy = greyscaleSC_db->getVector( "F" )[1]; @@ -80,12 +83,6 @@ void ScaLBL_GreyscaleSCModel::ReadParams(string filename){ if (greyscaleSC_db->keyExists( "Restart" )){ Restart = greyscaleSC_db->getScalar( "Restart" ); } - if (greyscaleSC_db->keyExists( "din" )){ - din = greyscaleSC_db->getScalar( "din" ); - } - if (greyscaleSC_db->keyExists( "dout" )){ - dout = greyscaleSC_db->getScalar( "dout" ); - } if (greyscaleSC_db->keyExists( "flux" )){ flux = greyscaleSC_db->getScalar( "flux" ); } @@ -182,6 +179,20 @@ void ScaLBL_GreyscaleSCModel::ReadInput(){ CalcDist(SignDist,id_solid,*Mask); if (rank == 0) cout << "Domain set." << endl; + + // Display boundary condition + switch (BoundaryCondition){ + case 0: + if (rank==0) printf("BoundaryCondition=%i: Periodic boundary condition\n",BoundaryCondition); + break; + case 3: + if (rank==0) printf("BoundaryCondition=%i: Constant pressure boundary condition\n",BoundaryCondition); + break; + default: + if (rank==0) printf("BoundaryCondition=%i: is currently not supported! Periodic boundary condition is used.\n",BoundaryCondition); + BoundaryCondition=0; + break; + } } void ScaLBL_GreyscaleSCModel::AssignGreyscaleAndSolidLabels() @@ -610,14 +621,33 @@ void ScaLBL_GreyscaleSCModel::Density_Init(){ } } } + //copy to device ScaLBL_CopyToDevice(DenA, DenA_temp, Nx*Ny*Nz*sizeof(double)); ScaLBL_CopyToDevice(DenB, DenB_temp, Nx*Ny*Nz*sizeof(double)); - //ScaLBL_CopyToDevice(Phi, Phi_temp, 1*Np*sizeof(double)); ScaLBL_DeviceBarrier(); delete [] DenA_temp; delete [] DenB_temp; - //delete [] Phi_temp; + + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); + ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,1); + ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,2); + ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); + ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,1); + ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,2); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-1); + ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-2); + ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-3); + ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-1); + ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-2); + ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-3); + } + } + } void ScaLBL_GreyscaleSCModel::Create(){ @@ -827,6 +857,11 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_DeviceBarrier(); ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); + if (BoundaryCondition > 0){ + ScaLBL_Comm->GreyscaleSC_BC_z(dvcMap, DenA, DenB, dinA, dinB); + ScaLBL_Comm->GreyscaleSC_BC_Z(dvcMap, DenA, DenB, doutA, doutB); + } + // Compute density gradient // fluid component A ScaLBL_Comm_Regular->SendHalo(DenA); @@ -845,7 +880,11 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - + // Set BCs + if (BoundaryCondition == 3){ + ScaLBL_Comm->GreyscaleSC_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); + ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); + } // Collsion ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, @@ -863,6 +902,11 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_DeviceBarrier(); ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); + if (BoundaryCondition > 0){ + ScaLBL_Comm->GreyscaleSC_BC_z(dvcMap, DenA, DenB, dinA, dinB); + ScaLBL_Comm->GreyscaleSC_BC_Z(dvcMap, DenA, DenB, doutA, doutB); + } + // Compute density gradient // fluid component A ScaLBL_Comm_Regular->SendHalo(DenA); @@ -881,7 +925,11 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - + // Set BCs + if (BoundaryCondition == 3){ + ScaLBL_Comm->GreyscaleSC_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); + ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); + } // Collsion ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, diff --git a/models/GreyscaleSCModel.h b/models/GreyscaleSCModel.h index 5de29c3d..314b535d 100644 --- a/models/GreyscaleSCModel.h +++ b/models/GreyscaleSCModel.h @@ -43,8 +43,8 @@ public: double rhoA_minor,rhoB_minor;//dissolved density double tolerance; double Fx,Fy,Fz,flux; - double din,dout; - double dp;//solid particle diameter, unit in voxel + double dinA,doutA; + double dinB,doutB; double GreyPorosity; int Nx,Ny,Nz,N,Np; From 3dede0d93a110fbe4873ad50dc854dfdcf72fd9a Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Thu, 21 May 2020 22:00:47 -0400 Subject: [PATCH 35/75] GreyscaleSC: fix pressure BC inter-domain communication --- models/GreyscaleSCModel.cpp | 68 +++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp index 8e01794f..c1cd9460 100644 --- a/models/GreyscaleSCModel.cpp +++ b/models/GreyscaleSCModel.cpp @@ -855,12 +855,17 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, dvcMap, fqA, fqB, DenA, DenB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); + // Set BCs + if (BoundaryCondition == 3){ + ScaLBL_Comm->GreyscaleSC_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); + ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); + } ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); - if (BoundaryCondition > 0){ - ScaLBL_Comm->GreyscaleSC_BC_z(dvcMap, DenA, DenB, dinA, dinB); - ScaLBL_Comm->GreyscaleSC_BC_Z(dvcMap, DenA, DenB, doutA, doutB); - } + //if (BoundaryCondition > 0){ + // ScaLBL_Comm->GreyscaleSC_BC_z(dvcMap, DenA, DenB, dinA, dinB); + // ScaLBL_Comm->GreyscaleSC_BC_Z(dvcMap, DenA, DenB, doutA, doutB); + //} // Compute density gradient // fluid component A @@ -868,11 +873,27 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm_Regular->RecvHalo(DenA); ScaLBL_DeviceBarrier(); + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-1); + } + } ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); // fluid component B ScaLBL_Comm_Regular->SendHalo(DenB); ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm_Regular->RecvHalo(DenB); + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-1); + } + } ScaLBL_DeviceBarrier(); ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); @@ -880,11 +901,6 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - // Set BCs - if (BoundaryCondition == 3){ - ScaLBL_Comm->GreyscaleSC_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); - ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); - } // Collsion ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, @@ -900,12 +916,17 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(dvcMap, fqA, fqB, DenA, DenB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); + // Set BCs + if (BoundaryCondition == 3){ + ScaLBL_Comm->GreyscaleSC_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); + ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); + } ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); - if (BoundaryCondition > 0){ - ScaLBL_Comm->GreyscaleSC_BC_z(dvcMap, DenA, DenB, dinA, dinB); - ScaLBL_Comm->GreyscaleSC_BC_Z(dvcMap, DenA, DenB, doutA, doutB); - } + //if (BoundaryCondition > 0){ + // ScaLBL_Comm->GreyscaleSC_BC_z(dvcMap, DenA, DenB, dinA, dinB); + // ScaLBL_Comm->GreyscaleSC_BC_Z(dvcMap, DenA, DenB, doutA, doutB); + //} // Compute density gradient // fluid component A @@ -913,23 +934,34 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm_Regular->RecvHalo(DenA); ScaLBL_DeviceBarrier(); + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-1); + } + } ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); // fluid component B ScaLBL_Comm_Regular->SendHalo(DenB); ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm_Regular->RecvHalo(DenB); ScaLBL_DeviceBarrier(); + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-1); + } + } ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); // Collsion ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - // Set BCs - if (BoundaryCondition == 3){ - ScaLBL_Comm->GreyscaleSC_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); - ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); - } // Collsion ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, From 95562e518ad60dcef96a25a7645c121e1c9abfa4 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Tue, 26 May 2020 20:59:35 -0400 Subject: [PATCH 36/75] add some miscellaneous changes --- models/GreyscaleSCModel.cpp | 57 ++++++++++++++++++++++++++++++++++--- models/GreyscaleSCModel.h | 1 + 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp index c1cd9460..50674365 100644 --- a/models/GreyscaleSCModel.cpp +++ b/models/GreyscaleSCModel.cpp @@ -201,6 +201,8 @@ void ScaLBL_GreyscaleSCModel::AssignGreyscaleAndSolidLabels() double *Poros, *Perm; Poros = new double[Np]; Perm = new double[Np]; + //relPermA_host = new double[Np]; + //relPermB_host = new double[Np]; double *SolidPotentialA_host = new double [Nx*Ny*Nz]; double *SolidPotentialB_host = new double [Nx*Ny*Nz]; double *SolidForceA_host = new double[3*Np]; @@ -210,11 +212,15 @@ void ScaLBL_GreyscaleSCModel::AssignGreyscaleAndSolidLabels() signed char VALUE=0; double POROSITY=0.f; double PERMEABILITY=0.f; + //double RELPERMA=0.f; + //double RELPERMB=0.f; double AFFINITY_A=0.f; double AFFINITY_B=0.f; auto PorosityList = greyscaleSC_db->getVector( "PorosityList" ); auto PermeabilityList = greyscaleSC_db->getVector( "PermeabilityList" ); + //auto RelPermListA = greyscaleSC_db->getVector( "RelPermListA" ); + //auto RelPermListB = greyscaleSC_db->getVector( "RelPermListB" ); auto LabelList = greyscaleSC_db->getVector( "ComponentLabels" ); auto AffinityListA = greyscaleSC_db->getVector( "ComponentAffinityA" ); auto AffinityListB = greyscaleSC_db->getVector( "ComponentAffinityB" ); @@ -231,11 +237,19 @@ void ScaLBL_GreyscaleSCModel::AssignGreyscaleAndSolidLabels() // *for ComponentLabels =1, 2, put porosity=1 (or if users accidentally put other values it should still be fine) //4. Requirement for "PermeabilityList": // *for ComponentLabels <=2, does not matter, can leave it as 1.0 + //5. Requirement for "RelPermListA" and "RelPermListB": + // *for ComponentLabels <=2, does not matter, can leave both RelPermA and RelPermB as 1.0 NLABELS=LabelList.size(); - if (NLABELS != PorosityList.size() || NLABELS != PermeabilityList.size() || NLABELS != AffinityListA.size() || NLABELS != AffinityListB.size() ){ - ERROR("Error: ComponentLabels, ComponentAffinityA/B, PorosityList and PermeabilityList must all be the same length! \n"); + if (NLABELS != PorosityList.size() || NLABELS != PermeabilityList.size() || + NLABELS != AffinityListA.size() || NLABELS != AffinityListB.size() ){ + ERROR("Error: ComponentLabels, ComponentAffinityA/B, PorosityList, and PermeabilityList must all be the same length! \n"); } +// if (NLABELS != PorosityList.size() || NLABELS != PermeabilityList.size() || +// NLABELS != RelPermListA.size() || NLABELS != RelPermListB.size() || +// NLABELS != AffinityListA.size() || NLABELS != AffinityListB.size() ){ +// ERROR("Error: ComponentLabels, ComponentAffinityA/B, PorosityList, PermeabilityList, and RelPermListA/B must all be the same length! \n"); +// } double label_count[NLABELS]; double label_count_global[NLABELS]; @@ -297,6 +311,35 @@ void ScaLBL_GreyscaleSCModel::AssignGreyscaleAndSolidLabels() } } } +// // New way of initializing the relperm values +// for (int k=0;k0) && (VALUE == LabelList[idx])){ +// RELPERMA=PermeabilityList[idx]*RelPermListA[idx]; +// RELPERMB=PermeabilityList[idx]*RelPermListB[idx]; +// idx = NLABELS; +// //Mask->id[n] = 0; // set mask to zero since this is an immobile component +// } +// } +// int idx = Map(i,j,k); +// if (!(idx < 0)){ +// if (RELPERMA<=0.0 || RELPERMB<=0.0){ +// ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); +// } +// else{ +// relPermA_host[idx] = RELPERMA/Dm->voxel_length/Dm->voxel_length; +// relPermB_host[idx] = RELPERMB/Dm->voxel_length/Dm->voxel_length; +// } +// } +// } +// } +// } //Populate the solid potential map, for ALL range of node_ID except node = 1,2, i.e. NW and W phase for (int k=0;kgetVector( "GreyNodeLabels" ); } - if (greyscaleSC_db->keyExists( "GreyNodeSw" )){ + if (greyscaleSC_db->keyExists( "GreyNodeSwInit" )){ SwList.clear(); - SwList = greyscaleSC_db->getVector( "GreyNodeSw" ); + SwList = greyscaleSC_db->getVector( "GreyNodeSwInit" ); } NLABELS=LabelList.size(); @@ -694,6 +741,8 @@ void ScaLBL_GreyscaleSCModel::Create(){ ScaLBL_AllocateDeviceMemory((void **) &DenA, sizeof(double)*Nx*Ny*Nz); ScaLBL_AllocateDeviceMemory((void **) &DenB, sizeof(double)*Nx*Ny*Nz); ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &relPermA, sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &relPermB, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); diff --git a/models/GreyscaleSCModel.h b/models/GreyscaleSCModel.h index 314b535d..667eca16 100644 --- a/models/GreyscaleSCModel.h +++ b/models/GreyscaleSCModel.h @@ -68,6 +68,7 @@ public: int *dvcMap; double *fqA, *fqB; double *Permeability;//grey voxel permeability + //double relPermA,relPermB;//grey voxel relperm double *Porosity; double *Velocity; double *Pressure_dvc; From 661246472a247a912f111a44f6eb74f6515b7c8d Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Wed, 27 May 2020 10:25:06 -0400 Subject: [PATCH 37/75] initialize the development of greyscale color model --- models/GreyscaleColorModel.cpp | 1393 ++++++++++++++++++++++++++++++++ models/GreyscaleColorModel.h | 102 +++ 2 files changed, 1495 insertions(+) create mode 100644 models/GreyscaleColorModel.cpp create mode 100644 models/GreyscaleColorModel.h diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp new file mode 100644 index 00000000..b2d20948 --- /dev/null +++ b/models/GreyscaleColorModel.cpp @@ -0,0 +1,1393 @@ +/* +Greyscale lattice boltzmann model + */ +#include "models/GreyscaleColorModel.h" +#include "analysis/distance.h" +#include "analysis/morphology.h" +#include +#include + +template +void DeleteArray( const TYPE *p ) +{ + delete [] p; +} + +ScaLBL_GreyscaleColorModel::ScaLBL_GreyscaleColorModel(int RANK, int NP, MPI_Comm COMM): +rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0),Gsc(0), +rhoA(0),rhoB(0),rhoA_minor(0),rhoB_minor(0),Fx(0),Fy(0),Fz(0),flux(0),dinA(0),doutA(0),dinB(0),doutB(0),GreyPorosity(0), +Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) +{ + SignDist.resize(Nx,Ny,Nz); + SignDist.fill(0); + +} +ScaLBL_GreyscaleColorModel::~ScaLBL_GreyscaleColorModel(){ + +} + +void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ + // read the input database + db = std::make_shared( filename ); + domain_db = db->getDatabase( "Domain" ); + greyscaleColor_db = db->getDatabase( "GreyscaleColor" ); + analysis_db = db->getDatabase( "Analysis" ); + vis_db = db->getDatabase( "Visualization" ); + + // set defaults + timestepMax = 100000; + tauA = 1.0; + tauB = 1.0; + tauA_eff = tauA; + tauB_eff = tauB; + rhoA = rhoB = 1.0; + rhoA_minor = rhoB_minor = 0.0;//NOTE this is for open nodes -> no dissolution + alpha = 0.001; + beta = 0.95; + tolerance = 0.01; + Fx = Fy = Fz = 0.0; + Restart=false; + din = dout = 1.0; + flux=0.0; + + // ---------------------- Greyscale Model parameters -----------------------// + if (greyscaleColor_db->keyExists( "timestepMax" )){ + timestepMax = greyscaleColor_db->getScalar( "timestepMax" ); + } + if (greyscaleColor_db->keyExists( "tauA" )){ + tauA = greyscaleColor_db->getScalar( "tauA" ); + } + if (greyscaleColor_db->keyExists( "tauB" )){ + tauB = greyscaleColor_db->getScalar( "tauB" ); + } + tauA_eff = greyscaleColor_db->getWithDefault( "tauA_eff", tauA ); + tauB_eff = greyscaleColor_db->getWithDefault( "tauB_eff", tauB ); + rhoA = greyscaleColor_db->getWithDefault( "rhoA", rhoA ); + rhoB = greyscaleColor_db->getWithDefault( "rhoB", rhoB ); + rhoA_minor = greyscaleColor_db->getWithDefault( "rhoA_minor", rhoA_minor ); + rhoB_minor = greyscaleColor_db->getWithDefault( "rhoB_minor", rhoB_minor ); + din = greyscaleColor_db->getWithDefault( "din", din ); + dout = greyscaleColor_db->getWithDefault( "dout", dout ); + if (greyscaleColor_db->keyExists( "F" )){ + Fx = greyscaleColor_db->getVector( "F" )[0]; + Fy = greyscaleColor_db->getVector( "F" )[1]; + Fz = greyscaleColor_db->getVector( "F" )[2]; + } + if (greyscaleColor_db->keyExists( "Restart" )){ + Restart = greyscaleColor_db->getScalar( "Restart" ); + } + if (greyscaleColor_db->keyExists( "flux" )){ + flux = greyscaleColor_db->getScalar( "flux" ); + } + if (greyscaleColor_db->keyExists( "tolerance" )){ + tolerance = greyscaleColor_db->getScalar( "tolerance" ); + } + // ------------------------------------------------------------------------// + + //------------------------ Other Domain parameters ------------------------// + BoundaryCondition = 0; + if (domain_db->keyExists( "BC" )){ + BoundaryCondition = domain_db->getScalar( "BC" ); + } + // ------------------------------------------------------------------------// +} + +void ScaLBL_GreyscaleColorModel::SetDomain(){ + Dm = std::shared_ptr(new Domain(domain_db,comm)); // full domain for analysis + Mask = std::shared_ptr(new Domain(domain_db,comm)); // mask domain removes immobile phases + // domain parameters + Nx = Dm->Nx; + Ny = Dm->Ny; + Nz = Dm->Nz; + Lx = Dm->Lx; + Ly = Dm->Ly; + Lz = Dm->Lz; + N = Nx*Ny*Nz; + + SignDist.resize(Nx,Ny,Nz); + Velocity_x.resize(Nx,Ny,Nz); + Velocity_y.resize(Nx,Ny,Nz); + Velocity_z.resize(Nx,Ny,Nz); + PorosityMap.resize(Nx,Ny,Nz); + Pressure.resize(Nx,Ny,Nz); + DenA_data.resize(Nx,Ny,Nz); + DenB_data.resize(Nx,Ny,Nz); + + id = new signed char [N]; + for (int i=0; iid[i] = 1; // initialize this way + MPI_Barrier(comm); + Dm->CommInit(); + MPI_Barrier(comm); + // Read domain parameters + rank = Dm->rank(); + nprocx = Dm->nprocx(); + nprocy = Dm->nprocy(); + nprocz = Dm->nprocz(); +} + +void ScaLBL_GreyscaleColorModel::ReadInput(){ + + sprintf(LocalRankString,"%05d",rank); + sprintf(LocalRankFilename,"%s%s","ID.",LocalRankString); + sprintf(LocalRestartFile,"%s%s","Restart.",LocalRankString); + + if (domain_db->keyExists( "Filename" )){ + auto Filename = domain_db->getScalar( "Filename" ); + Mask->Decomp(Filename); + } + else{ + if (rank==0) printf("Filename of input image is not found, reading ID.0* instead."); + Mask->ReadIDs(); + } + for (int i=0; iid[i]; // save what was read + + // Generate the signed distance map + // Initialize the domain and communication + Array id_solid(Nx,Ny,Nz); + int count = 0; + // Solve for the position of the solid phase + for (int k=0;kid[n]; + if (label > 0) id_solid(i,j,k) = 1; + else id_solid(i,j,k) = 0; + } + } + } + // Initialize the signed distance function + for (int k=0;kgetVector( "PorosityList" ); + auto PermeabilityList = greyscaleColor_db->getVector( "PermeabilityList" ); + auto LabelList = greyscaleColor_db->getVector( "ComponentLabels" ); + auto AffinityList = greyscaleColor_db->getVector( "ComponentAffinity" ); + + //1. Requirement for "ComponentLabels": + // *labels can be a nagative integer, 0, 1, 2, or a positive integer >= 3 + // *label = 1 and 2 are reserved for NW and W phase respectively. + //2. Requirement for "ComponentAffinity": + // *should be in the same length as "ComponentLabels" + // *for label=1 and 2, the affinity is +1 and -1, respectively + // *for label>2, these are the effective wettability (affinity) for the greynodes + //3. Requirement for "PorosityList": + // *for ComponentLables <=0, put porosity value = 0.0; + // *for ComponentLabels >=3, put the corresponding sub-resolution porosity + // *for ComponentLabels =1, 2, put porosity=1 (or if users accidentally put other values it should still be fine) + //4. Requirement for "PermeabilityList": + // *for ComponentLabels <=2, does not matter, can leave it as 1.0 + //5. Requirement for "RelPermListA" and "RelPermListB": + // *for ComponentLabels <=2, does not matter, can leave both RelPermA and RelPermB as 1.0 + + NLABELS=LabelList.size(); + if (NLABELS != PorosityList.size() || NLABELS != PermeabilityList.size() || + NLABELS != AffinityListA.size() || NLABELS != AffinityListB.size() ){ + ERROR("Error: ComponentLabels, ComponentAffinityA/B, PorosityList, and PermeabilityList must all be the same length! \n"); + } +// if (NLABELS != PorosityList.size() || NLABELS != PermeabilityList.size() || +// NLABELS != RelPermListA.size() || NLABELS != RelPermListB.size() || +// NLABELS != AffinityListA.size() || NLABELS != AffinityListB.size() ){ +// ERROR("Error: ComponentLabels, ComponentAffinityA/B, PorosityList, PermeabilityList, and RelPermListA/B must all be the same length! \n"); +// } + + double label_count[NLABELS]; + double label_count_global[NLABELS]; + + for (int idx=0; idx 0, i.e. open or grey nodes + //For node_ID <= 0: these are solid nodes of various wettability + for (int k=0;k0) && (VALUE == LabelList[idx])){ + POROSITY=PorosityList[idx]; + label_count[idx] += 1.0; + idx = NLABELS; + } + } + int idx = Map(i,j,k); + if (!(idx < 0)){ + if (POROSITY<=0.0){ + ERROR("Error: Porosity for grey voxels must be 0.0 < Porosity <= 1.0 !\n"); + } + else{ + Poros[idx] = POROSITY; + } + } + } + } + } + + //Populate the permeability map, NOTE only for node_ID > 0, i.e. open or grey nodes + //For node_ID <= 0: these are solid nodes of various wettability + for (int k=0;k0) && (VALUE == LabelList[idx])){ + PERMEABILITY=PermeabilityList[idx]; + idx = NLABELS; + //Mask->id[n] = 0; // set mask to zero since this is an immobile component + } + } + int idx = Map(i,j,k); + if (!(idx < 0)){ + if (PERMEABILITY<=0.0){ + ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); + } + else{ + Perm[idx] = PERMEABILITY/Dm->voxel_length/Dm->voxel_length; + } + } + } + } + } +// // New way of initializing the relperm values +// for (int k=0;k0) && (VALUE == LabelList[idx])){ +// RELPERMA=PermeabilityList[idx]*RelPermListA[idx]; +// RELPERMB=PermeabilityList[idx]*RelPermListB[idx]; +// idx = NLABELS; +// //Mask->id[n] = 0; // set mask to zero since this is an immobile component +// } +// } +// int idx = Map(i,j,k); +// if (!(idx < 0)){ +// if (RELPERMA<=0.0 || RELPERMB<=0.0){ +// ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); +// } +// else{ +// relPermA_host[idx] = RELPERMA/Dm->voxel_length/Dm->voxel_length; +// relPermB_host[idx] = RELPERMB/Dm->voxel_length/Dm->voxel_length; +// } +// } +// } +// } +// } + + //Populate the solid potential map, for ALL range of node_ID except node = 1,2, i.e. NW and W phase + for (int k=0;k=3){ + AFFINITY_A=AffinityListA[idx]*(1.0-PorosityList[idx]);//BE CAREFUL! Requires for node_ID<=0, user puts porosity=0.0 + AFFINITY_B=AffinityListB[idx]*(1.0-PorosityList[idx]);//BE CAREFUL! Requires for node_ID<=0, user puts porosity=0.0 + } + else{//i.e. label = 1 or 2 + AFFINITY_A=0.0; + AFFINITY_B=0.0; + } + idx = NLABELS; + } + } + //NOTE: node_ID = 1 and 2 are reserved + if ((VALUE == 1)||(VALUE == 2)){ + AFFINITY_A=0.0;//NOTE: still need this as users may forget to put label=1,2 in ComponentLabelLists + AFFINITY_B=0.0;//NOTE: still need this as users may forget to put label=1,2 in ComponentLabelLists + } + SolidPotentialA_host[n] = AFFINITY_A; + SolidPotentialB_host[n] = AFFINITY_B; + } + } + } + + // Calculate Shan-Chen fluid-solid forces + double *Dst; + Dst = new double [3*3*3]; + for (int kk=0; kk<3; kk++){ + for (int jj=0; jj<3; jj++){ + for (int ii=0; ii<3; ii++){ + int index = kk*9+jj*3+ii; + Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); + } + } + } + double w_face = 1.f/18.f; + double w_edge = 1.f/36.f; + double w_corner = 0.f; + //local + Dst[13] = 0.f; + //faces + Dst[4] = w_face; + Dst[10] = w_face; + Dst[12] = w_face; + Dst[14] = w_face; + Dst[16] = w_face; + Dst[22] = w_face; + // corners + Dst[0] = w_corner; + Dst[2] = w_corner; + Dst[6] = w_corner; + Dst[8] = w_corner; + Dst[18] = w_corner; + Dst[20] = w_corner; + Dst[24] = w_corner; + Dst[26] = w_corner; + // edges + Dst[1] = w_edge; + Dst[3] = w_edge; + Dst[5] = w_edge; + Dst[7] = w_edge; + Dst[9] = w_edge; + Dst[11] = w_edge; + Dst[15] = w_edge; + Dst[17] = w_edge; + Dst[19] = w_edge; + Dst[21] = w_edge; + Dst[23] = w_edge; + Dst[25] = w_edge; + + for (int k=1; kid[nn] <= 0)||(Mask->id[nn]>=3)){ + double vec_x = double(ii-1); + double vec_y = double(jj-1); + double vec_z = double(kk-1); + double GWNS_A=SolidPotentialA_host[nn]; + double GWNS_B=SolidPotentialB_host[nn]; + phi_x_A += -1.0*GWNS_A*weight*vec_x; + phi_y_A += -1.0*GWNS_A*weight*vec_y; + phi_z_A += -1.0*GWNS_A*weight*vec_z; + phi_x_B += -1.0*GWNS_B*weight*vec_x; + phi_y_B += -1.0*GWNS_B*weight*vec_y; + phi_z_B += -1.0*GWNS_B*weight*vec_z; + } + } + } + } + SolidForceA_host[idx+0*Np] = phi_x_A; + SolidForceA_host[idx+1*Np] = phi_y_A; + SolidForceA_host[idx+2*Np] = phi_z_A; + SolidForceB_host[idx+0*Np] = phi_x_B; + SolidForceB_host[idx+1*Np] = phi_y_B; + SolidForceB_host[idx+2*Np] = phi_z_B; + } + } + } + } + + // Set Dm to match Mask + for (int i=0; iid[i] = Mask->id[i]; + + for (int idx=0; idxComm.sumReduce(label_count[idx]); + + //Initialize a weighted porosity after considering grey voxels + GreyPorosity=0.0; + for (unsigned int idx=0; idxvoxel_length); + printf("Component labels: %lu \n",NLABELS); + for (unsigned int idx=0; idxvoxel_length/Dm->voxel_length,volume_fraction); + printf(" effective porosity=%.3g\n",volume_fraction*POROSITY); + } + printf("The weighted porosity, considering both open and grey voxels, is %.3g\n",GreyPorosity); + } + + //Copy all data to device + ScaLBL_CopyToDevice(Porosity, Poros, Np*sizeof(double)); + ScaLBL_CopyToDevice(Permeability, Perm, Np*sizeof(double)); + //ScaLBL_CopyToDevice(relPermA, relPermA_host, Np*sizeof(double)); + //ScaLBL_CopyToDevice(relPermB, relPermB_host, Np*sizeof(double)); + ScaLBL_CopyToDevice(SolidForceA, SolidForceA_host, 3*Np*sizeof(double)); + ScaLBL_CopyToDevice(SolidForceB, SolidForceB_host, 3*Np*sizeof(double)); + ScaLBL_DeviceBarrier(); + delete [] SolidPotentialA_host; + delete [] SolidPotentialB_host; + delete [] SolidForceA_host; + delete [] SolidForceB_host; + delete [] Poros; + delete [] Perm; + //delete [] relPermA_host; + //delete [] relPermB_host; + delete [] Dst; +} + +//void ScaLBL_GreyscaleColorModel::Density_Init(){ +// +// size_t NLABELS=0; +// signed char VALUE=0; +// +// vector LabelList{1,2}; +// vector SwList{0.0,1.0}; +// +// if (greyscaleColor_db->keyExists( "GreyNodeLabels" )){ +// LabelList.clear(); +// LabelList = greyscaleColor_db->getVector( "GreyNodeLabels" ); +// } +// if (greyscaleColor_db->keyExists( "GreyNodeSw" )){ +// SwList.clear(); +// SwList = greyscaleColor_db->getVector( "GreyNodeSw" ); +// } +// +// NLABELS=LabelList.size(); +// if (NLABELS != SwList.size()){ +// ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); +// } +// +// double *Den_temp; +// Den_temp=new double [2*Np]; +// double nA=0.5;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. +// double nB=0.5; +// +// //double *Phi_temp; +// //Phi_temp=new double [Np]; +// //double phi = 0.0; +// +// for (int k=0; kid[n]; +// if (VALUE>0){ +// for (unsigned int idx=0; idx < NLABELS; idx++){ +// if (VALUE == LabelList[idx]){ +// double Sw = SwList[idx]; +// if ((Sw<0.0) || (Sw>1.0)) ERROR("Error: Initial saturation for grey nodes must be between [0.0, 1.0]! \n"); +// nB=Sw; +// nA=1.0-Sw; +// //phi = nA-nB; +// idx = NLABELS; +// } +// } +// if (VALUE==1){//label=1 reserved for NW phase +// //TODO; maybe need rho_major and rho_minor initialization +// nA=rhoA; +// nB=rhoB_minor; +// //phi = nA-nB; +// } +// else if(VALUE==2){//label=2 reserved for W phase +// //TODO; maybe need rho_major and rho_minor initialization +// nA=rhoA_minor; +// nB=rhoB; +// //phi = nA-nB; +// } +// int idx = Map(i,j,k); +// Den_temp[idx+0*Np] = nA; +// Den_temp[idx+1*Np] = nB; +// //Phi_temp[idx] = phi; +// } +// } +// } +// } +// //copy to device +// ScaLBL_CopyToDevice(Den, Den_temp, 2*Np*sizeof(double)); +// //ScaLBL_CopyToDevice(Phi, Phi_temp, 1*Np*sizeof(double)); +// ScaLBL_DeviceBarrier(); +// delete [] Den_temp; +// //delete [] Phi_temp; +//} + +void ScaLBL_GreyscaleColorModel::Density_Init(){ + + size_t NLABELS=0; + signed char VALUE=0; + + vector LabelList{1,2}; + vector SwList{0.0,1.0}; + + if (greyscaleColor_db->keyExists( "GreyNodeLabels" )){ + LabelList.clear(); + LabelList = greyscaleColor_db->getVector( "GreyNodeLabels" ); + } + if (greyscaleColor_db->keyExists( "GreyNodeSwInit" )){ + SwList.clear(); + SwList = greyscaleColor_db->getVector( "GreyNodeSwInit" ); + } + + NLABELS=LabelList.size(); + if (NLABELS != SwList.size()){ + ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); + } + + double *DenA_temp,*DenB_temp; + DenA_temp=new double [Nx*Ny*Nz]; + DenB_temp=new double [Nx*Ny*Nz]; + double nA=0.0;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. + double nB=0.0; + + //double *Phi_temp; + //Phi_temp=new double [Np]; + //double phi = 0.0; + + for (int k=0; kid[n]; + if (VALUE>0){ + for (unsigned int idx=0; idx < NLABELS; idx++){ + if (VALUE == LabelList[idx]){ + double Sw = SwList[idx]; + if ((Sw<0.0) || (Sw>1.0)) ERROR("Error: Initial saturation for grey nodes must be between [0.0, 1.0]! \n"); + nB=Sw; + nA=1.0-Sw; + //phi = nA-nB; + idx = NLABELS; + } + } + if (VALUE==1){//label=1 reserved for NW phase + nA=rhoA; + nB=rhoB_minor; + //phi = nA-nB; + } + else if(VALUE==2){//label=2 reserved for W phase + nA=rhoA_minor; + nB=rhoB; + //phi = nA-nB; + } + DenA_temp[n] = nA; + DenB_temp[n] = nB; + } + else{ //for ID<=0, i.e. all sorts of solid minerals, density is zero + DenA_temp[n] = 0.0; + DenB_temp[n] = 0.0; + } + } + } + } + + //copy to device + ScaLBL_CopyToDevice(DenA, DenA_temp, Nx*Ny*Nz*sizeof(double)); + ScaLBL_CopyToDevice(DenB, DenB_temp, Nx*Ny*Nz*sizeof(double)); + ScaLBL_DeviceBarrier(); + delete [] DenA_temp; + delete [] DenB_temp; + + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); + ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,1); + ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,2); + ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); + ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,1); + ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,2); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-1); + ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-2); + ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-3); + ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-1); + ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-2); + ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-3); + } + } + +} + +void ScaLBL_GreyscaleColorModel::Create(){ + /* + * This function creates the variables needed to run a LBM + */ + //......................................................... + // don't perform computations at the eight corners + //id[0] = id[Nx-1] = id[(Ny-1)*Nx] = id[(Ny-1)*Nx + Nx-1] = 0; + //id[(Nz-1)*Nx*Ny] = id[(Nz-1)*Nx*Ny+Nx-1] = id[(Nz-1)*Nx*Ny+(Ny-1)*Nx] = id[(Nz-1)*Nx*Ny+(Ny-1)*Nx + Nx-1] = 0; + + //......................................................... + // Initialize communication structures in averaging domain + for (int i=0; iid[i] = Mask->id[i]; + Mask->CommInit(); + Np=Mask->PoreCount(); + //........................................................................... + if (rank==0) printf ("Create ScaLBL_Communicator \n"); + // Create a communicator for the device (will use optimized layout) + // ScaLBL_Communicator ScaLBL_Comm(Mask); // original + ScaLBL_Comm = std::shared_ptr(new ScaLBL_Communicator(Mask)); + ScaLBL_Comm_Regular = std::shared_ptr(new ScaLBL_Communicator(Mask)); + + int Npad=(Np/16 + 2)*16; + if (rank==0) printf ("Set up memory efficient layout, %i | %i | %i \n", Np, Npad, N); + Map.resize(Nx,Ny,Nz); Map.fill(-2); + auto neighborList= new int[18*Npad]; + Np = ScaLBL_Comm->MemoryOptimizedLayoutAA(Map,neighborList,Mask->id,Np); + MPI_Barrier(comm); + + //........................................................................... + // MAIN VARIABLES ALLOCATED HERE + //........................................................................... + // LBM variables + if (rank==0) printf ("Allocating distributions \n"); + //......................device distributions................................. + dist_mem_size = Np*sizeof(double); + neighborSize=18*(Np*sizeof(int)); + //........................................................................... + ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); + ScaLBL_AllocateDeviceMemory((void **) &dvcMap, sizeof(int)*Np); + ScaLBL_AllocateDeviceMemory((void **) &fqA, 19*dist_mem_size); + ScaLBL_AllocateDeviceMemory((void **) &fqB, 19*dist_mem_size); + ScaLBL_AllocateDeviceMemory((void **) &DenA, sizeof(double)*Nx*Ny*Nz); + ScaLBL_AllocateDeviceMemory((void **) &DenB, sizeof(double)*Nx*Ny*Nz); + ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &relPermA, sizeof(double)*Np); + //ScaLBL_AllocateDeviceMemory((void **) &relPermB, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &SolidForceA, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &SolidForceB, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &DenGradA, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &DenGradB, 3*sizeof(double)*Np); + //........................................................................... + // Update GPU data structures + if (rank==0) printf ("Setting up device neighbor list \n"); + fflush(stdout); + // Copy the Map to device + int *TmpMap; + TmpMap=new int[Np]; + for (int k=1; kLastExterior(); idx++){ + auto n = TmpMap[idx]; + if (n > Nx*Ny*Nz){ + printf("Bad value! idx=%i \n", n); + TmpMap[idx] = Nx*Ny*Nz-1; + } + } + for (int idx=ScaLBL_Comm->FirstInterior(); idxLastInterior(); idx++){ + auto n = TmpMap[idx]; + if ( n > Nx*Ny*Nz ){ + printf("Bad value! idx=%i \n",n); + TmpMap[idx] = Nx*Ny*Nz-1; + } + } + ScaLBL_CopyToDevice(dvcMap, TmpMap, sizeof(int)*Np); + ScaLBL_DeviceBarrier(); + delete [] TmpMap; + // copy the neighbor list + ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); +} + +void ScaLBL_GreyscaleColorModel::Initialize(){ + if (Restart == true){ +// //TODO: Restart funtion is currently not working; need updates +// if (rank==0){ +// printf("Initializing density field and distributions from Restart! \n"); +// } +// // Read in the restart file to CPU buffers +// std::shared_ptr cfq; +// cfq = std::shared_ptr(new double[19*Np],DeleteArray); +// std::shared_ptr cDen; +// cDen = std::shared_ptr(new double[2*Np],DeleteArray); +// FILE *File; +// File=fopen(LocalRestartFile,"rb"); +// fread(cfq.get(),sizeof(double),19*Np,File); +// fread(cDen.get(),sizeof(double),2*Np,File); +// fclose(File); +// +// // Copy the restart data to the GPU +// ScaLBL_CopyToDevice(fq,cfq.get(),19*Np*sizeof(double)); +// ScaLBL_CopyToDevice(Den,cDen.get(),2*Np*sizeof(double)); +// ScaLBL_DeviceBarrier(); +// MPI_Barrier(comm); +// +// //TODO need proper initialization ! +// +// //TODO need to initialize velocity field ! +// //this is required for calculating the pressure_dvc +// //can make a funciton to update velocity, such as ScaLBL_D3Q19_GreyColorIMRT_Velocity + } + else{ + if (rank==0) printf ("Initializing solid affinities \n"); + AssignGreyscaleAndSolidLabels(); + if (rank==0) printf ("Initializing density field \n"); + Density_Init();//initialize density field + if (rank==0) printf ("Initializing distributions \n"); + ScaLBL_D3Q19_GreyscaleColor_Init(dvcMap,fqA, fqB, DenA,DenB, Np); + +// //debug +// DoubleArray PhaseField(Nx,Ny,Nz); +// //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); +// ScaLBL_CopyToHost(PhaseField.data(), DenA, sizeof(double)*N); +// FILE *AFILE; +// sprintf(LocalRankFilename,"A_init.%05i.raw",rank); +// AFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,AFILE); +// fclose(AFILE); +// +// //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); +// ScaLBL_CopyToHost(PhaseField.data(), DenB, sizeof(double)*N); +// FILE *BFILE; +// sprintf(LocalRankFilename,"B_init.%05i.raw",rank); +// BFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,BFILE); +// fclose(BFILE); + + //Velocity also needs initialization (for old incompressible momentum transport) + //if (rank==0) printf ("Initializing velocity field \n"); + //double *vel_init; + //vel_init = new double [3*Np]; + //for (int i=0;i<3*Np;i++) vel_init[i]=0.0; + //ScaLBL_CopyToDevice(Velocity,vel_init,3*Np*sizeof(double)); + //ScaLBL_DeviceBarrier(); + //delete [] vel_init; + } +} + +void ScaLBL_GreyscaleColorModel::Run(){ + int nprocs=nprocx*nprocy*nprocz; + const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); + + int analysis_interval = 1000; // number of timesteps in between in situ analysis + int visualization_interval = 1000; + int restart_interval = 10000; // number of timesteps in between in saving distributions for restart + if (analysis_db->keyExists( "analysis_interval" )){ + analysis_interval = analysis_db->getScalar( "analysis_interval" ); + } + if (analysis_db->keyExists( "visualization_interval" )){ + visualization_interval = analysis_db->getScalar( "visualization_interval" ); + } + if (analysis_db->keyExists( "restart_interval" )){ + restart_interval = analysis_db->getScalar( "restart_interval" ); + } + if (greyscaleColor_db->keyExists( "timestep" )){ + timestep = greyscaleColor_db->getScalar( "timestep" ); + } + + if (rank==0){ + printf("********************************************************\n"); + printf("No. of timesteps: %i \n", timestepMax); + fflush(stdout); + } + + //.......create and start timer............ + double starttime,stoptime,cputime; + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); + starttime = MPI_Wtime(); + //......................................... + + Minkowski Morphology(Mask); + + //************ MAIN ITERATION LOOP ***************************************/ + PROFILE_START("Loop"); + auto current_db = db->cloneDatabase(); + double error = 1.0; + double flow_rate_previous = 0.0; + while (timestep < timestepMax && error > tolerance) { + //************************************************************************/ + // *************ODD TIMESTEP*************// + timestep++; + // Compute the density field + // Read for Aq, Bq happens in this routine (requires communication) + ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL + ScaLBL_D3Q19_AAodd_GreyscaleColor_Density(NeighborList, dvcMap, fqA, fqB, DenA, DenB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + // Set BCs + if (BoundaryCondition == 3){ + ScaLBL_Comm->GreyscaleColor_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); + ScaLBL_Comm->GreyscaleColor_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); + } + ScaLBL_D3Q19_AAodd_GreyscaleColor_Density(NeighborList, dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); + + //if (BoundaryCondition > 0){ + // ScaLBL_Comm->GreyscaleColor_BC_z(dvcMap, DenA, DenB, dinA, dinB); + // ScaLBL_Comm->GreyscaleColor_BC_Z(dvcMap, DenA, DenB, doutA, doutB); + //} + + // Compute density gradient + // fluid component A + ScaLBL_Comm_Regular->SendHalo(DenA); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm_Regular->RecvHalo(DenA); + ScaLBL_DeviceBarrier(); + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-1); + } + } + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + // fluid component B + ScaLBL_Comm_Regular->SendHalo(DenB); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm_Regular->RecvHalo(DenB); + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-1); + } + } + ScaLBL_DeviceBarrier(); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + + // Collsion + ScaLBL_D3Q19_AAodd_GreyscaleColor_BGK(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, + ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + // Collsion + ScaLBL_D3Q19_AAodd_GreyscaleColor_BGK(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, + 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + + + // *************EVEN TIMESTEP*************// + timestep++; + // Compute the density field + // Read for Aq, Bq happens in this routine (requires communication) + ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL + ScaLBL_D3Q19_AAeven_GreyscaleColor_Density(dvcMap, fqA, fqB, DenA, DenB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + // Set BCs + if (BoundaryCondition == 3){ + ScaLBL_Comm->GreyscaleColor_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); + ScaLBL_Comm->GreyscaleColor_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); + } + ScaLBL_D3Q19_AAeven_GreyscaleColor_Density(dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); + + //if (BoundaryCondition > 0){ + // ScaLBL_Comm->GreyscaleColor_BC_z(dvcMap, DenA, DenB, dinA, dinB); + // ScaLBL_Comm->GreyscaleColor_BC_Z(dvcMap, DenA, DenB, doutA, doutB); + //} + + // Compute density gradient + // fluid component A + ScaLBL_Comm_Regular->SendHalo(DenA); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm_Regular->RecvHalo(DenA); + ScaLBL_DeviceBarrier(); + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-1); + } + } + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + // fluid component B + ScaLBL_Comm_Regular->SendHalo(DenB); + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm_Regular->RecvHalo(DenB); + ScaLBL_DeviceBarrier(); + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-1); + } + } + ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + + // Collsion + ScaLBL_D3Q19_AAeven_GreyscaleColor_BGK(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, + ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + // Collsion + ScaLBL_D3Q19_AAeven_GreyscaleColor_BGK(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, + tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, + 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + + //************************************************************************/ + +// if (timestep%analysis_interval==0){ +// ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); +// ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); +// ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); +// //ScaLBL_Comm->RegularLayout(Map,Porosity,PorosityMap); +// //ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); +// +// double count_loc=0; +// double count; +// double vax,vay,vaz; +// double vax_loc,vay_loc,vaz_loc; +// //double px_loc,py_loc,pz_loc; +// //double px,py,pz; +// //double mass_loc,mass_glb; +// +// //parameters for domain average +// int64_t i,j,k,n,imin,jmin,kmin,kmax; +// // If external boundary conditions are set, do not average over the inlet and outlet +// kmin=1; kmax=Nz-1; +// //In case user forgets to specify the inlet/outlet buffer layers for BC>0 +// if (BoundaryCondition > 0 && Dm->kproc() == 0) kmin=4; +// if (BoundaryCondition > 0 && Dm->kproc() == Dm->nprocz()-1) kmax=Nz-4; +// +// imin=jmin=1; +// // If inlet/outlet layers exist use these as default +// //if (Dm->inlet_layers_x > 0) imin = Dm->inlet_layers_x; +// //if (Dm->inlet_layers_y > 0) jmin = Dm->inlet_layers_y; +// if (BoundaryCondition > 0 && Dm->inlet_layers_z > 0 && Dm->kproc() == 0) kmin = 1 + Dm->inlet_layers_z;//"1" indicates the halo layer +// if (BoundaryCondition > 0 && Dm->outlet_layers_z > 0 && Dm->kproc() == Dm->nprocz()-1) kmax = Nz-1 - Dm->outlet_layers_z; +// +//// px_loc = py_loc = pz_loc = 0.f; +//// mass_loc = 0.f; +//// for (int k=kmin; k 0){ +//// px_loc += Velocity_x(i,j,k)*Den*PorosityMap(i,j,k); +//// py_loc += Velocity_y(i,j,k)*Den*PorosityMap(i,j,k); +//// pz_loc += Velocity_z(i,j,k)*Den*PorosityMap(i,j,k); +//// mass_loc += Den*PorosityMap(i,j,k); +//// } +//// } +//// } +//// } +//// MPI_Allreduce(&px_loc, &px, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +//// MPI_Allreduce(&py_loc, &py, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +//// MPI_Allreduce(&pz_loc, &pz, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +//// MPI_Allreduce(&mass_loc,&mass_glb,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); +//// +//// vax = px/mass_glb; +//// vay = py/mass_glb; +//// vaz = pz/mass_glb; +// +// vax_loc = vay_loc = vaz_loc = 0.f; +// for (int k=kmin; k 0){ +// vax_loc += Velocity_x(i,j,k); +// vay_loc += Velocity_y(i,j,k); +// vaz_loc += Velocity_z(i,j,k); +// count_loc+=1.0; +// } +// } +// } +// } +// vax = Mask->Comm.sumReduce( vax_loc ); +// vay = Mask->Comm.sumReduce( vay_loc ); +// vaz = Mask->Comm.sumReduce( vaz_loc ); +// count = Mask->Comm.sumReduce( count_loc ); +// +// vax /= count; +// vay /= count; +// vaz /= count; +// +// double force_mag = sqrt(Fx*Fx+Fy*Fy+Fz*Fz); +// double dir_x = Fx/force_mag; +// double dir_y = Fy/force_mag; +// double dir_z = Fz/force_mag; +// if (force_mag == 0.0){ +// // default to z direction +// dir_x = 0.0; +// dir_y = 0.0; +// dir_z = 1.0; +// force_mag = 1.0; +// } +// //double flow_rate = (px*dir_x + py*dir_y + pz*dir_z)/mass_glb; +// double flow_rate = (vax*dir_x + vay*dir_y + vaz*dir_z); +// +// error = fabs(flow_rate - flow_rate_previous) / fabs(flow_rate); +// flow_rate_previous = flow_rate; +// +// //if (rank==0) printf("Computing Minkowski functionals \n"); +// Morphology.ComputeScalar(SignDist,0.f); +// //Morphology.PrintAll(); +// double mu = (tau-0.5)/3.f; +// double Vs = Morphology.V(); +// double As = Morphology.A(); +// double Hs = Morphology.H(); +// double Xs = Morphology.X(); +// Vs = Dm->Comm.sumReduce( Vs); +// As = Dm->Comm.sumReduce( As); +// Hs = Dm->Comm.sumReduce( Hs); +// Xs = Dm->Comm.sumReduce( Xs); +// +// double h = Dm->voxel_length; +// //double absperm = h*h*mu*Mask->Porosity()*flow_rate / force_mag; +// double absperm = h*h*mu*GreyPorosity*flow_rate / force_mag; +// +// if (rank==0){ +// printf(" AbsPerm = %.5g [micron^2]\n",absperm); +// bool WriteHeader=false; +// FILE * log_file = fopen("Permeability.csv","r"); +// if (log_file != NULL) +// fclose(log_file); +// else +// WriteHeader=true; +// log_file = fopen("Permeability.csv","a"); +// if (WriteHeader) +// fprintf(log_file,"timestep Fx Fy Fz mu Vs As Hs Xs vax vay vaz AbsPerm \n", +// timestep,Fx,Fy,Fz,mu,h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz,absperm); +// +// fprintf(log_file,"%i %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",timestep, Fx, Fy, Fz, mu, +// h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz, absperm); +// fclose(log_file); +// } +// } + + if (timestep%visualization_interval==0){ + WriteOutput(); + } + +// if (timestep%restart_interval==0){ +// //Use rank=0 write out Restart.db +// if (rank==0) { +// greyscaleColor_db->putScalar("timestep",timestep); +// greyscaleColor_db->putScalar( "Restart", true ); +// current_db->putDatabase("GreyscaleColor", greyscaleColor_db); +// std::ofstream OutStream("Restart.db"); +// current_db->print(OutStream, ""); +// OutStream.close(); +// +// } +// //Write out Restart data. +// std::shared_ptr cfq; +// cfq = std::shared_ptr(new double[19*Np],DeleteArray); +// ScaLBL_CopyToHost(cfq.get(),fq,19*Np*sizeof(double));// Copy restart data to the CPU +// +// FILE *RESTARTFILE; +// RESTARTFILE=fopen(LocalRestartFile,"wb"); +// fwrite(cfq.get(),sizeof(double),19*Np,RESTARTFILE); +// fclose(RESTARTFILE); +// MPI_Barrier(comm); +// } + } + + PROFILE_STOP("Loop"); + PROFILE_SAVE("lbpm_greyscale_simulator",1); + //************************************************************************ + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); + stoptime = MPI_Wtime(); + if (rank==0) printf("-------------------------------------------------------------------\n"); + // Compute the walltime per timestep + cputime = (stoptime - starttime)/timestep; + // Performance obtained from each node + double MLUPS = double(Np)/cputime/1000000; + + if (rank==0) printf("********************************************************\n"); + if (rank==0) printf("CPU time = %f \n", cputime); + if (rank==0) printf("Lattice update rate (per core)= %f MLUPS \n", MLUPS); + MLUPS *= nprocs; + if (rank==0) printf("Lattice update rate (total)= %f MLUPS \n", MLUPS); + if (rank==0) printf("********************************************************\n"); + + // ************************************************************************ +} + +void ScaLBL_GreyscaleColorModel::WriteOutput(){ + +/* Minkowski Morphology(Mask); + int SIZE=Np*sizeof(double); + ScaLBL_D3Q19_Momentum(fq,Velocity, Np); + ScaLBL_DeviceBarrier(); MPI_Barrier(comm); + ScaLBL_CopyToHost(&VELOCITY[0],&Velocity[0],3*SIZE); + + memcpy(Morphology.SDn.data(), Distance.data(), Nx*Ny*Nz*sizeof(double)); + Morphology.Initialize(); + Morphology.UpdateMeshValues(); + Morphology.ComputeLocal(); + Morphology.Reduce(); + + double count_loc=0; + double count; + double vax,vay,vaz; + double vax_loc,vay_loc,vaz_loc; + vax_loc = vay_loc = vaz_loc = 0.f; + for (int n=0; nLastExterior(); n++){ + vax_loc += VELOCITY[n]; + vay_loc += VELOCITY[Np+n]; + vaz_loc += VELOCITY[2*Np+n]; + count_loc+=1.0; + } + + for (int n=ScaLBL_Comm->FirstInterior(); nLastInterior(); n++){ + vax_loc += VELOCITY[n]; + vay_loc += VELOCITY[Np+n]; + vaz_loc += VELOCITY[2*Np+n]; + count_loc+=1.0; + } + MPI_Allreduce(&vax_loc,&vax,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + MPI_Allreduce(&vay_loc,&vay,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + MPI_Allreduce(&vaz_loc,&vaz,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + MPI_Allreduce(&count_loc,&count,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); + + vax /= count; + vay /= count; + vaz /= count; + + double mu = (tau-0.5)/3.f; + if (rank==0) printf("Fx Fy Fz mu Vs As Js Xs vx vy vz\n"); + if (rank==0) printf("%.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",Fx, Fy, Fz, mu, + Morphology.V(),Morphology.A(),Morphology.J(),Morphology.X(),vax,vay,vaz); + */ + + std::vector visData; + fillHalo fillData(Dm->Comm,Dm->rank_info,{Dm->Nx-2,Dm->Ny-2,Dm->Nz-2},{1,1,1},0,1); + + auto VxVar = std::make_shared(); + auto VyVar = std::make_shared(); + auto VzVar = std::make_shared(); + auto SignDistVar = std::make_shared(); + auto PressureVar = std::make_shared(); + auto DenAVar = std::make_shared(); + auto DenBVar = std::make_shared(); + + IO::initialize("","silo","false"); + // Create the MeshDataStruct + visData.resize(1); + visData[0].meshName = "domain"; + visData[0].mesh = std::make_shared( Dm->rank_info,Dm->Nx-2,Dm->Ny-2,Dm->Nz-2,Dm->Lx,Dm->Ly,Dm->Lz ); + SignDistVar->name = "SignDist"; + SignDistVar->type = IO::VariableType::VolumeVariable; + SignDistVar->dim = 1; + SignDistVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(SignDistVar); + + VxVar->name = "Velocity_x"; + VxVar->type = IO::VariableType::VolumeVariable; + VxVar->dim = 1; + VxVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(VxVar); + VyVar->name = "Velocity_y"; + VyVar->type = IO::VariableType::VolumeVariable; + VyVar->dim = 1; + VyVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(VyVar); + VzVar->name = "Velocity_z"; + VzVar->type = IO::VariableType::VolumeVariable; + VzVar->dim = 1; + VzVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(VzVar); + + PressureVar->name = "Pressure"; + PressureVar->type = IO::VariableType::VolumeVariable; + PressureVar->dim = 1; + PressureVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(PressureVar); + + DenAVar->name = "DenA"; + DenAVar->type = IO::VariableType::VolumeVariable; + DenAVar->dim = 1; + DenAVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(DenAVar); + DenBVar->name = "DenB"; + DenBVar->type = IO::VariableType::VolumeVariable; + DenBVar->dim = 1; + DenBVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(DenBVar); + + Array& SignData = visData[0].vars[0]->data; + Array& VelxData = visData[0].vars[1]->data; + Array& VelyData = visData[0].vars[2]->data; + Array& VelzData = visData[0].vars[3]->data; + Array& PressureData = visData[0].vars[4]->data; + Array& DenAData = visData[0].vars[5]->data; + Array& DenBData = visData[0].vars[6]->data; + + ASSERT(visData[0].vars[0]->name=="SignDist"); + ASSERT(visData[0].vars[1]->name=="Velocity_x"); + ASSERT(visData[0].vars[2]->name=="Velocity_y"); + ASSERT(visData[0].vars[3]->name=="Velocity_z"); + ASSERT(visData[0].vars[4]->name=="Pressure"); + ASSERT(visData[0].vars[5]->name=="DenA"); + ASSERT(visData[0].vars[6]->name=="DenB"); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); + ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); + ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); + ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); + ScaLBL_CopyToHost(DenA_data.data(), DenA, sizeof(double)*N); + ScaLBL_CopyToHost(DenB_data.data(), DenB, sizeof(double)*N); + + fillData.copy(SignDist,SignData); + fillData.copy(Velocity_x,VelxData); + fillData.copy(Velocity_y,VelyData); + fillData.copy(Velocity_z,VelzData); + fillData.copy(Pressure,PressureData); + fillData.copy(DenA_data,DenAData); + fillData.copy(DenB_data,DenBData); + + IO::writeData( timestep, visData, Dm->Comm ); + +} + +void ScaLBL_GreyscaleColorModel::WriteDebug(){ + // Copy back final phase indicator field and convert to regular layout + DoubleArray PhaseField(Nx,Ny,Nz); + + //ScaLBL_CopyToHost(Porosity.data(), Poros, sizeof(double)*N); + +// FILE *OUTFILE; +// sprintf(LocalRankFilename,"Phase.%05i.raw",rank); +// OUTFILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,OUTFILE); +// fclose(OUTFILE); +// + //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + ScaLBL_CopyToHost(PhaseField.data(), DenA, sizeof(double)*N); + FILE *AFILE; + sprintf(LocalRankFilename,"A.%05i.raw",rank); + AFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,AFILE); + fclose(AFILE); + + //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + ScaLBL_CopyToHost(PhaseField.data(), DenB, sizeof(double)*N); + FILE *BFILE; + sprintf(LocalRankFilename,"B.%05i.raw",rank); + BFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,BFILE); + fclose(BFILE); + + ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,PhaseField); + FILE *PFILE; + sprintf(LocalRankFilename,"Pressure.%05i.raw",rank); + PFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,PFILE); + fclose(PFILE); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[0],PhaseField); + FILE *VELX_FILE; + sprintf(LocalRankFilename,"Velocity_X.%05i.raw",rank); + VELX_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,VELX_FILE); + fclose(VELX_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],PhaseField); + FILE *VELY_FILE; + sprintf(LocalRankFilename,"Velocity_Y.%05i.raw",rank); + VELY_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,VELY_FILE); + fclose(VELY_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],PhaseField); + FILE *VELZ_FILE; + sprintf(LocalRankFilename,"Velocity_Z.%05i.raw",rank); + VELZ_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,VELZ_FILE); + fclose(VELZ_FILE); + +// ScaLBL_Comm->RegularLayout(Map,&Porosity[0],PhaseField); +// FILE *POROS_FILE; +// sprintf(LocalRankFilename,"Porosity.%05i.raw",rank); +// POROS_FILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,POROS_FILE); +// fclose(POROS_FILE); +// +// ScaLBL_Comm->RegularLayout(Map,&Permeability[0],PhaseField); +// FILE *PERM_FILE; +// sprintf(LocalRankFilename,"Permeability.%05i.raw",rank); +// PERM_FILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,PERM_FILE); +// fclose(PERM_FILE); +} diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h new file mode 100644 index 00000000..667eca16 --- /dev/null +++ b/models/GreyscaleColorModel.h @@ -0,0 +1,102 @@ +/* +Implementation of color lattice boltzmann model + */ +#include +#include +#include +#include +#include +#include +#include + +#include "common/Communication.h" +#include "common/MPI.h" +#include "common/Database.h" +#include "common/ScaLBL.h" +#include "ProfilerApp.h" +#include "threadpool/thread_pool.h" + +class ScaLBL_GreyscaleSCModel{ +public: + ScaLBL_GreyscaleSCModel(int RANK, int NP, MPI_Comm COMM); + ~ScaLBL_GreyscaleSCModel(); + + // functions in they should be run + void ReadParams(string filename); + void ReadParams(std::shared_ptr db0); + void SetDomain(); + void ReadInput(); + void Create(); + void Initialize(); + void Run(); + void WriteDebug(); + void WriteOutput(); + + bool Restart,pBC; + int timestep,timestepMax; + int BoundaryCondition; + int CollisionType; + double tauA,tauB; + double tauA_eff,tauB_eff; + double Gsc; + double rhoA,rhoB; + double rhoA_minor,rhoB_minor;//dissolved density + double tolerance; + double Fx,Fy,Fz,flux; + double dinA,doutA; + double dinB,doutB; + double GreyPorosity; + + int Nx,Ny,Nz,N,Np; + int rank,nprocx,nprocy,nprocz,nprocs; + double Lx,Ly,Lz; + + std::shared_ptr Dm; // this domain is for analysis + std::shared_ptr Mask; // this domain is for lbm + std::shared_ptr ScaLBL_Comm; + std::shared_ptr ScaLBL_Comm_Regular; + + // input database + std::shared_ptr db; + std::shared_ptr domain_db; + std::shared_ptr greyscaleSC_db; + std::shared_ptr analysis_db; + std::shared_ptr vis_db; + + signed char *id; + int *NeighborList; + int *dvcMap; + double *fqA, *fqB; + double *Permeability;//grey voxel permeability + //double relPermA,relPermB;//grey voxel relperm + double *Porosity; + double *Velocity; + double *Pressure_dvc; + double *DenA, *DenB; + double *DenGradA,*DenGradB; + double *SolidForceA,*SolidForceB; + + IntArray Map; + DoubleArray SignDist; + DoubleArray Velocity_x; + DoubleArray Velocity_y; + DoubleArray Velocity_z; + DoubleArray PorosityMap; + DoubleArray Pressure; + DoubleArray DenA_data; + DoubleArray DenB_data; + +private: + MPI_Comm comm; + + int dist_mem_size; + int neighborSize; + // filenames + char LocalRankString[8]; + char LocalRankFilename[40]; + char LocalRestartFile[40]; + + void AssignGreyscaleAndSolidLabels(); + void Density_Init(); +}; + From f5f4c51d5fafa786eeef1a1b32b32a4807b4e291 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Thu, 28 May 2020 18:22:25 -0400 Subject: [PATCH 38/75] discard greyscaleColor model --- models/GreyscaleColorModel.cpp | 1393 -------------------------------- models/GreyscaleColorModel.h | 102 --- 2 files changed, 1495 deletions(-) delete mode 100644 models/GreyscaleColorModel.cpp delete mode 100644 models/GreyscaleColorModel.h diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp deleted file mode 100644 index b2d20948..00000000 --- a/models/GreyscaleColorModel.cpp +++ /dev/null @@ -1,1393 +0,0 @@ -/* -Greyscale lattice boltzmann model - */ -#include "models/GreyscaleColorModel.h" -#include "analysis/distance.h" -#include "analysis/morphology.h" -#include -#include - -template -void DeleteArray( const TYPE *p ) -{ - delete [] p; -} - -ScaLBL_GreyscaleColorModel::ScaLBL_GreyscaleColorModel(int RANK, int NP, MPI_Comm COMM): -rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0),Gsc(0), -rhoA(0),rhoB(0),rhoA_minor(0),rhoB_minor(0),Fx(0),Fy(0),Fz(0),flux(0),dinA(0),doutA(0),dinB(0),doutB(0),GreyPorosity(0), -Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) -{ - SignDist.resize(Nx,Ny,Nz); - SignDist.fill(0); - -} -ScaLBL_GreyscaleColorModel::~ScaLBL_GreyscaleColorModel(){ - -} - -void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ - // read the input database - db = std::make_shared( filename ); - domain_db = db->getDatabase( "Domain" ); - greyscaleColor_db = db->getDatabase( "GreyscaleColor" ); - analysis_db = db->getDatabase( "Analysis" ); - vis_db = db->getDatabase( "Visualization" ); - - // set defaults - timestepMax = 100000; - tauA = 1.0; - tauB = 1.0; - tauA_eff = tauA; - tauB_eff = tauB; - rhoA = rhoB = 1.0; - rhoA_minor = rhoB_minor = 0.0;//NOTE this is for open nodes -> no dissolution - alpha = 0.001; - beta = 0.95; - tolerance = 0.01; - Fx = Fy = Fz = 0.0; - Restart=false; - din = dout = 1.0; - flux=0.0; - - // ---------------------- Greyscale Model parameters -----------------------// - if (greyscaleColor_db->keyExists( "timestepMax" )){ - timestepMax = greyscaleColor_db->getScalar( "timestepMax" ); - } - if (greyscaleColor_db->keyExists( "tauA" )){ - tauA = greyscaleColor_db->getScalar( "tauA" ); - } - if (greyscaleColor_db->keyExists( "tauB" )){ - tauB = greyscaleColor_db->getScalar( "tauB" ); - } - tauA_eff = greyscaleColor_db->getWithDefault( "tauA_eff", tauA ); - tauB_eff = greyscaleColor_db->getWithDefault( "tauB_eff", tauB ); - rhoA = greyscaleColor_db->getWithDefault( "rhoA", rhoA ); - rhoB = greyscaleColor_db->getWithDefault( "rhoB", rhoB ); - rhoA_minor = greyscaleColor_db->getWithDefault( "rhoA_minor", rhoA_minor ); - rhoB_minor = greyscaleColor_db->getWithDefault( "rhoB_minor", rhoB_minor ); - din = greyscaleColor_db->getWithDefault( "din", din ); - dout = greyscaleColor_db->getWithDefault( "dout", dout ); - if (greyscaleColor_db->keyExists( "F" )){ - Fx = greyscaleColor_db->getVector( "F" )[0]; - Fy = greyscaleColor_db->getVector( "F" )[1]; - Fz = greyscaleColor_db->getVector( "F" )[2]; - } - if (greyscaleColor_db->keyExists( "Restart" )){ - Restart = greyscaleColor_db->getScalar( "Restart" ); - } - if (greyscaleColor_db->keyExists( "flux" )){ - flux = greyscaleColor_db->getScalar( "flux" ); - } - if (greyscaleColor_db->keyExists( "tolerance" )){ - tolerance = greyscaleColor_db->getScalar( "tolerance" ); - } - // ------------------------------------------------------------------------// - - //------------------------ Other Domain parameters ------------------------// - BoundaryCondition = 0; - if (domain_db->keyExists( "BC" )){ - BoundaryCondition = domain_db->getScalar( "BC" ); - } - // ------------------------------------------------------------------------// -} - -void ScaLBL_GreyscaleColorModel::SetDomain(){ - Dm = std::shared_ptr(new Domain(domain_db,comm)); // full domain for analysis - Mask = std::shared_ptr(new Domain(domain_db,comm)); // mask domain removes immobile phases - // domain parameters - Nx = Dm->Nx; - Ny = Dm->Ny; - Nz = Dm->Nz; - Lx = Dm->Lx; - Ly = Dm->Ly; - Lz = Dm->Lz; - N = Nx*Ny*Nz; - - SignDist.resize(Nx,Ny,Nz); - Velocity_x.resize(Nx,Ny,Nz); - Velocity_y.resize(Nx,Ny,Nz); - Velocity_z.resize(Nx,Ny,Nz); - PorosityMap.resize(Nx,Ny,Nz); - Pressure.resize(Nx,Ny,Nz); - DenA_data.resize(Nx,Ny,Nz); - DenB_data.resize(Nx,Ny,Nz); - - id = new signed char [N]; - for (int i=0; iid[i] = 1; // initialize this way - MPI_Barrier(comm); - Dm->CommInit(); - MPI_Barrier(comm); - // Read domain parameters - rank = Dm->rank(); - nprocx = Dm->nprocx(); - nprocy = Dm->nprocy(); - nprocz = Dm->nprocz(); -} - -void ScaLBL_GreyscaleColorModel::ReadInput(){ - - sprintf(LocalRankString,"%05d",rank); - sprintf(LocalRankFilename,"%s%s","ID.",LocalRankString); - sprintf(LocalRestartFile,"%s%s","Restart.",LocalRankString); - - if (domain_db->keyExists( "Filename" )){ - auto Filename = domain_db->getScalar( "Filename" ); - Mask->Decomp(Filename); - } - else{ - if (rank==0) printf("Filename of input image is not found, reading ID.0* instead."); - Mask->ReadIDs(); - } - for (int i=0; iid[i]; // save what was read - - // Generate the signed distance map - // Initialize the domain and communication - Array id_solid(Nx,Ny,Nz); - int count = 0; - // Solve for the position of the solid phase - for (int k=0;kid[n]; - if (label > 0) id_solid(i,j,k) = 1; - else id_solid(i,j,k) = 0; - } - } - } - // Initialize the signed distance function - for (int k=0;kgetVector( "PorosityList" ); - auto PermeabilityList = greyscaleColor_db->getVector( "PermeabilityList" ); - auto LabelList = greyscaleColor_db->getVector( "ComponentLabels" ); - auto AffinityList = greyscaleColor_db->getVector( "ComponentAffinity" ); - - //1. Requirement for "ComponentLabels": - // *labels can be a nagative integer, 0, 1, 2, or a positive integer >= 3 - // *label = 1 and 2 are reserved for NW and W phase respectively. - //2. Requirement for "ComponentAffinity": - // *should be in the same length as "ComponentLabels" - // *for label=1 and 2, the affinity is +1 and -1, respectively - // *for label>2, these are the effective wettability (affinity) for the greynodes - //3. Requirement for "PorosityList": - // *for ComponentLables <=0, put porosity value = 0.0; - // *for ComponentLabels >=3, put the corresponding sub-resolution porosity - // *for ComponentLabels =1, 2, put porosity=1 (or if users accidentally put other values it should still be fine) - //4. Requirement for "PermeabilityList": - // *for ComponentLabels <=2, does not matter, can leave it as 1.0 - //5. Requirement for "RelPermListA" and "RelPermListB": - // *for ComponentLabels <=2, does not matter, can leave both RelPermA and RelPermB as 1.0 - - NLABELS=LabelList.size(); - if (NLABELS != PorosityList.size() || NLABELS != PermeabilityList.size() || - NLABELS != AffinityListA.size() || NLABELS != AffinityListB.size() ){ - ERROR("Error: ComponentLabels, ComponentAffinityA/B, PorosityList, and PermeabilityList must all be the same length! \n"); - } -// if (NLABELS != PorosityList.size() || NLABELS != PermeabilityList.size() || -// NLABELS != RelPermListA.size() || NLABELS != RelPermListB.size() || -// NLABELS != AffinityListA.size() || NLABELS != AffinityListB.size() ){ -// ERROR("Error: ComponentLabels, ComponentAffinityA/B, PorosityList, PermeabilityList, and RelPermListA/B must all be the same length! \n"); -// } - - double label_count[NLABELS]; - double label_count_global[NLABELS]; - - for (int idx=0; idx 0, i.e. open or grey nodes - //For node_ID <= 0: these are solid nodes of various wettability - for (int k=0;k0) && (VALUE == LabelList[idx])){ - POROSITY=PorosityList[idx]; - label_count[idx] += 1.0; - idx = NLABELS; - } - } - int idx = Map(i,j,k); - if (!(idx < 0)){ - if (POROSITY<=0.0){ - ERROR("Error: Porosity for grey voxels must be 0.0 < Porosity <= 1.0 !\n"); - } - else{ - Poros[idx] = POROSITY; - } - } - } - } - } - - //Populate the permeability map, NOTE only for node_ID > 0, i.e. open or grey nodes - //For node_ID <= 0: these are solid nodes of various wettability - for (int k=0;k0) && (VALUE == LabelList[idx])){ - PERMEABILITY=PermeabilityList[idx]; - idx = NLABELS; - //Mask->id[n] = 0; // set mask to zero since this is an immobile component - } - } - int idx = Map(i,j,k); - if (!(idx < 0)){ - if (PERMEABILITY<=0.0){ - ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); - } - else{ - Perm[idx] = PERMEABILITY/Dm->voxel_length/Dm->voxel_length; - } - } - } - } - } -// // New way of initializing the relperm values -// for (int k=0;k0) && (VALUE == LabelList[idx])){ -// RELPERMA=PermeabilityList[idx]*RelPermListA[idx]; -// RELPERMB=PermeabilityList[idx]*RelPermListB[idx]; -// idx = NLABELS; -// //Mask->id[n] = 0; // set mask to zero since this is an immobile component -// } -// } -// int idx = Map(i,j,k); -// if (!(idx < 0)){ -// if (RELPERMA<=0.0 || RELPERMB<=0.0){ -// ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); -// } -// else{ -// relPermA_host[idx] = RELPERMA/Dm->voxel_length/Dm->voxel_length; -// relPermB_host[idx] = RELPERMB/Dm->voxel_length/Dm->voxel_length; -// } -// } -// } -// } -// } - - //Populate the solid potential map, for ALL range of node_ID except node = 1,2, i.e. NW and W phase - for (int k=0;k=3){ - AFFINITY_A=AffinityListA[idx]*(1.0-PorosityList[idx]);//BE CAREFUL! Requires for node_ID<=0, user puts porosity=0.0 - AFFINITY_B=AffinityListB[idx]*(1.0-PorosityList[idx]);//BE CAREFUL! Requires for node_ID<=0, user puts porosity=0.0 - } - else{//i.e. label = 1 or 2 - AFFINITY_A=0.0; - AFFINITY_B=0.0; - } - idx = NLABELS; - } - } - //NOTE: node_ID = 1 and 2 are reserved - if ((VALUE == 1)||(VALUE == 2)){ - AFFINITY_A=0.0;//NOTE: still need this as users may forget to put label=1,2 in ComponentLabelLists - AFFINITY_B=0.0;//NOTE: still need this as users may forget to put label=1,2 in ComponentLabelLists - } - SolidPotentialA_host[n] = AFFINITY_A; - SolidPotentialB_host[n] = AFFINITY_B; - } - } - } - - // Calculate Shan-Chen fluid-solid forces - double *Dst; - Dst = new double [3*3*3]; - for (int kk=0; kk<3; kk++){ - for (int jj=0; jj<3; jj++){ - for (int ii=0; ii<3; ii++){ - int index = kk*9+jj*3+ii; - Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); - } - } - } - double w_face = 1.f/18.f; - double w_edge = 1.f/36.f; - double w_corner = 0.f; - //local - Dst[13] = 0.f; - //faces - Dst[4] = w_face; - Dst[10] = w_face; - Dst[12] = w_face; - Dst[14] = w_face; - Dst[16] = w_face; - Dst[22] = w_face; - // corners - Dst[0] = w_corner; - Dst[2] = w_corner; - Dst[6] = w_corner; - Dst[8] = w_corner; - Dst[18] = w_corner; - Dst[20] = w_corner; - Dst[24] = w_corner; - Dst[26] = w_corner; - // edges - Dst[1] = w_edge; - Dst[3] = w_edge; - Dst[5] = w_edge; - Dst[7] = w_edge; - Dst[9] = w_edge; - Dst[11] = w_edge; - Dst[15] = w_edge; - Dst[17] = w_edge; - Dst[19] = w_edge; - Dst[21] = w_edge; - Dst[23] = w_edge; - Dst[25] = w_edge; - - for (int k=1; kid[nn] <= 0)||(Mask->id[nn]>=3)){ - double vec_x = double(ii-1); - double vec_y = double(jj-1); - double vec_z = double(kk-1); - double GWNS_A=SolidPotentialA_host[nn]; - double GWNS_B=SolidPotentialB_host[nn]; - phi_x_A += -1.0*GWNS_A*weight*vec_x; - phi_y_A += -1.0*GWNS_A*weight*vec_y; - phi_z_A += -1.0*GWNS_A*weight*vec_z; - phi_x_B += -1.0*GWNS_B*weight*vec_x; - phi_y_B += -1.0*GWNS_B*weight*vec_y; - phi_z_B += -1.0*GWNS_B*weight*vec_z; - } - } - } - } - SolidForceA_host[idx+0*Np] = phi_x_A; - SolidForceA_host[idx+1*Np] = phi_y_A; - SolidForceA_host[idx+2*Np] = phi_z_A; - SolidForceB_host[idx+0*Np] = phi_x_B; - SolidForceB_host[idx+1*Np] = phi_y_B; - SolidForceB_host[idx+2*Np] = phi_z_B; - } - } - } - } - - // Set Dm to match Mask - for (int i=0; iid[i] = Mask->id[i]; - - for (int idx=0; idxComm.sumReduce(label_count[idx]); - - //Initialize a weighted porosity after considering grey voxels - GreyPorosity=0.0; - for (unsigned int idx=0; idxvoxel_length); - printf("Component labels: %lu \n",NLABELS); - for (unsigned int idx=0; idxvoxel_length/Dm->voxel_length,volume_fraction); - printf(" effective porosity=%.3g\n",volume_fraction*POROSITY); - } - printf("The weighted porosity, considering both open and grey voxels, is %.3g\n",GreyPorosity); - } - - //Copy all data to device - ScaLBL_CopyToDevice(Porosity, Poros, Np*sizeof(double)); - ScaLBL_CopyToDevice(Permeability, Perm, Np*sizeof(double)); - //ScaLBL_CopyToDevice(relPermA, relPermA_host, Np*sizeof(double)); - //ScaLBL_CopyToDevice(relPermB, relPermB_host, Np*sizeof(double)); - ScaLBL_CopyToDevice(SolidForceA, SolidForceA_host, 3*Np*sizeof(double)); - ScaLBL_CopyToDevice(SolidForceB, SolidForceB_host, 3*Np*sizeof(double)); - ScaLBL_DeviceBarrier(); - delete [] SolidPotentialA_host; - delete [] SolidPotentialB_host; - delete [] SolidForceA_host; - delete [] SolidForceB_host; - delete [] Poros; - delete [] Perm; - //delete [] relPermA_host; - //delete [] relPermB_host; - delete [] Dst; -} - -//void ScaLBL_GreyscaleColorModel::Density_Init(){ -// -// size_t NLABELS=0; -// signed char VALUE=0; -// -// vector LabelList{1,2}; -// vector SwList{0.0,1.0}; -// -// if (greyscaleColor_db->keyExists( "GreyNodeLabels" )){ -// LabelList.clear(); -// LabelList = greyscaleColor_db->getVector( "GreyNodeLabels" ); -// } -// if (greyscaleColor_db->keyExists( "GreyNodeSw" )){ -// SwList.clear(); -// SwList = greyscaleColor_db->getVector( "GreyNodeSw" ); -// } -// -// NLABELS=LabelList.size(); -// if (NLABELS != SwList.size()){ -// ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); -// } -// -// double *Den_temp; -// Den_temp=new double [2*Np]; -// double nA=0.5;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. -// double nB=0.5; -// -// //double *Phi_temp; -// //Phi_temp=new double [Np]; -// //double phi = 0.0; -// -// for (int k=0; kid[n]; -// if (VALUE>0){ -// for (unsigned int idx=0; idx < NLABELS; idx++){ -// if (VALUE == LabelList[idx]){ -// double Sw = SwList[idx]; -// if ((Sw<0.0) || (Sw>1.0)) ERROR("Error: Initial saturation for grey nodes must be between [0.0, 1.0]! \n"); -// nB=Sw; -// nA=1.0-Sw; -// //phi = nA-nB; -// idx = NLABELS; -// } -// } -// if (VALUE==1){//label=1 reserved for NW phase -// //TODO; maybe need rho_major and rho_minor initialization -// nA=rhoA; -// nB=rhoB_minor; -// //phi = nA-nB; -// } -// else if(VALUE==2){//label=2 reserved for W phase -// //TODO; maybe need rho_major and rho_minor initialization -// nA=rhoA_minor; -// nB=rhoB; -// //phi = nA-nB; -// } -// int idx = Map(i,j,k); -// Den_temp[idx+0*Np] = nA; -// Den_temp[idx+1*Np] = nB; -// //Phi_temp[idx] = phi; -// } -// } -// } -// } -// //copy to device -// ScaLBL_CopyToDevice(Den, Den_temp, 2*Np*sizeof(double)); -// //ScaLBL_CopyToDevice(Phi, Phi_temp, 1*Np*sizeof(double)); -// ScaLBL_DeviceBarrier(); -// delete [] Den_temp; -// //delete [] Phi_temp; -//} - -void ScaLBL_GreyscaleColorModel::Density_Init(){ - - size_t NLABELS=0; - signed char VALUE=0; - - vector LabelList{1,2}; - vector SwList{0.0,1.0}; - - if (greyscaleColor_db->keyExists( "GreyNodeLabels" )){ - LabelList.clear(); - LabelList = greyscaleColor_db->getVector( "GreyNodeLabels" ); - } - if (greyscaleColor_db->keyExists( "GreyNodeSwInit" )){ - SwList.clear(); - SwList = greyscaleColor_db->getVector( "GreyNodeSwInit" ); - } - - NLABELS=LabelList.size(); - if (NLABELS != SwList.size()){ - ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); - } - - double *DenA_temp,*DenB_temp; - DenA_temp=new double [Nx*Ny*Nz]; - DenB_temp=new double [Nx*Ny*Nz]; - double nA=0.0;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. - double nB=0.0; - - //double *Phi_temp; - //Phi_temp=new double [Np]; - //double phi = 0.0; - - for (int k=0; kid[n]; - if (VALUE>0){ - for (unsigned int idx=0; idx < NLABELS; idx++){ - if (VALUE == LabelList[idx]){ - double Sw = SwList[idx]; - if ((Sw<0.0) || (Sw>1.0)) ERROR("Error: Initial saturation for grey nodes must be between [0.0, 1.0]! \n"); - nB=Sw; - nA=1.0-Sw; - //phi = nA-nB; - idx = NLABELS; - } - } - if (VALUE==1){//label=1 reserved for NW phase - nA=rhoA; - nB=rhoB_minor; - //phi = nA-nB; - } - else if(VALUE==2){//label=2 reserved for W phase - nA=rhoA_minor; - nB=rhoB; - //phi = nA-nB; - } - DenA_temp[n] = nA; - DenB_temp[n] = nB; - } - else{ //for ID<=0, i.e. all sorts of solid minerals, density is zero - DenA_temp[n] = 0.0; - DenB_temp[n] = 0.0; - } - } - } - } - - //copy to device - ScaLBL_CopyToDevice(DenA, DenA_temp, Nx*Ny*Nz*sizeof(double)); - ScaLBL_CopyToDevice(DenB, DenB_temp, Nx*Ny*Nz*sizeof(double)); - ScaLBL_DeviceBarrier(); - delete [] DenA_temp; - delete [] DenB_temp; - - if (BoundaryCondition >0 ){ - if (Dm->kproc()==0){ - ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); - ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,1); - ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,2); - ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); - ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,1); - ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,2); - } - if (Dm->kproc() == nprocz-1){ - ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-1); - ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-2); - ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-3); - ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-1); - ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-2); - ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-3); - } - } - -} - -void ScaLBL_GreyscaleColorModel::Create(){ - /* - * This function creates the variables needed to run a LBM - */ - //......................................................... - // don't perform computations at the eight corners - //id[0] = id[Nx-1] = id[(Ny-1)*Nx] = id[(Ny-1)*Nx + Nx-1] = 0; - //id[(Nz-1)*Nx*Ny] = id[(Nz-1)*Nx*Ny+Nx-1] = id[(Nz-1)*Nx*Ny+(Ny-1)*Nx] = id[(Nz-1)*Nx*Ny+(Ny-1)*Nx + Nx-1] = 0; - - //......................................................... - // Initialize communication structures in averaging domain - for (int i=0; iid[i] = Mask->id[i]; - Mask->CommInit(); - Np=Mask->PoreCount(); - //........................................................................... - if (rank==0) printf ("Create ScaLBL_Communicator \n"); - // Create a communicator for the device (will use optimized layout) - // ScaLBL_Communicator ScaLBL_Comm(Mask); // original - ScaLBL_Comm = std::shared_ptr(new ScaLBL_Communicator(Mask)); - ScaLBL_Comm_Regular = std::shared_ptr(new ScaLBL_Communicator(Mask)); - - int Npad=(Np/16 + 2)*16; - if (rank==0) printf ("Set up memory efficient layout, %i | %i | %i \n", Np, Npad, N); - Map.resize(Nx,Ny,Nz); Map.fill(-2); - auto neighborList= new int[18*Npad]; - Np = ScaLBL_Comm->MemoryOptimizedLayoutAA(Map,neighborList,Mask->id,Np); - MPI_Barrier(comm); - - //........................................................................... - // MAIN VARIABLES ALLOCATED HERE - //........................................................................... - // LBM variables - if (rank==0) printf ("Allocating distributions \n"); - //......................device distributions................................. - dist_mem_size = Np*sizeof(double); - neighborSize=18*(Np*sizeof(int)); - //........................................................................... - ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); - ScaLBL_AllocateDeviceMemory((void **) &dvcMap, sizeof(int)*Np); - ScaLBL_AllocateDeviceMemory((void **) &fqA, 19*dist_mem_size); - ScaLBL_AllocateDeviceMemory((void **) &fqB, 19*dist_mem_size); - ScaLBL_AllocateDeviceMemory((void **) &DenA, sizeof(double)*Nx*Ny*Nz); - ScaLBL_AllocateDeviceMemory((void **) &DenB, sizeof(double)*Nx*Ny*Nz); - ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &relPermA, sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &relPermB, sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &SolidForceA, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &SolidForceB, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &DenGradA, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &DenGradB, 3*sizeof(double)*Np); - //........................................................................... - // Update GPU data structures - if (rank==0) printf ("Setting up device neighbor list \n"); - fflush(stdout); - // Copy the Map to device - int *TmpMap; - TmpMap=new int[Np]; - for (int k=1; kLastExterior(); idx++){ - auto n = TmpMap[idx]; - if (n > Nx*Ny*Nz){ - printf("Bad value! idx=%i \n", n); - TmpMap[idx] = Nx*Ny*Nz-1; - } - } - for (int idx=ScaLBL_Comm->FirstInterior(); idxLastInterior(); idx++){ - auto n = TmpMap[idx]; - if ( n > Nx*Ny*Nz ){ - printf("Bad value! idx=%i \n",n); - TmpMap[idx] = Nx*Ny*Nz-1; - } - } - ScaLBL_CopyToDevice(dvcMap, TmpMap, sizeof(int)*Np); - ScaLBL_DeviceBarrier(); - delete [] TmpMap; - // copy the neighbor list - ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); -} - -void ScaLBL_GreyscaleColorModel::Initialize(){ - if (Restart == true){ -// //TODO: Restart funtion is currently not working; need updates -// if (rank==0){ -// printf("Initializing density field and distributions from Restart! \n"); -// } -// // Read in the restart file to CPU buffers -// std::shared_ptr cfq; -// cfq = std::shared_ptr(new double[19*Np],DeleteArray); -// std::shared_ptr cDen; -// cDen = std::shared_ptr(new double[2*Np],DeleteArray); -// FILE *File; -// File=fopen(LocalRestartFile,"rb"); -// fread(cfq.get(),sizeof(double),19*Np,File); -// fread(cDen.get(),sizeof(double),2*Np,File); -// fclose(File); -// -// // Copy the restart data to the GPU -// ScaLBL_CopyToDevice(fq,cfq.get(),19*Np*sizeof(double)); -// ScaLBL_CopyToDevice(Den,cDen.get(),2*Np*sizeof(double)); -// ScaLBL_DeviceBarrier(); -// MPI_Barrier(comm); -// -// //TODO need proper initialization ! -// -// //TODO need to initialize velocity field ! -// //this is required for calculating the pressure_dvc -// //can make a funciton to update velocity, such as ScaLBL_D3Q19_GreyColorIMRT_Velocity - } - else{ - if (rank==0) printf ("Initializing solid affinities \n"); - AssignGreyscaleAndSolidLabels(); - if (rank==0) printf ("Initializing density field \n"); - Density_Init();//initialize density field - if (rank==0) printf ("Initializing distributions \n"); - ScaLBL_D3Q19_GreyscaleColor_Init(dvcMap,fqA, fqB, DenA,DenB, Np); - -// //debug -// DoubleArray PhaseField(Nx,Ny,Nz); -// //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); -// ScaLBL_CopyToHost(PhaseField.data(), DenA, sizeof(double)*N); -// FILE *AFILE; -// sprintf(LocalRankFilename,"A_init.%05i.raw",rank); -// AFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,AFILE); -// fclose(AFILE); -// -// //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); -// ScaLBL_CopyToHost(PhaseField.data(), DenB, sizeof(double)*N); -// FILE *BFILE; -// sprintf(LocalRankFilename,"B_init.%05i.raw",rank); -// BFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,BFILE); -// fclose(BFILE); - - //Velocity also needs initialization (for old incompressible momentum transport) - //if (rank==0) printf ("Initializing velocity field \n"); - //double *vel_init; - //vel_init = new double [3*Np]; - //for (int i=0;i<3*Np;i++) vel_init[i]=0.0; - //ScaLBL_CopyToDevice(Velocity,vel_init,3*Np*sizeof(double)); - //ScaLBL_DeviceBarrier(); - //delete [] vel_init; - } -} - -void ScaLBL_GreyscaleColorModel::Run(){ - int nprocs=nprocx*nprocy*nprocz; - const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); - - int analysis_interval = 1000; // number of timesteps in between in situ analysis - int visualization_interval = 1000; - int restart_interval = 10000; // number of timesteps in between in saving distributions for restart - if (analysis_db->keyExists( "analysis_interval" )){ - analysis_interval = analysis_db->getScalar( "analysis_interval" ); - } - if (analysis_db->keyExists( "visualization_interval" )){ - visualization_interval = analysis_db->getScalar( "visualization_interval" ); - } - if (analysis_db->keyExists( "restart_interval" )){ - restart_interval = analysis_db->getScalar( "restart_interval" ); - } - if (greyscaleColor_db->keyExists( "timestep" )){ - timestep = greyscaleColor_db->getScalar( "timestep" ); - } - - if (rank==0){ - printf("********************************************************\n"); - printf("No. of timesteps: %i \n", timestepMax); - fflush(stdout); - } - - //.......create and start timer............ - double starttime,stoptime,cputime; - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - starttime = MPI_Wtime(); - //......................................... - - Minkowski Morphology(Mask); - - //************ MAIN ITERATION LOOP ***************************************/ - PROFILE_START("Loop"); - auto current_db = db->cloneDatabase(); - double error = 1.0; - double flow_rate_previous = 0.0; - while (timestep < timestepMax && error > tolerance) { - //************************************************************************/ - // *************ODD TIMESTEP*************// - timestep++; - // Compute the density field - // Read for Aq, Bq happens in this routine (requires communication) - ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL - ScaLBL_D3Q19_AAodd_GreyscaleColor_Density(NeighborList, dvcMap, fqA, fqB, DenA, DenB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE - ScaLBL_DeviceBarrier(); - // Set BCs - if (BoundaryCondition == 3){ - ScaLBL_Comm->GreyscaleColor_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); - ScaLBL_Comm->GreyscaleColor_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); - } - ScaLBL_D3Q19_AAodd_GreyscaleColor_Density(NeighborList, dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); - - //if (BoundaryCondition > 0){ - // ScaLBL_Comm->GreyscaleColor_BC_z(dvcMap, DenA, DenB, dinA, dinB); - // ScaLBL_Comm->GreyscaleColor_BC_Z(dvcMap, DenA, DenB, doutA, doutB); - //} - - // Compute density gradient - // fluid component A - ScaLBL_Comm_Regular->SendHalo(DenA); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm_Regular->RecvHalo(DenA); - ScaLBL_DeviceBarrier(); - if (BoundaryCondition >0 ){ - if (Dm->kproc()==0){ - ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); - } - if (Dm->kproc() == nprocz-1){ - ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-1); - } - } - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); - // fluid component B - ScaLBL_Comm_Regular->SendHalo(DenB); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm_Regular->RecvHalo(DenB); - if (BoundaryCondition >0 ){ - if (Dm->kproc()==0){ - ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); - } - if (Dm->kproc() == nprocz-1){ - ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-1); - } - } - ScaLBL_DeviceBarrier(); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); - - // Collsion - ScaLBL_D3Q19_AAodd_GreyscaleColor_BGK(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, - tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, - ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - // Collsion - ScaLBL_D3Q19_AAodd_GreyscaleColor_BGK(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, - tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, - 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - - - // *************EVEN TIMESTEP*************// - timestep++; - // Compute the density field - // Read for Aq, Bq happens in this routine (requires communication) - ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL - ScaLBL_D3Q19_AAeven_GreyscaleColor_Density(dvcMap, fqA, fqB, DenA, DenB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE - ScaLBL_DeviceBarrier(); - // Set BCs - if (BoundaryCondition == 3){ - ScaLBL_Comm->GreyscaleColor_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); - ScaLBL_Comm->GreyscaleColor_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); - } - ScaLBL_D3Q19_AAeven_GreyscaleColor_Density(dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); - - //if (BoundaryCondition > 0){ - // ScaLBL_Comm->GreyscaleColor_BC_z(dvcMap, DenA, DenB, dinA, dinB); - // ScaLBL_Comm->GreyscaleColor_BC_Z(dvcMap, DenA, DenB, doutA, doutB); - //} - - // Compute density gradient - // fluid component A - ScaLBL_Comm_Regular->SendHalo(DenA); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm_Regular->RecvHalo(DenA); - ScaLBL_DeviceBarrier(); - if (BoundaryCondition >0 ){ - if (Dm->kproc()==0){ - ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); - } - if (Dm->kproc() == nprocz-1){ - ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-1); - } - } - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); - // fluid component B - ScaLBL_Comm_Regular->SendHalo(DenB); - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm_Regular->RecvHalo(DenB); - ScaLBL_DeviceBarrier(); - if (BoundaryCondition >0 ){ - if (Dm->kproc()==0){ - ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); - } - if (Dm->kproc() == nprocz-1){ - ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-1); - } - } - ScaLBL_D3Q19_GreyscaleColor_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); - - // Collsion - ScaLBL_D3Q19_AAeven_GreyscaleColor_BGK(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, - tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, - ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - // Collsion - ScaLBL_D3Q19_AAeven_GreyscaleColor_BGK(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, - tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, - 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - - //************************************************************************/ - -// if (timestep%analysis_interval==0){ -// ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); -// ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); -// ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); -// //ScaLBL_Comm->RegularLayout(Map,Porosity,PorosityMap); -// //ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); -// -// double count_loc=0; -// double count; -// double vax,vay,vaz; -// double vax_loc,vay_loc,vaz_loc; -// //double px_loc,py_loc,pz_loc; -// //double px,py,pz; -// //double mass_loc,mass_glb; -// -// //parameters for domain average -// int64_t i,j,k,n,imin,jmin,kmin,kmax; -// // If external boundary conditions are set, do not average over the inlet and outlet -// kmin=1; kmax=Nz-1; -// //In case user forgets to specify the inlet/outlet buffer layers for BC>0 -// if (BoundaryCondition > 0 && Dm->kproc() == 0) kmin=4; -// if (BoundaryCondition > 0 && Dm->kproc() == Dm->nprocz()-1) kmax=Nz-4; -// -// imin=jmin=1; -// // If inlet/outlet layers exist use these as default -// //if (Dm->inlet_layers_x > 0) imin = Dm->inlet_layers_x; -// //if (Dm->inlet_layers_y > 0) jmin = Dm->inlet_layers_y; -// if (BoundaryCondition > 0 && Dm->inlet_layers_z > 0 && Dm->kproc() == 0) kmin = 1 + Dm->inlet_layers_z;//"1" indicates the halo layer -// if (BoundaryCondition > 0 && Dm->outlet_layers_z > 0 && Dm->kproc() == Dm->nprocz()-1) kmax = Nz-1 - Dm->outlet_layers_z; -// -//// px_loc = py_loc = pz_loc = 0.f; -//// mass_loc = 0.f; -//// for (int k=kmin; k 0){ -//// px_loc += Velocity_x(i,j,k)*Den*PorosityMap(i,j,k); -//// py_loc += Velocity_y(i,j,k)*Den*PorosityMap(i,j,k); -//// pz_loc += Velocity_z(i,j,k)*Den*PorosityMap(i,j,k); -//// mass_loc += Den*PorosityMap(i,j,k); -//// } -//// } -//// } -//// } -//// MPI_Allreduce(&px_loc, &px, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -//// MPI_Allreduce(&py_loc, &py, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -//// MPI_Allreduce(&pz_loc, &pz, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -//// MPI_Allreduce(&mass_loc,&mass_glb,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -//// -//// vax = px/mass_glb; -//// vay = py/mass_glb; -//// vaz = pz/mass_glb; -// -// vax_loc = vay_loc = vaz_loc = 0.f; -// for (int k=kmin; k 0){ -// vax_loc += Velocity_x(i,j,k); -// vay_loc += Velocity_y(i,j,k); -// vaz_loc += Velocity_z(i,j,k); -// count_loc+=1.0; -// } -// } -// } -// } -// vax = Mask->Comm.sumReduce( vax_loc ); -// vay = Mask->Comm.sumReduce( vay_loc ); -// vaz = Mask->Comm.sumReduce( vaz_loc ); -// count = Mask->Comm.sumReduce( count_loc ); -// -// vax /= count; -// vay /= count; -// vaz /= count; -// -// double force_mag = sqrt(Fx*Fx+Fy*Fy+Fz*Fz); -// double dir_x = Fx/force_mag; -// double dir_y = Fy/force_mag; -// double dir_z = Fz/force_mag; -// if (force_mag == 0.0){ -// // default to z direction -// dir_x = 0.0; -// dir_y = 0.0; -// dir_z = 1.0; -// force_mag = 1.0; -// } -// //double flow_rate = (px*dir_x + py*dir_y + pz*dir_z)/mass_glb; -// double flow_rate = (vax*dir_x + vay*dir_y + vaz*dir_z); -// -// error = fabs(flow_rate - flow_rate_previous) / fabs(flow_rate); -// flow_rate_previous = flow_rate; -// -// //if (rank==0) printf("Computing Minkowski functionals \n"); -// Morphology.ComputeScalar(SignDist,0.f); -// //Morphology.PrintAll(); -// double mu = (tau-0.5)/3.f; -// double Vs = Morphology.V(); -// double As = Morphology.A(); -// double Hs = Morphology.H(); -// double Xs = Morphology.X(); -// Vs = Dm->Comm.sumReduce( Vs); -// As = Dm->Comm.sumReduce( As); -// Hs = Dm->Comm.sumReduce( Hs); -// Xs = Dm->Comm.sumReduce( Xs); -// -// double h = Dm->voxel_length; -// //double absperm = h*h*mu*Mask->Porosity()*flow_rate / force_mag; -// double absperm = h*h*mu*GreyPorosity*flow_rate / force_mag; -// -// if (rank==0){ -// printf(" AbsPerm = %.5g [micron^2]\n",absperm); -// bool WriteHeader=false; -// FILE * log_file = fopen("Permeability.csv","r"); -// if (log_file != NULL) -// fclose(log_file); -// else -// WriteHeader=true; -// log_file = fopen("Permeability.csv","a"); -// if (WriteHeader) -// fprintf(log_file,"timestep Fx Fy Fz mu Vs As Hs Xs vax vay vaz AbsPerm \n", -// timestep,Fx,Fy,Fz,mu,h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz,absperm); -// -// fprintf(log_file,"%i %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",timestep, Fx, Fy, Fz, mu, -// h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz, absperm); -// fclose(log_file); -// } -// } - - if (timestep%visualization_interval==0){ - WriteOutput(); - } - -// if (timestep%restart_interval==0){ -// //Use rank=0 write out Restart.db -// if (rank==0) { -// greyscaleColor_db->putScalar("timestep",timestep); -// greyscaleColor_db->putScalar( "Restart", true ); -// current_db->putDatabase("GreyscaleColor", greyscaleColor_db); -// std::ofstream OutStream("Restart.db"); -// current_db->print(OutStream, ""); -// OutStream.close(); -// -// } -// //Write out Restart data. -// std::shared_ptr cfq; -// cfq = std::shared_ptr(new double[19*Np],DeleteArray); -// ScaLBL_CopyToHost(cfq.get(),fq,19*Np*sizeof(double));// Copy restart data to the CPU -// -// FILE *RESTARTFILE; -// RESTARTFILE=fopen(LocalRestartFile,"wb"); -// fwrite(cfq.get(),sizeof(double),19*Np,RESTARTFILE); -// fclose(RESTARTFILE); -// MPI_Barrier(comm); -// } - } - - PROFILE_STOP("Loop"); - PROFILE_SAVE("lbpm_greyscale_simulator",1); - //************************************************************************ - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - stoptime = MPI_Wtime(); - if (rank==0) printf("-------------------------------------------------------------------\n"); - // Compute the walltime per timestep - cputime = (stoptime - starttime)/timestep; - // Performance obtained from each node - double MLUPS = double(Np)/cputime/1000000; - - if (rank==0) printf("********************************************************\n"); - if (rank==0) printf("CPU time = %f \n", cputime); - if (rank==0) printf("Lattice update rate (per core)= %f MLUPS \n", MLUPS); - MLUPS *= nprocs; - if (rank==0) printf("Lattice update rate (total)= %f MLUPS \n", MLUPS); - if (rank==0) printf("********************************************************\n"); - - // ************************************************************************ -} - -void ScaLBL_GreyscaleColorModel::WriteOutput(){ - -/* Minkowski Morphology(Mask); - int SIZE=Np*sizeof(double); - ScaLBL_D3Q19_Momentum(fq,Velocity, Np); - ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - ScaLBL_CopyToHost(&VELOCITY[0],&Velocity[0],3*SIZE); - - memcpy(Morphology.SDn.data(), Distance.data(), Nx*Ny*Nz*sizeof(double)); - Morphology.Initialize(); - Morphology.UpdateMeshValues(); - Morphology.ComputeLocal(); - Morphology.Reduce(); - - double count_loc=0; - double count; - double vax,vay,vaz; - double vax_loc,vay_loc,vaz_loc; - vax_loc = vay_loc = vaz_loc = 0.f; - for (int n=0; nLastExterior(); n++){ - vax_loc += VELOCITY[n]; - vay_loc += VELOCITY[Np+n]; - vaz_loc += VELOCITY[2*Np+n]; - count_loc+=1.0; - } - - for (int n=ScaLBL_Comm->FirstInterior(); nLastInterior(); n++){ - vax_loc += VELOCITY[n]; - vay_loc += VELOCITY[Np+n]; - vaz_loc += VELOCITY[2*Np+n]; - count_loc+=1.0; - } - MPI_Allreduce(&vax_loc,&vax,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - MPI_Allreduce(&vay_loc,&vay,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - MPI_Allreduce(&vaz_loc,&vaz,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - MPI_Allreduce(&count_loc,&count,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - - vax /= count; - vay /= count; - vaz /= count; - - double mu = (tau-0.5)/3.f; - if (rank==0) printf("Fx Fy Fz mu Vs As Js Xs vx vy vz\n"); - if (rank==0) printf("%.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",Fx, Fy, Fz, mu, - Morphology.V(),Morphology.A(),Morphology.J(),Morphology.X(),vax,vay,vaz); - */ - - std::vector visData; - fillHalo fillData(Dm->Comm,Dm->rank_info,{Dm->Nx-2,Dm->Ny-2,Dm->Nz-2},{1,1,1},0,1); - - auto VxVar = std::make_shared(); - auto VyVar = std::make_shared(); - auto VzVar = std::make_shared(); - auto SignDistVar = std::make_shared(); - auto PressureVar = std::make_shared(); - auto DenAVar = std::make_shared(); - auto DenBVar = std::make_shared(); - - IO::initialize("","silo","false"); - // Create the MeshDataStruct - visData.resize(1); - visData[0].meshName = "domain"; - visData[0].mesh = std::make_shared( Dm->rank_info,Dm->Nx-2,Dm->Ny-2,Dm->Nz-2,Dm->Lx,Dm->Ly,Dm->Lz ); - SignDistVar->name = "SignDist"; - SignDistVar->type = IO::VariableType::VolumeVariable; - SignDistVar->dim = 1; - SignDistVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(SignDistVar); - - VxVar->name = "Velocity_x"; - VxVar->type = IO::VariableType::VolumeVariable; - VxVar->dim = 1; - VxVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(VxVar); - VyVar->name = "Velocity_y"; - VyVar->type = IO::VariableType::VolumeVariable; - VyVar->dim = 1; - VyVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(VyVar); - VzVar->name = "Velocity_z"; - VzVar->type = IO::VariableType::VolumeVariable; - VzVar->dim = 1; - VzVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(VzVar); - - PressureVar->name = "Pressure"; - PressureVar->type = IO::VariableType::VolumeVariable; - PressureVar->dim = 1; - PressureVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(PressureVar); - - DenAVar->name = "DenA"; - DenAVar->type = IO::VariableType::VolumeVariable; - DenAVar->dim = 1; - DenAVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(DenAVar); - DenBVar->name = "DenB"; - DenBVar->type = IO::VariableType::VolumeVariable; - DenBVar->dim = 1; - DenBVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(DenBVar); - - Array& SignData = visData[0].vars[0]->data; - Array& VelxData = visData[0].vars[1]->data; - Array& VelyData = visData[0].vars[2]->data; - Array& VelzData = visData[0].vars[3]->data; - Array& PressureData = visData[0].vars[4]->data; - Array& DenAData = visData[0].vars[5]->data; - Array& DenBData = visData[0].vars[6]->data; - - ASSERT(visData[0].vars[0]->name=="SignDist"); - ASSERT(visData[0].vars[1]->name=="Velocity_x"); - ASSERT(visData[0].vars[2]->name=="Velocity_y"); - ASSERT(visData[0].vars[3]->name=="Velocity_z"); - ASSERT(visData[0].vars[4]->name=="Pressure"); - ASSERT(visData[0].vars[5]->name=="DenA"); - ASSERT(visData[0].vars[6]->name=="DenB"); - - ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); - ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); - ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); - ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); - ScaLBL_CopyToHost(DenA_data.data(), DenA, sizeof(double)*N); - ScaLBL_CopyToHost(DenB_data.data(), DenB, sizeof(double)*N); - - fillData.copy(SignDist,SignData); - fillData.copy(Velocity_x,VelxData); - fillData.copy(Velocity_y,VelyData); - fillData.copy(Velocity_z,VelzData); - fillData.copy(Pressure,PressureData); - fillData.copy(DenA_data,DenAData); - fillData.copy(DenB_data,DenBData); - - IO::writeData( timestep, visData, Dm->Comm ); - -} - -void ScaLBL_GreyscaleColorModel::WriteDebug(){ - // Copy back final phase indicator field and convert to regular layout - DoubleArray PhaseField(Nx,Ny,Nz); - - //ScaLBL_CopyToHost(Porosity.data(), Poros, sizeof(double)*N); - -// FILE *OUTFILE; -// sprintf(LocalRankFilename,"Phase.%05i.raw",rank); -// OUTFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,OUTFILE); -// fclose(OUTFILE); -// - //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); - ScaLBL_CopyToHost(PhaseField.data(), DenA, sizeof(double)*N); - FILE *AFILE; - sprintf(LocalRankFilename,"A.%05i.raw",rank); - AFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,AFILE); - fclose(AFILE); - - //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); - ScaLBL_CopyToHost(PhaseField.data(), DenB, sizeof(double)*N); - FILE *BFILE; - sprintf(LocalRankFilename,"B.%05i.raw",rank); - BFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,BFILE); - fclose(BFILE); - - ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,PhaseField); - FILE *PFILE; - sprintf(LocalRankFilename,"Pressure.%05i.raw",rank); - PFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,PFILE); - fclose(PFILE); - - ScaLBL_Comm->RegularLayout(Map,&Velocity[0],PhaseField); - FILE *VELX_FILE; - sprintf(LocalRankFilename,"Velocity_X.%05i.raw",rank); - VELX_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,VELX_FILE); - fclose(VELX_FILE); - - ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],PhaseField); - FILE *VELY_FILE; - sprintf(LocalRankFilename,"Velocity_Y.%05i.raw",rank); - VELY_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,VELY_FILE); - fclose(VELY_FILE); - - ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],PhaseField); - FILE *VELZ_FILE; - sprintf(LocalRankFilename,"Velocity_Z.%05i.raw",rank); - VELZ_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,VELZ_FILE); - fclose(VELZ_FILE); - -// ScaLBL_Comm->RegularLayout(Map,&Porosity[0],PhaseField); -// FILE *POROS_FILE; -// sprintf(LocalRankFilename,"Porosity.%05i.raw",rank); -// POROS_FILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,POROS_FILE); -// fclose(POROS_FILE); -// -// ScaLBL_Comm->RegularLayout(Map,&Permeability[0],PhaseField); -// FILE *PERM_FILE; -// sprintf(LocalRankFilename,"Permeability.%05i.raw",rank); -// PERM_FILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,PERM_FILE); -// fclose(PERM_FILE); -} diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h deleted file mode 100644 index 667eca16..00000000 --- a/models/GreyscaleColorModel.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -Implementation of color lattice boltzmann model - */ -#include -#include -#include -#include -#include -#include -#include - -#include "common/Communication.h" -#include "common/MPI.h" -#include "common/Database.h" -#include "common/ScaLBL.h" -#include "ProfilerApp.h" -#include "threadpool/thread_pool.h" - -class ScaLBL_GreyscaleSCModel{ -public: - ScaLBL_GreyscaleSCModel(int RANK, int NP, MPI_Comm COMM); - ~ScaLBL_GreyscaleSCModel(); - - // functions in they should be run - void ReadParams(string filename); - void ReadParams(std::shared_ptr db0); - void SetDomain(); - void ReadInput(); - void Create(); - void Initialize(); - void Run(); - void WriteDebug(); - void WriteOutput(); - - bool Restart,pBC; - int timestep,timestepMax; - int BoundaryCondition; - int CollisionType; - double tauA,tauB; - double tauA_eff,tauB_eff; - double Gsc; - double rhoA,rhoB; - double rhoA_minor,rhoB_minor;//dissolved density - double tolerance; - double Fx,Fy,Fz,flux; - double dinA,doutA; - double dinB,doutB; - double GreyPorosity; - - int Nx,Ny,Nz,N,Np; - int rank,nprocx,nprocy,nprocz,nprocs; - double Lx,Ly,Lz; - - std::shared_ptr Dm; // this domain is for analysis - std::shared_ptr Mask; // this domain is for lbm - std::shared_ptr ScaLBL_Comm; - std::shared_ptr ScaLBL_Comm_Regular; - - // input database - std::shared_ptr db; - std::shared_ptr domain_db; - std::shared_ptr greyscaleSC_db; - std::shared_ptr analysis_db; - std::shared_ptr vis_db; - - signed char *id; - int *NeighborList; - int *dvcMap; - double *fqA, *fqB; - double *Permeability;//grey voxel permeability - //double relPermA,relPermB;//grey voxel relperm - double *Porosity; - double *Velocity; - double *Pressure_dvc; - double *DenA, *DenB; - double *DenGradA,*DenGradB; - double *SolidForceA,*SolidForceB; - - IntArray Map; - DoubleArray SignDist; - DoubleArray Velocity_x; - DoubleArray Velocity_y; - DoubleArray Velocity_z; - DoubleArray PorosityMap; - DoubleArray Pressure; - DoubleArray DenA_data; - DoubleArray DenB_data; - -private: - MPI_Comm comm; - - int dist_mem_size; - int neighborSize; - // filenames - char LocalRankString[8]; - char LocalRankFilename[40]; - char LocalRestartFile[40]; - - void AssignGreyscaleAndSolidLabels(); - void Density_Init(); -}; - From a404f4c8af2fb4948ff167f01fc5d2700d167c4a Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Fri, 29 May 2020 10:28:11 -0400 Subject: [PATCH 39/75] GreyscaleSC model: update the density initialization on grey nodes --- models/GreyscaleSCModel.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp index 50674365..f1dc9ab2 100644 --- a/models/GreyscaleSCModel.cpp +++ b/models/GreyscaleSCModel.cpp @@ -606,20 +606,25 @@ void ScaLBL_GreyscaleSCModel::Density_Init(){ signed char VALUE=0; vector LabelList{1,2}; - vector SwList{0.0,1.0}; + vector GreyDenAList{rhoA,rhoB_minor}; + vector GreyDenBList{rhoB,rhoA_minor}; if (greyscaleSC_db->keyExists( "GreyNodeLabels" )){ LabelList.clear(); LabelList = greyscaleSC_db->getVector( "GreyNodeLabels" ); } - if (greyscaleSC_db->keyExists( "GreyNodeSwInit" )){ - SwList.clear(); - SwList = greyscaleSC_db->getVector( "GreyNodeSwInit" ); + if (greyscaleSC_db->keyExists( "GreyNodeDenAInit" )){ + GreyDenAList.clear(); + GreyDenAList = greyscaleSC_db->getVector( "GreyNodeDenAInit" ); + } + if (greyscaleSC_db->keyExists( "GreyNodeDenBInit" )){ + GreyDenBList.clear(); + GreyDenBList = greyscaleSC_db->getVector( "GreyNodeDenBInit" ); } NLABELS=LabelList.size(); - if (NLABELS != SwList.size()){ - ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); + if (NLABELS != GreyDenAList.size() || NLABELS != GreyDenBList.size()){ + ERROR("Error: GreyNodeLabels, GreyNodeDenAInit, and GreyNodeDenBInit must all be the same length! \n"); } double *DenA_temp,*DenB_temp; @@ -640,10 +645,8 @@ void ScaLBL_GreyscaleSCModel::Density_Init(){ if (VALUE>0){ for (unsigned int idx=0; idx < NLABELS; idx++){ if (VALUE == LabelList[idx]){ - double Sw = SwList[idx]; - if ((Sw<0.0) || (Sw>1.0)) ERROR("Error: Initial saturation for grey nodes must be between [0.0, 1.0]! \n"); - nB=Sw; - nA=1.0-Sw; + nA=GreyDenAList[idx]; + nB=GreyDenBList[idx]; //phi = nA-nB; idx = NLABELS; } From 120595ae7b34ea2f0e15eea268d42d6379d5c217 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Thu, 4 Jun 2020 16:40:47 -0400 Subject: [PATCH 40/75] try to fix fluxBC for greyscaleSC model but didn't work; save the work --- models/GreyscaleSCModel.cpp | 40 +++++++++++++++++++++++++++++-------- models/GreyscaleSCModel.h | 3 ++- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp index f1dc9ab2..6fa125fd 100644 --- a/models/GreyscaleSCModel.cpp +++ b/models/GreyscaleSCModel.cpp @@ -15,7 +15,7 @@ void DeleteArray( const TYPE *p ) ScaLBL_GreyscaleSCModel::ScaLBL_GreyscaleSCModel(int RANK, int NP, MPI_Comm COMM): rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0),Gsc(0), -rhoA(0),rhoB(0),rhoA_minor(0),rhoB_minor(0),Fx(0),Fy(0),Fz(0),flux(0),dinA(0),doutA(0),dinB(0),doutB(0),GreyPorosity(0), +rhoA(0),rhoB(0),rhoA_minor(0),rhoB_minor(0),Fx(0),Fy(0),Fz(0),fluxA(0),fluxB(0),dinA(0),doutA(0),dinB(0),doutB(0),GreyPorosity(0), Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) { SignDist.resize(Nx,Ny,Nz); @@ -50,7 +50,7 @@ void ScaLBL_GreyscaleSCModel::ReadParams(string filename){ dinB=rhoB_minor;//inlet density for fluid B doutA=rhoA_minor;//outlet denisty for fluid A doutB=rhoB;//outlet density for fluid B - flux=0.0; + fluxA=fluxB=0.0; // ---------------------- Greyscale Model parameters -----------------------// if (greyscaleSC_db->keyExists( "timestepMax" )){ @@ -83,8 +83,11 @@ void ScaLBL_GreyscaleSCModel::ReadParams(string filename){ if (greyscaleSC_db->keyExists( "Restart" )){ Restart = greyscaleSC_db->getScalar( "Restart" ); } - if (greyscaleSC_db->keyExists( "flux" )){ - flux = greyscaleSC_db->getScalar( "flux" ); + if (greyscaleSC_db->keyExists( "fluxA" )){ + fluxA = greyscaleSC_db->getScalar( "fluxA" ); + } + if (greyscaleSC_db->keyExists( "fluxB" )){ + fluxB = greyscaleSC_db->getScalar( "fluxB" ); } if (greyscaleSC_db->keyExists( "tolerance" )){ tolerance = greyscaleSC_db->getScalar( "tolerance" ); @@ -188,6 +191,9 @@ void ScaLBL_GreyscaleSCModel::ReadInput(){ case 3: if (rank==0) printf("BoundaryCondition=%i: Constant pressure boundary condition\n",BoundaryCondition); break; + case 4: + if (rank==0) printf("BoundaryCondition=%i: Constant flux boundary condition\n",BoundaryCondition); + break; default: if (rank==0) printf("BoundaryCondition=%i: is currently not supported! Periodic boundary condition is used.\n",BoundaryCondition); BoundaryCondition=0; @@ -912,6 +918,11 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_Comm->GreyscaleSC_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); } + if (BoundaryCondition == 4){ + dinA = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fqA, fluxA, timestep); + dinB = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fqB, fluxB, timestep); + ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); + } ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); //if (BoundaryCondition > 0){ @@ -925,7 +936,7 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm_Regular->RecvHalo(DenA); ScaLBL_DeviceBarrier(); - if (BoundaryCondition >0 ){ + if (BoundaryCondition ==3 || BoundaryCondition ==4){//not necessarily applied to velBC (BC=2) if (Dm->kproc()==0){ ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); } @@ -938,7 +949,7 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_Comm_Regular->SendHalo(DenB); ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm_Regular->RecvHalo(DenB); - if (BoundaryCondition >0 ){ + if (BoundaryCondition ==3 || BoundaryCondition ==4){//not necessarily applied to velBC (BC=2) if (Dm->kproc()==0){ ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); } @@ -973,6 +984,11 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_Comm->GreyscaleSC_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); } + if (BoundaryCondition == 4){ + dinA = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fqA, fluxA, timestep); + dinB = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fqB, fluxB, timestep); + ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); + } ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); //if (BoundaryCondition > 0){ @@ -986,7 +1002,7 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm_Regular->RecvHalo(DenA); ScaLBL_DeviceBarrier(); - if (BoundaryCondition >0 ){ + if (BoundaryCondition ==3 || BoundaryCondition ==4){//not necessarily applied to velBC (BC=2) if (Dm->kproc()==0){ ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); } @@ -1000,7 +1016,7 @@ void ScaLBL_GreyscaleSCModel::Run(){ ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); ScaLBL_Comm_Regular->RecvHalo(DenB); ScaLBL_DeviceBarrier(); - if (BoundaryCondition >0 ){ + if (BoundaryCondition ==3 || BoundaryCondition ==4){//not necessarily applied to velBC (BC=2) if (Dm->kproc()==0){ ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); } @@ -1149,6 +1165,14 @@ void ScaLBL_GreyscaleSCModel::Run(){ // fclose(log_file); // } // } + if (timestep==2&&BoundaryCondition==4){ + if (rank==0) printf(" Timestep dinA dinB doutA doutB\n"); + } + if (timestep%analysis_interval==0){ + if (BoundaryCondition==4){ + if (rank==0) printf(" %i %.3g %.3g %.3g %.3g\n",timestep,dinA,dinB,doutA,doutB); + } + } if (timestep%visualization_interval==0){ WriteOutput(); diff --git a/models/GreyscaleSCModel.h b/models/GreyscaleSCModel.h index 667eca16..e5e79d68 100644 --- a/models/GreyscaleSCModel.h +++ b/models/GreyscaleSCModel.h @@ -42,7 +42,8 @@ public: double rhoA,rhoB; double rhoA_minor,rhoB_minor;//dissolved density double tolerance; - double Fx,Fy,Fz,flux; + double Fx,Fy,Fz; + double fluxA,fluxB; double dinA,doutA; double dinB,doutB; double GreyPorosity; From f0b150c7c58e42cb5852baf2a6bdb8e6094401e6 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Tue, 9 Jun 2020 15:42:45 -0400 Subject: [PATCH 41/75] initialize greyscaleColor model --- models/GreyscaleColorModel.cpp | 1663 ++++++++++++++++++++++++++++++++ models/GreyscaleColorModel.h | 88 ++ 2 files changed, 1751 insertions(+) create mode 100644 models/GreyscaleColorModel.cpp create mode 100644 models/GreyscaleColorModel.h diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp new file mode 100644 index 00000000..3fef03d1 --- /dev/null +++ b/models/GreyscaleColorModel.cpp @@ -0,0 +1,1663 @@ +/* +color lattice boltzmann model + */ +#include "models/ColorModel.h" +#include "analysis/distance.h" +#include "analysis/morphology.h" +#include "common/Communication.h" +#include "common/ReadMicroCT.h" +#include +#include + +ScaLBL_ColorModel::ScaLBL_ColorModel(int RANK, int NP, const Utilities::MPI& COMM): +rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),rhoA(0),rhoB(0),alpha(0),beta(0), +Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),inletA(0),inletB(0),outletA(0),outletB(0), +Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) +{ + REVERSE_FLOW_DIRECTION = false; +} +ScaLBL_ColorModel::~ScaLBL_ColorModel(){ + +} + +/*void ScaLBL_ColorModel::WriteCheckpoint(const char *FILENAME, const double *cPhi, const double *cfq, int Np) +{ + int q,n; + double value; + ofstream File(FILENAME,ios::binary); + for (n=0; n( filename ); + domain_db = db->getDatabase( "Domain" ); + color_db = db->getDatabase( "Color" ); + analysis_db = db->getDatabase( "Analysis" ); + vis_db = db->getDatabase( "Visualization" ); + + // set defaults + timestepMax = 100000; + tauA = tauB = 1.0; + rhoA = rhoB = 1.0; + Fx = Fy = Fz = 0.0; + alpha=1e-3; + beta=0.95; + Restart=false; + din=dout=1.0; + flux=0.0; + + // Color Model parameters + if (color_db->keyExists( "timestepMax" )){ + timestepMax = color_db->getScalar( "timestepMax" ); + } + if (color_db->keyExists( "tauA" )){ + tauA = color_db->getScalar( "tauA" ); + } + if (color_db->keyExists( "tauB" )){ + tauB = color_db->getScalar( "tauB" ); + } + if (color_db->keyExists( "rhoA" )){ + rhoA = color_db->getScalar( "rhoA" ); + } + if (color_db->keyExists( "rhoB" )){ + rhoB = color_db->getScalar( "rhoB" ); + } + if (color_db->keyExists( "F" )){ + Fx = color_db->getVector( "F" )[0]; + Fy = color_db->getVector( "F" )[1]; + Fz = color_db->getVector( "F" )[2]; + } + if (color_db->keyExists( "alpha" )){ + alpha = color_db->getScalar( "alpha" ); + } + if (color_db->keyExists( "beta" )){ + beta = color_db->getScalar( "beta" ); + } + if (color_db->keyExists( "Restart" )){ + Restart = color_db->getScalar( "Restart" ); + } + if (color_db->keyExists( "din" )){ + din = color_db->getScalar( "din" ); + } + if (color_db->keyExists( "dout" )){ + dout = color_db->getScalar( "dout" ); + } + if (color_db->keyExists( "flux" )){ + flux = color_db->getScalar( "flux" ); + } + inletA=1.f; + inletB=0.f; + outletA=0.f; + outletB=1.f; + //if (BoundaryCondition==4) flux *= rhoA; // mass flux must adjust for density (see formulation for details) + + BoundaryCondition = 0; + if (domain_db->keyExists( "BC" )){ + BoundaryCondition = domain_db->getScalar( "BC" ); + } + + // Override user-specified boundary condition for specific protocols + auto protocol = color_db->getWithDefault( "protocol", "none" ); + if (protocol == "seed water"){ + if (BoundaryCondition != 0 ){ + BoundaryCondition = 0; + if (rank==0) printf("WARNING: protocol (seed water) supports only full periodic boundary condition \n"); + } + domain_db->putScalar( "BC", BoundaryCondition ); + } + else if (protocol == "open connected oil"){ + if (BoundaryCondition != 0 ){ + BoundaryCondition = 0; + if (rank==0) printf("WARNING: protocol (open connected oil) supports only full periodic boundary condition \n"); + } + domain_db->putScalar( "BC", BoundaryCondition ); + } + else if (protocol == "shell aggregation"){ + if (BoundaryCondition != 0 ){ + BoundaryCondition = 0; + if (rank==0) printf("WARNING: protocol (shell aggregation) supports only full periodic boundary condition \n"); + } + domain_db->putScalar( "BC", BoundaryCondition ); + } +} + +void ScaLBL_ColorModel::SetDomain(){ + Dm = std::shared_ptr(new Domain(domain_db,comm)); // full domain for analysis + Mask = std::shared_ptr(new Domain(domain_db,comm)); // mask domain removes immobile phases + // domain parameters + Nx = Dm->Nx; + Ny = Dm->Ny; + Nz = Dm->Nz; + Lx = Dm->Lx; + Ly = Dm->Ly; + Lz = Dm->Lz; + N = Nx*Ny*Nz; + id = new signed char [N]; + for (int i=0; iid[i] = 1; // initialize this way + //Averages = std::shared_ptr ( new TwoPhase(Dm) ); // TwoPhase analysis object + Averages = std::shared_ptr ( new SubPhase(Dm) ); // TwoPhase analysis object + comm.barrier(); + Dm->CommInit(); + comm.barrier(); + // Read domain parameters + rank = Dm->rank(); + nprocx = Dm->nprocx(); + nprocy = Dm->nprocy(); + nprocz = Dm->nprocz(); +} + +void ScaLBL_ColorModel::ReadInput(){ + + sprintf(LocalRankString,"%05d",rank); + sprintf(LocalRankFilename,"%s%s","ID.",LocalRankString); + sprintf(LocalRestartFile,"%s%s","Restart.",LocalRankString); + + if (color_db->keyExists( "image_sequence" )){ + auto ImageList = color_db->getVector( "image_sequence"); + int IMAGE_INDEX = color_db->getWithDefault( "image_index", 0 ); + std::string first_image = ImageList[IMAGE_INDEX]; + Mask->Decomp(first_image); + IMAGE_INDEX++; + } + else if (domain_db->keyExists( "GridFile" )){ + // Read the local domain data + auto input_id = readMicroCT( *domain_db, comm ); + // Fill the halo (assuming GCW of 1) + array size0 = { (int) input_id.size(0), (int) input_id.size(1), (int) input_id.size(2) }; + ArraySize size1 = { (size_t) Mask->Nx, (size_t) Mask->Ny, (size_t) Mask->Nz }; + ASSERT( (int) size1[0] == size0[0]+2 && (int) size1[1] == size0[1]+2 && (int) size1[2] == size0[2]+2 ); + fillHalo fill( comm, Mask->rank_info, size0, { 1, 1, 1 }, 0, 1 ); + Array id_view; + id_view.viewRaw( size1, Mask->id ); + fill.copy( input_id, id_view ); + fill.fill( id_view ); + } + else if (domain_db->keyExists( "Filename" )){ + auto Filename = domain_db->getScalar( "Filename" ); + Mask->Decomp(Filename); + } + else{ + Mask->ReadIDs(); + } + for (int i=0; iid[i]; // save what was read + + // Generate the signed distance map + // Initialize the domain and communication + Array id_solid(Nx,Ny,Nz); + // Solve for the position of the solid phase + for (int k=0;kid[n]; + if (label > 0) id_solid(i,j,k) = 1; + else id_solid(i,j,k) = 0; + } + } + } + // Initialize the signed distance function + for (int k=0;kSDs(i,j,k) = 2.0*double(id_solid(i,j,k))-1.0; + } + } + } +// MeanFilter(Averages->SDs); + if (rank==0) printf("Initialized solid phase -- Converting to Signed Distance function \n"); + CalcDist(Averages->SDs,id_solid,*Mask); + + if (rank == 0) cout << "Domain set." << endl; + + Averages->SetParams(rhoA,rhoB,tauA,tauB,Fx,Fy,Fz,alpha,beta); +} + +void ScaLBL_ColorModel::AssignComponentLabels(double *phase) +{ + size_t NLABELS=0; + signed char VALUE=0; + double AFFINITY=0.f; + + auto LabelList = color_db->getVector( "ComponentLabels" ); + auto AffinityList = color_db->getVector( "ComponentAffinity" ); + + NLABELS=LabelList.size(); + if (NLABELS != AffinityList.size()){ + ERROR("Error: ComponentLabels and ComponentAffinity must be the same length! \n"); + } + + double label_count[NLABELS]; + double label_count_global[NLABELS]; + // Assign the labels + + for (size_t idx=0; idxid[n] = 0; // set mask to zero since this is an immobile component + } + } + // fluid labels are reserved + if (VALUE == 1) AFFINITY=1.0; + else if (VALUE == 2) AFFINITY=-1.0; + phase[n] = AFFINITY; + } + } + } + + // Set Dm to match Mask + for (int i=0; iid[i] = Mask->id[i]; + + for (size_t idx=0; idxComm.sumReduce( label_count[idx] ); + + if (rank==0){ + printf("Component labels: %lu \n",NLABELS); + for (unsigned int idx=0; idxid[i] = Mask->id[i]; + Mask->CommInit(); + Np=Mask->PoreCount(); + //........................................................................... + if (rank==0) printf ("Create ScaLBL_Communicator \n"); + // Create a communicator for the device (will use optimized layout) + // ScaLBL_Communicator ScaLBL_Comm(Mask); // original + ScaLBL_Comm = std::shared_ptr(new ScaLBL_Communicator(Mask)); + ScaLBL_Comm_Regular = std::shared_ptr(new ScaLBL_Communicator(Mask)); + + int Npad=(Np/16 + 2)*16; + if (rank==0) printf ("Set up memory efficient layout, %i | %i | %i \n", Np, Npad, N); + Map.resize(Nx,Ny,Nz); Map.fill(-2); + auto neighborList= new int[18*Npad]; + Np = ScaLBL_Comm->MemoryOptimizedLayoutAA(Map,neighborList,Mask->id,Np); + comm.barrier(); + + //........................................................................... + // MAIN VARIABLES ALLOCATED HERE + //........................................................................... + // LBM variables + if (rank==0) printf ("Allocating distributions \n"); + //......................device distributions................................. + dist_mem_size = Np*sizeof(double); + neighborSize=18*(Np*sizeof(int)); + //........................................................................... + ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); + ScaLBL_AllocateDeviceMemory((void **) &dvcMap, sizeof(int)*Np); + ScaLBL_AllocateDeviceMemory((void **) &fq, 19*dist_mem_size); + ScaLBL_AllocateDeviceMemory((void **) &Aq, 7*dist_mem_size); + ScaLBL_AllocateDeviceMemory((void **) &Bq, 7*dist_mem_size); + ScaLBL_AllocateDeviceMemory((void **) &Den, 2*dist_mem_size); + ScaLBL_AllocateDeviceMemory((void **) &Phi, sizeof(double)*Nx*Ny*Nz); + ScaLBL_AllocateDeviceMemory((void **) &Pressure, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &ColorGrad, 3*sizeof(double)*Np); + //........................................................................... + // Update GPU data structures + if (rank==0) printf ("Setting up device map and neighbor list \n"); + fflush(stdout); + int *TmpMap; + TmpMap=new int[Np]; + for (int k=1; kLastExterior(); idx++){ + auto n = TmpMap[idx]; + if (n > Nx*Ny*Nz){ + printf("Bad value! idx=%i \n", n); + TmpMap[idx] = Nx*Ny*Nz-1; + } + } + for (int idx=ScaLBL_Comm->FirstInterior(); idxLastInterior(); idx++){ + auto n = TmpMap[idx]; + if ( n > Nx*Ny*Nz ){ + printf("Bad value! idx=%i \n",n); + TmpMap[idx] = Nx*Ny*Nz-1; + } + } + ScaLBL_CopyToDevice(dvcMap, TmpMap, sizeof(int)*Np); + ScaLBL_DeviceBarrier(); + delete [] TmpMap; + + // copy the neighbor list + ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); + // initialize phi based on PhaseLabel (include solid component labels) + double *PhaseLabel; + PhaseLabel = new double[N]; + AssignComponentLabels(PhaseLabel); + ScaLBL_CopyToDevice(Phi, PhaseLabel, N*sizeof(double)); +} + +/******************************************************** + * AssignComponentLabels * + ********************************************************/ + +void ScaLBL_ColorModel::Initialize(){ + + if (rank==0) printf ("Initializing distributions \n"); + ScaLBL_D3Q19_Init(fq, Np); + /* + * This function initializes model + */ + if (Restart == true){ + if (rank==0){ + printf("Reading restart file! \n"); + } + + // Read in the restart file to CPU buffers + int *TmpMap; + TmpMap = new int[Np]; + + double *cPhi, *cDist, *cDen; + cPhi = new double[N]; + cDen = new double[2*Np]; + cDist = new double[19*Np]; + ScaLBL_CopyToHost(TmpMap, dvcMap, Np*sizeof(int)); + ScaLBL_CopyToHost(cPhi, Phi, N*sizeof(double)); + + ifstream File(LocalRestartFile,ios::binary); + int idx; + double value,va,vb; + for (int n=0; nLastExterior(); n++){ + va = cDen[n]; + vb = cDen[Np + n]; + value = (va-vb)/(va+vb); + idx = TmpMap[n]; + if (!(idx < 0) && idxFirstInterior(); nLastInterior(); n++){ + va = cDen[n]; + vb = cDen[Np + n]; + value = (va-vb)/(va+vb); + idx = TmpMap[n]; + if (!(idx < 0) && idxLastExterior(), Np); + ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,0); + ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,1); + ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,2); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-1); + ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-2); + ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-3); + } + } + ScaLBL_CopyToHost(Averages->Phi.data(),Phi,N*sizeof(double)); +} + +void ScaLBL_ColorModel::Run(){ + int nprocs=nprocx*nprocy*nprocz; + const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); + + int IMAGE_INDEX = 0; + int IMAGE_COUNT = 0; + std::vector ImageList; + bool SET_CAPILLARY_NUMBER = false; + bool MORPH_ADAPT = false; + bool USE_MORPH = false; + bool USE_SEED = false; + bool USE_DIRECT = false; + bool USE_MORPHOPEN_OIL = false; + int MAX_MORPH_TIMESTEPS = 50000; // maximum number of LBM timesteps to spend in morphological adaptation routine + int MIN_STEADY_TIMESTEPS = 100000; + int MAX_STEADY_TIMESTEPS = 200000; + int RAMP_TIMESTEPS = 0;//50000; // number of timesteps to run initially (to get a reasonable velocity field before other pieces kick in) + int CURRENT_MORPH_TIMESTEPS=0; // counter for number of timesteps spent in morphological adaptation routine (reset each time) + int CURRENT_STEADY_TIMESTEPS=0; // counter for number of timesteps spent in morphological adaptation routine (reset each time) + int morph_interval = 100000; + int analysis_interval = 1000; // number of timesteps in between in situ analysis + int morph_timesteps = 0; + double morph_delta = 0.0; + double seed_water = 0.0; + double capillary_number = 0.0; + double tolerance = 0.01; + double Ca_previous = 0.f; + double initial_volume = 0.0; + double delta_volume = 0.0; + double delta_volume_target = 0.0; + double RESIDUAL_ENDPOINT_THRESHOLD = 0.04; + double NOISE_THRESHOLD = 0.0; + double BUMP_RATE = 2.0; + bool USE_BUMP_RATE = false; + + /* history for morphological algoirthm */ + double KRA_MORPH_FACTOR=0.8; + double volA_prev = 0.0; + double log_krA_prev = 1.0; + double log_krA_target = 1.0; + double log_krA = 0.0; + double slope_krA_volume = 0.0; + if (color_db->keyExists( "vol_A_previous" )){ + volA_prev = color_db->getScalar( "vol_A_previous" ); + } + if (color_db->keyExists( "log_krA_previous" )){ + log_krA_prev = color_db->getScalar( "log_krA_previous" ); + } + if (color_db->keyExists( "krA_morph_factor" )){ + KRA_MORPH_FACTOR = color_db->getScalar( "krA_morph_factor" ); + } + + /* defaults for simulation protocols */ + auto protocol = color_db->getWithDefault( "protocol", "none" ); + if (protocol == "image sequence"){ + // Get the list of images + USE_DIRECT = true; + ImageList = color_db->getVector( "image_sequence"); + IMAGE_INDEX = color_db->getWithDefault( "image_index", 0 ); + IMAGE_COUNT = ImageList.size(); + morph_interval = 10000; + USE_MORPH = true; + } + else if (protocol == "seed water"){ + morph_delta = 0.05; + seed_water = 0.01; + USE_SEED = true; + USE_MORPH = true; + } + else if (protocol == "open connected oil"){ + morph_delta = 0.05; + USE_MORPH = true; + USE_MORPHOPEN_OIL = true; + } + else if (protocol == "shell aggregation"){ + morph_delta = 0.05; + USE_MORPH = true; + } + + if (color_db->keyExists( "residual_endpoint_threshold" )){ + RESIDUAL_ENDPOINT_THRESHOLD = color_db->getScalar( "residual_endpoint_threshold" ); + } + NULL_USE( RESIDUAL_ENDPOINT_THRESHOLD ); + if (color_db->keyExists( "noise_threshold" )){ + NOISE_THRESHOLD = color_db->getScalar( "noise_threshold" ); + USE_BUMP_RATE = true; + } + if (color_db->keyExists( "bump_rate" )){ + BUMP_RATE = color_db->getScalar( "bump_rate" ); + USE_BUMP_RATE = true; + } + if (color_db->keyExists( "capillary_number" )){ + capillary_number = color_db->getScalar( "capillary_number" ); + SET_CAPILLARY_NUMBER=true; + //RESCALE_FORCE_MAX = 1; + } +// if (analysis_db->keyExists( "rescale_force_count" )){ +// RESCALE_FORCE_MAX = analysis_db->getScalar( "rescale_force_count" ); +// } + if (color_db->keyExists( "timestep" )){ + timestep = color_db->getScalar( "timestep" ); + } + if (BoundaryCondition != 0 && SET_CAPILLARY_NUMBER==true){ + if (rank == 0) printf("WARINING: capillary number target only supported for BC = 0 \n"); + SET_CAPILLARY_NUMBER=false; + } + if (analysis_db->keyExists( "seed_water" )){ + seed_water = analysis_db->getScalar( "seed_water" ); + if (rank == 0) printf("Seed water in oil %f (seed_water) \n",seed_water); + USE_SEED = true; + } + if (analysis_db->keyExists( "morph_delta" )){ + morph_delta = analysis_db->getScalar( "morph_delta" ); + if (rank == 0) printf("Target volume change %f (morph_delta) \n",morph_delta); + } + if (analysis_db->keyExists( "morph_interval" )){ + morph_interval = analysis_db->getScalar( "morph_interval" ); + USE_MORPH = true; + } + if (analysis_db->keyExists( "use_morphopen_oil" )){ + USE_MORPHOPEN_OIL = analysis_db->getScalar( "use_morphopen_oil" ); + if (rank == 0 && USE_MORPHOPEN_OIL) printf("Volume change by morphological opening \n"); + USE_MORPH = true; + } + if (analysis_db->keyExists( "tolerance" )){ + tolerance = analysis_db->getScalar( "tolerance" ); + } + if (analysis_db->keyExists( "analysis_interval" )){ + analysis_interval = analysis_db->getScalar( "analysis_interval" ); + } + if (analysis_db->keyExists( "min_steady_timesteps" )){ + MIN_STEADY_TIMESTEPS = analysis_db->getScalar( "min_steady_timesteps" ); + } + if (analysis_db->keyExists( "max_steady_timesteps" )){ + MAX_STEADY_TIMESTEPS = analysis_db->getScalar( "max_steady_timesteps" ); + } + if (analysis_db->keyExists( "max_morph_timesteps" )){ + MAX_MORPH_TIMESTEPS = analysis_db->getScalar( "max_morph_timesteps" ); + } + + + if (rank==0){ + printf("********************************************************\n"); + if (protocol == "image sequence"){ + printf(" using protocol = image sequence \n"); + printf(" min_steady_timesteps = %i \n",MIN_STEADY_TIMESTEPS); + printf(" max_steady_timesteps = %i \n",MAX_STEADY_TIMESTEPS); + printf(" tolerance = %f \n",tolerance); + std::string first_image = ImageList[IMAGE_INDEX]; + printf(" first image in sequence: %s ***\n", first_image.c_str()); + } + else if (protocol == "seed water"){ + printf(" using protocol = seed water \n"); + printf(" min_steady_timesteps = %i \n",MIN_STEADY_TIMESTEPS); + printf(" max_steady_timesteps = %i \n",MAX_STEADY_TIMESTEPS); + printf(" tolerance = %f \n",tolerance); + printf(" morph_delta = %f \n",morph_delta); + printf(" seed_water = %f \n",seed_water); + } + else if (protocol == "open connected oil"){ + printf(" using protocol = open connected oil \n"); + printf(" min_steady_timesteps = %i \n",MIN_STEADY_TIMESTEPS); + printf(" max_steady_timesteps = %i \n",MAX_STEADY_TIMESTEPS); + printf(" tolerance = %f \n",tolerance); + printf(" morph_delta = %f \n",morph_delta); + } + else if (protocol == "shell aggregation"){ + printf(" using protocol = shell aggregation \n"); + printf(" min_steady_timesteps = %i \n",MIN_STEADY_TIMESTEPS); + printf(" max_steady_timesteps = %i \n",MAX_STEADY_TIMESTEPS); + printf(" tolerance = %f \n",tolerance); + printf(" morph_delta = %f \n",morph_delta); + } + printf("No. of timesteps: %i \n", timestepMax); + fflush(stdout); + } + + //.......create and start timer............ + double starttime,stoptime,cputime; + ScaLBL_DeviceBarrier(); + comm.barrier(); + starttime = Utilities::MPI::time(); + //......................................... + + //************ MAIN ITERATION LOOP ***************************************/ + PROFILE_START("Loop"); + //std::shared_ptr analysis_db; + bool Regular = false; + auto current_db = db->cloneDatabase(); + runAnalysis analysis( current_db, rank_info, ScaLBL_Comm, Dm, Np, Regular, Map ); + //analysis.createThreads( analysis_method, 4 ); + while (timestep < timestepMax ) { + //if ( rank==0 ) { printf("Running timestep %i (%i MB)\n",timestep+1,(int)(Utilities::getMemoryUsage()/1048576)); } + PROFILE_START("Update"); + // *************ODD TIMESTEP************* + timestep++; + // Compute the Phase indicator field + // Read for Aq, Bq happens in this routine (requires communication) + ScaLBL_Comm->BiSendD3Q7AA(Aq,Bq); //READ FROM NORMAL + ScaLBL_D3Q7_AAodd_PhaseField(NeighborList, dvcMap, Aq, Bq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->BiRecvD3Q7AA(Aq,Bq); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + ScaLBL_D3Q7_AAodd_PhaseField(NeighborList, dvcMap, Aq, Bq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); + + // Perform the collision operation + ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL + if (BoundaryCondition > 0){ + ScaLBL_Comm->Color_BC_z(dvcMap, Phi, Den, inletA, inletB); + ScaLBL_Comm->Color_BC_Z(dvcMap, Phi, Den, outletA, outletB); + } + // Halo exchange for phase field + ScaLBL_Comm_Regular->SendHalo(Phi); + + ScaLBL_D3Q19_AAodd_Color(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, + alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm_Regular->RecvHalo(Phi); + ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + // Set BCs + if (BoundaryCondition == 3){ + ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); + ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); + } + if (BoundaryCondition == 4){ + din = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fq, flux, timestep); + ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); + } + ScaLBL_D3Q19_AAodd_Color(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, + alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_DeviceBarrier(); + comm.barrier(); + + // *************EVEN TIMESTEP************* + timestep++; + // Compute the Phase indicator field + ScaLBL_Comm->BiSendD3Q7AA(Aq,Bq); //READ FROM NORMAL + ScaLBL_D3Q7_AAeven_PhaseField(dvcMap, Aq, Bq, Den, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm->BiRecvD3Q7AA(Aq,Bq); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + ScaLBL_D3Q7_AAeven_PhaseField(dvcMap, Aq, Bq, Den, Phi, 0, ScaLBL_Comm->LastExterior(), Np); + + // Perform the collision operation + ScaLBL_Comm->SendD3Q19AA(fq); //READ FORM NORMAL + // Halo exchange for phase field + if (BoundaryCondition > 0){ + ScaLBL_Comm->Color_BC_z(dvcMap, Phi, Den, inletA, inletB); + ScaLBL_Comm->Color_BC_Z(dvcMap, Phi, Den, outletA, outletB); + } + ScaLBL_Comm_Regular->SendHalo(Phi); + ScaLBL_D3Q19_AAeven_Color(dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, + alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ScaLBL_Comm_Regular->RecvHalo(Phi); + ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE + ScaLBL_DeviceBarrier(); + // Set boundary conditions + if (BoundaryCondition == 3){ + ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); + ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); + } + else if (BoundaryCondition == 4){ + din = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fq, flux, timestep); + ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); + } + ScaLBL_D3Q19_AAeven_Color(dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, + alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_DeviceBarrier(); + comm.barrier(); + //************************************************************************ + + PROFILE_STOP("Update"); + + if (rank==0 && timestep%analysis_interval == 0 && BoundaryCondition > 0){ + printf("%i %f \n",timestep,din); + } + // Run the analysis + analysis.basic(timestep, current_db, *Averages, Phi, Pressure, Velocity, fq, Den ); + + + // allow initial ramp-up to get closer to steady state + if (timestep > RAMP_TIMESTEPS && timestep%analysis_interval == 0 && USE_MORPH){ + analysis.finish(); + CURRENT_STEADY_TIMESTEPS += analysis_interval; + + double volB = Averages->gwb.V; + double volA = Averages->gnb.V; + volA /= Dm->Volume; + volB /= Dm->Volume;; + initial_volume = volA*Dm->Volume; + double vA_x = Averages->gnb.Px/Averages->gnb.M; + double vA_y = Averages->gnb.Py/Averages->gnb.M; + double vA_z = Averages->gnb.Pz/Averages->gnb.M; + double vB_x = Averages->gwb.Px/Averages->gwb.M; + double vB_y = Averages->gwb.Py/Averages->gwb.M; + double vB_z = Averages->gwb.Pz/Averages->gwb.M; + double muA = rhoA*(tauA-0.5)/3.f; + double muB = rhoB*(tauB-0.5)/3.f; + double force_mag = sqrt(Fx*Fx+Fy*Fy+Fz*Fz); + double dir_x = Fx/force_mag; + double dir_y = Fy/force_mag; + double dir_z = Fz/force_mag; + if (force_mag == 0.0){ + // default to z direction + dir_x = 0.0; + dir_y = 0.0; + dir_z = 1.0; + force_mag = 1.0; + } + double current_saturation = volB/(volA+volB); + double flow_rate_A = volA*(vA_x*dir_x + vA_y*dir_y + vA_z*dir_z); + double flow_rate_B = volB*(vB_x*dir_x + vB_y*dir_y + vB_z*dir_z); + double Ca = fabs(muA*flow_rate_A + muB*flow_rate_B)/(5.796*alpha); + + if (SET_CAPILLARY_NUMBER && CURRENT_STEADY_TIMESTEPS%MIN_STEADY_TIMESTEPS < analysis_interval ){ + Fx *= capillary_number / Ca; + Fy *= capillary_number / Ca; + Fz *= capillary_number / Ca; + if (force_mag > 1e-3){ + Fx *= 1e-3/force_mag; // impose ceiling for stability + Fy *= 1e-3/force_mag; + Fz *= 1e-3/force_mag; + } + if (rank == 0) printf(" -- adjust force by factor %f \n ",capillary_number / Ca); + Averages->SetParams(rhoA,rhoB,tauA,tauB,Fx,Fy,Fz,alpha,beta); + color_db->putVector("F",{Fx,Fy,Fz}); + } + + if ( morph_timesteps > morph_interval ){ + + bool isSteady = false; + if ( (fabs((Ca - Ca_previous)/Ca) < tolerance && CURRENT_STEADY_TIMESTEPS > MIN_STEADY_TIMESTEPS)) + isSteady = true; + if (CURRENT_STEADY_TIMESTEPS > MAX_STEADY_TIMESTEPS) + isSteady = true; + + if ( isSteady ){ + MORPH_ADAPT = true; + CURRENT_MORPH_TIMESTEPS=0; + //delta_volume_target = Dm->Volume*volA *morph_delta; // set target volume change + /** morphological target based on relative permeability for A **/ + double krA_TMP= fabs(muA*flow_rate_A / force_mag); + log_krA = log(krA_TMP); + log_krA_target = log(KRA_MORPH_FACTOR*(krA_TMP)); + slope_krA_volume = (log_krA - log_krA_prev)/(Dm->Volume*(volA - volA_prev)); + delta_volume_target=Dm->Volume*(volA+(log_krA_target - log_krA)/slope_krA_volume); + log_krA_prev = log_krA; + volA_prev = volA; + printf(" log(kr)=%f, volume=%f, TARGET log(kr)=%f, volume change=%f \n",log_krA, volA, log_krA_target, delta_volume_target/(volA*Dm->Volume)); + /** compute averages & write data **/ + Averages->Full(); + Averages->Write(timestep); + analysis.WriteVisData(timestep, current_db, *Averages, Phi, Pressure, Velocity, fq, Den ); + analysis.finish(); + + if (rank==0){ + printf("** WRITE STEADY POINT *** "); + printf("Ca = %f, (previous = %f) \n",Ca,Ca_previous); + double h = Dm->voxel_length; + // pressures + double pA = Averages->gnb.p; + double pB = Averages->gwb.p; + double pAc = Averages->gnc.p; + double pBc = Averages->gwc.p; + double pAB = (pA-pB)/(h*5.796*alpha); + double pAB_connected = (pAc-pBc)/(h*5.796*alpha); + // connected contribution + double Vol_nc = Averages->gnc.V/Dm->Volume; + double Vol_wc = Averages->gwc.V/Dm->Volume; + double Vol_nd = Averages->gnd.V/Dm->Volume; + double Vol_wd = Averages->gwd.V/Dm->Volume; + double Mass_n = Averages->gnc.M + Averages->gnd.M; + double Mass_w = Averages->gwc.M + Averages->gwd.M; + double vAc_x = Averages->gnc.Px/Mass_n; + double vAc_y = Averages->gnc.Py/Mass_n; + double vAc_z = Averages->gnc.Pz/Mass_n; + double vBc_x = Averages->gwc.Px/Mass_w; + double vBc_y = Averages->gwc.Py/Mass_w; + double vBc_z = Averages->gwc.Pz/Mass_w; + // disconnected contribution + double vAd_x = Averages->gnd.Px/Mass_n; + double vAd_y = Averages->gnd.Py/Mass_n; + double vAd_z = Averages->gnd.Pz/Mass_n; + double vBd_x = Averages->gwd.Px/Mass_w; + double vBd_y = Averages->gwd.Py/Mass_w; + double vBd_z = Averages->gwd.Pz/Mass_w; + + double flow_rate_A_connected = Vol_nc*(vAc_x*dir_x + vAc_y*dir_y + vAc_z*dir_z); + double flow_rate_B_connected = Vol_wc*(vBc_x*dir_x + vBc_y*dir_y + vBc_z*dir_z); + double flow_rate_A_disconnected = (Vol_nd)*(vAd_x*dir_x + vAd_y*dir_y + vAd_z*dir_z); + double flow_rate_B_disconnected = (Vol_wd)*(vBd_x*dir_x + vBd_y*dir_y + vBd_z*dir_z); + + double kAeff_connected = h*h*muA*flow_rate_A_connected/(force_mag); + double kBeff_connected = h*h*muB*flow_rate_B_connected/(force_mag); + + double kAeff_disconnected = h*h*muA*flow_rate_A_disconnected/(force_mag); + double kBeff_disconnected = h*h*muB*flow_rate_B_disconnected/(force_mag); + + double kAeff = h*h*muA*(flow_rate_A)/(force_mag); + double kBeff = h*h*muB*(flow_rate_B)/(force_mag); + + double viscous_pressure_drop = (rhoA*volA + rhoB*volB)*force_mag; + double Mobility = muA/muB; + + bool WriteHeader=false; + FILE * kr_log_file = fopen("relperm.csv","r"); + if (kr_log_file != NULL) + fclose(kr_log_file); + else + WriteHeader=true; + kr_log_file = fopen("relperm.csv","a"); + if (WriteHeader) + fprintf(kr_log_file,"timesteps sat.water eff.perm.oil eff.perm.water eff.perm.oil.connected eff.perm.water.connected eff.perm.oil.disconnected eff.perm.water.disconnected cap.pressure cap.pressure.connected pressure.drop Ca M\n"); + + fprintf(kr_log_file,"%i %.5g %.5g %.5g %.5g %.5g %.5g %.5g %.5g %.5g %.5g %.5g %.5g\n",CURRENT_STEADY_TIMESTEPS,current_saturation,kAeff,kBeff,kAeff_connected,kBeff_connected,kAeff_disconnected,kBeff_disconnected,pAB,pAB_connected,viscous_pressure_drop,Ca,Mobility); + fclose(kr_log_file); + + printf(" Measured capillary number %f \n ",Ca); + } + if (SET_CAPILLARY_NUMBER ){ + Fx *= capillary_number / Ca; + Fy *= capillary_number / Ca; + Fz *= capillary_number / Ca; + if (force_mag > 1e-3){ + Fx *= 1e-3/force_mag; // impose ceiling for stability + Fy *= 1e-3/force_mag; + Fz *= 1e-3/force_mag; + } + if (flow_rate_A < NOISE_THRESHOLD && USE_BUMP_RATE){ + if (rank==0) printf("Hit noise threshold (%f): bumping capillary number by %f X \n",NOISE_THRESHOLD,BUMP_RATE); + Fx *= BUMP_RATE; // impose bump condition + Fy *= BUMP_RATE; + Fz *= BUMP_RATE; + capillary_number *= BUMP_RATE; + color_db->putScalar("capillary_number",capillary_number); + current_db->putDatabase("Color", color_db); + MORPH_ADAPT = false; // re-run current point if below noise threshold + } + if (rank == 0) printf(" -- adjust force by factor %f \n ",capillary_number / Ca); + Averages->SetParams(rhoA,rhoB,tauA,tauB,Fx,Fy,Fz,alpha,beta); + color_db->putVector("F",{Fx,Fy,Fz}); + } + + CURRENT_STEADY_TIMESTEPS = 0; + } + else{ + if (rank==0){ + printf("** Continue to simulate steady *** \n "); + printf("Ca = %f, (previous = %f) \n",Ca,Ca_previous); + } + } + morph_timesteps=0; + Ca_previous = Ca; + } + + if (MORPH_ADAPT ){ + CURRENT_MORPH_TIMESTEPS += analysis_interval; + if (USE_DIRECT){ + // Use image sequence + IMAGE_INDEX++; + MORPH_ADAPT = false; + if (IMAGE_INDEX < IMAGE_COUNT){ + std::string next_image = ImageList[IMAGE_INDEX]; + if (rank==0) printf("***Loading next image in sequence (%i) ***\n",IMAGE_INDEX); + color_db->putScalar("image_index",IMAGE_INDEX); + ImageInit(next_image); + } + else{ + if (rank==0) printf("Finished simulating image sequence \n"); + timestep = timestepMax; + } + } + else if (USE_SEED){ + delta_volume = volA*Dm->Volume - initial_volume; + CURRENT_MORPH_TIMESTEPS += analysis_interval; + double massChange = SeedPhaseField(seed_water); + if (rank==0) printf("***Seed water in oil %f, volume change %f / %f ***\n", massChange, delta_volume, delta_volume_target); + } + else if (USE_MORPHOPEN_OIL){ + delta_volume = volA*Dm->Volume - initial_volume; + if (rank==0) printf("***Morphological opening of connected oil, target volume change %f ***\n", delta_volume_target); + MorphOpenConnected(delta_volume_target); + } + else { + if (rank==0) printf("***Shell aggregation, target volume change %f ***\n", delta_volume_target); + //double delta_volume_target = volB - (volA + volB)*TARGET_SATURATION; // change in volume to A + delta_volume += MorphInit(beta,delta_volume_target-delta_volume); + } + + if ( (delta_volume - delta_volume_target)/delta_volume_target > 0.0 ){ + MORPH_ADAPT = false; + CURRENT_STEADY_TIMESTEPS=0; + initial_volume = volA*Dm->Volume; + delta_volume = 0.0; + if (USE_DIRECT){ + //BoundaryCondition = 0; + //ScaLBL_Comm->BoundaryCondition = 0; + //ScaLBL_Comm_Regular->BoundaryCondition = 0; + //Fx = capillary_number*dir_x*force_mag / Ca; + //Fy = capillary_number*dir_y*force_mag / Ca; + //Fz = capillary_number*dir_z*force_mag / Ca; + } + } + else if (!(USE_DIRECT) && CURRENT_MORPH_TIMESTEPS > MAX_MORPH_TIMESTEPS) { + MORPH_ADAPT = false; + CURRENT_STEADY_TIMESTEPS=0; + initial_volume = volA*Dm->Volume; + delta_volume = 0.0; + } + if ( REVERSE_FLOW_DIRECTION ){ + //if (rank==0) printf("*****REVERSE FLOW DIRECTION***** \n"); + delta_volume = 0.0; + // flow direction will reverse after next steady point + MORPH_ADAPT = false; + CURRENT_STEADY_TIMESTEPS=0; + //morph_delta *= (-1.0); + REVERSE_FLOW_DIRECTION = false; + } + comm.barrier(); + } + morph_timesteps += analysis_interval; + } + } + analysis.finish(); + PROFILE_STOP("Loop"); + PROFILE_SAVE("lbpm_color_simulator",1); + //************************************************************************ + ScaLBL_DeviceBarrier(); + comm.barrier(); + stoptime = Utilities::MPI::time(); + if (rank==0) printf("-------------------------------------------------------------------\n"); + // Compute the walltime per timestep + cputime = (stoptime - starttime)/timestep; + // Performance obtained from each node + double MLUPS = double(Np)/cputime/1000000; + + if (rank==0) printf("********************************************************\n"); + if (rank==0) printf("CPU time = %f \n", cputime); + if (rank==0) printf("Lattice update rate (per core)= %f MLUPS \n", MLUPS); + MLUPS *= nprocs; + if (rank==0) printf("Lattice update rate (total)= %f MLUPS \n", MLUPS); + if (rank==0) printf("********************************************************\n"); + + // ************************************************************************ +} + +double ScaLBL_ColorModel::ImageInit(std::string Filename){ + + if (rank==0) printf("Re-initializing fluids from file: %s \n", Filename.c_str()); + Mask->Decomp(Filename); + for (int i=0; iid[i]; // save what was read + for (int i=0; iid[i] = Mask->id[i]; // save what was read + + double *PhaseLabel; + PhaseLabel = new double[Nx*Ny*Nz]; + AssignComponentLabels(PhaseLabel); + + double Count = 0.0; + double PoreCount = 0.0; + for (int k=1; kComm.sumReduce( Count ); + PoreCount = Dm->Comm.sumReduce( PoreCount ); + + if (rank==0) printf(" new saturation: %f (%f / %f) \n", Count / PoreCount, Count, PoreCount); + ScaLBL_CopyToDevice(Phi, PhaseLabel, Nx*Ny*Nz*sizeof(double)); + comm.barrier(); + + ScaLBL_D3Q19_Init(fq, Np); + ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + comm.barrier(); + + ScaLBL_CopyToHost(Averages->Phi.data(),Phi,Nx*Ny*Nz*sizeof(double)); + + double saturation = Count/PoreCount; + return saturation; + +} + +double ScaLBL_ColorModel::MorphOpenConnected(double target_volume_change){ + + int nx = Nx; + int ny = Ny; + int nz = Nz; + int n; + int N = nx*ny*nz; + double volume_change=0.0; + + if (target_volume_change < 0.0){ + Array id_solid(nx,ny,nz); + Array phase_label(nx,ny,nz); + DoubleArray distance(Nx,Ny,Nz); + DoubleArray phase(nx,ny,nz); + signed char *id_connected; + id_connected = new signed char [nx*ny*nz]; + + ScaLBL_CopyToHost(phase.data(), Phi, N*sizeof(double)); + + // Extract only the connected part of NWP + BlobIDstruct new_index; + double vF=0.0; double vS=0.0; + ComputeGlobalBlobIDs(nx-2,ny-2,nz-2,Dm->rank_info,phase,Averages->SDs,vF,vS,phase_label,Dm->Comm); + Dm->Comm.barrier(); + + long long count_connected=0; + long long count_porespace=0; + long long count_water=0; + for (int k=1; k 0){ + count_porespace++; + } + if (id[n] == 2){ + count_water++; + } + } + } + } + count_connected = Dm->Comm.sumReduce( count_connected); + count_porespace = Dm->Comm.sumReduce( count_porespace); + count_water = Dm->Comm.sumReduce( count_water); + + for (int k=0; kSDs(i,j,k) > 0.f){ + if (d < 3.f){ + phase(i,j,k) = (2.f*(exp(-2.f*beta*d))/(1.f+exp(-2.f*beta*d))-1.f); + } + } + } + } + } + + int count_morphopen=0.0; + for (int k=1; kComm.sumReduce( count_morphopen); + volume_change = double(count_morphopen - count_connected); + + if (rank==0) printf(" opening of connected oil %f \n",volume_change/count_connected); + + ScaLBL_CopyToDevice(Phi,phase.data(),N*sizeof(double)); + ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,0); + ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,1); + ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,2); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-1); + ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-2); + ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-3); + } + } + } + return(volume_change); +} + +double ScaLBL_ColorModel::SeedPhaseField(const double seed_water_in_oil){ + srand(time(NULL)); + double mass_loss =0.f; + double count =0.f; + double *Aq_tmp, *Bq_tmp; + double *Vel_tmp; + + Aq_tmp = new double [7*Np]; + Bq_tmp = new double [7*Np]; + Vel_tmp = new double [3*Np]; + + ScaLBL_CopyToHost(Aq_tmp, Aq, 7*Np*sizeof(double)); + ScaLBL_CopyToHost(Bq_tmp, Bq, 7*Np*sizeof(double)); + ScaLBL_CopyToHost(Vel_tmp, Velocity, 7*Np*sizeof(double)); + + //Extract averged velocity + double vx_glb = (Averages->gnb.Px+Averages->gwb.Px)/(Averages->gnb.M+Averages->gwb.M); + double vy_glb = (Averages->gnb.Py+Averages->gwb.Py)/(Averages->gnb.M+Averages->gwb.M); + double vz_glb = (Averages->gnb.Pz+Averages->gwb.Pz)/(Averages->gnb.M+Averages->gwb.M); + double v_mag_glb = sqrt(vx_glb*vx_glb+vy_glb*vy_glb+vz_glb*vz_glb); + + for (int n=0; n < ScaLBL_Comm->LastExterior(); n++){ + double v_mag_local = sqrt(Vel_tmp[n]*Vel_tmp[n]+Vel_tmp[n+1*Np]*Vel_tmp[n+1*Np]+Vel_tmp[n+2*Np]*Vel_tmp[n+2*Np]); + double weight = (v_mag_local 0.0){ + Aq_tmp[n] -= 0.3333333333333333*random_value; + Aq_tmp[n+Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+2*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+3*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+4*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+5*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+6*Np] -= 0.1111111111111111*random_value; + + Bq_tmp[n] += 0.3333333333333333*random_value; + Bq_tmp[n+Np] += 0.1111111111111111*random_value; + Bq_tmp[n+2*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+3*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+4*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+5*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+6*Np] += 0.1111111111111111*random_value; + } + mass_loss += random_value*seed_water_in_oil; + } + + for (int n=ScaLBL_Comm->FirstInterior(); n < ScaLBL_Comm->LastInterior(); n++){ + double v_mag_local = sqrt(Vel_tmp[n]*Vel_tmp[n]+Vel_tmp[n+1*Np]*Vel_tmp[n+1*Np]+Vel_tmp[n+2*Np]*Vel_tmp[n+2*Np]); + double weight = (v_mag_local 0.0){ + Aq_tmp[n] -= 0.3333333333333333*random_value; + Aq_tmp[n+Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+2*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+3*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+4*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+5*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+6*Np] -= 0.1111111111111111*random_value; + + Bq_tmp[n] += 0.3333333333333333*random_value; + Bq_tmp[n+Np] += 0.1111111111111111*random_value; + Bq_tmp[n+2*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+3*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+4*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+5*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+6*Np] += 0.1111111111111111*random_value; + } + mass_loss += random_value*seed_water_in_oil; + } + + count = Dm->Comm.sumReduce( count ); + mass_loss = Dm->Comm.sumReduce( mass_loss ); + if (rank == 0) printf("Remove mass %f from %f voxels \n",mass_loss,count); + + // Need to initialize Aq, Bq, Den, Phi directly + //ScaLBL_CopyToDevice(Phi,phase.data(),7*Np*sizeof(double)); + ScaLBL_CopyToDevice(Aq, Aq_tmp, 7*Np*sizeof(double)); + ScaLBL_CopyToDevice(Bq, Bq_tmp, 7*Np*sizeof(double)); + + return(mass_loss); +} + +//double ScaLBL_ColorModel::SeedPhaseField(const double seed_water_in_oil){ +// srand(time(NULL)); +// double mass_loss =0.f; +// double count =0.f; +// double *Aq_tmp, *Bq_tmp; +// +// Aq_tmp = new double [7*Np]; +// Bq_tmp = new double [7*Np]; +// +// ScaLBL_CopyToHost(Aq_tmp, Aq, 7*Np*sizeof(double)); +// ScaLBL_CopyToHost(Bq_tmp, Bq, 7*Np*sizeof(double)); +// +///* for (int k=1; kSDs(i,j,k) < 0.f){ +// // skip +// } +// else if (phase(i,j,k) > 0.f ){ +// phase(i,j,k) -= random_value*seed_water_in_oil; +// mass_loss += random_value*seed_water_in_oil; +// count++; +// } +// else { +// +// } +// } +// } +// } +// */ +// for (int n=0; n < ScaLBL_Comm->LastExterior(); n++){ +// double random_value = seed_water_in_oil*double(rand())/ RAND_MAX; +// double dA = Aq_tmp[n] + Aq_tmp[n+Np] + Aq_tmp[n+2*Np] + Aq_tmp[n+3*Np] + Aq_tmp[n+4*Np] + Aq_tmp[n+5*Np] + Aq_tmp[n+6*Np]; +// double dB = Bq_tmp[n] + Bq_tmp[n+Np] + Bq_tmp[n+2*Np] + Bq_tmp[n+3*Np] + Bq_tmp[n+4*Np] + Bq_tmp[n+5*Np] + Bq_tmp[n+6*Np]; +// double phase_id = (dA - dB) / (dA + dB); +// if (phase_id > 0.0){ +// Aq_tmp[n] -= 0.3333333333333333*random_value; +// Aq_tmp[n+Np] -= 0.1111111111111111*random_value; +// Aq_tmp[n+2*Np] -= 0.1111111111111111*random_value; +// Aq_tmp[n+3*Np] -= 0.1111111111111111*random_value; +// Aq_tmp[n+4*Np] -= 0.1111111111111111*random_value; +// Aq_tmp[n+5*Np] -= 0.1111111111111111*random_value; +// Aq_tmp[n+6*Np] -= 0.1111111111111111*random_value; +// +// Bq_tmp[n] += 0.3333333333333333*random_value; +// Bq_tmp[n+Np] += 0.1111111111111111*random_value; +// Bq_tmp[n+2*Np] += 0.1111111111111111*random_value; +// Bq_tmp[n+3*Np] += 0.1111111111111111*random_value; +// Bq_tmp[n+4*Np] += 0.1111111111111111*random_value; +// Bq_tmp[n+5*Np] += 0.1111111111111111*random_value; +// Bq_tmp[n+6*Np] += 0.1111111111111111*random_value; +// } +// mass_loss += random_value*seed_water_in_oil; +// } +// +// for (int n=ScaLBL_Comm->FirstInterior(); n < ScaLBL_Comm->LastInterior(); n++){ +// double random_value = seed_water_in_oil*double(rand())/ RAND_MAX; +// double dA = Aq_tmp[n] + Aq_tmp[n+Np] + Aq_tmp[n+2*Np] + Aq_tmp[n+3*Np] + Aq_tmp[n+4*Np] + Aq_tmp[n+5*Np] + Aq_tmp[n+6*Np]; +// double dB = Bq_tmp[n] + Bq_tmp[n+Np] + Bq_tmp[n+2*Np] + Bq_tmp[n+3*Np] + Bq_tmp[n+4*Np] + Bq_tmp[n+5*Np] + Bq_tmp[n+6*Np]; +// double phase_id = (dA - dB) / (dA + dB); +// if (phase_id > 0.0){ +// Aq_tmp[n] -= 0.3333333333333333*random_value; +// Aq_tmp[n+Np] -= 0.1111111111111111*random_value; +// Aq_tmp[n+2*Np] -= 0.1111111111111111*random_value; +// Aq_tmp[n+3*Np] -= 0.1111111111111111*random_value; +// Aq_tmp[n+4*Np] -= 0.1111111111111111*random_value; +// Aq_tmp[n+5*Np] -= 0.1111111111111111*random_value; +// Aq_tmp[n+6*Np] -= 0.1111111111111111*random_value; +// +// Bq_tmp[n] += 0.3333333333333333*random_value; +// Bq_tmp[n+Np] += 0.1111111111111111*random_value; +// Bq_tmp[n+2*Np] += 0.1111111111111111*random_value; +// Bq_tmp[n+3*Np] += 0.1111111111111111*random_value; +// Bq_tmp[n+4*Np] += 0.1111111111111111*random_value; +// Bq_tmp[n+5*Np] += 0.1111111111111111*random_value; +// Bq_tmp[n+6*Np] += 0.1111111111111111*random_value; +// } +// mass_loss += random_value*seed_water_in_oil; +// } +// +// count = Dm->Comm.sumReduce( count ); +// mass_loss = Dm->Comm.sumReduce( mass_loss ); +// if (rank == 0) printf("Remove mass %f from %f voxels \n",mass_loss,count); +// +// // Need to initialize Aq, Bq, Den, Phi directly +// //ScaLBL_CopyToDevice(Phi,phase.data(),7*Np*sizeof(double)); +// ScaLBL_CopyToDevice(Aq, Aq_tmp, 7*Np*sizeof(double)); +// ScaLBL_CopyToDevice(Bq, Bq_tmp, 7*Np*sizeof(double)); +// +// return(mass_loss); +//} + +double ScaLBL_ColorModel::MorphInit(const double beta, const double target_delta_volume){ + const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); + + double vF = 0.f; + double vS = 0.f; + double delta_volume; + + DoubleArray phase(Nx,Ny,Nz); + IntArray phase_label(Nx,Ny,Nz);; + DoubleArray phase_distance(Nx,Ny,Nz); + Array phase_id(Nx,Ny,Nz); + fillHalo fillDouble(Dm->Comm,Dm->rank_info,{Nx-2,Ny-2,Nz-2},{1,1,1},0,1); + + + // Basic algorithm to + // 1. Copy phase field to CPU + ScaLBL_CopyToHost(phase.data(), Phi, N*sizeof(double)); + + double count = 0.f; + for (int k=1; k 0.f && Averages->SDs(i,j,k) > 0.f) count+=1.f; + } + } + } + double volume_initial = Dm->Comm.sumReduce( count); + /* + sprintf(LocalRankFilename,"phi_initial.%05i.raw",rank); + FILE *INPUT = fopen(LocalRankFilename,"wb"); + fwrite(phase.data(),8,N,INPUT); + fclose(INPUT); + */ + // 2. Identify connected components of phase field -> phase_label + BlobIDstruct new_index; + ComputeGlobalBlobIDs(Nx-2,Ny-2,Nz-2,rank_info,phase,Averages->SDs,vF,vS,phase_label,comm); + comm.barrier(); + + // only operate on component "0" + count = 0.0; + double second_biggest = 0.0; + + for (int k=0; kComm.sumReduce( count ); + second_biggest = Dm->Comm.sumReduce( second_biggest ); + + /*int reach_x, reach_y, reach_z; + for (int k=0; k phase_distance + CalcDist(phase_distance,phase_id,*Dm); + + double temp,value; + double factor=0.5/beta; + for (int k=0; k 1.f) value=1.f; + if (value < -1.f) value=-1.f; + // temp -- distance based on analytical form McClure, Prins et al, Comp. Phys. Comm. + temp = -factor*log((1.0+value)/(1.0-value)); + /// use this approximation close to the object + if (fabs(value) < 0.8 && Averages->SDs(i,j,k) > 1.f ){ + phase_distance(i,j,k) = temp; + } + // erase the original object + phase(i,j,k) = -1.0; + } + } + } + } + + if (volume_connected - second_biggest < 2.0*fabs(target_delta_volume) && target_delta_volume < 0.0){ + // if connected volume is less than 2% just delete the whole thing + if (rank==0) printf("Connected region has shrunk! \n"); + REVERSE_FLOW_DIRECTION = true; + } +/* else{*/ + if (rank==0) printf("Pathway volume / next largest ganglion %f \n",volume_connected/second_biggest ); + if (rank==0) printf("MorphGrow with target volume fraction change %f \n", target_delta_volume/volume_initial); + double target_delta_volume_incremental = target_delta_volume; + if (fabs(target_delta_volume) > 0.01*volume_initial) + target_delta_volume_incremental = 0.01*volume_initial*target_delta_volume/fabs(target_delta_volume); + delta_volume = MorphGrow(Averages->SDs,phase_distance,phase_id,Averages->Dm, target_delta_volume_incremental); + + for (int k=0; kSDs(i,j,k) > 0.f){ + if (d < 3.f){ + //phase(i,j,k) = -1.0; + phase(i,j,k) = (2.f*(exp(-2.f*beta*d))/(1.f+exp(-2.f*beta*d))-1.f); + } + } + } + } + } + fillDouble.fill(phase); + //} + + count = 0.f; + for (int k=1; k 0.f && Averages->SDs(i,j,k) > 0.f){ + count+=1.f; + } + } + } + } + double volume_final = Dm->Comm.sumReduce( count ); + + delta_volume = (volume_final-volume_initial); + if (rank == 0) printf("MorphInit: change fluid volume fraction by %f \n", delta_volume/volume_initial); + if (rank == 0) printf(" new saturation = %f \n", volume_final/(0.238323*double((Nx-2)*(Ny-2)*(Nz-2)*nprocs))); + + // 6. copy back to the device + //if (rank==0) printf("MorphInit: copy data back to device\n"); + ScaLBL_CopyToDevice(Phi,phase.data(),N*sizeof(double)); + /* + sprintf(LocalRankFilename,"dist_final.%05i.raw",rank); + FILE *DIST = fopen(LocalRankFilename,"wb"); + fwrite(phase_distance.data(),8,N,DIST); + fclose(DIST); + + sprintf(LocalRankFilename,"phi_final.%05i.raw",rank); + FILE *PHI = fopen(LocalRankFilename,"wb"); + fwrite(phase.data(),8,N,PHI); + fclose(PHI); + */ + // 7. Re-initialize phase field and density + ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + if (BoundaryCondition >0 ){ + if (Dm->kproc()==0){ + ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,0); + ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,1); + ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,2); + } + if (Dm->kproc() == nprocz-1){ + ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-1); + ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-2); + ScaLBL_SetSlice_z(Phi,-1.0,Nx,Ny,Nz,Nz-3); + } + } + return delta_volume; +} + +void ScaLBL_ColorModel::WriteDebug(){ + // Copy back final phase indicator field and convert to regular layout + DoubleArray PhaseField(Nx,Ny,Nz); + //ScaLBL_Comm->RegularLayout(Map,Phi,PhaseField); + ScaLBL_CopyToHost(PhaseField.data(), Phi, sizeof(double)*N); + + FILE *OUTFILE; + sprintf(LocalRankFilename,"Phase.%05i.raw",rank); + OUTFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,OUTFILE); + fclose(OUTFILE); + + ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); + FILE *AFILE; + sprintf(LocalRankFilename,"A.%05i.raw",rank); + AFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,AFILE); + fclose(AFILE); + + ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); + FILE *BFILE; + sprintf(LocalRankFilename,"B.%05i.raw",rank); + BFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,BFILE); + fclose(BFILE); + + ScaLBL_Comm->RegularLayout(Map,Pressure,PhaseField); + FILE *PFILE; + sprintf(LocalRankFilename,"Pressure.%05i.raw",rank); + PFILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,PFILE); + fclose(PFILE); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[0],PhaseField); + FILE *VELX_FILE; + sprintf(LocalRankFilename,"Velocity_X.%05i.raw",rank); + VELX_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,VELX_FILE); + fclose(VELX_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],PhaseField); + FILE *VELY_FILE; + sprintf(LocalRankFilename,"Velocity_Y.%05i.raw",rank); + VELY_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,VELY_FILE); + fclose(VELY_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],PhaseField); + FILE *VELZ_FILE; + sprintf(LocalRankFilename,"Velocity_Z.%05i.raw",rank); + VELZ_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,VELZ_FILE); + fclose(VELZ_FILE); + +// ScaLBL_Comm->RegularLayout(Map,&ColorGrad[0],PhaseField); +// FILE *CGX_FILE; +// sprintf(LocalRankFilename,"Gradient_X.%05i.raw",rank); +// CGX_FILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,CGX_FILE); +// fclose(CGX_FILE); +// +// ScaLBL_Comm->RegularLayout(Map,&ColorGrad[Np],PhaseField); +// FILE *CGY_FILE; +// sprintf(LocalRankFilename,"Gradient_Y.%05i.raw",rank); +// CGY_FILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,CGY_FILE); +// fclose(CGY_FILE); +// +// ScaLBL_Comm->RegularLayout(Map,&ColorGrad[2*Np],PhaseField); +// FILE *CGZ_FILE; +// sprintf(LocalRankFilename,"Gradient_Z.%05i.raw",rank); +// CGZ_FILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,CGZ_FILE); +// fclose(CGZ_FILE); + +} diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h new file mode 100644 index 00000000..c52f04c3 --- /dev/null +++ b/models/GreyscaleColorModel.h @@ -0,0 +1,88 @@ +/* +Implementation of color lattice boltzmann model + */ +#include +#include +#include +#include +#include +#include +#include + +#include "common/Communication.h" +#include "analysis/TwoPhase.h" +#include "analysis/runAnalysis.h" +#include "common/MPI.h" +#include "ProfilerApp.h" +#include "threadpool/thread_pool.h" + +class ScaLBL_ColorModel{ +public: + ScaLBL_ColorModel(int RANK, int NP, const Utilities::MPI& COMM); + ~ScaLBL_ColorModel(); + + // functions in they should be run + void ReadParams(string filename); + void ReadParams(std::shared_ptr db0); + void SetDomain(); + void ReadInput(); + void Create(); + void Initialize(); + void Run(); + void WriteDebug(); + + bool Restart,pBC; + bool REVERSE_FLOW_DIRECTION; + int timestep,timestepMax; + int BoundaryCondition; + double tauA,tauB,rhoA,rhoB,alpha,beta; + double Fx,Fy,Fz,flux; + double din,dout,inletA,inletB,outletA,outletB; + + int Nx,Ny,Nz,N,Np; + int rank,nprocx,nprocy,nprocz,nprocs; + double Lx,Ly,Lz; + + std::shared_ptr Dm; // this domain is for analysis + std::shared_ptr Mask; // this domain is for lbm + std::shared_ptr ScaLBL_Comm; + std::shared_ptr ScaLBL_Comm_Regular; + //std::shared_ptr Averages; + std::shared_ptr Averages; + + // input database + std::shared_ptr db; + std::shared_ptr domain_db; + std::shared_ptr color_db; + std::shared_ptr analysis_db; + std::shared_ptr vis_db; + + IntArray Map; + signed char *id; + int *NeighborList; + int *dvcMap; + double *fq, *Aq, *Bq; + double *Den, *Phi; + double *ColorGrad; + double *Velocity; + double *Pressure; + +private: + Utilities::MPI comm; + + int dist_mem_size; + int neighborSize; + // filenames + char LocalRankString[8]; + char LocalRankFilename[40]; + char LocalRestartFile[40]; + + //int rank,nprocs; + void LoadParams(std::shared_ptr db0); + void AssignComponentLabels(double *phase); + double ImageInit(std::string filename); + double MorphInit(const double beta, const double morph_delta); + double SeedPhaseField(const double seed_water_in_oil); + double MorphOpenConnected(double target_volume_change); +}; + From 2621a7718f93e1f6211497ba5b919ee05f78a782 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Mon, 15 Jun 2020 22:41:01 -0400 Subject: [PATCH 42/75] Greyscale Color model; both CPU and GPU versions are ready --- common/ScaLBL.cpp | 4 +- common/ScaLBL.h | 20 +- cpu/Greyscale.cpp | 2 +- cpu/GreyscaleColor.cpp | 1366 +++++++++ cpu/GreyscaleFE.cpp | 3113 +++++++++++++++++++ cpu/GreyscaleSC.cpp | 3625 +++++++++++++++++++++++ gpu/GreyscaleColor.cu | 1429 +++++++++ gpu/GreyscaleSC.cu | 12 +- models/GreyscaleColorModel.cpp | 663 ++++- models/GreyscaleColorModel.h | 20 +- tests/CMakeLists.txt | 1 + tests/lbpm_greyscaleColor_simulator.cpp | 58 + 12 files changed, 10152 insertions(+), 161 deletions(-) create mode 100644 cpu/GreyscaleColor.cpp create mode 100644 cpu/GreyscaleFE.cpp create mode 100644 cpu/GreyscaleSC.cpp create mode 100644 gpu/GreyscaleColor.cu create mode 100644 tests/lbpm_greyscaleColor_simulator.cpp diff --git a/common/ScaLBL.cpp b/common/ScaLBL.cpp index c8feffbe..8aee6f33 100644 --- a/common/ScaLBL.cpp +++ b/common/ScaLBL.cpp @@ -2079,7 +2079,7 @@ void ScaLBL_Communicator::GreyscaleSC_BC_z(int *Map, double *DenA, double *DenB, { if (kproc == 0) { // Set the density field on the z inlet - ScaLBL_GreyscaleSC_BC_z(dvcSendList_z, Map, DenA, DenB, vA, vB, sendCount_z, N); + ScaLBL_GreyscaleSC_BC_z(dvcSendList_z, Map, DenA, DenB, vA, vB, sendCount_z); } } @@ -2087,7 +2087,7 @@ void ScaLBL_Communicator::GreyscaleSC_BC_Z(int *Map, double *DenA, double *DenB, { if (kproc == nprocz-1){ // Set the density field on the Z outlet - ScaLBL_GreyscaleSC_BC_Z(dvcSendList_Z, Map, DenA, DenB, vA, vB, sendCount_Z, N); + ScaLBL_GreyscaleSC_BC_Z(dvcSendList_Z, Map, DenA, DenB, vA, vB, sendCount_Z); } } diff --git a/common/ScaLBL.h b/common/ScaLBL.h index 0f31224b..a74c54a2 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -146,9 +146,9 @@ extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(int *Map, double *distA, dou 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); -extern "C" void ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np); +extern "C" void ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count); -extern "C" void ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np); +extern "C" void ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count); extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z(int *list, double *distA, double *distB, double dinA, double dinB, int count, int N); @@ -158,6 +158,19 @@ extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z(int *neighborList, int *l extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z(int *neighborList, int *list, double *distA, double *distB, double doutA, double doutB, int count, int N); +// GREYSCALE COLOR MODEL (Two-component) +//extern "C" void ScaLBL_D3Q19_GreyscaleColor_Init(double *dist, double *Porosity, int Np); + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, + double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, + double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, + double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np); + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *d_neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, + double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, + double rhoA, double rhoB, double tauA, double tauB, double tauA_eff,double tauB_eff, double alpha, double beta, + double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np); + // MRT MODEL extern "C" void ScaLBL_D3Q19_AAeven_MRT(double *dist, int start, int finish, int Np, double rlx_setA, double rlx_setB, double Fx, double Fy, double Fz); @@ -224,9 +237,6 @@ extern "C" void ScaLBL_Color_BC_Z(int *list, int *Map, double *Phi, double *Den, extern "C" void ScaLBL_SetSlice_z(double *Phi, double value, int Nx, int Ny, int Nz, int Slice); -extern "C" void ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np); - -extern "C" void ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np); class ScaLBL_Communicator{ diff --git a/cpu/Greyscale.cpp b/cpu/Greyscale.cpp index 8fa54275..affe6c2b 100644 --- a/cpu/Greyscale.cpp +++ b/cpu/Greyscale.cpp @@ -1436,7 +1436,7 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double *dis //-------------------- IMRT collison where body force has NO higher-order terms -------------// //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*Den+19*Den(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m1 = m1 + rlx_setA*((-30*Den+19*Den*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); m2 = m2 + rlx_setA*((12*Den - 5.5*Den*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); jx = jx + Fx; m4 = m4 + rlx_setB*((-0.6666666666666666*ux*Den) - m4) diff --git a/cpu/GreyscaleColor.cpp b/cpu/GreyscaleColor.cpp new file mode 100644 index 00000000..48f84e09 --- /dev/null +++ b/cpu/GreyscaleColor.cpp @@ -0,0 +1,1366 @@ +#include + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, + double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Velocity, + double rhoA, double rhoB, double tauA, double tauB, double tauA_eff,double tauB_eff, double alpha, double beta, + double Gx, double Gy, double Gz, int strideY, int strideZ, int start, int finish, int Np){ + + int n,nn,ijk,nread; + int nr1,nr2,nr3,nr4,nr5,nr6; + int nr7,nr8,nr9,nr10; + int nr11,nr12,nr13,nr14; + //int nr15,nr16,nr17,nr18; + double fq; + // conserved momemnts + double rho,jx,jy,jz; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double m3,m5,m7; + double nA,nB; // number density + double a1,b1,a2,b2,nAB,delta; + double C,nx,ny,nz; //color gradient magnitude and direction + double phi,tau,rho0,rlx_setA,rlx_setB; + + double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double tau_eff; + double mu_eff;//kinematic viscosity + double nx_gs,ny_gs,nz_gs;//grey-solid color gradient + double Fx,Fy,Fz; + + 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; + + for (n=start; n even part of dist) + //fq = dist[nread]; // reading the f2 data into register fq + nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nr2]; // reading the f2 data into register fq + rho += fq; + m1 -= 11.0*(fq); + m2 -= 4.0*(fq); + jx -= fq; + m4 += 4.0*(fq); + m9 += 2.0*(fq); + m10 -= 4.0*(fq); + + // q=3 + //nread = neighborList[n+2*Np]; // neighbor 4 + //fq = dist[nread]; + nr3 = neighborList[n+2*Np]; // neighbor 4 + fq = dist[nr3]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy = fq; + m6 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 = fq; + m12 = -2.0*fq; + + // q = 4 + //nread = neighborList[n+3*Np]; // neighbor 3 + //fq = dist[nread]; + nr4 = neighborList[n+3*Np]; // neighbor 3 + fq = dist[nr4]; + rho+= fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy -= fq; + m6 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 += fq; + m12 -= 2.0*fq; + + // q=5 + //nread = neighborList[n+4*Np]; + //fq = dist[nread]; + nr5 = neighborList[n+4*Np]; + fq = dist[nr5]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz = fq; + m8 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + + // q = 6 + //nread = neighborList[n+5*Np]; + //fq = dist[nread]; + nr6 = neighborList[n+5*Np]; + fq = dist[nr6]; + rho+= fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz -= fq; + m8 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q=7 + //nread = neighborList[n+6*Np]; + //fq = dist[nread]; + nr7 = neighborList[n+6*Np]; + fq = dist[nr7]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 = fq; + m16 = fq; + m17 = -fq; + + // q = 8 + //nread = neighborList[n+7*Np]; + //fq = dist[nread]; + nr8 = neighborList[n+7*Np]; + fq = dist[nr8]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 += fq; + m16 -= fq; + m17 += fq; + + // q=9 + //nread = neighborList[n+8*Np]; + //fq = dist[nread]; + nr9 = neighborList[n+8*Np]; + fq = dist[nr9]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 += fq; + m17 += fq; + + // q = 10 + //nread = neighborList[n+9*Np]; + //fq = dist[nread]; + nr10 = neighborList[n+9*Np]; + fq = dist[nr10]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 -= fq; + m17 -= fq; + + // q=11 + //nread = neighborList[n+10*Np]; + //fq = dist[nread]; + nr11 = neighborList[n+10*Np]; + fq = dist[nr11]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 = fq; + m16 -= fq; + m18 = fq; + + // q=12 + //nread = neighborList[n+11*Np]; + //fq = dist[nread]; + nr12 = neighborList[n+11*Np]; + fq = dist[nr12]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 += fq; + m16 += fq; + m18 -= fq; + + // q=13 + //nread = neighborList[n+12*Np]; + //fq = dist[nread]; + nr13 = neighborList[n+12*Np]; + fq = dist[nr13]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 -= fq; + m18 -= fq; + + // q=14 + //nread = neighborList[n+13*Np]; + //fq = dist[nread]; + nr14 = neighborList[n+13*Np]; + fq = dist[nr14]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 += fq; + m18 += fq; + + // q=15 + nread = neighborList[n+14*Np]; + fq = dist[nread]; + //fq = dist[17*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 = fq; + m17 += fq; + m18 -= fq; + + // q=16 + nread = neighborList[n+15*Np]; + fq = dist[nread]; + //fq = dist[8*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 += fq; + m17 -= fq; + m18 += fq; + + // q=17 + //fq = dist[18*Np+n]; + nread = neighborList[n+16*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 += fq; + m18 += fq; + + // q=18 + nread = neighborList[n+17*Np]; + fq = dist[nread]; + //fq = dist[9*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 -= fq; + m18 -= fq; + + // Compute greyscale related parameters + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*(porosity*Gx); + vy = jy/rho0+0.5*(porosity*Gy); + vz = jz/rho0+0.5*(porosity*Gz); + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz); + if (porosity==1.0){ + Fx=rho0*(Gx); + Fy=rho0*(Gy); + Fz=rho0*(Gz); + } + + // write the velocity + Velocity[n] = ux; + Velocity[Np+n] = uy; + Velocity[2*Np+n] = uz; + + //........................................................................ + //..............carry out relaxation process.............................. + //..........Toelke, Fruediger et. al. 2006................................ + if (C == 0.0) nx = ny = nz = 0.0; + m1 = m1 + rlx_setA*((19*(ux*ux+uy*uy+uz*uz)*rho0/porosity - 11*rho) -19*alpha*C - m1); + m2 = m2 + rlx_setA*((3*rho - 5.5*(ux*ux+uy*uy+uz*uz)*rho0/porosity)- m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0)- m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0)- m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0)- m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*(((2*ux*ux-uy*uy-uz*uz)*rho0/porosity) + 0.5*alpha*C*(2*nx*nx-ny*ny-nz*nz) - m9); + m10 = m10 + rlx_setA*( - m10); + //m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + rlx_setA*(((uy*uy-uz*uz)*rho0/porosity) + 0.5*alpha*C*(ny*ny-nz*nz)- m11); + m12 = m12 + rlx_setA*( - m12); + //m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_setA*( (ux*uy*rho0/porosity) + 0.5*alpha*C*nx*ny - m13); + m14 = m14 + rlx_setA*( (uy*uz*rho0/porosity) + 0.5*alpha*C*ny*nz - m14); + m15 = m15 + rlx_setA*( (ux*uz*rho0/porosity) + 0.5*alpha*C*nx*nz - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + //nread = neighborList[n+Np]; + dist[nr2] = fq; + + // q=2 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + //nread = neighborList[n]; + dist[nr1] = fq; + + // q = 3 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+3*Np]; + dist[nr4] = fq; + + // q = 4 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+2*Np]; + dist[nr3] = fq; + + // q = 5 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+5*Np]; + dist[nr6] = fq; + + // q = 6 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+4*Np]; + dist[nr5] = fq; + + // q = 7 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+ + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + //nread = neighborList[n+7*Np]; + dist[nr8] = fq; + + // q = 8 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 + +mrt_V12*m12+0.25*m13+0.125*(m17-m16); + //nread = neighborList[n+6*Np]; + dist[nr7] = fq; + + // q = 9 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+ + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + //nread = neighborList[n+9*Np]; + dist[nr10] = fq; + + // q = 10 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+ + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + //nread = neighborList[n+8*Np]; + dist[nr9] = fq; + + // q = 11 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) + +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 + -mrt_V12*m12+0.25*m15+0.125*(m18-m16); + //nread = neighborList[n+11*Np]; + dist[nr12] = fq; + + // q = 12 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ + mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + //nread = neighborList[n+10*Np]; + dist[nr11]= fq; + + // q = 13 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) + +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 + -mrt_V12*m12-0.25*m15-0.125*(m16+m18); + //nread = neighborList[n+13*Np]; + dist[nr14] = fq; + + // q= 14 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) + +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 + -mrt_V12*m12-0.25*m15+0.125*(m16+m18); + //nread = neighborList[n+12*Np]; + dist[nr13] = fq; + + + // q = 15 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + nread = neighborList[n+15*Np]; + dist[nread] = fq; + + // q = 16 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + nread = neighborList[n+14*Np]; + dist[nread] = fq; + + + // q = 17 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) + -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + nread = neighborList[n+17*Np]; + dist[nread] = fq; + + // q = 18 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) + -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + nread = neighborList[n+16*Np]; + dist[nread] = fq; + //........................................................................ + + // Instantiate mass transport distributions + // Stationary value - distribution 0 + nAB = 1.0/(nA+nB); + Aq[n] = 0.3333333333333333*nA; + Bq[n] = 0.3333333333333333*nB; + + //............................................... + // q = 0,2,4 + // Cq = {1,0,0}, {0,1,0}, {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nx; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; + + // q = 1 + //nread = neighborList[n+Np]; + Aq[nr2] = a1; + Bq[nr2] = b1; + // q=2 + //nread = neighborList[n]; + Aq[nr1] = a2; + Bq[nr1] = b2; + + //............................................... + // Cq = {0,1,0} + delta = beta*nA*nB*nAB*0.1111111111111111*ny; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; + + // q = 3 + //nread = neighborList[n+3*Np]; + Aq[nr4] = a1; + Bq[nr4] = b1; + // q = 4 + //nread = neighborList[n+2*Np]; + Aq[nr3] = a2; + Bq[nr3] = b2; + + //............................................... + // q = 4 + // Cq = {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nz; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; + + // q = 5 + //nread = neighborList[n+5*Np]; + Aq[nr6] = a1; + Bq[nr6] = b1; + // q = 6 + //nread = neighborList[n+4*Np]; + Aq[nr5] = a2; + Bq[nr5] = b2; + //............................................... + } +} + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, + double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Velocity, + double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, + double Gx, double Gy, double Gz, int strideY, int strideZ, int start, int finish, int Np){ + + int ijk,nn,n; + double fq; + // conserved momemnts + double rho,jx,jy,jz; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double m3,m5,m7; + double nA,nB; // number density + double a1,b1,a2,b2,nAB,delta; + double C,nx,ny,nz; //color gradient magnitude and direction + double phi,tau,rho0,rlx_setA,rlx_setB; + + double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double tau_eff; + double mu_eff;//kinematic viscosity + double nx_gs,ny_gs,nz_gs;//grey-solid color gradient + double Fx,Fy,Fz; + + 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; + + for (n=start; n0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; + + Aq[1*Np+n] = a1; + Bq[1*Np+n] = b1; + Aq[2*Np+n] = a2; + Bq[2*Np+n] = b2; + + //............................................... + // q = 2 + // Cq = {0,1,0} + delta = beta*nA*nB*nAB*0.1111111111111111*ny; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; + + Aq[3*Np+n] = a1; + Bq[3*Np+n] = b1; + Aq[4*Np+n] = a2; + Bq[4*Np+n] = b2; + //............................................... + // q = 4 + // Cq = {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nz; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; + + Aq[5*Np+n] = a1; + Bq[5*Np+n] = b1; + Aq[6*Np+n] = a2; + Bq[6*Np+n] = b2; + //............................................... + } +} + + +//extern "C" void ScaLBL_D3Q19_GreyscaleColor_Init(double *dist, double *Porosity, int Np){ +// int n; +// double porosity; +// for (n=0; n +#include + +extern "C" void ScaLBL_D3Q19_GreyscaleFE_Pressure(double *dist, double *Den, double *Poros,double *Velocity, + double *Pressure, double rhoA,double rhoB, int N){ + + int n; + double ux,uy,uz,u_mag; + double pressure; + double porosity; + double rho0; + double phi; + double nA,nB; + + for (n=0; n0.0)-Gsc*nB*nA_gradx*int(phi<0.0); +// Gff_y = -Gsc*nA*nB_grady*int(phi>0.0)-Gsc*nB*nA_grady*int(phi<0.0); +// Gff_z = -Gsc*nA*nB_gradz*int(phi>0.0)-Gsc*nB*nA_gradz*int(phi<0.0); + Gff_x = -Gsc*(nA*nB_gradx+nB*nA_gradx); + Gff_y = -Gsc*(nA*nB_grady+nB*nA_grady); + Gff_z = -Gsc*(nA*nB_gradz+nB*nA_gradz); + // fluid-solid force + Gfs_x = (nA-nB)*SolidForce[n+0*Np]; + Gfs_y = (nA-nB)*SolidForce[n+1*Np]; + Gfs_z = (nA-nB)*SolidForce[n+2*Np]; + + porosity = Poros[n]; + // use local saturation as an estimation of effective relperm values + perm = Perm[n]*nA/(nA+nB)*int(phi>0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); + vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); + vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); + if (porosity==1.0){ + Fx=rho0*(Gx + Gff_x + Gfs_x); + Fy=rho0*(Gy + Gff_y + Gfs_y); + Fz=rho0*(Gz + Gff_z + Gfs_z); + } + + //Calculate pressure for Incompressible-MRT model + pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); + +// //..............carry out relaxation process............................................... +// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; +// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; +// jx = jx + Fx; +// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +// jy = jy + Fy; +// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +// jz = jz + Fz; +// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) +// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; +// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) +// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; +// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) +// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; +// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) +// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; +// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) +// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; +// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) +// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; +// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) +// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); +// //....................................................................................................... + + //-------------------- IMRT collison where body force has NO higher-order terms -------------// + //..............carry out relaxation process............................................... + m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); + m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); + m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); + m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); + m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + dist[1*Np+n] = fq; + + // q=2 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + dist[2*Np+n] = fq; + + // q = 3 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + dist[3*Np+n] = fq; + + // q = 4 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + dist[4*Np+n] = fq; + + // q = 5 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + dist[5*Np+n] = fq; + + // q = 6 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + dist[6*Np+n] = fq; + + // q = 7 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + dist[7*Np+n] = fq; + + // q = 8 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); + dist[8*Np+n] = fq; + + // q = 9 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + dist[9*Np+n] = fq; + + // q = 10 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + dist[10*Np+n] = fq; + + // q = 11 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); + dist[11*Np+n] = fq; + + // q = 12 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + dist[12*Np+n] = fq; + + // q = 13 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); + dist[13*Np+n] = fq; + + // q= 14 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); + dist[14*Np+n] = fq; + + // q = 15 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + dist[15*Np+n] = fq; + + // q = 16 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + dist[16*Np+n] = fq; + + // q = 17 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + dist[17*Np+n] = fq; + + // q = 18 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + dist[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] = pressure; + + //-----------------------Mass transport------------------------// + // Calculate the color gradient + nx = (2*nB*nA_gradx-2*nA*nB_gradx)/(nA+nB)/(nA+nB); + ny = (2*nB*nA_grady-2*nA*nB_grady)/(nA+nB)/(nA+nB); + nz = (2*nB*nA_gradz-2*nA*nB_gradz)/(nA+nB)/(nA+nB); + //...........Normalize the Color Gradient................................. + C = sqrt(nx*nx+ny*ny+nz*nz); + double ColorMag = C; + if (C==0.0) ColorMag=1.0; + nx = nx/ColorMag; + ny = ny/ColorMag; + nz = nz/ColorMag; + if (C == 0.0) nx = ny = nz = 0.0; + + // Instantiate mass transport distributions + // Stationary value - distribution 0 + nAB = 1.0/(nA+nB); + Aq[n] = 0.3333333333333333*nA; + Bq[n] = 0.3333333333333333*nB; + + //............................................... + // q = 0,2,4 + // Cq = {1,0,0}, {0,1,0}, {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nx; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; + + Aq[1*Np+n] = a1; + Bq[1*Np+n] = b1; + Aq[2*Np+n] = a2; + Bq[2*Np+n] = b2; + + //............................................... + // q = 2 + // Cq = {0,1,0} + delta = beta*nA*nB*nAB*0.1111111111111111*ny; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; + + Aq[3*Np+n] = a1; + Bq[3*Np+n] = b1; + Aq[4*Np+n] = a2; + Bq[4*Np+n] = b2; + //............................................... + // q = 4 + // Cq = {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nz; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; + + Aq[5*Np+n] = a1; + Bq[5*Np+n] = b1; + Aq[6*Np+n] = a2; + Bq[6*Np+n] = b2; + //............................................... + } +} + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFE(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, + double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure){ + + int n, nread, nr1,nr2,nr3,nr4,nr5,nr6; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + // currently disable 'GeoFun' + double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double tau,tau_eff,rlx_setA,rlx_setB; + double mu_eff;//effective kinematic viscosity for Darcy term + double rho0; + double phi; + double nx,ny,nz,C; + double nA,nB; + double a1,b1,a2,b2,nAB,delta; + double beta=0.95; + double nA_gradx,nA_grady,nA_gradz; + double nB_gradx,nB_grady,nB_gradz; + double Gff_x,Gff_y,Gff_z; + double Gfs_x,Gfs_y,Gfs_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; + + for (n=start; n 10Np => odd part of dist) + fq = dist[nr1]; // reading the f1 data into register fq + pressure = fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jx = fq; + m4 = -4.0*fq; + m9 = 2.0*fq; + m10 = -4.0*fq; + + // q=2 + nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nr2]; // reading the f2 data into register fq + pressure += fq; + m1 -= 11.0*(fq); + m2 -= 4.0*(fq); + jx -= fq; + m4 += 4.0*(fq); + m9 += 2.0*(fq); + m10 -= 4.0*(fq); + + // q=3 + nr3 = neighborList[n+2*Np]; // neighbor 4 + fq = dist[nr3]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy = fq; + m6 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 = fq; + m12 = -2.0*fq; + + // q = 4 + nr4 = neighborList[n+3*Np]; // neighbor 3 + fq = dist[nr4]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy -= fq; + m6 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 += fq; + m12 -= 2.0*fq; + + // q=5 + nr5 = neighborList[n+4*Np]; + fq = dist[nr5]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz = fq; + m8 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q = 6 + nr6 = neighborList[n+5*Np]; + fq = dist[nr6]; + pressure += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz -= fq; + m8 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q=7 + nread = neighborList[n+6*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 = fq; + m16 = fq; + m17 = -fq; + + // q = 8 + nread = neighborList[n+7*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 += fq; + m16 -= fq; + m17 += fq; + + // q=9 + nread = neighborList[n+8*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 += fq; + m17 += fq; + + // q = 10 + nread = neighborList[n+9*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 -= fq; + m17 -= fq; + + // q=11 + nread = neighborList[n+10*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 = fq; + m16 -= fq; + m18 = fq; + + // q=12 + nread = neighborList[n+11*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 += fq; + m16 += fq; + m18 -= fq; + + // q=13 + nread = neighborList[n+12*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 -= fq; + m18 -= fq; + + // q=14 + nread = neighborList[n+13*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 += fq; + m18 += fq; + + // q=15 + nread = neighborList[n+14*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 = fq; + m17 += fq; + m18 -= fq; + + // q=16 + nread = neighborList[n+15*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 += fq; + m17 -= fq; + m18 += fq; + + // q=17 + nread = neighborList[n+16*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 += fq; + m18 += fq; + + // q=18 + nread = neighborList[n+17*Np]; + fq = dist[nread]; + pressure += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 -= fq; + m18 -= fq; + //---------------------------------------------------------------------// + + //---------------- Calculate SC fluid-fluid and fluid-solid forces ---------------// + // fluid-fluid force +// Gff_x = -Gsc*nA*nB_gradx*int(phi>0.0)-Gsc*nB*nA_gradx*int(phi<0.0); +// Gff_y = -Gsc*nA*nB_grady*int(phi>0.0)-Gsc*nB*nA_grady*int(phi<0.0); +// Gff_z = -Gsc*nA*nB_gradz*int(phi>0.0)-Gsc*nB*nA_gradz*int(phi<0.0); + Gff_x = -Gsc*(nA*nB_gradx+nB*nA_gradx); + Gff_y = -Gsc*(nA*nB_grady+nB*nA_grady); + Gff_z = -Gsc*(nA*nB_gradz+nB*nA_gradz); + // fluid-solid force + Gfs_x = (nA-nB)*SolidForce[n+0*Np]; + Gfs_y = (nA-nB)*SolidForce[n+1*Np]; + Gfs_z = (nA-nB)*SolidForce[n+2*Np]; + + porosity = Poros[n]; + // use local saturation as an estimation of effective relperm values + perm = Perm[n]*nA/(nA+nB)*int(phi>0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); + vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); + vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); + if (porosity==1.0){ + Fx=rho0*(Gx + Gff_x + Gfs_x); + Fy=rho0*(Gy + Gff_y + Gfs_y); + Fz=rho0*(Gz + Gff_z + Gfs_z); + } + + //Calculate pressure for Incompressible-MRT model + pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); + +// //..............carry out relaxation process............................................... +// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) +// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; +// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) +// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; +// jx = jx + Fx; +// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +// jy = jy + Fy; +// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +// jz = jz + Fz; +// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) +// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; +// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) +// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; +// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) +// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; +// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) +// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; +// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) +// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; +// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) +// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; +// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) +// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); +// //....................................................................................................... + + //-------------------- IMRT collison where body force has NO higher-order terms -------------// + //..............carry out relaxation process............................................... + m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); + m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); + m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); + m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); + m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); + m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... + + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + //nread = neighborList[n+Np]; + dist[nr2] = fq; + + // q=2 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + //nread = neighborList[n]; + dist[nr1] = fq; + + // q = 3 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+3*Np]; + dist[nr4] = fq; + + // q = 4 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+2*Np]; + dist[nr3] = fq; + + // q = 5 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+5*Np]; + dist[nr6] = fq; + + // q = 6 + fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+4*Np]; + dist[nr5] = fq; + + // q = 7 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + nread = neighborList[n+7*Np]; + dist[nread] = fq; + + // q = 8 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); + nread = neighborList[n+6*Np]; + dist[nread] = fq; + + // q = 9 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + nread = neighborList[n+9*Np]; + dist[nread] = fq; + + // q = 10 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + nread = neighborList[n+8*Np]; + dist[nread] = fq; + + // q = 11 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); + nread = neighborList[n+11*Np]; + dist[nread] = fq; + + // q = 12 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + nread = neighborList[n+10*Np]; + dist[nread]= fq; + + // q = 13 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); + nread = neighborList[n+13*Np]; + dist[nread] = fq; + + // q= 14 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); + nread = neighborList[n+12*Np]; + dist[nread] = fq; + + // q = 15 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + nread = neighborList[n+15*Np]; + dist[nread] = fq; + + // q = 16 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + nread = neighborList[n+14*Np]; + dist[nread] = fq; + + // q = 17 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + nread = neighborList[n+17*Np]; + dist[nread] = fq; + + // q = 18 + fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + nread = neighborList[n+16*Np]; + dist[nread] = fq; + //........................................................................ + + //Update velocity on device + Velocity[0*Np+n] = ux; + Velocity[1*Np+n] = uy; + Velocity[2*Np+n] = uz; + //Update pressure on device + Pressure[n] = pressure; + + //-----------------------Mass transport------------------------// + // Calculate the color gradient + nx = (2*nB*nA_gradx-2*nA*nB_gradx)/(nA+nB)/(nA+nB); + ny = (2*nB*nA_grady-2*nA*nB_grady)/(nA+nB)/(nA+nB); + nz = (2*nB*nA_gradz-2*nA*nB_gradz)/(nA+nB)/(nA+nB); + //...........Normalize the Color Gradient................................. + C = sqrt(nx*nx+ny*ny+nz*nz); + double ColorMag = C; + if (C==0.0) ColorMag=1.0; + nx = nx/ColorMag; + ny = ny/ColorMag; + nz = nz/ColorMag; + if (C == 0.0) nx = ny = nz = 0.0; + + // Instantiate mass transport distributions + // Stationary value - distribution 0 + nAB = 1.0/(nA+nB); + Aq[n] = 0.3333333333333333*nA; + Bq[n] = 0.3333333333333333*nB; + + //............................................... + // q = 0,2,4 + // Cq = {1,0,0}, {0,1,0}, {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nx; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; + + // q = 1 + //nread = neighborList[n+Np]; + Aq[nr2] = a1; + Bq[nr2] = b1; + // q=2 + //nread = neighborList[n]; + Aq[nr1] = a2; + Bq[nr1] = b2; + + //............................................... + // Cq = {0,1,0} + delta = beta*nA*nB*nAB*0.1111111111111111*ny; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; + + // q = 3 + //nread = neighborList[n+3*Np]; + Aq[nr4] = a1; + Bq[nr4] = b1; + // q = 4 + //nread = neighborList[n+2*Np]; + Aq[nr3] = a2; + Bq[nr3] = b2; + + //............................................... + // q = 4 + // Cq = {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nz; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; + + // q = 5 + //nread = neighborList[n+5*Np]; + Aq[nr6] = a1; + Bq[nr6] = b1; + // q = 6 + //nread = neighborList[n+4*Np]; + Aq[nr5] = a2; + Bq[nr5] = b2; + //............................................... + } +} + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFEChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, + double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ + + int n, nread, nr1,nr2,nr3,nr4,nr5,nr6; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + // currently disable 'GeoFun' + double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double tau,tau_eff,rlx_setA,rlx_setB; + double mu_eff;//effective kinematic viscosity for Darcy term + double rho,rho0; + double phi; + double phi_lap;//laplacian of phase field + double nA,nB; + double Gfs_x,Gfs_y,Gfs_z; + double Gff_x,Gff_y,Gff_z; + double chem; + double rlx_phi; + double a1,a2;//PDF of phase field + // *---------------------------------Pressure Tensor Gradient------------------------------------*// + double Pxx_x,Pyy_y,Pzz_z; + double Pxy_x,Pxy_y; + double Pyz_y,Pyz_z; + double Pxz_x,Pxz_z; + double px,py,pz; //pressure gradient + + 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; + + for (n=start; n0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); + + //Load pressure gradient + px=PressureGrad[0*Np+n]; + py=PressureGrad[1*Np+n]; + pz=PressureGrad[2*Np+n]; + + //Load pressure tensor gradient + //For reference full list of PressTensorGrad + //PressTensorGrad[n+0*Np] = Pxx_x + //PressTensorGrad[n+1*Np] = Pxx_y + //PressTensorGrad[n+2*Np] = Pxx_z + //PressTensorGrad[n+3*Np] = Pyy_x + //PressTensorGrad[n+4*Np] = Pyy_y + //PressTensorGrad[n+5*Np] = Pyy_z + //PressTensorGrad[n+6*Np] = Pzz_x + //PressTensorGrad[n+7*Np] = Pzz_y + //PressTensorGrad[n+8*Np] = Pzz_z + //PressTensorGrad[n+9*Np] = Pxy_x + //PressTensorGrad[n+10*Np] = Pxy_y + //PressTensorGrad[n+11*Np] = Pxy_z + //PressTensorGrad[n+12*Np] = Pyz_x + //PressTensorGrad[n+13*Np] = Pyz_y + //PressTensorGrad[n+14*Np] = Pyz_z + //PressTensorGrad[n+15*Np] = Pxz_x + //PressTensorGrad[n+16*Np] = Pxz_y + //PressTensorGrad[n+17*Np] = Pxz_z + Pxx_x = PressTensorGrad[0*Np+n]; + Pyy_y = PressTensorGrad[4*Np+n]; + Pzz_z = PressTensorGrad[8*Np+n]; + Pxy_x = PressTensorGrad[9*Np+n]; + Pxz_x = PressTensorGrad[15*Np+n]; + Pxy_y = PressTensorGrad[10*Np+n]; + Pyz_y = PressTensorGrad[13*Np+n]; + Pyz_z = PressTensorGrad[14*Np+n]; + Pxz_z = PressTensorGrad[17*Np+n]; + //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... + //TODO double check if you need porosity as a fre-factor + Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); + Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); + Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); + // fluid-solid force + Gfs_x = (nA-nB)*SolidForce[n+0*Np]; + Gfs_y = (nA-nB)*SolidForce[n+1*Np]; + Gfs_z = (nA-nB)*SolidForce[n+2*Np]; + + // local density + rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); + // local relaxation time + tau=tauA + 0.5*(1.0-phi)*(tauB-tauA); + rlx_setA = 1.f/tau; + rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); + tau_eff=tauA_eff + 0.5*(1.0-phi)*(tauB_eff-tauA_eff); + mu_eff = (tau_eff-0.5)/3.f;//kinematic viscosity + + //........................................................................ + // READ THE DISTRIBUTIONS + // (read from opposite array due to previous swap operation) + //........................................................................ + // q=0 + fq = dist[n]; + rho = fq; + m1 = -30.0*fq; + m2 = 12.0*fq; + + // q=1 + nr1 = neighborList[n]; // neighbor 2 ( > 10Np => odd part of dist) + fq = dist[nr1]; // reading the f1 data into register fq + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jx = fq; + m4 = -4.0*fq; + m9 = 2.0*fq; + m10 = -4.0*fq; + + // q=2 + nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nr2]; // reading the f2 data into register fq + rho += fq; + m1 -= 11.0*(fq); + m2 -= 4.0*(fq); + jx -= fq; + m4 += 4.0*(fq); + m9 += 2.0*(fq); + m10 -= 4.0*(fq); + + // q=3 + nr3 = neighborList[n+2*Np]; // neighbor 4 + fq = dist[nr3]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy = fq; + m6 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 = fq; + m12 = -2.0*fq; + + // q = 4 + nr4 = neighborList[n+3*Np]; // neighbor 3 + fq = dist[nr4]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy -= fq; + m6 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 += fq; + m12 -= 2.0*fq; + + // q=5 + nr5 = neighborList[n+4*Np]; + fq = dist[nr5]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz = fq; + m8 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q = 6 + nr6 = neighborList[n+5*Np]; + fq = dist[nr6]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz -= fq; + m8 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q=7 + nread = neighborList[n+6*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 = fq; + m16 = fq; + m17 = -fq; + + // q = 8 + nread = neighborList[n+7*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 += fq; + m16 -= fq; + m17 += fq; + + // q=9 + nread = neighborList[n+8*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 += fq; + m17 += fq; + + // q = 10 + nread = neighborList[n+9*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 -= fq; + m17 -= fq; + + // q=11 + nread = neighborList[n+10*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 = fq; + m16 -= fq; + m18 = fq; + + // q=12 + nread = neighborList[n+11*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 += fq; + m16 += fq; + m18 -= fq; + + // q=13 + nread = neighborList[n+12*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 -= fq; + m18 -= fq; + + // q=14 + nread = neighborList[n+13*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 += fq; + m18 += fq; + + // q=15 + nread = neighborList[n+14*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 = fq; + m17 += fq; + m18 -= fq; + + // q=16 + nread = neighborList[n+15*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 += fq; + m17 -= fq; + m18 += fq; + + // q=17 + nread = neighborList[n+16*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 += fq; + m18 += fq; + + // q=18 + nread = neighborList[n+17*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 -= fq; + m18 -= fq; + //---------------------------------------------------------------------// + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); + vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); + vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); + if (porosity==1.0){ + Fx=rho0*(Gx + Gff_x + Gfs_x); + Fy=rho0*(Gy + Gff_y + Gfs_y); + Fz=rho0*(Gz + Gff_z + Gfs_z); + } + + //Calculate pressure for Incompressible-MRT model + //pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); + pressure=rho/3.0; + + //-------------------- IMRT collison where body force has NO higher-order terms -------------// + //..............carry out relaxation process............................................... + m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho0 - 11*rho) - m1); + m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho0)- m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*jx)- m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*jy)- m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*jz)- m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho0) - m9); + m10 = m10 + rlx_setA*( - m10); + m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho0) - m11); + m12 = m12 + rlx_setA*( - m12); + m13 = m13 + rlx_setA*( (jx*jy/rho0) - m13); + m14 = m14 + rlx_setA*( (jy*jz/rho0) - m14); + m15 = m15 + rlx_setA*( (jx*jz/rho0) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... + + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + //nread = neighborList[n+Np]; + dist[nr2] = fq; + + // q=2 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + //nread = neighborList[n]; + dist[nr1] = fq; + + // q = 3 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+3*Np]; + dist[nr4] = fq; + + // q = 4 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+2*Np]; + dist[nr3] = fq; + + // q = 5 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+5*Np]; + dist[nr6] = fq; + + // q = 6 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+4*Np]; + dist[nr5] = fq; + + // q = 7 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + nread = neighborList[n+7*Np]; + dist[nread] = fq; + + // q = 8 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); + nread = neighborList[n+6*Np]; + dist[nread] = fq; + + // q = 9 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + nread = neighborList[n+9*Np]; + dist[nread] = fq; + + // q = 10 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + nread = neighborList[n+8*Np]; + dist[nread] = fq; + + // q = 11 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); + nread = neighborList[n+11*Np]; + dist[nread] = fq; + + // q = 12 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + nread = neighborList[n+10*Np]; + dist[nread]= fq; + + // q = 13 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); + nread = neighborList[n+13*Np]; + dist[nread] = fq; + + // q= 14 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); + nread = neighborList[n+12*Np]; + dist[nread] = fq; + + // q = 15 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + nread = neighborList[n+15*Np]; + dist[nread] = fq; + + // q = 16 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + nread = neighborList[n+14*Np]; + dist[nread] = fq; + + // q = 17 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + nread = neighborList[n+17*Np]; + dist[nread] = fq; + + // q = 18 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + nread = neighborList[n+16*Np]; + dist[nread] = fq; + //........................................................................ + + //Update velocity on device + Velocity[0*Np+n] = ux; + Velocity[1*Np+n] = uy; + Velocity[2*Np+n] = uz; + //Update pressure on device + Pressure[n] = pressure; + + //-----------------------Mass transport------------------------// + // calcuale chemical potential + chem = 0.125*(lambdaA+lambdaB)*(-phi+phi*phi*phi)-0.25*(kappaA+kappaB)*phi_lap; + //rlx_phi = 3.f-sqrt(3.f); + rlx_phi = 1.0; + + //............................................... + // q = 0,2,4 + // Cq = {1,0,0}, {0,1,0}, {0,0,1} + //a1 = Cq[nr2]; + //a2 = Cq[nr1]; + //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*ux)); + //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*ux)); + a1 = 0.1111111111111111*4.5*(gamma*chem+phi*ux); + a2 = 0.1111111111111111*4.5*(gamma*chem-phi*ux); + + // q = 1 + //nread = neighborList[n+Np]; + Cq[nr2] = a1; + // q=2 + //nread = neighborList[n]; + Cq[nr1] = a2; + + //............................................... + // Cq = {0,1,0} + //a1 = Cq[nr4]; + //a2 = Cq[nr3]; + //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uy)); + //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uy)); + a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uy); + a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uy); + + // q = 3 + //nread = neighborList[n+3*Np]; + Cq[nr4] = a1; + // q = 4 + //nread = neighborList[n+2*Np]; + Cq[nr3] = a2; + + //............................................... + // q = 4 + // Cq = {0,0,1} + //a1 = Cq[nr6]; + //a2 = Cq[nr5]; + //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uz)); + //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uz)); + a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uz); + a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uz); + + // q = 5 + //nread = neighborList[n+5*Np]; + Cq[nr6] = a1; + // q = 6 + //nread = neighborList[n+4*Np]; + Cq[nr5] = a2; + //............................................... + + // Instantiate mass transport distributions + // Stationary value - distribution 0 + //a1=Cq[n]; + //Cq[n] = (1.0-rlx_phi)*a1+rlx_phi*(phi-3.0*gamma*chem); + Cq[n] = phi-3.0*gamma*chem; + } +} + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFEChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, + double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, + double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ + + int n; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + // currently disable 'GeoFun' + double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double tau,tau_eff,rlx_setA,rlx_setB; + double mu_eff;//effective kinematic viscosity for Darcy term + double rho,rho0; + double phi; + double phi_lap;//laplacian of phase field + double nA,nB; + double Gfs_x,Gfs_y,Gfs_z; + double Gff_x,Gff_y,Gff_z; + double chem; + double rlx_phi; + double a1,a2;//PDF of phase field + // *---------------------------------Pressure Tensor Gradient------------------------------------*// + double Pxx_x,Pyy_y,Pzz_z; + double Pxy_x,Pxy_y; + double Pyz_y,Pyz_z; + double Pxz_x,Pxz_z; + double px,py,pz; //pressure gradient + + + 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; + + + for (n=start; n0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); + + //Load pressure gradient + px=PressureGrad[0*Np+n]; + py=PressureGrad[1*Np+n]; + pz=PressureGrad[2*Np+n]; + + //Load pressure tensor gradient + //For reference full list of PressTensorGrad + //PressTensorGrad[n+0*Np] = Pxx_x + //PressTensorGrad[n+1*Np] = Pxx_y + //PressTensorGrad[n+2*Np] = Pxx_z + //PressTensorGrad[n+3*Np] = Pyy_x + //PressTensorGrad[n+4*Np] = Pyy_y + //PressTensorGrad[n+5*Np] = Pyy_z + //PressTensorGrad[n+6*Np] = Pzz_x + //PressTensorGrad[n+7*Np] = Pzz_y + //PressTensorGrad[n+8*Np] = Pzz_z + //PressTensorGrad[n+9*Np] = Pxy_x + //PressTensorGrad[n+10*Np] = Pxy_y + //PressTensorGrad[n+11*Np] = Pxy_z + //PressTensorGrad[n+12*Np] = Pyz_x + //PressTensorGrad[n+13*Np] = Pyz_y + //PressTensorGrad[n+14*Np] = Pyz_z + //PressTensorGrad[n+15*Np] = Pxz_x + //PressTensorGrad[n+16*Np] = Pxz_y + //PressTensorGrad[n+17*Np] = Pxz_z + Pxx_x = PressTensorGrad[0*Np+n]; + Pyy_y = PressTensorGrad[4*Np+n]; + Pzz_z = PressTensorGrad[8*Np+n]; + Pxy_x = PressTensorGrad[9*Np+n]; + Pxz_x = PressTensorGrad[15*Np+n]; + Pxy_y = PressTensorGrad[10*Np+n]; + Pyz_y = PressTensorGrad[13*Np+n]; + Pyz_z = PressTensorGrad[14*Np+n]; + Pxz_z = PressTensorGrad[17*Np+n]; + //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... + //TODO double check if you need porosity as a fre-factor + Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); + Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); + Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); + // fluid-solid force + Gfs_x = (nA-nB)*SolidForce[n+0*Np]; + Gfs_y = (nA-nB)*SolidForce[n+1*Np]; + Gfs_z = (nA-nB)*SolidForce[n+2*Np]; + + // local density + rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); + // local relaxation time + tau=tauA + 0.5*(1.0-phi)*(tauB-tauA); + rlx_setA = 1.f/tau; + rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); + tau_eff=tauA_eff + 0.5*(1.0-phi)*(tauB_eff-tauA_eff); + mu_eff = (tau_eff-0.5)/3.f;//kinematic viscosity + + + //........................................................................ + // READ THE DISTRIBUTIONS + // (read from opposite array due to previous swap operation) + //........................................................................ + // q=0 + fq = dist[n]; + rho = fq; + m1 = -30.0*fq; + m2 = 12.0*fq; + + // q=1 + fq = dist[2*Np+n]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jx = fq; + m4 = -4.0*fq; + m9 = 2.0*fq; + m10 = -4.0*fq; + + // f2 = dist[10*Np+n]; + fq = dist[1*Np+n]; + rho += fq; + m1 -= 11.0*(fq); + m2 -= 4.0*(fq); + jx -= fq; + m4 += 4.0*(fq); + m9 += 2.0*(fq); + m10 -= 4.0*(fq); + + // q=3 + fq = dist[4*Np+n]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy = fq; + m6 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 = fq; + m12 = -2.0*fq; + + // q = 4 + fq = dist[3*Np+n]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy -= fq; + m6 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 += fq; + m12 -= 2.0*fq; + + // q=5 + fq = dist[6*Np+n]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz = fq; + m8 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q = 6 + fq = dist[5*Np+n]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz -= fq; + m8 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q=7 + fq = dist[8*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 = fq; + m16 = fq; + m17 = -fq; + + // q = 8 + fq = dist[7*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 += fq; + m16 -= fq; + m17 += fq; + + // q=9 + fq = dist[10*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 += fq; + m17 += fq; + + // q = 10 + fq = dist[9*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 -= fq; + m17 -= fq; + + // q=11 + fq = dist[12*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 = fq; + m16 -= fq; + m18 = fq; + + // q=12 + fq = dist[11*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 += fq; + m16 += fq; + m18 -= fq; + + // q=13 + fq = dist[14*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 -= fq; + m18 -= fq; + + // q=14 + fq = dist[13*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 += fq; + m18 += fq; + + // q=15 + fq = dist[16*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 = fq; + m17 += fq; + m18 -= fq; + + // q=16 + fq = dist[15*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 += fq; + m17 -= fq; + m18 += fq; + + // q=17 + fq = dist[18*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 += fq; + m18 += fq; + + // q=18 + fq = dist[17*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 -= fq; + m18 -= fq; + //---------------------------------------------------------------------// + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); + vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); + vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); + if (porosity==1.0){ + Fx=rho0*(Gx + Gff_x + Gfs_x); + Fy=rho0*(Gy + Gff_y + Gfs_y); + Fz=rho0*(Gz + Gff_z + Gfs_z); + } + + //Calculate pressure for Incompressible-MRT model + //pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); + pressure=rho/3.0; + + //-------------------- IMRT collison where body force has NO higher-order terms -------------// + //..............carry out relaxation process............................................... + m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho0 - 11*rho) - m1); + m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho0)- m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*jx)- m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*jy)- m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*jz)- m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho0) - m9); + m10 = m10 + rlx_setA*( - m10); + m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho0) - m11); + m12 = m12 + rlx_setA*( - m12); + m13 = m13 + rlx_setA*( (jx*jy/rho0) - m13); + m14 = m14 + rlx_setA*( (jy*jz/rho0) - m14); + m15 = m15 + rlx_setA*( (jx*jz/rho0) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + dist[1*Np+n] = fq; + + // q=2 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + dist[2*Np+n] = fq; + + // q = 3 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + dist[3*Np+n] = fq; + + // q = 4 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + dist[4*Np+n] = fq; + + // q = 5 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + dist[5*Np+n] = fq; + + // q = 6 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + dist[6*Np+n] = fq; + + // q = 7 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + dist[7*Np+n] = fq; + + // q = 8 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); + dist[8*Np+n] = fq; + + // q = 9 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + dist[9*Np+n] = fq; + + // q = 10 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + dist[10*Np+n] = fq; + + // q = 11 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); + dist[11*Np+n] = fq; + + // q = 12 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + dist[12*Np+n] = fq; + + // q = 13 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); + dist[13*Np+n] = fq; + + // q= 14 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); + dist[14*Np+n] = fq; + + // q = 15 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + dist[15*Np+n] = fq; + + // q = 16 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + dist[16*Np+n] = fq; + + // q = 17 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + dist[17*Np+n] = fq; + + // q = 18 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + dist[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] = pressure; + + //-----------------------Mass transport------------------------// + // calcuale chemical potential + chem = 0.125*(lambdaA+lambdaB)*(-phi+phi*phi*phi)-0.25*(kappaA+kappaB)*phi_lap; + //rlx_phi = 3.f-sqrt(3.f); + rlx_phi = 1.0; + + //............................................... + // q = 0,2,4 + // Cq = {1,0,0}, {0,1,0}, {0,0,1} + //a1 = Cq[1*Np+n]; + //a2 = Cq[2*Np+n]; + //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*ux)); + //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*ux)); + a1 = 0.1111111111111111*4.5*(gamma*chem+phi*ux); + a2 = 0.1111111111111111*4.5*(gamma*chem-phi*ux); + + Cq[1*Np+n] = a1; + Cq[2*Np+n] = a2; + + //............................................... + // q = 2 + // Cq = {0,1,0} + //a1 = Cq[3*Np+n]; + //a2 = Cq[4*Np+n]; + //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uy)); + //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uy)); + a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uy); + a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uy); + + Cq[3*Np+n] = a1; + Cq[4*Np+n] = a2; + //............................................... + // q = 4 + // Cq = {0,0,1} + //a1 = Cq[5*Np+n]; + //a2 = Cq[6*Np+n]; + //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uz)); + //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uz)); + a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uz); + a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uz); + + Cq[5*Np+n] = a1; + Cq[6*Np+n] = a2; + //............................................... + + // Instantiate mass transport distributions + // Stationary value - distribution 0 + //a1=Cq[n]; + //Cq[n] = (1.0-rlx_phi)*a1+rlx_phi*(phi-3.0*gamma*chem); + Cq[n] = phi-3.0*gamma*chem; + } +} + +extern "C" void ScaLBL_D3Q19_GreyscaleFE_IMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np){ + int n; + double phi; + double nA,nB; + double Den0; + for (n=0; n +#include + +//__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 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 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 + +#define NBLOCKS 1024 +#define NTHREADS 256 + +__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, + double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, + double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff,double alpha, double beta, + double Gx, double Gy, double Gz, int strideY, int strideZ, int start, int finish, int Np){ + + int n,nn,ijk,nread; + int nr1,nr2,nr3,nr4,nr5,nr6; + int nr7,nr8,nr9,nr10; + int nr11,nr12,nr13,nr14; + //int nr15,nr16,nr17,nr18; + double fq; + // conserved momemnts + double rho,jx,jy,jz; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double m3,m5,m7; + double nA,nB; // number density + double a1,b1,a2,b2,nAB,delta; + double C,nx,ny,nz; //color gradient magnitude and direction + double phi,tau,rho0,rlx_setA,rlx_setB; + + double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double tau_eff; + double mu_eff;//kinematic viscosity + double nx_gs,ny_gs,nz_gs;//grey-solid color gradient + double Fx,Fy,Fz; + + const double mrt_V1=0.05263157894736842; + const double mrt_V2=0.012531328320802; + const double mrt_V3=0.04761904761904762; + const double mrt_V4=0.004594820384294068; + const double mrt_V5=0.01587301587301587; + const double mrt_V6=0.0555555555555555555555555; + const double mrt_V7=0.02777777777777778; + const double mrt_V8=0.08333333333333333; + const double mrt_V9=0.003341687552213868; + const double mrt_V10=0.003968253968253968; + const double mrt_V11=0.01388888888888889; + const double mrt_V12=0.04166666666666666; + + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s even part of dist) + //fq = dist[nread]; // reading the f2 data into register fq + nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nr2]; // reading the f2 data into register fq + rho += fq; + m1 -= 11.0*(fq); + m2 -= 4.0*(fq); + jx -= fq; + m4 += 4.0*(fq); + m9 += 2.0*(fq); + m10 -= 4.0*(fq); + + // q=3 + //nread = neighborList[n+2*Np]; // neighbor 4 + //fq = dist[nread]; + nr3 = neighborList[n+2*Np]; // neighbor 4 + fq = dist[nr3]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy = fq; + m6 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 = fq; + m12 = -2.0*fq; + + // q = 4 + //nread = neighborList[n+3*Np]; // neighbor 3 + //fq = dist[nread]; + nr4 = neighborList[n+3*Np]; // neighbor 3 + fq = dist[nr4]; + rho+= fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy -= fq; + m6 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 += fq; + m12 -= 2.0*fq; + + // q=5 + //nread = neighborList[n+4*Np]; + //fq = dist[nread]; + nr5 = neighborList[n+4*Np]; + fq = dist[nr5]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz = fq; + m8 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + + // q = 6 + //nread = neighborList[n+5*Np]; + //fq = dist[nread]; + nr6 = neighborList[n+5*Np]; + fq = dist[nr6]; + rho+= fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz -= fq; + m8 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q=7 + //nread = neighborList[n+6*Np]; + //fq = dist[nread]; + nr7 = neighborList[n+6*Np]; + fq = dist[nr7]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 = fq; + m16 = fq; + m17 = -fq; + + // q = 8 + //nread = neighborList[n+7*Np]; + //fq = dist[nread]; + nr8 = neighborList[n+7*Np]; + fq = dist[nr8]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 += fq; + m16 -= fq; + m17 += fq; + + // q=9 + //nread = neighborList[n+8*Np]; + //fq = dist[nread]; + nr9 = neighborList[n+8*Np]; + fq = dist[nr9]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 += fq; + m17 += fq; + + // q = 10 + //nread = neighborList[n+9*Np]; + //fq = dist[nread]; + nr10 = neighborList[n+9*Np]; + fq = dist[nr10]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 -= fq; + m17 -= fq; + + // q=11 + //nread = neighborList[n+10*Np]; + //fq = dist[nread]; + nr11 = neighborList[n+10*Np]; + fq = dist[nr11]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 = fq; + m16 -= fq; + m18 = fq; + + // q=12 + //nread = neighborList[n+11*Np]; + //fq = dist[nread]; + nr12 = neighborList[n+11*Np]; + fq = dist[nr12]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 += fq; + m16 += fq; + m18 -= fq; + + // q=13 + //nread = neighborList[n+12*Np]; + //fq = dist[nread]; + nr13 = neighborList[n+12*Np]; + fq = dist[nr13]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 -= fq; + m18 -= fq; + + // q=14 + //nread = neighborList[n+13*Np]; + //fq = dist[nread]; + nr14 = neighborList[n+13*Np]; + fq = dist[nr14]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 += fq; + m18 += fq; + + // q=15 + nread = neighborList[n+14*Np]; + fq = dist[nread]; + //fq = dist[17*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 = fq; + m17 += fq; + m18 -= fq; + + // q=16 + nread = neighborList[n+15*Np]; + fq = dist[nread]; + //fq = dist[8*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 += fq; + m17 -= fq; + m18 += fq; + + // q=17 + //fq = dist[18*Np+n]; + nread = neighborList[n+16*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 += fq; + m18 += fq; + + // q=18 + nread = neighborList[n+17*Np]; + fq = dist[nread]; + //fq = dist[9*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 -= fq; + m18 -= fq; + + // Compute greyscale related parameters + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*(porosity*Gx); + vy = jy/rho0+0.5*(porosity*Gy); + vz = jz/rho0+0.5*(porosity*Gz); + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz); + if (porosity==1.0){ + Fx=rho0*(Gx); + Fy=rho0*(Gy); + Fz=rho0*(Gz); + } + + // write the velocity + Velocity[n] = ux; + Velocity[Np+n] = uy; + Velocity[2*Np+n] = uz; + + //........................................................................ + //..............carry out relaxation process.............................. + //..........Toelke, Fruediger et. al. 2006................................ + if (C == 0.0) nx = ny = nz = 0.0; + m1 = m1 + rlx_setA*((19*(ux*ux+uy*uy+uz*uz)*rho0/porosity - 11*rho) -19*alpha*C - m1); + m2 = m2 + rlx_setA*((3*rho - 5.5*(ux*ux+uy*uy+uz*uz)*rho0/porosity)- m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0)- m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0)- m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0)- m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*(((2*ux*ux-uy*uy-uz*uz)*rho0/porosity) + 0.5*alpha*C*(2*nx*nx-ny*ny-nz*nz) - m9); + m10 = m10 + rlx_setA*( - m10); + //m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + rlx_setA*(((uy*uy-uz*uz)*rho0/porosity) + 0.5*alpha*C*(ny*ny-nz*nz)- m11); + m12 = m12 + rlx_setA*( - m12); + //m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_setA*( (ux*uy*rho0/porosity) + 0.5*alpha*C*nx*ny - m13); + m14 = m14 + rlx_setA*( (uy*uz*rho0/porosity) + 0.5*alpha*C*ny*nz - m14); + m15 = m15 + rlx_setA*( (ux*uz*rho0/porosity) + 0.5*alpha*C*nx*nz - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + //nread = neighborList[n+Np]; + dist[nr2] = fq; + + // q=2 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + //nread = neighborList[n]; + dist[nr1] = fq; + + // q = 3 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+3*Np]; + dist[nr4] = fq; + + // q = 4 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+2*Np]; + dist[nr3] = fq; + + // q = 5 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+5*Np]; + dist[nr6] = fq; + + // q = 6 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+4*Np]; + dist[nr5] = fq; + + // q = 7 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+ + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + //nread = neighborList[n+7*Np]; + dist[nr8] = fq; + + // q = 8 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 + +mrt_V12*m12+0.25*m13+0.125*(m17-m16); + //nread = neighborList[n+6*Np]; + dist[nr7] = fq; + + // q = 9 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+ + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + //nread = neighborList[n+9*Np]; + dist[nr10] = fq; + + // q = 10 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+ + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + //nread = neighborList[n+8*Np]; + dist[nr9] = fq; + + // q = 11 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) + +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 + -mrt_V12*m12+0.25*m15+0.125*(m18-m16); + //nread = neighborList[n+11*Np]; + dist[nr12] = fq; + + // q = 12 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ + mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + //nread = neighborList[n+10*Np]; + dist[nr11]= fq; + + // q = 13 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) + +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 + -mrt_V12*m12-0.25*m15-0.125*(m16+m18); + //nread = neighborList[n+13*Np]; + dist[nr14] = fq; + + // q= 14 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) + +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 + -mrt_V12*m12-0.25*m15+0.125*(m16+m18); + //nread = neighborList[n+12*Np]; + dist[nr13] = fq; + + + // q = 15 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + nread = neighborList[n+15*Np]; + dist[nread] = fq; + + // q = 16 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + nread = neighborList[n+14*Np]; + dist[nread] = fq; + + + // q = 17 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) + -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + nread = neighborList[n+17*Np]; + dist[nread] = fq; + + // q = 18 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) + -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + nread = neighborList[n+16*Np]; + dist[nread] = fq; + //........................................................................ + + // Instantiate mass transport distributions + // Stationary value - distribution 0 + nAB = 1.0/(nA+nB); + Aq[n] = 0.3333333333333333*nA; + Bq[n] = 0.3333333333333333*nB; + + //............................................... + // q = 0,2,4 + // Cq = {1,0,0}, {0,1,0}, {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nx; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; + + // q = 1 + //nread = neighborList[n+Np]; + Aq[nr2] = a1; + Bq[nr2] = b1; + // q=2 + //nread = neighborList[n]; + Aq[nr1] = a2; + Bq[nr1] = b2; + + //............................................... + // Cq = {0,1,0} + delta = beta*nA*nB*nAB*0.1111111111111111*ny; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; + + // q = 3 + //nread = neighborList[n+3*Np]; + Aq[nr4] = a1; + Bq[nr4] = b1; + // q = 4 + //nread = neighborList[n+2*Np]; + Aq[nr3] = a2; + Bq[nr3] = b2; + + //............................................... + // q = 4 + // Cq = {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nz; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; + + // q = 5 + //nread = neighborList[n+5*Np]; + Aq[nr6] = a1; + Bq[nr6] = b1; + // q = 6 + //nread = neighborList[n+4*Np]; + Aq[nr5] = a2; + Bq[nr5] = b2; + //............................................... + } + } +} + +__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, + double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, + double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, + double Gx, double Gy, double Gz, int strideY, int strideZ, int start, int finish, int Np){ + int ijk,nn,n; + double fq; + // conserved momemnts + double rho,jx,jy,jz; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double m3,m5,m7; + double nA,nB; // number density + double a1,b1,a2,b2,nAB,delta; + double C,nx,ny,nz; //color gradient magnitude and direction + double phi,tau,rho0,rlx_setA,rlx_setB; + + double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double tau_eff; + double mu_eff;//kinematic viscosity + double nx_gs,ny_gs,nz_gs;//grey-solid color gradient + double Fx,Fy,Fz; + + 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; s0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; + + Aq[1*Np+n] = a1; + Bq[1*Np+n] = b1; + Aq[2*Np+n] = a2; + Bq[2*Np+n] = b2; + + //............................................... + // q = 2 + // Cq = {0,1,0} + delta = beta*nA*nB*nAB*0.1111111111111111*ny; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; + + Aq[3*Np+n] = a1; + Bq[3*Np+n] = b1; + Aq[4*Np+n] = a2; + Bq[4*Np+n] = b2; + //............................................... + // q = 4 + // Cq = {0,0,1} + delta = beta*nA*nB*nAB*0.1111111111111111*nz; + if (!(nA*nB*nAB>0)) delta=0; + a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; + b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; + a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; + b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; + + Aq[5*Np+n] = a1; + Bq[5*Np+n] = b1; + Aq[6*Np+n] = a2; + Bq[6*Np+n] = b2; + //............................................... + + } + } +} + + +//__global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Init(double *dist, double *Porosity, int Np) +//{ +// int n; +// int S = Np/NBLOCKS/NTHREADS + 1; +// double porosity; +// for (int s=0; s>>(dist,Porosity,Np); +// cudaError_t err = cudaGetLastError(); +// if (cudaSuccess != err){ +// printf("CUDA error in ScaLBL_D3Q19_GreyscaleColor_Init: %s \n",cudaGetErrorString(err)); +// } +//} + +extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, + double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, + double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, + double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np){ + + //cudaProfilerStart(); + //cudaFuncSetCacheConfig(dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor, cudaFuncCachePreferL1); + + dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor<<>>(Map, dist, Aq, Bq, Den, Phi, GreySolidGrad, Poros, Perm, Vel, + rhoA, rhoB, tauA, tauB, tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, strideY, strideZ, start, finish, Np); + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleColor: %s \n",cudaGetErrorString(err)); + } + //cudaProfilerStop(); + +} + +extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *d_neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, + double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, + double rhoA, double rhoB, double tauA, double tauB, double tauA_eff,double tauB_eff, double alpha, double beta, + double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np){ + + //cudaProfilerStart(); + //cudaFuncSetCacheConfig(dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor, cudaFuncCachePreferL1); + + dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor<<>>(d_neighborList, Map, dist, Aq, Bq, Den, Phi, GreySolidGrad, Poros, Perm,Vel, + rhoA, rhoB, tauA, tauB, tauA_eff, tauB_eff,alpha, beta, Fx, Fy, Fz, strideY, strideZ, start, finish, Np); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleColor: %s \n",cudaGetErrorString(err)); + } + //cudaProfilerStop(); +} + diff --git a/gpu/GreyscaleSC.cu b/gpu/GreyscaleSC.cu index e22b7a50..309a9371 100644 --- a/gpu/GreyscaleSC.cu +++ b/gpu/GreyscaleSC.cu @@ -3215,7 +3215,7 @@ __global__ void dvc_ScaLBL_D3Q19_GreyscaleSC_Gradient(int *neighborList, int *Ma } } -__global__ void dvc_ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np) +__global__ void dvc_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 @@ -3228,7 +3228,7 @@ __global__ void dvc_ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, } } -__global__ void dvc_ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np) +__global__ void dvc_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 @@ -3764,18 +3764,18 @@ extern "C" void ScaLBL_D3Q19_GreyscaleSC_Gradient(int *neighborList, int *Map, d } -extern "C" void ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np){ +extern "C" void ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count){ int GRID = count / 512 + 1; - dvc_ScaLBL_GreyscaleSC_BC_z<<>>(list, Map, DenA, DenB, vA, vB, count, Np); + dvc_ScaLBL_GreyscaleSC_BC_z<<>>(list, Map, DenA, DenB, vA, vB, count); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ printf("CUDA error in ScaLBL_GreyscaleSC_BC_z: %s \n",cudaGetErrorString(err)); } } -extern "C" void ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count, int Np){ +extern "C" void ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count){ int GRID = count / 512 + 1; - dvc_ScaLBL_GreyscaleSC_BC_Z<<>>(list, Map, DenA, DenB, vA, vB, count, Np); + dvc_ScaLBL_GreyscaleSC_BC_Z<<>>(list, Map, DenA, DenB, vA, vB, count); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ printf("CUDA error in ScaLBL_GreyscaleSC_BC_Z: %s \n",cudaGetErrorString(err)); diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 3fef03d1..c7cabe04 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -1,7 +1,7 @@ /* color lattice boltzmann model */ -#include "models/ColorModel.h" +#include "models/GreyscaleColorModel.h" #include "analysis/distance.h" #include "analysis/morphology.h" #include "common/Communication.h" @@ -9,18 +9,18 @@ color lattice boltzmann model #include #include -ScaLBL_ColorModel::ScaLBL_ColorModel(int RANK, int NP, const Utilities::MPI& COMM): -rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),rhoA(0),rhoB(0),alpha(0),beta(0), -Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),inletA(0),inletB(0),outletA(0),outletB(0), -Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) +ScaLBL_GreyscaleColorModel::ScaLBL_GreyscaleColorModel(int RANK, int NP, const Utilities::MPI& COMM): +rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0),rhoA(0),rhoB(0),alpha(0),beta(0), +Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),inletA(0),inletB(0),outletA(0),outletB(0),GreyPorosity(0), +Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),greyMode(0),Lx(0),Ly(0),Lz(0),comm(COMM) { REVERSE_FLOW_DIRECTION = false; } -ScaLBL_ColorModel::~ScaLBL_ColorModel(){ +ScaLBL_GreyscaleColorModel::~ScaLBL_GreyscaleColorModel(){ } -/*void ScaLBL_ColorModel::WriteCheckpoint(const char *FILENAME, const double *cPhi, const double *cfq, int Np) +/*void ScaLBL_GreyscaleColorModel::WriteCheckpoint(const char *FILENAME, const double *cPhi, const double *cfq, int Np) { int q,n; double value; @@ -39,7 +39,7 @@ ScaLBL_ColorModel::~ScaLBL_ColorModel(){ } -void ScaLBL_ColorModel::ReadCheckpoint(char *FILENAME, double *cPhi, double *cfq, int Np) +void ScaLBL_GreyscaleColorModel::ReadCheckpoint(char *FILENAME, double *cPhi, double *cfq, int Np) { int q=0, n=0; double value=0; @@ -58,11 +58,11 @@ void ScaLBL_ColorModel::ReadCheckpoint(char *FILENAME, double *cPhi, double *cfq */ -void ScaLBL_ColorModel::ReadParams(string filename){ +void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ // read the input database db = std::make_shared( filename ); domain_db = db->getDatabase( "Domain" ); - color_db = db->getDatabase( "Color" ); + greyscaleColor_db = db->getDatabase( "Color" ); analysis_db = db->getDatabase( "Analysis" ); vis_db = db->getDatabase( "Visualization" ); @@ -76,46 +76,55 @@ void ScaLBL_ColorModel::ReadParams(string filename){ Restart=false; din=dout=1.0; flux=0.0; + greyMode=false; // Color Model parameters - if (color_db->keyExists( "timestepMax" )){ - timestepMax = color_db->getScalar( "timestepMax" ); + if (greyscaleColor_db->keyExists( "timestepMax" )){ + timestepMax = greyscaleColor_db->getScalar( "timestepMax" ); } - if (color_db->keyExists( "tauA" )){ - tauA = color_db->getScalar( "tauA" ); + if (greyscaleColor_db->keyExists( "tauA" )){ + tauA = greyscaleColor_db->getScalar( "tauA" ); } - if (color_db->keyExists( "tauB" )){ - tauB = color_db->getScalar( "tauB" ); + if (greyscaleColor_db->keyExists( "tauB" )){ + tauB = greyscaleColor_db->getScalar( "tauB" ); } - if (color_db->keyExists( "rhoA" )){ - rhoA = color_db->getScalar( "rhoA" ); + tauA_eff = greyscaleColor_db->getWithDefault( "tauA_eff", tauA ); + tauB_eff = greyscaleColor_db->getWithDefault( "tauB_eff", tauB ); + if (greyscaleColor_db->keyExists( "rhoA" )){ + rhoA = greyscaleColor_db->getScalar( "rhoA" ); } - if (color_db->keyExists( "rhoB" )){ - rhoB = color_db->getScalar( "rhoB" ); + if (greyscaleColor_db->keyExists( "rhoB" )){ + rhoB = greyscaleColor_db->getScalar( "rhoB" ); } - if (color_db->keyExists( "F" )){ - Fx = color_db->getVector( "F" )[0]; - Fy = color_db->getVector( "F" )[1]; - Fz = color_db->getVector( "F" )[2]; + if (greyscaleColor_db->keyExists( "F" )){ + Fx = greyscaleColor_db->getVector( "F" )[0]; + Fy = greyscaleColor_db->getVector( "F" )[1]; + Fz = greyscaleColor_db->getVector( "F" )[2]; } - if (color_db->keyExists( "alpha" )){ - alpha = color_db->getScalar( "alpha" ); + if (greyscaleColor_db->keyExists( "alpha" )){ + alpha = greyscaleColor_db->getScalar( "alpha" ); } - if (color_db->keyExists( "beta" )){ - beta = color_db->getScalar( "beta" ); + if (greyscaleColor_db->keyExists( "beta" )){ + beta = greyscaleColor_db->getScalar( "beta" ); } - if (color_db->keyExists( "Restart" )){ - Restart = color_db->getScalar( "Restart" ); + if (greyscaleColor_db->keyExists( "Restart" )){ + Restart = greyscaleColor_db->getScalar( "Restart" ); } - if (color_db->keyExists( "din" )){ - din = color_db->getScalar( "din" ); + if (greyscaleColor_db->keyExists( "din" )){ + din = greyscaleColor_db->getScalar( "din" ); } - if (color_db->keyExists( "dout" )){ - dout = color_db->getScalar( "dout" ); + if (greyscaleColor_db->keyExists( "dout" )){ + dout = greyscaleColor_db->getScalar( "dout" ); } - if (color_db->keyExists( "flux" )){ - flux = color_db->getScalar( "flux" ); + if (greyscaleColor_db->keyExists( "flux" )){ + flux = greyscaleColor_db->getScalar( "flux" ); } + if (greyscaleColor_db->keyExists("GreySolidLabels")|| + greyscaleColor_db->keyExists("GreySolidAffinity")|| + greyscaleColor_db->keyExists("PorosityList")|| + greyscaleColor_db->keyExists("PermeabilityList")){ + greyMode = true; + } inletA=1.f; inletB=0.f; outletA=0.f; @@ -128,7 +137,7 @@ void ScaLBL_ColorModel::ReadParams(string filename){ } // Override user-specified boundary condition for specific protocols - auto protocol = color_db->getWithDefault( "protocol", "none" ); + auto protocol = greyscaleColor_db->getWithDefault( "protocol", "none" ); if (protocol == "seed water"){ if (BoundaryCondition != 0 ){ BoundaryCondition = 0; @@ -152,7 +161,7 @@ void ScaLBL_ColorModel::ReadParams(string filename){ } } -void ScaLBL_ColorModel::SetDomain(){ +void ScaLBL_GreyscaleColorModel::SetDomain(){ Dm = std::shared_ptr(new Domain(domain_db,comm)); // full domain for analysis Mask = std::shared_ptr(new Domain(domain_db,comm)); // mask domain removes immobile phases // domain parameters @@ -177,15 +186,15 @@ void ScaLBL_ColorModel::SetDomain(){ nprocz = Dm->nprocz(); } -void ScaLBL_ColorModel::ReadInput(){ +void ScaLBL_GreyscaleColorModel::ReadInput(){ sprintf(LocalRankString,"%05d",rank); sprintf(LocalRankFilename,"%s%s","ID.",LocalRankString); sprintf(LocalRestartFile,"%s%s","Restart.",LocalRankString); - if (color_db->keyExists( "image_sequence" )){ - auto ImageList = color_db->getVector( "image_sequence"); - int IMAGE_INDEX = color_db->getWithDefault( "image_index", 0 ); + if (greyscaleColor_db->keyExists( "image_sequence" )){ + auto ImageList = greyscaleColor_db->getVector( "image_sequence"); + int IMAGE_INDEX = greyscaleColor_db->getWithDefault( "image_index", 0 ); std::string first_image = ImageList[IMAGE_INDEX]; Mask->Decomp(first_image); IMAGE_INDEX++; @@ -245,14 +254,28 @@ void ScaLBL_ColorModel::ReadInput(){ Averages->SetParams(rhoA,rhoB,tauA,tauB,Fx,Fy,Fz,alpha,beta); } -void ScaLBL_ColorModel::AssignComponentLabels(double *phase) +void ScaLBL_GreyscaleColorModel::AssignComponentLabels() { + // Initialize impermeability solid nodes and grey nodes + // Key input parameters: + // 1. ComponentLabels + // labels for various impermeable minerals and grey nodes + // 2. ComponentAffinity + // for impermeable minerals, this is same as the wettability phase field in the normal color model + // for grey nodes, this is effectively the initial phase field values + // **Convention for ComponentLabels: + // (1) zero and negative integers are for impermeability minerals + // (2) positive integers > 2 are for grey nodes + // (3) label = 1 and 2 are always conserved for open node of non-wetting and wetting phase, respectively. + double *phase; + phase = new double[N]; + size_t NLABELS=0; signed char VALUE=0; double AFFINITY=0.f; - auto LabelList = color_db->getVector( "ComponentLabels" ); - auto AffinityList = color_db->getVector( "ComponentAffinity" ); + auto LabelList = greyscaleColor_db->getVector( "ComponentLabels" ); + auto AffinityList = greyscaleColor_db->getVector( "ComponentAffinity" ); NLABELS=LabelList.size(); if (NLABELS != AffinityList.size()){ @@ -304,10 +327,300 @@ void ScaLBL_ColorModel::AssignComponentLabels(double *phase) } } + ScaLBL_CopyToDevice(Phi, phase, N*sizeof(double)); + ScaLBL_DeviceBarrier(); + delete [] phase; +} + +void ScaLBL_GreyscaleColorModel::AssignGreySolidLabels() +{ + // ONLY initialize grey nodes + // Key input parameters: + // 1. GreySolidLabels + // labels for grey nodes + // 2. GreySolidAffinity + // affinity ranges [-1,1] + // oil-wet > 0 + // water-wet < 0 + // neutral = 0 + double *SolidPotential_host = new double [Nx*Ny*Nz]; + double *GreySolidGrad_host = new double [3*Np]; + + size_t NLABELS=0; + signed char VALUE=0; + double AFFINITY=0.f; + + auto LabelList = greyscaleColor_db->getVector( "GreySolidLabels" ); + auto AffinityList = greyscaleColor_db->getVector( "GreySolidAffinity" ); + + NLABELS=LabelList.size(); + if (NLABELS != AffinityList.size()){ + ERROR("Error: GreySolidLabels and GreySolidAffinity must be the same length! \n"); + } + + double label_count[NLABELS]; + double label_count_global[NLABELS]; + // Assign the labels + + for (size_t idx=0; idxid[n] = 0; // set mask to zero since this is an immobile component + } + } + SolidPotential_host[n] = AFFINITY; + } + } + } + + // Calculate grey-solid color-gradient + double *Dst; + Dst = new double [3*3*3]; + for (int kk=0; kk<3; kk++){ + for (int jj=0; jj<3; jj++){ + for (int ii=0; ii<3; ii++){ + int index = kk*9+jj*3+ii; + Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); + } + } + } + double w_face = 1.f; + double w_edge = 0.5; + double w_corner = 0.f; + //local + Dst[13] = 0.f; + //faces + Dst[4] = w_face; + Dst[10] = w_face; + Dst[12] = w_face; + Dst[14] = w_face; + Dst[16] = w_face; + Dst[22] = w_face; + // corners + Dst[0] = w_corner; + Dst[2] = w_corner; + Dst[6] = w_corner; + Dst[8] = w_corner; + Dst[18] = w_corner; + Dst[20] = w_corner; + Dst[24] = w_corner; + Dst[26] = w_corner; + // edges + Dst[1] = w_edge; + Dst[3] = w_edge; + Dst[5] = w_edge; + Dst[7] = w_edge; + Dst[9] = w_edge; + Dst[11] = w_edge; + Dst[15] = w_edge; + Dst[17] = w_edge; + Dst[19] = w_edge; + Dst[21] = w_edge; + Dst[23] = w_edge; + Dst[25] = w_edge; + + for (int k=1; kComm.sumReduce( label_count[idx] ); + + if (rank==0){ + printf("Grey-solid labels: %lu \n",NLABELS); + for (unsigned int idx=0; idxgetVector( "GreySolidLabels" ); + auto PorosityList = greyscaleColor_db->getVector( "PorosityList" ); + auto PermeabilityList = greyscaleColor_db->getVector( "PermeabilityList" ); + + NLABELS=LabelList.size(); + if (LabelList.size() != PorosityList.size()){ + ERROR("Error: GreySolidLabels and PorosityList must be the same length! \n"); + } + + double label_count[NLABELS]; + double label_count_global[NLABELS]; + // Assign the labels + + for (int idx=0; idxid[n] = 0; // set mask to zero since this is an immobile component + } + } + int idx = Map(i,j,k); + if (!(idx < 0)){ + if (POROSITY<=0.0){ + ERROR("Error: Porosity for grey voxels must be 0.0 < Porosity <= 1.0 !\n"); + } + else{ + Porosity[idx] = POROSITY; + } + } + } + } + } + + if (NLABELS != PermeabilityList.size()){ + ERROR("Error: GreySolidLabels and PermeabilityList must be the same length! \n"); + } + for (int k=0;kid[n] = 0; // set mask to zero since this is an immobile component + } + } + int idx = Map(i,j,k); + if (!(idx < 0)){ + if (PERMEABILITY<=0.0){ + ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); + } + else{ + Permeability[idx] = PERMEABILITY/Dm->voxel_length/Dm->voxel_length; + } + } + } + } + } + + + // Set Dm to match Mask + for (int i=0; iid[i] = Mask->id[i]; + + for (int idx=0; idxComm.sumReduce(label_count[idx]); + + //Initialize a weighted porosity after considering grey voxels + GreyPorosity=0.0; + for (unsigned int idx=0; idxvoxel_length); + printf("Component labels: %lu \n",NLABELS); + for (unsigned int idx=0; idxvoxel_length/Dm->voxel_length,volume_fraction); + printf(" effective porosity=%.3g\n",volume_fraction*POROSITY); + } + printf("The weighted porosity, considering both open and grey voxels, is %.3g\n",GreyPorosity); + } + + ScaLBL_CopyToDevice(Porosity_dvc, Porosity, Np*sizeof(double)); + ScaLBL_CopyToDevice(Permeability_dvc, Permeability, Np*sizeof(double)); + ScaLBL_DeviceBarrier(); + delete [] Porosity; + delete [] Permeability; } -void ScaLBL_ColorModel::Create(){ +void ScaLBL_GreyscaleColorModel::Create(){ /* * This function creates the variables needed to run a LBM */ @@ -353,7 +666,12 @@ void ScaLBL_ColorModel::Create(){ ScaLBL_AllocateDeviceMemory((void **) &Phi, sizeof(double)*Nx*Ny*Nz); ScaLBL_AllocateDeviceMemory((void **) &Pressure, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &ColorGrad, 3*sizeof(double)*Np); + if (greyMode==true){ + ScaLBL_AllocateDeviceMemory((void **) &GreySolidGrad, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Porosity_dvc, sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &Permeability_dvc, sizeof(double)*Np); + } + //ScaLBL_AllocateDeviceMemory((void **) &ColorGrad, 3*sizeof(double)*Np); //........................................................................... // Update GPU data structures if (rank==0) printf ("Setting up device map and neighbor list \n"); @@ -390,21 +708,21 @@ void ScaLBL_ColorModel::Create(){ // copy the neighbor list ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); - // initialize phi based on PhaseLabel (include solid component labels) - double *PhaseLabel; - PhaseLabel = new double[N]; - AssignComponentLabels(PhaseLabel); - ScaLBL_CopyToDevice(Phi, PhaseLabel, N*sizeof(double)); + + // initialize phi based on PhaseLabel (include solid component labels) + AssignComponentLabels();//do open/black/grey nodes initialization + if (greyMode==true){ + AssignGreySolidLabels(); + AssignGreyPoroPermLabels(); + } } -/******************************************************** - * AssignComponentLabels * - ********************************************************/ -void ScaLBL_ColorModel::Initialize(){ +void ScaLBL_GreyscaleColorModel::Initialize(){ if (rank==0) printf ("Initializing distributions \n"); ScaLBL_D3Q19_Init(fq, Np); + //ScaLBL_D3Q19_GreyscaleColor_Init(fq, Porosity_dvc, Np); /* * This function initializes model */ @@ -487,7 +805,7 @@ void ScaLBL_ColorModel::Initialize(){ ScaLBL_CopyToHost(Averages->Phi.data(),Phi,N*sizeof(double)); } -void ScaLBL_ColorModel::Run(){ +void ScaLBL_GreyscaleColorModel::Run(){ int nprocs=nprocx*nprocy*nprocz; const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); @@ -529,23 +847,23 @@ void ScaLBL_ColorModel::Run(){ double log_krA_target = 1.0; double log_krA = 0.0; double slope_krA_volume = 0.0; - if (color_db->keyExists( "vol_A_previous" )){ - volA_prev = color_db->getScalar( "vol_A_previous" ); + if (greyscaleColor_db->keyExists( "vol_A_previous" )){ + volA_prev = greyscaleColor_db->getScalar( "vol_A_previous" ); } - if (color_db->keyExists( "log_krA_previous" )){ - log_krA_prev = color_db->getScalar( "log_krA_previous" ); + if (greyscaleColor_db->keyExists( "log_krA_previous" )){ + log_krA_prev = greyscaleColor_db->getScalar( "log_krA_previous" ); } - if (color_db->keyExists( "krA_morph_factor" )){ - KRA_MORPH_FACTOR = color_db->getScalar( "krA_morph_factor" ); + if (greyscaleColor_db->keyExists( "krA_morph_factor" )){ + KRA_MORPH_FACTOR = greyscaleColor_db->getScalar( "krA_morph_factor" ); } /* defaults for simulation protocols */ - auto protocol = color_db->getWithDefault( "protocol", "none" ); + auto protocol = greyscaleColor_db->getWithDefault( "protocol", "none" ); if (protocol == "image sequence"){ // Get the list of images USE_DIRECT = true; - ImageList = color_db->getVector( "image_sequence"); - IMAGE_INDEX = color_db->getWithDefault( "image_index", 0 ); + ImageList = greyscaleColor_db->getVector( "image_sequence"); + IMAGE_INDEX = greyscaleColor_db->getWithDefault( "image_index", 0 ); IMAGE_COUNT = ImageList.size(); morph_interval = 10000; USE_MORPH = true; @@ -566,28 +884,28 @@ void ScaLBL_ColorModel::Run(){ USE_MORPH = true; } - if (color_db->keyExists( "residual_endpoint_threshold" )){ - RESIDUAL_ENDPOINT_THRESHOLD = color_db->getScalar( "residual_endpoint_threshold" ); + if (greyscaleColor_db->keyExists( "residual_endpoint_threshold" )){ + RESIDUAL_ENDPOINT_THRESHOLD = greyscaleColor_db->getScalar( "residual_endpoint_threshold" ); } NULL_USE( RESIDUAL_ENDPOINT_THRESHOLD ); - if (color_db->keyExists( "noise_threshold" )){ - NOISE_THRESHOLD = color_db->getScalar( "noise_threshold" ); + if (greyscaleColor_db->keyExists( "noise_threshold" )){ + NOISE_THRESHOLD = greyscaleColor_db->getScalar( "noise_threshold" ); USE_BUMP_RATE = true; } - if (color_db->keyExists( "bump_rate" )){ - BUMP_RATE = color_db->getScalar( "bump_rate" ); + if (greyscaleColor_db->keyExists( "bump_rate" )){ + BUMP_RATE = greyscaleColor_db->getScalar( "bump_rate" ); USE_BUMP_RATE = true; } - if (color_db->keyExists( "capillary_number" )){ - capillary_number = color_db->getScalar( "capillary_number" ); + if (greyscaleColor_db->keyExists( "capillary_number" )){ + capillary_number = greyscaleColor_db->getScalar( "capillary_number" ); SET_CAPILLARY_NUMBER=true; //RESCALE_FORCE_MAX = 1; } // if (analysis_db->keyExists( "rescale_force_count" )){ // RESCALE_FORCE_MAX = analysis_db->getScalar( "rescale_force_count" ); // } - if (color_db->keyExists( "timestep" )){ - timestep = color_db->getScalar( "timestep" ); + if (greyscaleColor_db->keyExists( "timestep" )){ + timestep = greyscaleColor_db->getScalar( "timestep" ); } if (BoundaryCondition != 0 && SET_CAPILLARY_NUMBER==true){ if (rank == 0) printf("WARINING: capillary number target only supported for BC = 0 \n"); @@ -699,9 +1017,15 @@ void ScaLBL_ColorModel::Run(){ } // Halo exchange for phase field ScaLBL_Comm_Regular->SendHalo(Phi); - - ScaLBL_D3Q19_AAodd_Color(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, - alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + if (greyMode==true){ + ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, + rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, + alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + } + else{ + ScaLBL_D3Q19_AAodd_Color(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, + alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + } ScaLBL_Comm_Regular->RecvHalo(Phi); ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); @@ -714,8 +1038,15 @@ void ScaLBL_ColorModel::Run(){ din = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fq, flux, timestep); ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); } - ScaLBL_D3Q19_AAodd_Color(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, - alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + if (greyMode==true){ + ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, + rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, + alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + } + else{ + ScaLBL_D3Q19_AAodd_Color(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, + alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + } ScaLBL_DeviceBarrier(); comm.barrier(); @@ -736,8 +1067,15 @@ void ScaLBL_ColorModel::Run(){ ScaLBL_Comm->Color_BC_Z(dvcMap, Phi, Den, outletA, outletB); } ScaLBL_Comm_Regular->SendHalo(Phi); - ScaLBL_D3Q19_AAeven_Color(dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, - alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + if (greyMode==true){ + ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, + rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, + alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + } + else{ + ScaLBL_D3Q19_AAeven_Color(dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, + alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + } ScaLBL_Comm_Regular->RecvHalo(Phi); ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE ScaLBL_DeviceBarrier(); @@ -750,8 +1088,15 @@ void ScaLBL_ColorModel::Run(){ din = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fq, flux, timestep); ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); } - ScaLBL_D3Q19_AAeven_Color(dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, - alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + if (greyMode==true){ + ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, + rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, + alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + } + else{ + ScaLBL_D3Q19_AAeven_Color(dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, + alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + } ScaLBL_DeviceBarrier(); comm.barrier(); //************************************************************************ @@ -810,7 +1155,7 @@ void ScaLBL_ColorModel::Run(){ } if (rank == 0) printf(" -- adjust force by factor %f \n ",capillary_number / Ca); Averages->SetParams(rhoA,rhoB,tauA,tauB,Fx,Fy,Fz,alpha,beta); - color_db->putVector("F",{Fx,Fy,Fz}); + greyscaleColor_db->putVector("F",{Fx,Fy,Fz}); } if ( morph_timesteps > morph_interval ){ @@ -919,13 +1264,13 @@ void ScaLBL_ColorModel::Run(){ Fy *= BUMP_RATE; Fz *= BUMP_RATE; capillary_number *= BUMP_RATE; - color_db->putScalar("capillary_number",capillary_number); - current_db->putDatabase("Color", color_db); + greyscaleColor_db->putScalar("capillary_number",capillary_number); + current_db->putDatabase("Color", greyscaleColor_db); MORPH_ADAPT = false; // re-run current point if below noise threshold } if (rank == 0) printf(" -- adjust force by factor %f \n ",capillary_number / Ca); Averages->SetParams(rhoA,rhoB,tauA,tauB,Fx,Fy,Fz,alpha,beta); - color_db->putVector("F",{Fx,Fy,Fz}); + greyscaleColor_db->putVector("F",{Fx,Fy,Fz}); } CURRENT_STEADY_TIMESTEPS = 0; @@ -949,8 +1294,8 @@ void ScaLBL_ColorModel::Run(){ if (IMAGE_INDEX < IMAGE_COUNT){ std::string next_image = ImageList[IMAGE_INDEX]; if (rank==0) printf("***Loading next image in sequence (%i) ***\n",IMAGE_INDEX); - color_db->putScalar("image_index",IMAGE_INDEX); - ImageInit(next_image); + greyscaleColor_db->putScalar("image_index",IMAGE_INDEX); + //ImageInit(next_image); } else{ if (rank==0) printf("Finished simulating image sequence \n"); @@ -1031,53 +1376,54 @@ void ScaLBL_ColorModel::Run(){ // ************************************************************************ } -double ScaLBL_ColorModel::ImageInit(std::string Filename){ - - if (rank==0) printf("Re-initializing fluids from file: %s \n", Filename.c_str()); - Mask->Decomp(Filename); - for (int i=0; iid[i]; // save what was read - for (int i=0; iid[i] = Mask->id[i]; // save what was read +//double ScaLBL_GreyscaleColorModel::ImageInit(std::string Filename){ +// +// if (rank==0) printf("Re-initializing fluids from file: %s \n", Filename.c_str()); +// Mask->Decomp(Filename); +// for (int i=0; iid[i]; // save what was read +// for (int i=0; iid[i] = Mask->id[i]; // save what was read +// +// //double *PhaseLabel; +// //PhaseLabel = new double[Nx*Ny*Nz]; +// //AssignComponentLabels(PhaseLabel); +// AssignComponentLabels(); +// +// double Count = 0.0; +// double PoreCount = 0.0; +// for (int k=1; kComm.sumReduce( Count ); +// PoreCount = Dm->Comm.sumReduce( PoreCount ); +// +// if (rank==0) printf(" new saturation: %f (%f / %f) \n", Count / PoreCount, Count, PoreCount); +// ScaLBL_CopyToDevice(Phi, PhaseLabel, Nx*Ny*Nz*sizeof(double)); +// comm.barrier(); +// +// ScaLBL_D3Q19_Init(fq, Np); +// ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np); +// ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); +// comm.barrier(); +// +// ScaLBL_CopyToHost(Averages->Phi.data(),Phi,Nx*Ny*Nz*sizeof(double)); +// +// double saturation = Count/PoreCount; +// return saturation; +// +//} - double *PhaseLabel; - PhaseLabel = new double[Nx*Ny*Nz]; - AssignComponentLabels(PhaseLabel); - - double Count = 0.0; - double PoreCount = 0.0; - for (int k=1; kComm.sumReduce( Count ); - PoreCount = Dm->Comm.sumReduce( PoreCount ); - - if (rank==0) printf(" new saturation: %f (%f / %f) \n", Count / PoreCount, Count, PoreCount); - ScaLBL_CopyToDevice(Phi, PhaseLabel, Nx*Ny*Nz*sizeof(double)); - comm.barrier(); - - ScaLBL_D3Q19_Init(fq, Np); - ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - comm.barrier(); - - ScaLBL_CopyToHost(Averages->Phi.data(),Phi,Nx*Ny*Nz*sizeof(double)); - - double saturation = Count/PoreCount; - return saturation; - -} - -double ScaLBL_ColorModel::MorphOpenConnected(double target_volume_change){ +double ScaLBL_GreyscaleColorModel::MorphOpenConnected(double target_volume_change){ int nx = Nx; int ny = Ny; @@ -1220,7 +1566,7 @@ double ScaLBL_ColorModel::MorphOpenConnected(double target_volume_change){ return(volume_change); } -double ScaLBL_ColorModel::SeedPhaseField(const double seed_water_in_oil){ +double ScaLBL_GreyscaleColorModel::SeedPhaseField(const double seed_water_in_oil){ srand(time(NULL)); double mass_loss =0.f; double count =0.f; @@ -1307,7 +1653,7 @@ double ScaLBL_ColorModel::SeedPhaseField(const double seed_water_in_oil){ return(mass_loss); } -//double ScaLBL_ColorModel::SeedPhaseField(const double seed_water_in_oil){ +//double ScaLBL_GreyscaleColorModel::SeedPhaseField(const double seed_water_in_oil){ // srand(time(NULL)); // double mass_loss =0.f; // double count =0.f; @@ -1401,7 +1747,7 @@ double ScaLBL_ColorModel::SeedPhaseField(const double seed_water_in_oil){ // return(mass_loss); //} -double ScaLBL_ColorModel::MorphInit(const double beta, const double target_delta_volume){ +double ScaLBL_GreyscaleColorModel::MorphInit(const double beta, const double target_delta_volume){ const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); double vF = 0.f; @@ -1585,7 +1931,7 @@ double ScaLBL_ColorModel::MorphInit(const double beta, const double target_delta return delta_volume; } -void ScaLBL_ColorModel::WriteDebug(){ +void ScaLBL_GreyscaleColorModel::WriteDebug(){ // Copy back final phase indicator field and convert to regular layout DoubleArray PhaseField(Nx,Ny,Nz); //ScaLBL_Comm->RegularLayout(Map,Phi,PhaseField); @@ -1639,6 +1985,41 @@ void ScaLBL_ColorModel::WriteDebug(){ fwrite(PhaseField.data(),8,N,VELZ_FILE); fclose(VELZ_FILE); + ScaLBL_Comm->RegularLayout(Map,&Porosity_dvc[0],PhaseField); + FILE *POROS_FILE; + sprintf(LocalRankFilename,"Porosity.%05i.raw",rank); + POROS_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,POROS_FILE); + fclose(POROS_FILE); + + ScaLBL_Comm->RegularLayout(Map,&Permeability_dvc[0],PhaseField); + FILE *PERM_FILE; + sprintf(LocalRankFilename,"Permeability.%05i.raw",rank); + PERM_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,PERM_FILE); + fclose(PERM_FILE); + + ScaLBL_Comm->RegularLayout(Map,&GreySolidGrad[0],PhaseField); + FILE *GreySG_X_FILE; + sprintf(LocalRankFilename,"GreySolidGrad_X.%05i.raw",rank); + GreySG_X_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,GreySG_X_FILE); + fclose(GreySG_X_FILE); + + ScaLBL_Comm->RegularLayout(Map,&GreySolidGrad[Np],PhaseField); + FILE *GreySG_Y_FILE; + sprintf(LocalRankFilename,"GreySolidGrad_Y.%05i.raw",rank); + GreySG_Y_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,GreySG_Y_FILE); + fclose(GreySG_Y_FILE); + + ScaLBL_Comm->RegularLayout(Map,&GreySolidGrad[2*Np],PhaseField); + FILE *GreySG_Z_FILE; + sprintf(LocalRankFilename,"GreySolidGrad_Z.%05i.raw",rank); + GreySG_Z_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,GreySG_Z_FILE); + fclose(GreySG_Z_FILE); + // ScaLBL_Comm->RegularLayout(Map,&ColorGrad[0],PhaseField); // FILE *CGX_FILE; // sprintf(LocalRankFilename,"Gradient_X.%05i.raw",rank); diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h index c52f04c3..64e3f1e3 100644 --- a/models/GreyscaleColorModel.h +++ b/models/GreyscaleColorModel.h @@ -16,10 +16,10 @@ Implementation of color lattice boltzmann model #include "ProfilerApp.h" #include "threadpool/thread_pool.h" -class ScaLBL_ColorModel{ +class ScaLBL_GreyscaleColorModel{ public: - ScaLBL_ColorModel(int RANK, int NP, const Utilities::MPI& COMM); - ~ScaLBL_ColorModel(); + ScaLBL_GreyscaleColorModel(int RANK, int NP, const Utilities::MPI& COMM); + ~ScaLBL_GreyscaleColorModel(); // functions in they should be run void ReadParams(string filename); @@ -36,8 +36,11 @@ public: int timestep,timestepMax; int BoundaryCondition; double tauA,tauB,rhoA,rhoB,alpha,beta; + double tauA_eff,tauB_eff; double Fx,Fy,Fz,flux; double din,dout,inletA,inletB,outletA,outletB; + double GreyPorosity; + bool greyMode;//run greyColor model if true int Nx,Ny,Nz,N,Np; int rank,nprocx,nprocy,nprocz,nprocs; @@ -53,7 +56,7 @@ public: // input database std::shared_ptr db; std::shared_ptr domain_db; - std::shared_ptr color_db; + std::shared_ptr greyscaleColor_db; std::shared_ptr analysis_db; std::shared_ptr vis_db; @@ -63,9 +66,12 @@ public: int *dvcMap; double *fq, *Aq, *Bq; double *Den, *Phi; - double *ColorGrad; + double *GreySolidGrad; + //double *ColorGrad; double *Velocity; double *Pressure; + double *Porosity_dvc; + double *Permeability_dvc; private: Utilities::MPI comm; @@ -79,7 +85,9 @@ private: //int rank,nprocs; void LoadParams(std::shared_ptr db0); - void AssignComponentLabels(double *phase); + void AssignComponentLabels(); + void AssignGreySolidLabels(); + void AssignGreyPoroPermLabels(); double ImageInit(std::string filename); double MorphInit(const double beta, const double morph_delta); double SeedPhaseField(const double seed_water_in_oil); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 362d020e..567b43c3 100755 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -6,6 +6,7 @@ ADD_LBPM_EXECUTABLE( lbpm_permeability_simulator ) ADD_LBPM_EXECUTABLE( lbpm_greyscale_simulator ) ADD_LBPM_EXECUTABLE( lbpm_greyscaleFE_simulator ) ADD_LBPM_EXECUTABLE( lbpm_greyscaleSC_simulator ) +ADD_LBPM_EXECUTABLE( lbpm_greyscaleColor_simulator ) #ADD_LBPM_EXECUTABLE( lbpm_BGK_simulator ) #ADD_LBPM_EXECUTABLE( lbpm_color_macro_simulator ) ADD_LBPM_EXECUTABLE( lbpm_dfh_simulator ) diff --git a/tests/lbpm_greyscaleColor_simulator.cpp b/tests/lbpm_greyscaleColor_simulator.cpp new file mode 100644 index 00000000..3f9fdd19 --- /dev/null +++ b/tests/lbpm_greyscaleColor_simulator.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "common/ScaLBL.h" +#include "common/Communication.h" +#include "common/MPI.h" +#include "models/GreyscaleColorModel.h" +//#define WRITE_SURFACES + +using namespace std; + + +int main(int argc, char **argv) +{ + //***************************************** + // ***** MPI STUFF **************** + //***************************************** + // Initialize MPI + int rank,nprocs; + MPI_Init(&argc,&argv); + MPI_Comm comm = MPI_COMM_WORLD; + MPI_Comm_rank(comm,&rank); + MPI_Comm_size(comm,&nprocs); + { + // parallel domain size (# of sub-domains) + int nprocx,nprocy,nprocz; + int iproc,jproc,kproc; + + if (rank == 0){ + printf("****************************************\n"); + printf("Running Greyscale Two-Phase Calculation \n"); + printf("****************************************\n"); + } + // Initialize compute device + int device=ScaLBL_SetDevice(rank); + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); + + ScaLBL_GreyscaleColorModel GreyscaleColor(rank,nprocs,comm); + auto filename = argv[1]; + GreyscaleColor.ReadParams(filename); + GreyscaleColor.SetDomain(); // this reads in the domain + GreyscaleColor.ReadInput(); + GreyscaleColor.Create(); // creating the model will create data structure to match the pore structure and allocate variables + GreyscaleColor.Initialize(); // initializing the model will set initial conditions for variables + GreyscaleColor.Run(); + GreyscaleColor.WriteDebug(); + } + // **************************************************** + MPI_Barrier(comm); + MPI_Finalize(); + // **************************************************** +} From 4434bfe2825061beb17a0ee0f3b0342b9cec63a8 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Mon, 22 Jun 2020 13:39:51 -0400 Subject: [PATCH 43/75] GPU only, make greyscaleColor equivalent single-phase model available --- common/ScaLBL.h | 5 + gpu/Greyscale.cu | 1070 ++++++++++++++++++++++++++++ models/GreyscaleModel.cpp | 21 +- tests/lbpm_greyscale_simulator.cpp | 2 +- 4 files changed, 1096 insertions(+), 2 deletions(-) diff --git a/common/ScaLBL.h b/common/ScaLBL.h index a74c54a2..de91e790 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -72,6 +72,11 @@ extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_IMRT(double *dist, int start, int extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz, double *Poros,double *Perm, double *Velocity,double Den,double *Pressure); +extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz, + double *Poros,double *Perm, double *Velocity,double Den,double *Pressure); + +extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz, + double *Poros,double *Perm, double *Velocity,double Den,double *Pressure); // GREYSCALE FREE-ENERGY MODEL (Two-component) extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFE(double *dist, double *Aq, double *Bq, double *Den, diff --git a/gpu/Greyscale.cu b/gpu/Greyscale.cu index 19b3ccec..63b3ccc8 100644 --- a/gpu/Greyscale.cu +++ b/gpu/Greyscale.cu @@ -1590,6 +1590,1056 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double } } +__global__ void dvc_ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double rho0, double *Pressure){ + + int n, nread; + int nr1,nr2,nr3,nr4,nr5,nr6; + int nr7,nr8,nr9,nr10; + int nr11,nr12,nr13,nr14; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double rho,jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; + double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double rlx_setA = rlx; + double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); + + const double mrt_V1=0.05263157894736842; + const double mrt_V2=0.012531328320802; + const double mrt_V3=0.04761904761904762; + const double mrt_V4=0.004594820384294068; + const double mrt_V5=0.01587301587301587; + const double mrt_V6=0.0555555555555555555555555; + const double mrt_V7=0.02777777777777778; + const double mrt_V8=0.08333333333333333; + const double mrt_V9=0.003341687552213868; + const double mrt_V10=0.003968253968253968; + const double mrt_V11=0.01388888888888889; + const double mrt_V12=0.04166666666666666; + + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s even part of dist) + //fq = dist[nread]; // reading the f2 data into register fq + nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nr2]; // reading the f2 data into register fq + rho += fq; + m1 -= 11.0*(fq); + m2 -= 4.0*(fq); + jx -= fq; + m4 += 4.0*(fq); + m9 += 2.0*(fq); + m10 -= 4.0*(fq); + + // q=3 + //nread = neighborList[n+2*Np]; // neighbor 4 + //fq = dist[nread]; + nr3 = neighborList[n+2*Np]; // neighbor 4 + fq = dist[nr3]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy = fq; + m6 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 = fq; + m12 = -2.0*fq; + + // q = 4 + //nread = neighborList[n+3*Np]; // neighbor 3 + //fq = dist[nread]; + nr4 = neighborList[n+3*Np]; // neighbor 3 + fq = dist[nr4]; + rho+= fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy -= fq; + m6 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 += fq; + m12 -= 2.0*fq; + + // q=5 + //nread = neighborList[n+4*Np]; + //fq = dist[nread]; + nr5 = neighborList[n+4*Np]; + fq = dist[nr5]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz = fq; + m8 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + + // q = 6 + //nread = neighborList[n+5*Np]; + //fq = dist[nread]; + nr6 = neighborList[n+5*Np]; + fq = dist[nr6]; + rho+= fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz -= fq; + m8 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q=7 + //nread = neighborList[n+6*Np]; + //fq = dist[nread]; + nr7 = neighborList[n+6*Np]; + fq = dist[nr7]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 = fq; + m16 = fq; + m17 = -fq; + + // q = 8 + //nread = neighborList[n+7*Np]; + //fq = dist[nread]; + nr8 = neighborList[n+7*Np]; + fq = dist[nr8]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 += fq; + m16 -= fq; + m17 += fq; + + // q=9 + //nread = neighborList[n+8*Np]; + //fq = dist[nread]; + nr9 = neighborList[n+8*Np]; + fq = dist[nr9]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 += fq; + m17 += fq; + + // q = 10 + //nread = neighborList[n+9*Np]; + //fq = dist[nread]; + nr10 = neighborList[n+9*Np]; + fq = dist[nr10]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 -= fq; + m17 -= fq; + + // q=11 + //nread = neighborList[n+10*Np]; + //fq = dist[nread]; + nr11 = neighborList[n+10*Np]; + fq = dist[nr11]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 = fq; + m16 -= fq; + m18 = fq; + + // q=12 + //nread = neighborList[n+11*Np]; + //fq = dist[nread]; + nr12 = neighborList[n+11*Np]; + fq = dist[nr12]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 += fq; + m16 += fq; + m18 -= fq; + + // q=13 + //nread = neighborList[n+12*Np]; + //fq = dist[nread]; + nr13 = neighborList[n+12*Np]; + fq = dist[nr13]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 -= fq; + m18 -= fq; + + // q=14 + //nread = neighborList[n+13*Np]; + //fq = dist[nread]; + nr14 = neighborList[n+13*Np]; + fq = dist[nr14]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 += fq; + m18 += fq; + + // q=15 + nread = neighborList[n+14*Np]; + fq = dist[nread]; + //fq = dist[17*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 = fq; + m17 += fq; + m18 -= fq; + + // q=16 + nread = neighborList[n+15*Np]; + fq = dist[nread]; + //fq = dist[8*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 += fq; + m17 -= fq; + m18 += fq; + + // q=17 + //fq = dist[18*Np+n]; + nread = neighborList[n+16*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 += fq; + m18 += fq; + + // q=18 + nread = neighborList[n+17*Np]; + fq = dist[nread]; + //fq = dist[9*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 -= fq; + m18 -= fq; + //---------------------------------------------------------------------// + + porosity = Poros[n]; + perm = Perm[n]; + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*porosity*Gx; + vy = jy/rho0+0.5*porosity*Gy; + vz = jz/rho0+0.5*porosity*Gz; + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz); + if (porosity==1.0){ + Fx=rho0*Gx; + Fy=rho0*Gy; + Fz=rho0*Gz; + } + + //Calculate pressure for MRT model + pressure=rho/3.f; + + //-------------------- MRT collison where body force has NO higher-order terms -------------// + m1 = m1 + rlx_setA*((19*(ux*ux+uy*uy+uz*uz)*rho0/porosity - 11*rho) - m1); + m2 = m2 + rlx_setA*((3*rho - 5.5*(ux*ux+uy*uy+uz*uz)*rho0/porosity) - m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0)- m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0)- m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0)- m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*(((2*ux*ux-uy*uy-uz*uz)*rho0/porosity) - m9); + m10 = m10 + rlx_setA*( - m10); + //m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + rlx_setA*(((uy*uy-uz*uz)*rho0/porosity) - m11); + m12 = m12 + rlx_setA*( - m12); + //m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_setA*( (ux*uy*rho0/porosity) - m13); + m14 = m14 + rlx_setA*( (uy*uz*rho0/porosity) - m14); + m15 = m15 + rlx_setA*( (ux*uz*rho0/porosity) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... + + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + //nread = neighborList[n+Np]; + dist[nr2] = fq; + + // q=2 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + //nread = neighborList[n]; + dist[nr1] = fq; + + // q = 3 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+3*Np]; + dist[nr4] = fq; + + // q = 4 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+2*Np]; + dist[nr3] = fq; + + // q = 5 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+5*Np]; + dist[nr6] = fq; + + // q = 6 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+4*Np]; + dist[nr5] = fq; + + // q = 7 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+ + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + //nread = neighborList[n+7*Np]; + dist[nr8] = fq; + + // q = 8 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 + +mrt_V12*m12+0.25*m13+0.125*(m17-m16); + //nread = neighborList[n+6*Np]; + dist[nr7] = fq; + + // q = 9 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+ + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + //nread = neighborList[n+9*Np]; + dist[nr10] = fq; + + // q = 10 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+ + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + //nread = neighborList[n+8*Np]; + dist[nr9] = fq; + + // q = 11 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) + +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 + -mrt_V12*m12+0.25*m15+0.125*(m18-m16); + //nread = neighborList[n+11*Np]; + dist[nr12] = fq; + + // q = 12 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ + mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + //nread = neighborList[n+10*Np]; + dist[nr11]= fq; + + // q = 13 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) + +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 + -mrt_V12*m12-0.25*m15-0.125*(m16+m18); + //nread = neighborList[n+13*Np]; + dist[nr14] = fq; + + // q= 14 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) + +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 + -mrt_V12*m12-0.25*m15+0.125*(m16+m18); + //nread = neighborList[n+12*Np]; + dist[nr13] = fq; + + + // q = 15 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + nread = neighborList[n+15*Np]; + dist[nread] = fq; + + // q = 16 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + nread = neighborList[n+14*Np]; + dist[nread] = fq; + + + // q = 17 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) + -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + nread = neighborList[n+17*Np]; + dist[nread] = fq; + + // q = 18 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) + -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + nread = neighborList[n+16*Np]; + dist[nread] = fq; + //........................................................................ + + //Update velocity on device + Velocity[0*Np+n] = ux; + Velocity[1*Np+n] = uy; + Velocity[2*Np+n] = uz; + //Update pressure on device + Pressure[n] = pressure; + } + } +} + +__global__ void dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz, + double *Poros,double *Perm, double *Velocity,double rho0, double *Pressure){ + + int n; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double rho,jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; + double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double rlx_setA = rlx; + double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); + + const double mrt_V1=0.05263157894736842; + const double mrt_V2=0.012531328320802; + const double mrt_V3=0.04761904761904762; + const double mrt_V4=0.004594820384294068; + const double mrt_V5=0.01587301587301587; + const double mrt_V6=0.0555555555555555555555555; + const double mrt_V7=0.02777777777777778; + const double mrt_V8=0.08333333333333333; + const double mrt_V9=0.003341687552213868; + const double mrt_V10=0.003968253968253968; + const double mrt_V11=0.01388888888888889; + const double mrt_V12=0.04166666666666666; + + + int S = Np/NBLOCKS/NTHREADS + 1; + for (int s=0; s>>(neighborList,dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,rho0,Pressure); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAodd_Greyscale_MRT: %s \n",cudaGetErrorString(err)); + } +} + +extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Fx, double Fy, double Fz,double *Poros,double *Perm, double *Velocity,double rho0,double *Pressure){ + + dvc_ScaLBL_D3Q19_AAeven_Greyscale_MRT<<>>(dist,start,finish,Np,rlx,rlx_eff,Fx,Fy,Fz,Poros,Perm,Velocity,rho0,Pressure); + + cudaError_t err = cudaGetLastError(); + if (cudaSuccess != err){ + printf("CUDA error in ScaLBL_D3Q19_AAeven_Greyscale_MRT: %s \n",cudaGetErrorString(err)); + } +} + extern "C" void ScaLBL_D3Q19_GreyIMRT_Init(double *dist, int Np, double Den){ dvc_ScaLBL_D3Q19_GreyIMRT_Init<<>>(dist, Np, Den); cudaError_t err = cudaGetLastError(); diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index 08cf09b5..9ca98cd5 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -44,7 +44,7 @@ void ScaLBL_GreyscaleModel::ReadParams(string filename){ din=dout=1.0; flux=0.0; dp = 10.0; //unit of 'dp': voxel - CollisionType = 1; //1: IMRT; 2: BGK + CollisionType = 1; //1: IMRT; 2: BGK; 3: MRT // ---------------------- Greyscale Model parameters -----------------------// if (greyscale_db->keyExists( "timestepMax" )){ @@ -84,6 +84,9 @@ void ScaLBL_GreyscaleModel::ReadParams(string filename){ if (collision == "BGK"){ CollisionType=2; } + else if (collision == "MRT"){ + CollisionType=3; + } // ------------------------------------------------------------------------// //------------------------ Other Domain parameters ------------------------// @@ -360,6 +363,10 @@ void ScaLBL_GreyscaleModel::Initialize(){ ScaLBL_D3Q19_Init(fq, Np); if (rank==0) printf("Collision model: BGK.\n"); } + else if (CollisionType==3){ + ScaLBL_D3Q19_Init(fq, Np); + if (rank==0) printf("Collision model: MRT.\n"); + } else{ if (rank==0) printf("Unknown collison type! IMRT collision is used.\n"); ScaLBL_D3Q19_GreyIMRT_Init(fq, Np, Den); @@ -441,6 +448,9 @@ void ScaLBL_GreyscaleModel::Run(){ case 2: ScaLBL_D3Q19_AAodd_Greyscale(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); break; + case 3: + ScaLBL_D3Q19_AAodd_Greyscale_MRT(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; default: ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); break; @@ -459,6 +469,9 @@ void ScaLBL_GreyscaleModel::Run(){ case 2: ScaLBL_D3Q19_AAodd_Greyscale(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); break; + case 3: + ScaLBL_D3Q19_AAodd_Greyscale_MRT(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; default: ScaLBL_D3Q19_AAodd_Greyscale_IMRT(NeighborList, fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); break; @@ -475,6 +488,9 @@ void ScaLBL_GreyscaleModel::Run(){ case 2: ScaLBL_D3Q19_AAeven_Greyscale(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); break; + case 3: + ScaLBL_D3Q19_AAeven_Greyscale_MRT(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; default: ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); break; @@ -493,6 +509,9 @@ void ScaLBL_GreyscaleModel::Run(){ case 2: ScaLBL_D3Q19_AAeven_Greyscale(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Pressure_dvc); break; + case 3: + ScaLBL_D3Q19_AAeven_Greyscale_MRT(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); + break; default: ScaLBL_D3Q19_AAeven_Greyscale_IMRT(fq, 0, ScaLBL_Comm->LastExterior(), Np, rlx, rlx_eff, Fx, Fy, Fz,Porosity,Permeability,Velocity,Den,Pressure_dvc); break; diff --git a/tests/lbpm_greyscale_simulator.cpp b/tests/lbpm_greyscale_simulator.cpp index a54b6fc4..de815906 100644 --- a/tests/lbpm_greyscale_simulator.cpp +++ b/tests/lbpm_greyscale_simulator.cpp @@ -54,7 +54,7 @@ int main(int argc, char **argv) Greyscale.Create(); // creating the model will create data structure to match the pore structure and allocate variables Greyscale.Initialize(); // initializing the model will set initial conditions for variables Greyscale.Run(); - //Greyscale.VelocityField(); + Greyscale.VelocityField(); //Greyscale.WriteDebug(); } // **************************************************** From 9a599b504f42ebce69d57be6eaa8780d1c7ac104 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Wed, 24 Jun 2020 21:45:08 -0400 Subject: [PATCH 44/75] fix typo --- common/Domain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/Domain.cpp b/common/Domain.cpp index 1274d80d..ab57ea4e 100644 --- a/common/Domain.cpp +++ b/common/Domain.cpp @@ -224,7 +224,7 @@ void Domain::initialize( std::shared_ptr db ) if (rank_info.kz < nproc[2]-1) outlet_layers_z = 0; // Fill remaining variables N = Nx*Ny*Nz; - Volume = nx*ny*nx*nproc[0]*nproc[1]*nproc[2]*1.0; + Volume = nx*ny*nz*nproc[0]*nproc[1]*nproc[2]*1.0; if (myrank==0) printf("voxel length = %f micron \n", voxel_length); From 7aad36e37a3974c134f0fb68dee7275fcdbbe758 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Wed, 24 Jun 2020 22:07:21 -0400 Subject: [PATCH 45/75] CPU also available, make greyscaleColor equivalent single-phase model available --- cpu/Greyscale.cpp | 1033 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1033 insertions(+) diff --git a/cpu/Greyscale.cpp b/cpu/Greyscale.cpp index affe6c2b..a2395e61 100644 --- a/cpu/Greyscale.cpp +++ b/cpu/Greyscale.cpp @@ -1566,6 +1566,1039 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_IMRT(int *neighborList, double *dis } +extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz,double *Poros,double *Perm, double *Velocity,double rho0,double *Pressure){ + + int n, nread; + int nr1,nr2,nr3,nr4,nr5,nr6; + int nr7,nr8,nr9,nr10; + int nr11,nr12,nr13,nr14; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double rho,jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; + double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double rlx_setA = rlx; + double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); + + const double mrt_V1=0.05263157894736842; + const double mrt_V2=0.012531328320802; + const double mrt_V3=0.04761904761904762; + const double mrt_V4=0.004594820384294068; + const double mrt_V5=0.01587301587301587; + const double mrt_V6=0.0555555555555555555555555; + const double mrt_V7=0.02777777777777778; + const double mrt_V8=0.08333333333333333; + const double mrt_V9=0.003341687552213868; + const double mrt_V10=0.003968253968253968; + const double mrt_V11=0.01388888888888889; + const double mrt_V12=0.04166666666666666; + + for (int n=start; n even part of dist) + //fq = dist[nread]; // reading the f2 data into register fq + nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) + fq = dist[nr2]; // reading the f2 data into register fq + rho += fq; + m1 -= 11.0*(fq); + m2 -= 4.0*(fq); + jx -= fq; + m4 += 4.0*(fq); + m9 += 2.0*(fq); + m10 -= 4.0*(fq); + + // q=3 + //nread = neighborList[n+2*Np]; // neighbor 4 + //fq = dist[nread]; + nr3 = neighborList[n+2*Np]; // neighbor 4 + fq = dist[nr3]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy = fq; + m6 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 = fq; + m12 = -2.0*fq; + + // q = 4 + //nread = neighborList[n+3*Np]; // neighbor 3 + //fq = dist[nread]; + nr4 = neighborList[n+3*Np]; // neighbor 3 + fq = dist[nr4]; + rho+= fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jy -= fq; + m6 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 += fq; + m12 -= 2.0*fq; + + // q=5 + //nread = neighborList[n+4*Np]; + //fq = dist[nread]; + nr5 = neighborList[n+4*Np]; + fq = dist[nr5]; + rho += fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz = fq; + m8 = -4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + + // q = 6 + //nread = neighborList[n+5*Np]; + //fq = dist[nread]; + nr6 = neighborList[n+5*Np]; + fq = dist[nr6]; + rho+= fq; + m1 -= 11.0*fq; + m2 -= 4.0*fq; + jz -= fq; + m8 += 4.0*fq; + m9 -= fq; + m10 += 2.0*fq; + m11 -= fq; + m12 += 2.0*fq; + + // q=7 + //nread = neighborList[n+6*Np]; + //fq = dist[nread]; + nr7 = neighborList[n+6*Np]; + fq = dist[nr7]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 = fq; + m16 = fq; + m17 = -fq; + + // q = 8 + //nread = neighborList[n+7*Np]; + //fq = dist[nread]; + nr8 = neighborList[n+7*Np]; + fq = dist[nr8]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 += fq; + m16 -= fq; + m17 += fq; + + // q=9 + //nread = neighborList[n+8*Np]; + //fq = dist[nread]; + nr9 = neighborList[n+8*Np]; + fq = dist[nr9]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jy -= fq; + m6 -= fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 += fq; + m17 += fq; + + // q = 10 + //nread = neighborList[n+9*Np]; + //fq = dist[nread]; + nr10 = neighborList[n+9*Np]; + fq = dist[nr10]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jy += fq; + m6 += fq; + m9 += fq; + m10 += fq; + m11 += fq; + m12 += fq; + m13 -= fq; + m16 -= fq; + m17 -= fq; + + // q=11 + //nread = neighborList[n+10*Np]; + //fq = dist[nread]; + nr11 = neighborList[n+10*Np]; + fq = dist[nr11]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 = fq; + m16 -= fq; + m18 = fq; + + // q=12 + //nread = neighborList[n+11*Np]; + //fq = dist[nread]; + nr12 = neighborList[n+11*Np]; + fq = dist[nr12]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 += fq; + m16 += fq; + m18 -= fq; + + // q=13 + //nread = neighborList[n+12*Np]; + //fq = dist[nread]; + nr13 = neighborList[n+12*Np]; + fq = dist[nr13]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx += fq; + m4 += fq; + jz -= fq; + m8 -= fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 -= fq; + m18 -= fq; + + // q=14 + //nread = neighborList[n+13*Np]; + //fq = dist[nread]; + nr14 = neighborList[n+13*Np]; + fq = dist[nr14]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jx -= fq; + m4 -= fq; + jz += fq; + m8 += fq; + m9 += fq; + m10 += fq; + m11 -= fq; + m12 -= fq; + m15 -= fq; + m16 += fq; + m18 += fq; + + // q=15 + nread = neighborList[n+14*Np]; + fq = dist[nread]; + //fq = dist[17*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 = fq; + m17 += fq; + m18 -= fq; + + // q=16 + nread = neighborList[n+15*Np]; + fq = dist[nread]; + //fq = dist[8*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 += fq; + m17 -= fq; + m18 += fq; + + // q=17 + //fq = dist[18*Np+n]; + nread = neighborList[n+16*Np]; + fq = dist[nread]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy += fq; + m6 += fq; + jz -= fq; + m8 -= fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 += fq; + m18 += fq; + + // q=18 + nread = neighborList[n+17*Np]; + fq = dist[nread]; + //fq = dist[9*Np+n]; + rho += fq; + m1 += 8.0*fq; + m2 += fq; + jy -= fq; + m6 -= fq; + jz += fq; + m8 += fq; + m9 -= 2.0*fq; + m10 -= 2.0*fq; + m14 -= fq; + m17 -= fq; + m18 -= fq; + //---------------------------------------------------------------------// + + porosity = Poros[n]; + perm = Perm[n]; + + c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); + if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes + GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); + c1 = porosity*0.5*GeoFun/sqrt(perm); + if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes + + vx = jx/rho0+0.5*porosity*Gx; + vy = jy/rho0+0.5*porosity*Gy; + vz = jz/rho0+0.5*porosity*Gz; + v_mag=sqrt(vx*vx+vy*vy+vz*vz); + ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); + uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); + uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); + u_mag=sqrt(ux*ux+uy*uy+uz*uz); + + //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium + Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx); + Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy); + Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz); + if (porosity==1.0){ + Fx=rho0*Gx; + Fy=rho0*Gy; + Fz=rho0*Gz; + } + + //Calculate pressure for MRT model + pressure=rho/3.f; + + //-------------------- MRT collison where body force has NO higher-order terms -------------// + m1 = m1 + rlx_setA*((19*(ux*ux+uy*uy+uz*uz)*rho0/porosity - 11*rho) - m1); + m2 = m2 + rlx_setA*((3*rho - 5.5*(ux*ux+uy*uy+uz*uz)*rho0/porosity) - m2); + jx = jx + Fx; + m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0)- m4) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + jy = jy + Fy; + m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0)- m6) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + jz = jz + Fz; + m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0)- m8) + + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + m9 = m9 + rlx_setA*(((2*ux*ux-uy*uy-uz*uz)*rho0/porosity) - m9); + m10 = m10 + rlx_setA*( - m10); + //m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); + m11 = m11 + rlx_setA*(((uy*uy-uz*uz)*rho0/porosity) - m11); + m12 = m12 + rlx_setA*( - m12); + //m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); + m13 = m13 + rlx_setA*( (ux*uy*rho0/porosity) - m13); + m14 = m14 + rlx_setA*( (uy*uz*rho0/porosity) - m14); + m15 = m15 + rlx_setA*( (ux*uz*rho0/porosity) - m15); + m16 = m16 + rlx_setB*( - m16); + m17 = m17 + rlx_setB*( - m17); + m18 = m18 + rlx_setB*( - m18); + //....................................................................................................... + + + //.................inverse transformation...................................................... + // q=0 + fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; + dist[n] = fq; + + // q = 1 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); + //nread = neighborList[n+Np]; + dist[nr2] = fq; + + // q=2 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); + //nread = neighborList[n]; + dist[nr1] = fq; + + // q = 3 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+3*Np]; + dist[nr4] = fq; + + // q = 4 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); + //nread = neighborList[n+2*Np]; + dist[nr3] = fq; + + // q = 5 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+5*Np]; + dist[nr6] = fq; + + // q = 6 + fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); + //nread = neighborList[n+4*Np]; + dist[nr5] = fq; + + // q = 7 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+ + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); + //nread = neighborList[n+7*Np]; + dist[nr8] = fq; + + // q = 8 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 + +mrt_V12*m12+0.25*m13+0.125*(m17-m16); + //nread = neighborList[n+6*Np]; + dist[nr7] = fq; + + // q = 9 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+ + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); + //nread = neighborList[n+9*Np]; + dist[nr10] = fq; + + // q = 10 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+ + mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); + //nread = neighborList[n+8*Np]; + dist[nr9] = fq; + + // q = 11 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) + +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 + -mrt_V12*m12+0.25*m15+0.125*(m18-m16); + //nread = neighborList[n+11*Np]; + dist[nr12] = fq; + + // q = 12 + fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ + mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); + //nread = neighborList[n+10*Np]; + dist[nr11]= fq; + + // q = 13 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) + +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 + -mrt_V12*m12-0.25*m15-0.125*(m16+m18); + //nread = neighborList[n+13*Np]; + dist[nr14] = fq; + + // q= 14 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) + +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 + -mrt_V12*m12-0.25*m15+0.125*(m16+m18); + //nread = neighborList[n+12*Np]; + dist[nr13] = fq; + + + // q = 15 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); + nread = neighborList[n+15*Np]; + dist[nread] = fq; + + // q = 16 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) + -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); + nread = neighborList[n+14*Np]; + dist[nread] = fq; + + + // q = 17 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) + -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); + nread = neighborList[n+17*Np]; + dist[nread] = fq; + + // q = 18 + fq = mrt_V1*rho+mrt_V9*m1 + +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) + -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); + nread = neighborList[n+16*Np]; + dist[nread] = fq; + //........................................................................ + + //Update velocity on device + Velocity[0*Np+n] = ux; + Velocity[1*Np+n] = uy; + Velocity[2*Np+n] = uz; + //Update pressure on device + Pressure[n] = pressure; + } +} + +extern "C" void ScaLBL_D3Q19_AAeven_Greyscale_MRT(double *dist, int start, int finish, int Np, double rlx, double rlx_eff, double Gx, double Gy, double Gz,double *Poros,double *Perm, double *Velocity,double rho0,double *Pressure){ + + int n; + double vx,vy,vz,v_mag; + double ux,uy,uz,u_mag; + double pressure;//defined for this incompressible model + // conserved momemnts + double rho,jx,jy,jz; + // non-conserved moments + double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; + double fq; + //double f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18; + double GeoFun;//geometric function from Guo's PRE 66, 036304 (2002) + double porosity; + double perm;//voxel permeability + double c0, c1; //Guo's model parameters + double mu_eff = (1.0/rlx_eff-0.5)/3.0;//kinematic viscosity + double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) + double rlx_setA = rlx; + double rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); + + const double mrt_V1=0.05263157894736842; + const double mrt_V2=0.012531328320802; + const double mrt_V3=0.04761904761904762; + const double mrt_V4=0.004594820384294068; + const double mrt_V5=0.01587301587301587; + const double mrt_V6=0.0555555555555555555555555; + const double mrt_V7=0.02777777777777778; + const double mrt_V8=0.08333333333333333; + const double mrt_V9=0.003341687552213868; + const double mrt_V10=0.003968253968253968; + const double mrt_V11=0.01388888888888889; + const double mrt_V12=0.04166666666666666; + + + for (int n=start; n Date: Fri, 26 Jun 2020 10:39:45 -0400 Subject: [PATCH 46/75] update minkowski --- analysis/Minkowski.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index e98cfdc7..faac6142 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -58,9 +58,9 @@ void Minkowski::ComputeScalar(const DoubleArray& Field, const double isovalue) //int Nx = Field.size(0); //int Ny = Field.size(1); //int Nz = Field.size(2); - for (int k=0; k Date: Fri, 26 Jun 2020 12:48:32 -0400 Subject: [PATCH 47/75] add stl writer to dcel --- analysis/dcel.cpp | 19 +++++++++++++++++++ analysis/dcel.h | 1 + 2 files changed, 20 insertions(+) diff --git a/analysis/dcel.cpp b/analysis/dcel.cpp index ca21c0e6..9ca8921c 100644 --- a/analysis/dcel.cpp +++ b/analysis/dcel.cpp @@ -15,6 +15,25 @@ int DECL::Face(int index){ return FaceData[index]; } +void DECL::Write(){ + int e1,e2,e3; + FILE *TRIANGLES; + TRIANGLES = fopen("triangles.stl","w"); + fprintf("solid \n"); + for (int idx=0; idx Date: Fri, 26 Jun 2020 13:09:30 -0400 Subject: [PATCH 48/75] fix dcel write --- analysis/dcel.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/analysis/dcel.cpp b/analysis/dcel.cpp index 9ca8921c..01e7b571 100644 --- a/analysis/dcel.cpp +++ b/analysis/dcel.cpp @@ -19,17 +19,17 @@ void DECL::Write(){ int e1,e2,e3; FILE *TRIANGLES; TRIANGLES = fopen("triangles.stl","w"); - fprintf("solid \n"); + fprintf(TRIANGLES,"solid \n"); for (int idx=0; idx Date: Fri, 26 Jun 2020 15:53:23 -0400 Subject: [PATCH 49/75] stl writer for dcel --- analysis/dcel.cpp | 270 ++++++---------------------------------------- analysis/dcel.h | 7 ++ 2 files changed, 38 insertions(+), 239 deletions(-) diff --git a/analysis/dcel.cpp b/analysis/dcel.cpp index 01e7b571..71f69951 100644 --- a/analysis/dcel.cpp +++ b/analysis/dcel.cpp @@ -1,7 +1,5 @@ #include "analysis/dcel.h" - - DECL::DECL(){ } @@ -369,243 +367,37 @@ double DECL::EdgeAngle(int edge) return angle; } -void Isosurface(DoubleArray &A, const double &v) +void iso_surface(const Array&Field, const double isovalue) { - NULL_USE( v ); - - Point P,Q; - Point PlaceHolder; - Point C0,C1,C2,C3,C4,C5,C6,C7; - - int TriangleCount; - int VertexCount; - int CubeIndex; - - Point VertexList[12]; - Point NewVertexList[12]; - int LocalRemap[12]; - - Point cellvertices[20]; - std::array,20> Triangles; - Triangles.fill( { 0 } ); - - // Values from array 'A' at the cube corners - double CubeValues[8]; - - int Nx = A.size(0); - int Ny = A.size(1); - int Nz = A.size(2); - - // Points corresponding to cube corners - C0.x = 0.0; C0.y = 0.0; C0.z = 0.0; - C1.x = 1.0; C1.y = 0.0; C1.z = 0.0; - C2.x = 1.0; C2.y = 1.0; C2.z = 0.0; - C3.x = 0.0; C3.y = 1.0; C3.z = 0.0; - C4.x = 0.0; C4.y = 0.0; C4.z = 1.0; - C5.x = 1.0; C5.y = 0.0; C5.z = 1.0; - C6.x = 1.0; C6.y = 1.0; C6.z = 1.0; - C7.x = 0.0; C7.y = 1.0; C7.z = 1.0; - - std::vector> HalfEdge; - for (int k=1; kV2 - HalfEdge[idx_edge][0] = V1; // first vertex - HalfEdge[idx_edge][1] = V2; // second vertex - HalfEdge[idx_edge][2] = idx; // triangle - HalfEdge[idx_edge][3] = -1; // twin - HalfEdge[idx_edge][4] = idx_edge+2; // previous edge - HalfEdge[idx_edge][5] = idx_edge+1; // next edge - idx_edge++; - // second edge: V2->V3 - HalfEdge[idx_edge][0] = V2; // first vertex - HalfEdge[idx_edge][1] = V3; // second vertex - HalfEdge[idx_edge][2] = idx; // triangle - HalfEdge[idx_edge][3] = -1; // twin - HalfEdge[idx_edge][4] = idx_edge-1; // previous edge - HalfEdge[idx_edge][5] = idx_edge+1; // next edge - idx_edge++; - // third edge: V3->V1 - HalfEdge[idx_edge][0] = V3; // first vertex - HalfEdge[idx_edge][1] = V1; // second vertex - HalfEdge[idx_edge][2] = idx; // triangle - HalfEdge[idx_edge][3] = -1; // twin - HalfEdge[idx_edge][4] = idx_edge-1; // previous edge - HalfEdge[idx_edge][5] = idx_edge-2; // next edge - idx_edge++; - } - int EdgeCount=idx_edge; - for (int idx=0; idx #include "analysis/pmmc.h" @@ -79,3 +82,7 @@ public: private: std::vector FaceData; }; + +void iso_surface(const Array&Field, const double isovalue); + +#endif From d89dcf2648d0b9e23d786bb6d3f8cc0d380111f3 Mon Sep 17 00:00:00 2001 From: JamesEMcclure Date: Sat, 27 Jun 2020 07:28:48 -0400 Subject: [PATCH 50/75] Eikonal solver in distance --- analysis/distance.cpp | 141 ++++++++++++++++++++++++++++++++++++++++++ analysis/distance.h | 11 ++++ 2 files changed, 152 insertions(+) diff --git a/analysis/distance.cpp b/analysis/distance.cpp index e297b435..78c344d2 100644 --- a/analysis/distance.cpp +++ b/analysis/distance.cpp @@ -182,6 +182,147 @@ void CalcVecDist( Array &d, const Array &ID0, const Domain &Dm, } } +double Eikonal(DoubleArray &Distance, char *ID, Domain &Dm, int timesteps){ + + /* + * This routine converts the data in the Distance array to a signed distance + * by solving the equation df/dt = sign(1-|grad f|), where Distance provides + * the values of f on the mesh associated with domain Dm + * It has been tested with segmented data initialized to values [-1,1] + * and will converge toward the signed distance to the surface bounding the associated phases + * + * Reference: + * Min C (2010) On reinitializing level set functions, Journal of Computational Physics229 + */ + + int i,j,k; + double dt=0.1; + double Dx,Dy,Dz; + double Dxp,Dxm,Dyp,Dym,Dzp,Dzm; + double Dxxp,Dxxm,Dyyp,Dyym,Dzzp,Dzzm; + double sign,norm; + double LocalVar,GlobalVar,LocalMax,GlobalMax; + + int xdim,ydim,zdim; + xdim=Dm.Nx-2; + ydim=Dm.Ny-2; + zdim=Dm.Nz-2; + fillHalo fillData(Dm.Comm, Dm.rank_info,xdim,ydim,zdim,1,1,1,0,1); + + // Arrays to store the second derivatives + DoubleArray Dxx(Dm.Nx,Dm.Ny,Dm.Nz); + DoubleArray Dyy(Dm.Nx,Dm.Ny,Dm.Nz); + DoubleArray Dzz(Dm.Nx,Dm.Ny,Dm.Nz); + + int count = 0; + while (count < timesteps){ + + // Communicate the halo of values + fillData.fill(Distance); + + // Compute second order derivatives + for (k=1;k 0.f) Dx = Dxp*Dxp; + elseDx = Dxm*Dxm; + + if (Dyp + Dym > 0.f) Dy = Dyp*Dyp; + elseDy = Dym*Dym; + + if (Dzp + Dzm > 0.f) Dz = Dzp*Dzp; + elseDz = Dzm*Dzm; + } + else{ + + if (Dxp + Dxm < 0.f) Dx = Dxp*Dxp; + elseDx = Dxm*Dxm; + + if (Dyp + Dym < 0.f) Dy = Dyp*Dyp; + elseDy = Dym*Dym; + + if (Dzp + Dzm < 0.f) Dz = Dzp*Dzp; + elseDz = Dzm*Dzm; + } + + //Dx = max(Dxp*Dxp,Dxm*Dxm); + //Dy = max(Dyp*Dyp,Dym*Dym); + //Dz = max(Dzp*Dzp,Dzm*Dzm); + + norm=sqrt(Dx + Dy + Dz); + if (norm > 1.0) norm=1.0; + + Distance(i,j,k) += dt*sign*(1.0 - norm); + LocalVar += dt*sign*(1.0 - norm); + + if (fabs(dt*sign*(1.0 - norm)) > LocalMax) + LocalMax = fabs(dt*sign*(1.0 - norm)); + } + } + } + + MPI_Allreduce(&LocalVar,&GlobalVar,1,MPI_DOUBLE,MPI_SUM,Dm.Comm); + MPI_Allreduce(&LocalMax,&GlobalMax,1,MPI_DOUBLE,MPI_MAX,Dm.Comm); + GlobalVar /= (Dm.Nx-2)*(Dm.Ny-2)*(Dm.Nz-2)*Dm.nprocx*Dm.nprocy*Dm.nprocz; + count++; + + if (count%50 == 0 && Dm.rank==0 ) + printf("Time=%i, Max variation=%f, Global variation=%f \n",count,GlobalMax,GlobalVar); + + if (fabs(GlobalMax) < 1e-5){ + if (Dm.rank==0) printf("Exiting with max tolerance of 1e-5 \n"); + count=timesteps; + } + } + return GlobalVar; +} // Explicit instantiations template void CalcDist( Array&, const Array&, const Domain&, const std::array&, const std::array& ); diff --git a/analysis/distance.h b/analysis/distance.h index b3fc870e..5ca00c83 100644 --- a/analysis/distance.h +++ b/analysis/distance.h @@ -40,4 +40,15 @@ void CalcDist( Array &Distance, const Array &ID, const Domain &Dm, void CalcVecDist( Array &Distance, const Array &ID, const Domain &Dm, const std::array& periodic = {true,true,true}, const std::array& dx = {1,1,1} ); + +/*! + * @brief Calculate the distance based on solution of Eikonal equation + * @details This routine calculates the signed distance to the nearest domain surface. + * @param[out] Distance Distance function + * @param[in] ID Domain id + * @param[in] Dm Domain information + * @param[in] timesteps number of timesteps to run for Eikonal solver + */ +double Eikonal(DoubleArray &Distance, char *ID, Domain &Dm, int timesteps); + #endif From 7cdfd4006ab122396283e4819991c2a989a7c635 Mon Sep 17 00:00:00 2001 From: JamesEMcclure Date: Sat, 27 Jun 2020 07:30:46 -0400 Subject: [PATCH 51/75] Eikonal solver in distance --- analysis/distance.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/analysis/distance.cpp b/analysis/distance.cpp index 78c344d2..3b7641d6 100644 --- a/analysis/distance.cpp +++ b/analysis/distance.cpp @@ -272,24 +272,24 @@ double Eikonal(DoubleArray &Distance, char *ID, Domain &Dm, int timesteps){ // Compute upwind derivatives for Godunov Hamiltonian if (sign < 0.0){ if (Dxp + Dxm > 0.f) Dx = Dxp*Dxp; - elseDx = Dxm*Dxm; + else Dx = Dxm*Dxm; if (Dyp + Dym > 0.f) Dy = Dyp*Dyp; - elseDy = Dym*Dym; + else Dy = Dym*Dym; if (Dzp + Dzm > 0.f) Dz = Dzp*Dzp; - elseDz = Dzm*Dzm; + else Dz = Dzm*Dzm; } else{ if (Dxp + Dxm < 0.f) Dx = Dxp*Dxp; - elseDx = Dxm*Dxm; + else Dx = Dxm*Dxm; if (Dyp + Dym < 0.f) Dy = Dyp*Dyp; - elseDy = Dym*Dym; + else Dy = Dym*Dym; if (Dzp + Dzm < 0.f) Dz = Dzp*Dzp; - elseDz = Dzm*Dzm; + else Dz = Dzm*Dzm; } //Dx = max(Dxp*Dxp,Dxm*Dxm); From 3d58822fef7bd2d1a3ca58dc534e45de13c42091 Mon Sep 17 00:00:00 2001 From: JamesEMcclure Date: Sat, 27 Jun 2020 07:43:26 -0400 Subject: [PATCH 52/75] Eikonal solver in distance --- analysis/distance.cpp | 11 ++++++----- analysis/distance.h | 13 ++++++++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/analysis/distance.cpp b/analysis/distance.cpp index 3b7641d6..be4cbac6 100644 --- a/analysis/distance.cpp +++ b/analysis/distance.cpp @@ -182,7 +182,7 @@ void CalcVecDist( Array &d, const Array &ID0, const Domain &Dm, } } -double Eikonal(DoubleArray &Distance, char *ID, Domain &Dm, int timesteps){ +double Eikonal(DoubleArray &Distance, char *ID, Domain &Dm, int timesteps, const std::array& periodic){ /* * This routine converts the data in the Distance array to a signed distance @@ -207,7 +207,8 @@ double Eikonal(DoubleArray &Distance, char *ID, Domain &Dm, int timesteps){ xdim=Dm.Nx-2; ydim=Dm.Ny-2; zdim=Dm.Nz-2; - fillHalo fillData(Dm.Comm, Dm.rank_info,xdim,ydim,zdim,1,1,1,0,1); + //fillHalo fillData(Dm.Comm, Dm.rank_info,xdim,ydim,zdim,1,1,1,0,1); + fillHalo fillData( Dm.Comm, Dm.rank_info, {xdim, ydim, zdim}, {1,1,1}, 50, 1, {true,true,true}, periodic ); // Arrays to store the second derivatives DoubleArray Dxx(Dm.Nx,Dm.Ny,Dm.Nz); @@ -310,14 +311,14 @@ double Eikonal(DoubleArray &Distance, char *ID, Domain &Dm, int timesteps){ MPI_Allreduce(&LocalVar,&GlobalVar,1,MPI_DOUBLE,MPI_SUM,Dm.Comm); MPI_Allreduce(&LocalMax,&GlobalMax,1,MPI_DOUBLE,MPI_MAX,Dm.Comm); - GlobalVar /= (Dm.Nx-2)*(Dm.Ny-2)*(Dm.Nz-2)*Dm.nprocx*Dm.nprocy*Dm.nprocz; + GlobalVar /= Dm.Volume; count++; - if (count%50 == 0 && Dm.rank==0 ) + if (count%50 == 0 && Dm.rank()==0 ) printf("Time=%i, Max variation=%f, Global variation=%f \n",count,GlobalMax,GlobalVar); if (fabs(GlobalMax) < 1e-5){ - if (Dm.rank==0) printf("Exiting with max tolerance of 1e-5 \n"); + if (Dm.rank()==0) printf("Exiting with max tolerance of 1e-5 \n"); count=timesteps; } } diff --git a/analysis/distance.h b/analysis/distance.h index 5ca00c83..b382a49f 100644 --- a/analysis/distance.h +++ b/analysis/distance.h @@ -16,6 +16,16 @@ struct Vec { }; inline bool operator<(const Vec& l, const Vec& r){ return l.x*l.x+l.y*l.y+l.z*l.z < r.x*r.x+r.y*r.y+r.z*r.z; } +inline double minmod(double &a, double &b){ + + double value; + + value = a; + if ( a*b < 0.0) value=0.0; + else if (fabs(a) > fabs(b)) value = b; + + return value; +} /*! * @brief Calculate the distance using a simple method @@ -48,7 +58,8 @@ void CalcVecDist( Array &Distance, const Array &ID, const Domain &Dm, * @param[in] ID Domain id * @param[in] Dm Domain information * @param[in] timesteps number of timesteps to run for Eikonal solver + * @param[in] periodic Directions that are periodic */ -double Eikonal(DoubleArray &Distance, char *ID, Domain &Dm, int timesteps); +double Eikonal(DoubleArray &Distance, char *ID, Domain &Dm, int timesteps, const std::array& periodic); #endif From a16d82bac0c5d42afa1138fbfe8bf22ceeb47511 Mon Sep 17 00:00:00 2001 From: JamesEMcclure Date: Sat, 27 Jun 2020 07:50:03 -0400 Subject: [PATCH 53/75] Eikonal solver in distance --- analysis/distance.cpp | 4 ++-- analysis/distance.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/analysis/distance.cpp b/analysis/distance.cpp index be4cbac6..fd48f7c7 100644 --- a/analysis/distance.cpp +++ b/analysis/distance.cpp @@ -182,7 +182,7 @@ void CalcVecDist( Array &d, const Array &ID0, const Domain &Dm, } } -double Eikonal(DoubleArray &Distance, char *ID, Domain &Dm, int timesteps, const std::array& periodic){ +double Eikonal(DoubleArray &Distance, const Array &ID, Domain &Dm, int timesteps, const std::array& periodic){ /* * This routine converts the data in the Distance array to a signed distance @@ -244,7 +244,7 @@ double Eikonal(DoubleArray &Distance, char *ID, Domain &Dm, int timesteps, const int n = k*Dm.Nx*Dm.Ny + j*Dm.Nx + i; sign = -1; - if (ID[n] == 1) sign = 1; + if (ID(i,j,k) == 1) sign = 1; // local second derivative terms Dxxp = minmod(Dxx(i,j,k),Dxx(i+1,j,k)); diff --git a/analysis/distance.h b/analysis/distance.h index b382a49f..d6c2740c 100644 --- a/analysis/distance.h +++ b/analysis/distance.h @@ -60,6 +60,6 @@ void CalcVecDist( Array &Distance, const Array &ID, const Domain &Dm, * @param[in] timesteps number of timesteps to run for Eikonal solver * @param[in] periodic Directions that are periodic */ -double Eikonal(DoubleArray &Distance, char *ID, Domain &Dm, int timesteps, const std::array& periodic); +double Eikonal(DoubleArray &Distance, const Array &ID, Domain &Dm, int timesteps, const std::array& periodic); #endif From 3dd7ba5936c60676e438c67e8f1bae4bbd2430d7 Mon Sep 17 00:00:00 2001 From: JamesEMcclure Date: Sat, 27 Jun 2020 07:56:53 -0400 Subject: [PATCH 54/75] refine dist in Minkowski (fix isosurface bugs) --- analysis/Minkowski.cpp | 1 + analysis/dcel.cpp | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index faac6142..476f208c 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -137,6 +137,7 @@ void Minkowski::MeasureObject(){ } } CalcDist(distance,id,*Dm); + Eikonal(distance, id, *Dm, 10, {true, true, true}); ComputeScalar(distance,0.0); } diff --git a/analysis/dcel.cpp b/analysis/dcel.cpp index 71f69951..91102acf 100644 --- a/analysis/dcel.cpp +++ b/analysis/dcel.cpp @@ -388,16 +388,22 @@ void iso_surface(const Array&Field, const double isovalue) auto P1 = object.vertex.coords(object.halfedge.v1(e1)); auto P2 = object.vertex.coords(object.halfedge.v1(e2)); auto P3 = object.vertex.coords(object.halfedge.v1(e3)); - P1.x += 1.0*i; P1.y += 1.0*j; P1.z +=1.0*k; - P2.x += 1.0*i; P2.y += 1.0*j; P2.z +=1.0*k; - P3.x += 1.0*i; P3.y += 1.0*j; P3.z +=1.0*k; - fprintf(TRIANGLES,"vertex %f %f %f\n",P1.x,P1.y,P1.z); - fprintf(TRIANGLES,"vertex %f %f %f\n",P2.x,P2.y,P2.z); - fprintf(TRIANGLES,"vertex %f %f %f\n",P3.x,P3.y,P3.z); + auto Normal = object.TriNormal(e1); + // P1.x += 1.0*i; P1.y += 1.0*j; P1.z +=1.0*k; + //P2.x += 1.0*i; P2.y += 1.0*j; P2.z +=1.0*k; + //P3.x += 1.0*i; P3.y += 1.0*j; P3.z +=1.0*k; + fprintf(TRIANGLES,"facet normal %f %f %f\n",Normal.x,Normal.y,Normal.z); + fprintf(TRIANGLES," outer loop\n"); + fprintf(TRIANGLES," vertex %f %f %f\n",P1.x,P1.y,P1.z); + fprintf(TRIANGLES," vertex %f %f %f\n",P2.x,P2.y,P2.z); + fprintf(TRIANGLES," vertex %f %f %f\n",P3.x,P3.y,P3.z); + fprintf(TRIANGLES," endloop\n"); + fprintf(TRIANGLES,"endfacet\n"); } } } } + fprintf(TRIANGLES,"endsolid isosurface\n"); fclose(TRIANGLES); } From 07ea37d2f246b2d0fbabe6321e3716af3d229aba Mon Sep 17 00:00:00 2001 From: James McClure Date: Sat, 27 Jun 2020 15:16:13 -0400 Subject: [PATCH 55/75] at device test --- tests/CMakeLists.txt | 1 + tests/TestSetDevice.cpp | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 tests/TestSetDevice.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 8b14a9dc..7e703c9d 100755 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -70,6 +70,7 @@ ADD_LBPM_TEST_PARALLEL( TestCommD3Q19 8 ) ADD_LBPM_TEST_1_2_4( testCommunication ) ADD_LBPM_TEST( TestWriter ) ADD_LBPM_TEST( TestDatabase ) +ADD_LBPM_TEST( TestSetDevice ) ADD_LBPM_PROVISIONAL_TEST( TestMicroCTReader ) IF ( USE_NETCDF ) ADD_LBPM_TEST_PARALLEL( TestNetcdf 8 ) diff --git a/tests/TestSetDevice.cpp b/tests/TestSetDevice.cpp new file mode 100644 index 00000000..79627b88 --- /dev/null +++ b/tests/TestSetDevice.cpp @@ -0,0 +1,37 @@ +#include +#include "common/MPI_Helpers.h" +#include "common/Utilities.h" +#include "common/ScaLBL.h" + +int main (int argc, char **argv) +{ + MPI_Init(&argc,&argv); + int rank = MPI_WORLD_RANK(); + int nprocs = MPI_WORLD_SIZE(); + + for (int i=0; i Date: Sat, 27 Jun 2020 20:54:00 -0400 Subject: [PATCH 56/75] update cubes --- analysis/Minkowski.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index 476f208c..c87ce22b 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -58,9 +58,9 @@ void Minkowski::ComputeScalar(const DoubleArray& Field, const double isovalue) //int Nx = Field.size(0); //int Ny = Field.size(1); //int Nz = Field.size(2); - for (int k=1; k Date: Mon, 29 Jun 2020 11:07:55 -0400 Subject: [PATCH 57/75] use internal / external edge count in Euler characteristic --- analysis/Minkowski.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index c87ce22b..16a1a6c7 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -58,9 +58,9 @@ void Minkowski::ComputeScalar(const DoubleArray& Field, const double isovalue) //int Nx = Field.size(0); //int Ny = Field.size(1); //int Nz = Field.size(2); - for (int k=0; k 0) EulerChar = (0.25*nvert - nside_intern - 0.5*nside_extern + nface); */ + Xi += 0.25*double(object.VertexCount) - nside_intern - 0.5*nside_extern + double(object.TriangleCount); } } } From 736870f4b59c0fce414893b7a6e1181d9c5d6eaa Mon Sep 17 00:00:00 2001 From: James McClure Date: Mon, 29 Jun 2020 13:46:24 -0400 Subject: [PATCH 58/75] still debugging Euler characteristic bug --- analysis/Minkowski.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index 16a1a6c7..c4600343 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -87,13 +87,23 @@ void Minkowski::ComputeScalar(const DoubleArray& Field, const double isovalue) // printf(" (%i,%i,%i) QR(%i,%i)={%f,%f,%f} {%f,%f,%f} a=%f l=%f \n",i,j,k,e2,object.halfedge.twin(e2),P2.x,P2.y,P2.z,P3.x,P3.y,P3.z,a2,s2); // printf(" (%i,%i,%i) RP(%i,%i)={%f,%f,%f} {%f,%f,%f} a=%f l=%f \n",i,j,k,e3,object.halfedge.twin(e3),P3.x,P3.y,P3.z,P1.x,P1.y,P1.z,a3,s3); //} + // Euler characteristic (half edge rule: one face - 0.5*(three edges)) + Xi -= 0.5; } // Euler characteristic -- each vertex shared by four cubes - double nside_extern = double(object.VertexCount); - double nside_intern = double(object.VertexCount)-3.0; - /*EulerChar=0.0; + //Xi += 0.25*double(object.VertexCount); + // check if vertices are at corners + for (int idx=0; idx 0) EulerChar = (0.25*nvert - nside_intern - 0.5*nside_extern + nface); */ - Xi += 0.25*double(object.VertexCount) - nside_intern - 0.5*nside_extern + double(object.TriangleCount); } } } From 4d2174cedb13ccd6ae24c3f383e57139c2e31512 Mon Sep 17 00:00:00 2001 From: James E McClure Date: Mon, 29 Jun 2020 14:18:05 -0400 Subject: [PATCH 59/75] update Euler characteristic --- analysis/Minkowski.cpp | 6 +++--- tests/TestSetDevice.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index c4600343..5b9826e6 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -95,10 +95,10 @@ void Minkowski::ComputeScalar(const DoubleArray& Field, const double isovalue) // check if vertices are at corners for (int idx=0; idx Date: Wed, 8 Jul 2020 22:24:37 -0400 Subject: [PATCH 60/75] 1. add color grad for debug;2. fix bug for calculating greyscale solid gradient --- common/ScaLBL.h | 4 +-- gpu/GreyscaleColor.cu | 58 +++++++++++++++++++++++----------- models/GreyscaleColorModel.cpp | 56 ++++++++++++++++---------------- models/GreyscaleColorModel.h | 2 +- 4 files changed, 71 insertions(+), 49 deletions(-) diff --git a/common/ScaLBL.h b/common/ScaLBL.h index de91e790..0170461a 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -167,12 +167,12 @@ extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z(int *neighborList, int *l //extern "C" void ScaLBL_D3Q19_GreyscaleColor_Init(double *dist, double *Porosity, int Np); extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, - double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, + double *ColorGrad,double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np); extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *d_neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, - double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, + double *ColorGrad,double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, double rhoA, double rhoB, double tauA, double tauB, double tauA_eff,double tauB_eff, double alpha, double beta, double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np); diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu index ea7b5ce1..1c0a6087 100644 --- a/gpu/GreyscaleColor.cu +++ b/gpu/GreyscaleColor.cu @@ -4,7 +4,7 @@ #define NTHREADS 256 __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, - double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, + double *ColorGrad,double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff,double alpha, double beta, double Gx, double Gy, double Gz, int strideY, int strideZ, int start, int finish, int Np){ @@ -33,6 +33,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Ma double tau_eff; double mu_eff;//kinematic viscosity double nx_gs,ny_gs,nz_gs;//grey-solid color gradient + double nx_phase,ny_phase,nz_phase,C_phase; double Fx,Fy,Fz; const double mrt_V1=0.05263157894736842; @@ -134,13 +135,23 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Ma nn = ijk-strideZ+strideY; // neighbor index (get convention) m18 = Phi[nn]; // get neighbor for phi - 18 //............Compute the Color Gradient................................... - nx = -(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); - ny = -(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); - nz = -(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); + nx_phase = -(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); + ny_phase = -(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); + nz_phase = -(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); + ColorGrad[n]=nx_phase; + ColorGrad[n+Np]=ny_phase; + ColorGrad[n+2*Np]=nz_phase; + C_phase = sqrt(nx_phase*nx_phase+ny_phase*ny_phase+nz_phase*nz_phase); + //correct the normal color gradient by considering the effect of grey solid - nx += (1.0-porosity)*nx_gs; - ny += (1.0-porosity)*ny_gs; - nz += (1.0-porosity)*nz_gs; + nx = nx_phase + (1.0-porosity)*nx_gs; + ny = ny_phase + (1.0-porosity)*ny_gs; + nz = nz_phase + (1.0-porosity)*nz_gs; + if (C_phase==0.0){ + nx = nx_phase; + ny = ny_phase; + nz = nz_phase; + } //...........Normalize the Color Gradient................................. C = sqrt(nx*nx+ny*ny+nz*nz); @@ -717,7 +728,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Ma } __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, - double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, + double *ColorGrad,double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, double Gx, double Gy, double Gz, int strideY, int strideZ, int start, int finish, int Np){ int ijk,nn,n; @@ -741,6 +752,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double tau_eff; double mu_eff;//kinematic viscosity double nx_gs,ny_gs,nz_gs;//grey-solid color gradient + double nx_phase,ny_phase,nz_phase,C_phase; double Fx,Fy,Fz; const double mrt_V1=0.05263157894736842; @@ -843,13 +855,23 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, nn = ijk-strideZ+strideY; // neighbor index (get convention) m18 = Phi[nn]; // get neighbor for phi - 18 //............Compute the Color Gradient................................... - nx = -(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); - ny = -(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); - nz = -(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); + nx_phase = -(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); + ny_phase = -(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); + nz_phase = -(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); + ColorGrad[n]=nx_phase; + ColorGrad[n+Np]=ny_phase; + ColorGrad[n+2*Np]=nz_phase; + C_phase = sqrt(nx_phase*nx_phase+ny_phase*ny_phase+nz_phase*nz_phase); + //correct the normal color gradient by considering the effect of grey solid - nx += (1.0-porosity)*nx_gs; - ny += (1.0-porosity)*ny_gs; - nz += (1.0-porosity)*nz_gs; + nx = nx_phase + (1.0-porosity)*nx_gs; + ny = ny_phase + (1.0-porosity)*ny_gs; + nz = nz_phase + (1.0-porosity)*nz_gs; + if (C_phase==0.0){ + nx = nx_phase; + ny = ny_phase; + nz = nz_phase; + } //...........Normalize the Color Gradient................................. C = sqrt(nx*nx+ny*ny+nz*nz); @@ -1392,14 +1414,14 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, //} extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, - double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, + double *ColorGrad,double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np){ //cudaProfilerStart(); //cudaFuncSetCacheConfig(dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor, cudaFuncCachePreferL1); - dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor<<>>(Map, dist, Aq, Bq, Den, Phi, GreySolidGrad, Poros, Perm, Vel, + dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor<<>>(Map, dist, Aq, Bq, Den,ColorGrad, Phi, GreySolidGrad, Poros, Perm, Vel, rhoA, rhoB, tauA, tauB, tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, strideY, strideZ, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ @@ -1410,14 +1432,14 @@ extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, doubl } extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *d_neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, - double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, + double *ColorGrad,double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, double rhoA, double rhoB, double tauA, double tauB, double tauA_eff,double tauB_eff, double alpha, double beta, double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np){ //cudaProfilerStart(); //cudaFuncSetCacheConfig(dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor, cudaFuncCachePreferL1); - dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor<<>>(d_neighborList, Map, dist, Aq, Bq, Den, Phi, GreySolidGrad, Poros, Perm,Vel, + dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor<<>>(d_neighborList, Map, dist, Aq, Bq, Den,ColorGrad, Phi, GreySolidGrad, Poros, Perm,Vel, rhoA, rhoB, tauA, tauB, tauA_eff, tauB_eff,alpha, beta, Fx, Fy, Fz, strideY, strideZ, start, finish, Np); cudaError_t err = cudaGetLastError(); diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index c7cabe04..dcbab77e 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -119,9 +119,9 @@ void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ if (greyscaleColor_db->keyExists( "flux" )){ flux = greyscaleColor_db->getScalar( "flux" ); } - if (greyscaleColor_db->keyExists("GreySolidLabels")|| - greyscaleColor_db->keyExists("GreySolidAffinity")|| - greyscaleColor_db->keyExists("PorosityList")|| + if (greyscaleColor_db->keyExists("GreySolidLabels")&& + greyscaleColor_db->keyExists("GreySolidAffinity")&& + greyscaleColor_db->keyExists("PorosityList")&& greyscaleColor_db->keyExists("PermeabilityList")){ greyMode = true; } @@ -671,7 +671,7 @@ void ScaLBL_GreyscaleColorModel::Create(){ ScaLBL_AllocateDeviceMemory((void **) &Porosity_dvc, sizeof(double)*Np); ScaLBL_AllocateDeviceMemory((void **) &Permeability_dvc, sizeof(double)*Np); } - //ScaLBL_AllocateDeviceMemory((void **) &ColorGrad, 3*sizeof(double)*Np); + ScaLBL_AllocateDeviceMemory((void **) &ColorGrad, 3*sizeof(double)*Np); //........................................................................... // Update GPU data structures if (rank==0) printf ("Setting up device map and neighbor list \n"); @@ -1018,7 +1018,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ // Halo exchange for phase field ScaLBL_Comm_Regular->SendHalo(Phi); if (greyMode==true){ - ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, + ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den,ColorGrad, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); } @@ -1039,7 +1039,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); } if (greyMode==true){ - ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, + ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den,ColorGrad, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); } @@ -1068,7 +1068,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ } ScaLBL_Comm_Regular->SendHalo(Phi); if (greyMode==true){ - ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, + ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den,ColorGrad, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); } @@ -1089,7 +1089,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); } if (greyMode==true){ - ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, + ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den,ColorGrad, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); } @@ -2020,25 +2020,25 @@ void ScaLBL_GreyscaleColorModel::WriteDebug(){ fwrite(PhaseField.data(),8,N,GreySG_Z_FILE); fclose(GreySG_Z_FILE); -// ScaLBL_Comm->RegularLayout(Map,&ColorGrad[0],PhaseField); -// FILE *CGX_FILE; -// sprintf(LocalRankFilename,"Gradient_X.%05i.raw",rank); -// CGX_FILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,CGX_FILE); -// fclose(CGX_FILE); -// -// ScaLBL_Comm->RegularLayout(Map,&ColorGrad[Np],PhaseField); -// FILE *CGY_FILE; -// sprintf(LocalRankFilename,"Gradient_Y.%05i.raw",rank); -// CGY_FILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,CGY_FILE); -// fclose(CGY_FILE); -// -// ScaLBL_Comm->RegularLayout(Map,&ColorGrad[2*Np],PhaseField); -// FILE *CGZ_FILE; -// sprintf(LocalRankFilename,"Gradient_Z.%05i.raw",rank); -// CGZ_FILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,CGZ_FILE); -// fclose(CGZ_FILE); + ScaLBL_Comm->RegularLayout(Map,&ColorGrad[0],PhaseField); + FILE *CGX_FILE; + sprintf(LocalRankFilename,"Gradient_X.%05i.raw",rank); + CGX_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,CGX_FILE); + fclose(CGX_FILE); + + ScaLBL_Comm->RegularLayout(Map,&ColorGrad[Np],PhaseField); + FILE *CGY_FILE; + sprintf(LocalRankFilename,"Gradient_Y.%05i.raw",rank); + CGY_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,CGY_FILE); + fclose(CGY_FILE); + + ScaLBL_Comm->RegularLayout(Map,&ColorGrad[2*Np],PhaseField); + FILE *CGZ_FILE; + sprintf(LocalRankFilename,"Gradient_Z.%05i.raw",rank); + CGZ_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,CGZ_FILE); + fclose(CGZ_FILE); } diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h index 64e3f1e3..b3a894bd 100644 --- a/models/GreyscaleColorModel.h +++ b/models/GreyscaleColorModel.h @@ -67,7 +67,7 @@ public: double *fq, *Aq, *Bq; double *Den, *Phi; double *GreySolidGrad; - //double *ColorGrad; + double *ColorGrad; double *Velocity; double *Pressure; double *Porosity_dvc; From a1f337591124aa2dde67cd259c62505d9feba774 Mon Sep 17 00:00:00 2001 From: James E McClure Date: Wed, 22 Jul 2020 11:57:51 -0400 Subject: [PATCH 61/75] added mean filter --- analysis/filters.cpp | 31 +++++++++++++++++++++++++++++++ analysis/filters.h | 8 +++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/analysis/filters.cpp b/analysis/filters.cpp index c5858560..8c532712 100644 --- a/analysis/filters.cpp +++ b/analysis/filters.cpp @@ -2,6 +2,37 @@ #include "math.h" #include "ProfilerApp.h" +void Mean3D( const Array &Input, Array &Output ) +{ + PROFILE_START("Mean3D"); + // Perform a 3D Mean filter on Input array + int i,j,k,ii,jj,kk; + int imin,jmin,kmin,imax,jmax,kmax; + + float *List; + List=new float[27]; + + int Nx = int(Input.size(0)); + int Ny = int(Input.size(1)); + int Nz = int(Input.size(2)); + + for (k=1; k &Input, Array &Output ) { diff --git a/analysis/filters.h b/analysis/filters.h index 131b2b9f..250ba23a 100644 --- a/analysis/filters.h +++ b/analysis/filters.h @@ -4,6 +4,13 @@ #include "common/Array.h" +/*! + * @brief Filter image + * @details This routine performs a mean filter + * @param[in] Input Input image + * @param[out] Output Output image + */ +void Mean3D( const Array &Input, Array &Output ) /*! * @brief Filter image @@ -13,7 +20,6 @@ */ void Med3D( const Array &Input, Array &Output ); - /*! * @brief Filter image * @details This routine performs a non-linear local means filter From c9640c46ba54699bba7d4af39a235719bb496b4e Mon Sep 17 00:00:00 2001 From: JamesEMcclure Date: Wed, 22 Jul 2020 13:14:07 -0400 Subject: [PATCH 62/75] fix smooth distance --- analysis/Minkowski.cpp | 7 ++++--- analysis/Minkowski.h | 1 + analysis/filters.cpp | 8 ++------ analysis/filters.h | 2 +- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index 5b9826e6..7707286f 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -140,7 +140,7 @@ void Minkowski::MeasureObject(){ * 0 - labels the object * 1 - labels the rest of the */ - + DoubleArray smooth_distance(Nx,Ny,Nz); for (int k=0; k &Input, Array &Output ) +void Mean3D( const Array &Input, Array &Output ) { PROFILE_START("Mean3D"); // Perform a 3D Mean filter on Input array - int i,j,k,ii,jj,kk; - int imin,jmin,kmin,imax,jmax,kmax; - - float *List; - List=new float[27]; + int i,j,k; int Nx = int(Input.size(0)); int Ny = int(Input.size(1)); diff --git a/analysis/filters.h b/analysis/filters.h index 250ba23a..404fb265 100644 --- a/analysis/filters.h +++ b/analysis/filters.h @@ -10,7 +10,7 @@ * @param[in] Input Input image * @param[out] Output Output image */ -void Mean3D( const Array &Input, Array &Output ) +void Mean3D( const Array &Input, Array &Output ); /*! * @brief Filter image From dd4903155213e5ccc119dda1268ea29eaec3b9fe Mon Sep 17 00:00:00 2001 From: JamesEMcclure Date: Wed, 22 Jul 2020 20:31:09 -0400 Subject: [PATCH 63/75] fix smooth distance --- analysis/Minkowski.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index 7707286f..c45f2a58 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -140,7 +140,7 @@ void Minkowski::MeasureObject(){ * 0 - labels the object * 1 - labels the rest of the */ - DoubleArray smooth_distance(Nx,Ny,Nz); + //DoubleArray smooth_distance(Nx,Ny,Nz); for (int k=0; k Date: Wed, 22 Jul 2020 20:34:43 -0400 Subject: [PATCH 64/75] fix smooth distance --- analysis/Minkowski.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index c45f2a58..9e6e0f43 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -151,7 +151,7 @@ void Minkowski::MeasureObject(){ CalcDist(distance,id,*Dm); //Mean3D(distance,smooth_distance); Eikonal(distance, id, *Dm, 20, {true, true, true}); - ComputeScalar(smooth_distance,0.0); + ComputeScalar(distance,0.0); } From 80c7afc27c1c34f53a66ab0ad94f5d589b288ab9 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Thu, 23 Jul 2020 10:44:43 -0400 Subject: [PATCH 65/75] save the work; make several greynode wettability models available; need more validation and tests --- common/ScaLBL.h | 14 +- gpu/GreyscaleColor.cu | 1490 +++++++++++++++++++++++++++++++- models/GreyscaleColorModel.cpp | 779 +++++++++++++---- models/GreyscaleColorModel.h | 5 +- 4 files changed, 2082 insertions(+), 206 deletions(-) diff --git a/common/ScaLBL.h b/common/ScaLBL.h index 0170461a..2c674fb6 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -166,13 +166,23 @@ extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z(int *neighborList, int *l // GREYSCALE COLOR MODEL (Two-component) //extern "C" void ScaLBL_D3Q19_GreyscaleColor_Init(double *dist, double *Porosity, int Np); +//extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, +// double *ColorGrad,double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, +// double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, +// double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np); +// +//extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *d_neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, +// double *ColorGrad,double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, +// double rhoA, double rhoB, double tauA, double tauB, double tauA_eff,double tauB_eff, double alpha, double beta, +// double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np); + extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, - double *ColorGrad,double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, + double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np); extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *d_neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, - double *ColorGrad,double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, + double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, double rhoA, double rhoB, double tauA, double tauB, double tauA_eff,double tauB_eff, double alpha, double beta, double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np); diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu index 1c0a6087..9ac4ce00 100644 --- a/gpu/GreyscaleColor.cu +++ b/gpu/GreyscaleColor.cu @@ -1,10 +1,12 @@ #include +#include #define NBLOCKS 1024 #define NTHREADS 256 +//Model-1 __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, - double *ColorGrad,double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, + double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff,double alpha, double beta, double Gx, double Gy, double Gz, int strideY, int strideZ, int start, int finish, int Np){ @@ -57,6 +59,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Ma // read the component number densities nA = Den[n]; nB = Den[Np + n]; + porosity = Poros[n]; perm = Perm[n]; nx_gs = GreySolidGrad[n+0*Np]; @@ -138,9 +141,6 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Ma nx_phase = -(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); ny_phase = -(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); nz_phase = -(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); - ColorGrad[n]=nx_phase; - ColorGrad[n+Np]=ny_phase; - ColorGrad[n+2*Np]=nz_phase; C_phase = sqrt(nx_phase*nx_phase+ny_phase*ny_phase+nz_phase*nz_phase); //correct the normal color gradient by considering the effect of grey solid @@ -727,8 +727,9 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Ma } } +//Model-1 __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, - double *ColorGrad,double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, + double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, double Gx, double Gy, double Gz, int strideY, int strideZ, int start, int finish, int Np){ int ijk,nn,n; @@ -858,9 +859,6 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, nx_phase = -(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); ny_phase = -(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); nz_phase = -(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); - ColorGrad[n]=nx_phase; - ColorGrad[n+Np]=ny_phase; - ColorGrad[n+2*Np]=nz_phase; C_phase = sqrt(nx_phase*nx_phase+ny_phase*ny_phase+nz_phase*nz_phase); //correct the normal color gradient by considering the effect of grey solid @@ -1369,6 +1367,1435 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, } } +////Model-2&3 +//__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, +// double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, +// double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff,double alpha, double beta, +// double Gx, double Gy, double Gz, int strideY, int strideZ, int start, int finish, int Np){ +// +// int n,nn,ijk,nread; +// int nr1,nr2,nr3,nr4,nr5,nr6; +// int nr7,nr8,nr9,nr10; +// int nr11,nr12,nr13,nr14; +// //int nr15,nr16,nr17,nr18; +// double fq; +// // conserved momemnts +// double rho,jx,jy,jz; +// double vx,vy,vz,v_mag; +// double ux,uy,uz,u_mag; +// // non-conserved moments +// double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; +// double m3,m5,m7; +// double t1,t2,t4,t6,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18; +// double t3,t5,t7; +// double nA,nB; // number density +// double a1,b1,a2,b2,nAB,delta; +// double C,nx,ny,nz; //color gradient magnitude and direction +// double phi,tau,rho0,rlx_setA,rlx_setB; +// +// double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) +// double porosity; +// double perm;//voxel permeability +// double c0, c1; //Guo's model parameters +// double tau_eff; +// double mu_eff;//kinematic viscosity +// double nx_phase,ny_phase,nz_phase,C_phase; +// double Fx,Fy,Fz; +// +// 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; s1.0) t1 =((t1>0.0)-(t1<0.0))*(1.0-fabs(t1))+t1; +// //........................................................................ +// nn = ijk+1; // neighbor index (get convention) +// m2 = Phi[nn]; // get neighbor for phi - 2 +// t2 = m2+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t2)>1.0) t2 =((t2>0.0)-(t2<0.0))*(1.0-fabs(t2))+t2; +// //........................................................................ +// nn = ijk-strideY; // neighbor index (get convention) +// m3 = Phi[nn]; // get neighbor for phi - 3 +// t3 = m3+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t3)>1.0) t3 =((t3>0.0)-(t3<0.0))*(1.0-fabs(t3))+t3; +// //........................................................................ +// nn = ijk+strideY; // neighbor index (get convention) +// m4 = Phi[nn]; // get neighbor for phi - 4 +// t4 = m4+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t4)>1.0) t4 =((t4>0.0)-(t4<0.0))*(1.0-fabs(t4))+t4; +// //........................................................................ +// nn = ijk-strideZ; // neighbor index (get convention) +// m5 = Phi[nn]; // get neighbor for phi - 5 +// t5 = m5+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t5)>1.0) t5 =((t5>0.0)-(t5<0.0))*(1.0-fabs(t5))+t5; +// //........................................................................ +// nn = ijk+strideZ; // neighbor index (get convention) +// m6 = Phi[nn]; // get neighbor for phi - 6 +// t6 = m6+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t6)>1.0) t6 =((t6>0.0)-(t6<0.0))*(1.0-fabs(t6))+t6; +// //........................................................................ +// nn = ijk-strideY-1; // neighbor index (get convention) +// m7 = Phi[nn]; // get neighbor for phi - 7 +// t7 = m7+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t7)>1.0) t7 =((t7>0.0)-(t7<0.0))*(1.0-fabs(t7))+t7; +// //........................................................................ +// nn = ijk+strideY+1; // neighbor index (get convention) +// m8 = Phi[nn]; // get neighbor for phi - 8 +// t8 = m8+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t8)>1.0) t8 =((t8>0.0)-(t8<0.0))*(1.0-fabs(t8))+t8; +// //........................................................................ +// nn = ijk+strideY-1; // neighbor index (get convention) +// m9 = Phi[nn]; // get neighbor for phi - 9 +// t9 = m9+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t9)>1.0) t9 =((t9>0.0)-(t9<0.0))*(1.0-fabs(t9))+t9; +// //........................................................................ +// nn = ijk-strideY+1; // neighbor index (get convention) +// m10 = Phi[nn]; // get neighbor for phi - 10 +// t10 = m10+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t10)>1.0) t10 =((t10>0.0)-(t10<0.0))*(1.0-fabs(t10))+t10; +// //........................................................................ +// nn = ijk-strideZ-1; // neighbor index (get convention) +// m11 = Phi[nn]; // get neighbor for phi - 11 +// t11 = m11+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t11)>1.0) t11 =((t11>0.0)-(t11<0.0))*(1.0-fabs(t11))+t11; +// //........................................................................ +// nn = ijk+strideZ+1; // neighbor index (get convention) +// m12 = Phi[nn]; // get neighbor for phi - 12 +// t12 = m12+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t12)>1.0) t12 =((t12>0.0)-(t12<0.0))*(1.0-fabs(t12))+t12; +// //........................................................................ +// nn = ijk+strideZ-1; // neighbor index (get convention) +// m13 = Phi[nn]; // get neighbor for phi - 13 +// t13 = m13+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t13)>1.0) t13 =((t13>0.0)-(t13<0.0))*(1.0-fabs(t13))+t13; +// //........................................................................ +// nn = ijk-strideZ+1; // neighbor index (get convention) +// m14 = Phi[nn]; // get neighbor for phi - 14 +// t14 = m14+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t14)>1.0) t14 =((t14>0.0)-(t14<0.0))*(1.0-fabs(t14))+t14; +// //........................................................................ +// nn = ijk-strideZ-strideY; // neighbor index (get convention) +// m15 = Phi[nn]; // get neighbor for phi - 15 +// t15 = m15+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t15)>1.0) t15 =((t15>0.0)-(t15<0.0))*(1.0-fabs(t15))+t15; +// //........................................................................ +// nn = ijk+strideZ+strideY; // neighbor index (get convention) +// m16 = Phi[nn]; // get neighbor for phi - 16 +// t16 = m16+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t16)>1.0) t16 =((t16>0.0)-(t16<0.0))*(1.0-fabs(t16))+t16; +// //........................................................................ +// nn = ijk+strideZ-strideY; // neighbor index (get convention) +// m17 = Phi[nn]; // get neighbor for phi - 17 +// t17 = m17+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t17)>1.0) t17 =((t17>0.0)-(t17<0.0))*(1.0-fabs(t17))+t17; +// //........................................................................ +// nn = ijk-strideZ+strideY; // neighbor index (get convention) +// m18 = Phi[nn]; // get neighbor for phi - 18 +// t18 = m18+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t18)>1.0) t18 =((t18>0.0)-(t18<0.0))*(1.0-fabs(t18))+t18; +// //............Compute the Color Gradient................................... +// nx_phase = -(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); +// ny_phase = -(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); +// nz_phase = -(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); +// C_phase = sqrt(nx_phase*nx_phase+ny_phase*ny_phase+nz_phase*nz_phase); +// //correct the normal color gradient by considering the effect of grey solid +// nx = -(t1-t2+0.5*(t7-t8+t9-t10+t11-t12+t13-t14)); +// ny = -(t3-t4+0.5*(t7-t8-t9+t10+t15-t16+t17-t18)); +// nz = -(t5-t6+0.5*(t11-t12-t13+t14+t15-t16-t17+t18)); +// +// if (C_phase==0.0){//i.e. if in a bulk phase, there is no need for grey-solid correction +// nx = nx_phase; +// ny = ny_phase; +// nz = nz_phase; +// } +// +// //...........Normalize the Color Gradient................................. +// C = sqrt(nx*nx+ny*ny+nz*nz); +// double ColorMag = C; +// if (C==0.0) ColorMag=1.0; +// nx = nx/ColorMag; +// ny = ny/ColorMag; +// nz = nz/ColorMag; +// +// // q=0 +// fq = dist[n]; +// rho = fq; +// m1 = -30.0*fq; +// m2 = 12.0*fq; +// +// // q=1 +// //nread = neighborList[n]; // neighbor 2 +// //fq = dist[nread]; // reading the f1 data into register fq +// nr1 = neighborList[n]; +// fq = dist[nr1]; // reading the f1 data into register fq +// rho += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jx = fq; +// m4 = -4.0*fq; +// m9 = 2.0*fq; +// m10 = -4.0*fq; +// +// // f2 = dist[10*Np+n]; +// //nread = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) +// //fq = dist[nread]; // reading the f2 data into register fq +// nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) +// fq = dist[nr2]; // reading the f2 data into register fq +// rho += fq; +// m1 -= 11.0*(fq); +// m2 -= 4.0*(fq); +// jx -= fq; +// m4 += 4.0*(fq); +// m9 += 2.0*(fq); +// m10 -= 4.0*(fq); +// +// // q=3 +// //nread = neighborList[n+2*Np]; // neighbor 4 +// //fq = dist[nread]; +// nr3 = neighborList[n+2*Np]; // neighbor 4 +// fq = dist[nr3]; +// rho += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jy = fq; +// m6 = -4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 = fq; +// m12 = -2.0*fq; +// +// // q = 4 +// //nread = neighborList[n+3*Np]; // neighbor 3 +// //fq = dist[nread]; +// nr4 = neighborList[n+3*Np]; // neighbor 3 +// fq = dist[nr4]; +// rho+= fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jy -= fq; +// m6 += 4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 += fq; +// m12 -= 2.0*fq; +// +// // q=5 +// //nread = neighborList[n+4*Np]; +// //fq = dist[nread]; +// nr5 = neighborList[n+4*Np]; +// fq = dist[nr5]; +// rho += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jz = fq; +// m8 = -4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 -= fq; +// m12 += 2.0*fq; +// +// +// // q = 6 +// //nread = neighborList[n+5*Np]; +// //fq = dist[nread]; +// nr6 = neighborList[n+5*Np]; +// fq = dist[nr6]; +// rho+= fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jz -= fq; +// m8 += 4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 -= fq; +// m12 += 2.0*fq; +// +// // q=7 +// //nread = neighborList[n+6*Np]; +// //fq = dist[nread]; +// nr7 = neighborList[n+6*Np]; +// fq = dist[nr7]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jy += fq; +// m6 += fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 = fq; +// m16 = fq; +// m17 = -fq; +// +// // q = 8 +// //nread = neighborList[n+7*Np]; +// //fq = dist[nread]; +// nr8 = neighborList[n+7*Np]; +// fq = dist[nr8]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jy -= fq; +// m6 -= fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 += fq; +// m16 -= fq; +// m17 += fq; +// +// // q=9 +// //nread = neighborList[n+8*Np]; +// //fq = dist[nread]; +// nr9 = neighborList[n+8*Np]; +// fq = dist[nr9]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jy -= fq; +// m6 -= fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 -= fq; +// m16 += fq; +// m17 += fq; +// +// // q = 10 +// //nread = neighborList[n+9*Np]; +// //fq = dist[nread]; +// nr10 = neighborList[n+9*Np]; +// fq = dist[nr10]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jy += fq; +// m6 += fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 -= fq; +// m16 -= fq; +// m17 -= fq; +// +// // q=11 +// //nread = neighborList[n+10*Np]; +// //fq = dist[nread]; +// nr11 = neighborList[n+10*Np]; +// fq = dist[nr11]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jz += fq; +// m8 += fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 = fq; +// m16 -= fq; +// m18 = fq; +// +// // q=12 +// //nread = neighborList[n+11*Np]; +// //fq = dist[nread]; +// nr12 = neighborList[n+11*Np]; +// fq = dist[nr12]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jz -= fq; +// m8 -= fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 += fq; +// m16 += fq; +// m18 -= fq; +// +// // q=13 +// //nread = neighborList[n+12*Np]; +// //fq = dist[nread]; +// nr13 = neighborList[n+12*Np]; +// fq = dist[nr13]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jz -= fq; +// m8 -= fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 -= fq; +// m16 -= fq; +// m18 -= fq; +// +// // q=14 +// //nread = neighborList[n+13*Np]; +// //fq = dist[nread]; +// nr14 = neighborList[n+13*Np]; +// fq = dist[nr14]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jz += fq; +// m8 += fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 -= fq; +// m16 += fq; +// m18 += fq; +// +// // q=15 +// nread = neighborList[n+14*Np]; +// fq = dist[nread]; +// //fq = dist[17*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy += fq; +// m6 += fq; +// jz += fq; +// m8 += fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 = fq; +// m17 += fq; +// m18 -= fq; +// +// // q=16 +// nread = neighborList[n+15*Np]; +// fq = dist[nread]; +// //fq = dist[8*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy -= fq; +// m6 -= fq; +// jz -= fq; +// m8 -= fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 += fq; +// m17 -= fq; +// m18 += fq; +// +// // q=17 +// //fq = dist[18*Np+n]; +// nread = neighborList[n+16*Np]; +// fq = dist[nread]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy += fq; +// m6 += fq; +// jz -= fq; +// m8 -= fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 -= fq; +// m17 += fq; +// m18 += fq; +// +// // q=18 +// nread = neighborList[n+17*Np]; +// fq = dist[nread]; +// //fq = dist[9*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy -= fq; +// m6 -= fq; +// jz += fq; +// m8 += fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 -= fq; +// m17 -= fq; +// m18 -= fq; +// +// // Compute greyscale related parameters +// c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); +// if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes +// //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); +// c1 = porosity*0.5*GeoFun/sqrt(perm); +// if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes +// +// vx = jx/rho0+0.5*(porosity*Gx); +// vy = jy/rho0+0.5*(porosity*Gy); +// vz = jz/rho0+0.5*(porosity*Gz); +// v_mag=sqrt(vx*vx+vy*vy+vz*vz); +// ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); +// uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); +// uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); +// u_mag=sqrt(ux*ux+uy*uy+uz*uz); +// +// //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium +// Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx); +// Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy); +// Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz); +// if (porosity==1.0){ +// Fx=rho0*(Gx); +// Fy=rho0*(Gy); +// Fz=rho0*(Gz); +// } +// +// // write the velocity +// Velocity[n] = ux; +// Velocity[Np+n] = uy; +// Velocity[2*Np+n] = uz; +// +// //........................................................................ +// //..............carry out relaxation process.............................. +// //..........Toelke, Fruediger et. al. 2006................................ +// if (C == 0.0) nx = ny = nz = 0.0; +// m1 = m1 + rlx_setA*((19*(ux*ux+uy*uy+uz*uz)*rho0/porosity - 11*rho) -19*alpha*C - m1); +// m2 = m2 + rlx_setA*((3*rho - 5.5*(ux*ux+uy*uy+uz*uz)*rho0/porosity)- m2); +// jx = jx + Fx; +// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0)- m4) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +// jy = jy + Fy; +// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0)- m6) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +// jz = jz + Fz; +// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0)- m8) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +// m9 = m9 + rlx_setA*(((2*ux*ux-uy*uy-uz*uz)*rho0/porosity) + 0.5*alpha*C*(2*nx*nx-ny*ny-nz*nz) - m9); +// m10 = m10 + rlx_setA*( - m10); +// //m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); +// m11 = m11 + rlx_setA*(((uy*uy-uz*uz)*rho0/porosity) + 0.5*alpha*C*(ny*ny-nz*nz)- m11); +// m12 = m12 + rlx_setA*( - m12); +// //m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); +// m13 = m13 + rlx_setA*( (ux*uy*rho0/porosity) + 0.5*alpha*C*nx*ny - m13); +// m14 = m14 + rlx_setA*( (uy*uz*rho0/porosity) + 0.5*alpha*C*ny*nz - m14); +// m15 = m15 + rlx_setA*( (ux*uz*rho0/porosity) + 0.5*alpha*C*nx*nz - m15); +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); +// +// //.................inverse transformation...................................................... +// // q=0 +// fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; +// dist[n] = fq; +// +// // q = 1 +// fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); +// //nread = neighborList[n+Np]; +// dist[nr2] = fq; +// +// // q=2 +// fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); +// //nread = neighborList[n]; +// dist[nr1] = fq; +// +// // q = 3 +// fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); +// //nread = neighborList[n+3*Np]; +// dist[nr4] = fq; +// +// // q = 4 +// fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); +// //nread = neighborList[n+2*Np]; +// dist[nr3] = fq; +// +// // q = 5 +// fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); +// //nread = neighborList[n+5*Np]; +// dist[nr6] = fq; +// +// // q = 6 +// fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); +// //nread = neighborList[n+4*Np]; +// dist[nr5] = fq; +// +// // q = 7 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+ +// mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); +// //nread = neighborList[n+7*Np]; +// dist[nr8] = fq; +// +// // q = 8 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 +// +mrt_V12*m12+0.25*m13+0.125*(m17-m16); +// //nread = neighborList[n+6*Np]; +// dist[nr7] = fq; +// +// // q = 9 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+ +// mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); +// //nread = neighborList[n+9*Np]; +// dist[nr10] = fq; +// +// // q = 10 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+ +// mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); +// //nread = neighborList[n+8*Np]; +// dist[nr9] = fq; +// +// // q = 11 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12+0.25*m15+0.125*(m18-m16); +// //nread = neighborList[n+11*Np]; +// dist[nr12] = fq; +// +// // q = 12 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ +// mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); +// //nread = neighborList[n+10*Np]; +// dist[nr11]= fq; +// +// // q = 13 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12-0.25*m15-0.125*(m16+m18); +// //nread = neighborList[n+13*Np]; +// dist[nr14] = fq; +// +// // q= 14 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12-0.25*m15+0.125*(m16+m18); +// //nread = neighborList[n+12*Np]; +// dist[nr13] = fq; +// +// +// // q = 15 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) +// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); +// nread = neighborList[n+15*Np]; +// dist[nread] = fq; +// +// // q = 16 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) +// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); +// nread = neighborList[n+14*Np]; +// dist[nread] = fq; +// +// +// // q = 17 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) +// -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); +// nread = neighborList[n+17*Np]; +// dist[nread] = fq; +// +// // q = 18 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) +// -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); +// nread = neighborList[n+16*Np]; +// dist[nread] = fq; +// //........................................................................ +// +// // Instantiate mass transport distributions +// // Stationary value - distribution 0 +// nAB = 1.0/(nA+nB); +// Aq[n] = 0.3333333333333333*nA; +// Bq[n] = 0.3333333333333333*nB; +// +// //............................................... +// // q = 0,2,4 +// // Cq = {1,0,0}, {0,1,0}, {0,0,1} +// delta = beta*nA*nB*nAB*0.1111111111111111*nx; +// if (!(nA*nB*nAB>0)) delta=0; +// a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; +// b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; +// a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; +// b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; +// +// // q = 1 +// //nread = neighborList[n+Np]; +// Aq[nr2] = a1; +// Bq[nr2] = b1; +// // q=2 +// //nread = neighborList[n]; +// Aq[nr1] = a2; +// Bq[nr1] = b2; +// +// //............................................... +// // Cq = {0,1,0} +// delta = beta*nA*nB*nAB*0.1111111111111111*ny; +// if (!(nA*nB*nAB>0)) delta=0; +// a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; +// b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; +// a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; +// b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; +// +// // q = 3 +// //nread = neighborList[n+3*Np]; +// Aq[nr4] = a1; +// Bq[nr4] = b1; +// // q = 4 +// //nread = neighborList[n+2*Np]; +// Aq[nr3] = a2; +// Bq[nr3] = b2; +// +// //............................................... +// // q = 4 +// // Cq = {0,0,1} +// delta = beta*nA*nB*nAB*0.1111111111111111*nz; +// if (!(nA*nB*nAB>0)) delta=0; +// a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; +// b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; +// a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; +// b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; +// +// // q = 5 +// //nread = neighborList[n+5*Np]; +// Aq[nr6] = a1; +// Bq[nr6] = b1; +// // q = 6 +// //nread = neighborList[n+4*Np]; +// Aq[nr5] = a2; +// Bq[nr5] = b2; +// //............................................... +// } +// } +//} +// +////Model-2&3 +//__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, +// double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, +// double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, +// double Gx, double Gy, double Gz, int strideY, int strideZ, int start, int finish, int Np){ +// int ijk,nn,n; +// double fq; +// // conserved momemnts +// double rho,jx,jy,jz; +// double vx,vy,vz,v_mag; +// double ux,uy,uz,u_mag; +// // non-conserved moments +// double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; +// double m3,m5,m7; +// double t1,t2,t4,t6,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18; +// double t3,t5,t7; +// double nA,nB; // number density +// double a1,b1,a2,b2,nAB,delta; +// double C,nx,ny,nz; //color gradient magnitude and direction +// double phi,tau,rho0,rlx_setA,rlx_setB; +// +// double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) +// double porosity; +// double perm;//voxel permeability +// double c0, c1; //Guo's model parameters +// double tau_eff; +// double mu_eff;//kinematic viscosity +// double nx_phase,ny_phase,nz_phase,C_phase; +// double Fx,Fy,Fz; +// +// 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; s1.0) t1 =((t1>0.0)-(t1<0.0))*(1.0-fabs(t1))+t1; +// //........................................................................ +// nn = ijk+1; // neighbor index (get convention) +// m2 = Phi[nn]; // get neighbor for phi - 2 +// t2 = m2+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t2)>1.0) t2 =((t2>0.0)-(t2<0.0))*(1.0-fabs(t2))+t2; +// //........................................................................ +// nn = ijk-strideY; // neighbor index (get convention) +// m3 = Phi[nn]; // get neighbor for phi - 3 +// t3 = m3+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t3)>1.0) t3 =((t3>0.0)-(t3<0.0))*(1.0-fabs(t3))+t3; +// //........................................................................ +// nn = ijk+strideY; // neighbor index (get convention) +// m4 = Phi[nn]; // get neighbor for phi - 4 +// t4 = m4+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t4)>1.0) t4 =((t4>0.0)-(t4<0.0))*(1.0-fabs(t4))+t4; +// //........................................................................ +// nn = ijk-strideZ; // neighbor index (get convention) +// m5 = Phi[nn]; // get neighbor for phi - 5 +// t5 = m5+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t5)>1.0) t5 =((t5>0.0)-(t5<0.0))*(1.0-fabs(t5))+t5; +// //........................................................................ +// nn = ijk+strideZ; // neighbor index (get convention) +// m6 = Phi[nn]; // get neighbor for phi - 6 +// t6 = m6+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t6)>1.0) t6 =((t6>0.0)-(t6<0.0))*(1.0-fabs(t6))+t6; +// //........................................................................ +// nn = ijk-strideY-1; // neighbor index (get convention) +// m7 = Phi[nn]; // get neighbor for phi - 7 +// t7 = m7+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t7)>1.0) t7 =((t7>0.0)-(t7<0.0))*(1.0-fabs(t7))+t7; +// //........................................................................ +// nn = ijk+strideY+1; // neighbor index (get convention) +// m8 = Phi[nn]; // get neighbor for phi - 8 +// t8 = m8+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t8)>1.0) t8 =((t8>0.0)-(t8<0.0))*(1.0-fabs(t8))+t8; +// //........................................................................ +// nn = ijk+strideY-1; // neighbor index (get convention) +// m9 = Phi[nn]; // get neighbor for phi - 9 +// t9 = m9+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t9)>1.0) t9 =((t9>0.0)-(t9<0.0))*(1.0-fabs(t9))+t9; +// //........................................................................ +// nn = ijk-strideY+1; // neighbor index (get convention) +// m10 = Phi[nn]; // get neighbor for phi - 10 +// t10 = m10+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t10)>1.0) t10 =((t10>0.0)-(t10<0.0))*(1.0-fabs(t10))+t10; +// //........................................................................ +// nn = ijk-strideZ-1; // neighbor index (get convention) +// m11 = Phi[nn]; // get neighbor for phi - 11 +// t11 = m11+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t11)>1.0) t11 =((t11>0.0)-(t11<0.0))*(1.0-fabs(t11))+t11; +// //........................................................................ +// nn = ijk+strideZ+1; // neighbor index (get convention) +// m12 = Phi[nn]; // get neighbor for phi - 12 +// t12 = m12+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t12)>1.0) t12 =((t12>0.0)-(t12<0.0))*(1.0-fabs(t12))+t12; +// //........................................................................ +// nn = ijk+strideZ-1; // neighbor index (get convention) +// m13 = Phi[nn]; // get neighbor for phi - 13 +// t13 = m13+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t13)>1.0) t13 =((t13>0.0)-(t13<0.0))*(1.0-fabs(t13))+t13; +// //........................................................................ +// nn = ijk-strideZ+1; // neighbor index (get convention) +// m14 = Phi[nn]; // get neighbor for phi - 14 +// t14 = m14+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t14)>1.0) t14 =((t14>0.0)-(t14<0.0))*(1.0-fabs(t14))+t14; +// //........................................................................ +// nn = ijk-strideZ-strideY; // neighbor index (get convention) +// m15 = Phi[nn]; // get neighbor for phi - 15 +// t15 = m15+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t15)>1.0) t15 =((t15>0.0)-(t15<0.0))*(1.0-fabs(t15))+t15; +// //........................................................................ +// nn = ijk+strideZ+strideY; // neighbor index (get convention) +// m16 = Phi[nn]; // get neighbor for phi - 16 +// t16 = m16+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t16)>1.0) t16 =((t16>0.0)-(t16<0.0))*(1.0-fabs(t16))+t16; +// //........................................................................ +// nn = ijk+strideZ-strideY; // neighbor index (get convention) +// m17 = Phi[nn]; // get neighbor for phi - 17 +// t17 = m17+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t17)>1.0) t17 =((t17>0.0)-(t17<0.0))*(1.0-fabs(t17))+t17; +// //........................................................................ +// nn = ijk-strideZ+strideY; // neighbor index (get convention) +// m18 = Phi[nn]; // get neighbor for phi - 18 +// t18 = m18+(1.0-porosity)*GreySolidGrad[nn]; +// if (fabs(t18)>1.0) t18 =((t18>0.0)-(t18<0.0))*(1.0-fabs(t18))+t18; +// //............Compute the Color Gradient................................... +// nx_phase = -(m1-m2+0.5*(m7-m8+m9-m10+m11-m12+m13-m14)); +// ny_phase = -(m3-m4+0.5*(m7-m8-m9+m10+m15-m16+m17-m18)); +// nz_phase = -(m5-m6+0.5*(m11-m12-m13+m14+m15-m16-m17+m18)); +// C_phase = sqrt(nx_phase*nx_phase+ny_phase*ny_phase+nz_phase*nz_phase); +// //correct the normal color gradient by considering the effect of grey solid +// nx = -(t1-t2+0.5*(t7-t8+t9-t10+t11-t12+t13-t14)); +// ny = -(t3-t4+0.5*(t7-t8-t9+t10+t15-t16+t17-t18)); +// nz = -(t5-t6+0.5*(t11-t12-t13+t14+t15-t16-t17+t18)); +// +// if (C_phase==0.0){ +// nx = nx_phase; +// ny = ny_phase; +// nz = nz_phase; +// } +// +// //...........Normalize the Color Gradient................................. +// C = sqrt(nx*nx+ny*ny+nz*nz); +// double ColorMag = C; +// if (C==0.0) ColorMag=1.0; +// nx = nx/ColorMag; +// ny = ny/ColorMag; +// nz = nz/ColorMag; +// +// // q=0 +// fq = dist[n]; +// rho = fq; +// m1 = -30.0*fq; +// m2 = 12.0*fq; +// +// // q=1 +// fq = dist[2*Np+n]; +// rho += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jx = fq; +// m4 = -4.0*fq; +// m9 = 2.0*fq; +// m10 = -4.0*fq; +// +// // f2 = dist[10*Np+n]; +// fq = dist[1*Np+n]; +// rho += fq; +// m1 -= 11.0*(fq); +// m2 -= 4.0*(fq); +// jx -= fq; +// m4 += 4.0*(fq); +// m9 += 2.0*(fq); +// m10 -= 4.0*(fq); +// +// // q=3 +// fq = dist[4*Np+n]; +// rho += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jy = fq; +// m6 = -4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 = fq; +// m12 = -2.0*fq; +// +// // q = 4 +// fq = dist[3*Np+n]; +// rho+= fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jy -= fq; +// m6 += 4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 += fq; +// m12 -= 2.0*fq; +// +// // q=5 +// fq = dist[6*Np+n]; +// rho += fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jz = fq; +// m8 = -4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 -= fq; +// m12 += 2.0*fq; +// +// // q = 6 +// fq = dist[5*Np+n]; +// rho+= fq; +// m1 -= 11.0*fq; +// m2 -= 4.0*fq; +// jz -= fq; +// m8 += 4.0*fq; +// m9 -= fq; +// m10 += 2.0*fq; +// m11 -= fq; +// m12 += 2.0*fq; +// +// // q=7 +// fq = dist[8*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jy += fq; +// m6 += fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 = fq; +// m16 = fq; +// m17 = -fq; +// +// // q = 8 +// fq = dist[7*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jy -= fq; +// m6 -= fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 += fq; +// m16 -= fq; +// m17 += fq; +// +// // q=9 +// fq = dist[10*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jy -= fq; +// m6 -= fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 -= fq; +// m16 += fq; +// m17 += fq; +// +// // q = 10 +// fq = dist[9*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jy += fq; +// m6 += fq; +// m9 += fq; +// m10 += fq; +// m11 += fq; +// m12 += fq; +// m13 -= fq; +// m16 -= fq; +// m17 -= fq; +// +// // q=11 +// fq = dist[12*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jz += fq; +// m8 += fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 = fq; +// m16 -= fq; +// m18 = fq; +// +// // q=12 +// fq = dist[11*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jz -= fq; +// m8 -= fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 += fq; +// m16 += fq; +// m18 -= fq; +// +// // q=13 +// fq = dist[14*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx += fq; +// m4 += fq; +// jz -= fq; +// m8 -= fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 -= fq; +// m16 -= fq; +// m18 -= fq; +// +// // q=14 +// fq = dist[13*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jx -= fq; +// m4 -= fq; +// jz += fq; +// m8 += fq; +// m9 += fq; +// m10 += fq; +// m11 -= fq; +// m12 -= fq; +// m15 -= fq; +// m16 += fq; +// m18 += fq; +// +// // q=15 +// fq = dist[16*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy += fq; +// m6 += fq; +// jz += fq; +// m8 += fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 = fq; +// m17 += fq; +// m18 -= fq; +// +// // q=16 +// fq = dist[15*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy -= fq; +// m6 -= fq; +// jz -= fq; +// m8 -= fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 += fq; +// m17 -= fq; +// m18 += fq; +// +// // q=17 +// fq = dist[18*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy += fq; +// m6 += fq; +// jz -= fq; +// m8 -= fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 -= fq; +// m17 += fq; +// m18 += fq; +// +// // q=18 +// fq = dist[17*Np+n]; +// rho += fq; +// m1 += 8.0*fq; +// m2 += fq; +// jy -= fq; +// m6 -= fq; +// jz += fq; +// m8 += fq; +// m9 -= 2.0*fq; +// m10 -= 2.0*fq; +// m14 -= fq; +// m17 -= fq; +// m18 -= fq; +// +// // Compute greyscale related parameters +// c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); +// if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes +// //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); +// c1 = porosity*0.5*GeoFun/sqrt(perm); +// if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes +// +// vx = jx/rho0+0.5*(porosity*Gx); +// vy = jy/rho0+0.5*(porosity*Gy); +// vz = jz/rho0+0.5*(porosity*Gz); +// v_mag=sqrt(vx*vx+vy*vy+vz*vz); +// ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); +// uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); +// uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); +// u_mag=sqrt(ux*ux+uy*uy+uz*uz); +// +// //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium +// Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx); +// Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy); +// Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz); +// if (porosity==1.0){ +// Fx=rho0*(Gx); +// Fy=rho0*(Gy); +// Fz=rho0*(Gz); +// } +// +// // write the velocity +// Velocity[n] = ux; +// Velocity[Np+n] = uy; +// Velocity[2*Np+n] = uz; +// +// //........................................................................ +// //..............carry out relaxation process.............................. +// //..........Toelke, Fruediger et. al. 2006................................ +// if (C == 0.0) nx = ny = nz = 0.0; +// m1 = m1 + rlx_setA*((19*(ux*ux+uy*uy+uz*uz)*rho0/porosity - 11*rho) -19*alpha*C - m1); +// m2 = m2 + rlx_setA*((3*rho - 5.5*(ux*ux+uy*uy+uz*uz)*rho0/porosity)- m2); +// jx = jx + Fx; +// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0)- m4) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); +// jy = jy + Fy; +// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0)- m6) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); +// jz = jz + Fz; +// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0)- m8) +// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); +// m9 = m9 + rlx_setA*(((2*ux*ux-uy*uy-uz*uz)*rho0/porosity) + 0.5*alpha*C*(2*nx*nx-ny*ny-nz*nz) - m9); +// m10 = m10 + rlx_setA*( - m10); +// //m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); +// m11 = m11 + rlx_setA*(((uy*uy-uz*uz)*rho0/porosity) + 0.5*alpha*C*(ny*ny-nz*nz)- m11); +// m12 = m12 + rlx_setA*( - m12); +// //m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); +// m13 = m13 + rlx_setA*( (ux*uy*rho0/porosity) + 0.5*alpha*C*nx*ny - m13); +// m14 = m14 + rlx_setA*( (uy*uz*rho0/porosity) + 0.5*alpha*C*ny*nz - m14); +// m15 = m15 + rlx_setA*( (ux*uz*rho0/porosity) + 0.5*alpha*C*nx*nz - m15); +// m16 = m16 + rlx_setB*( - m16); +// m17 = m17 + rlx_setB*( - m17); +// m18 = m18 + rlx_setB*( - m18); +// +// //.................inverse transformation...................................................... +// // q=0 +// fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; +// dist[n] = fq; +// +// // q = 1 +// fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); +// dist[1*Np+n] = fq; +// +// // q=2 +// fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); +// dist[2*Np+n] = fq; +// +// // q = 3 +// fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); +// dist[3*Np+n] = fq; +// +// // q = 4 +// fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); +// dist[4*Np+n] = fq; +// +// // q = 5 +// fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); +// dist[5*Np+n] = fq; +// +// // q = 6 +// fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); +// dist[6*Np+n] = fq; +// +// // q = 7 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+ +// mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); +// dist[7*Np+n] = fq; +// +// +// // q = 8 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11 +// +mrt_V12*m12+0.25*m13+0.125*(m17-m16); +// dist[8*Np+n] = fq; +// +// // q = 9 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+ +// mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); +// dist[9*Np+n] = fq; +// +// // q = 10 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+ +// mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); +// dist[10*Np+n] = fq; +// +// +// // q = 11 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12+0.25*m15+0.125*(m18-m16); +// dist[11*Np+n] = fq; +// +// // q = 12 +// fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+ +// mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); +// dist[12*Np+n] = fq; +// +// // q = 13 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12-0.25*m15-0.125*(m16+m18); +// dist[13*Np+n] = fq; +// +// // q= 14 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4) +// +mrt_V7*m9+mrt_V11*m10-mrt_V8*m11 +// -mrt_V12*m12-0.25*m15+0.125*(m16+m18); +// +// dist[14*Np+n] = fq; +// +// // q = 15 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8) +// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); +// dist[15*Np+n] = fq; +// +// // q = 16 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8) +// -mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); +// dist[16*Np+n] = fq; +// +// +// // q = 17 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8) +// -mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); +// dist[17*Np+n] = fq; +// +// // q = 18 +// fq = mrt_V1*rho+mrt_V9*m1 +// +mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6) +// -mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); +// dist[18*Np+n] = fq; +// //........................................................................ +// +// // Instantiate mass transport distributions +// // Stationary value - distribution 0 +// nAB = 1.0/(nA+nB); +// Aq[n] = 0.3333333333333333*nA; +// Bq[n] = 0.3333333333333333*nB; +// +// //............................................... +// // q = 0,2,4 +// // Cq = {1,0,0}, {0,1,0}, {0,0,1} +// delta = beta*nA*nB*nAB*0.1111111111111111*nx; +// if (!(nA*nB*nAB>0)) delta=0; +// a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; +// b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; +// a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; +// b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; +// +// Aq[1*Np+n] = a1; +// Bq[1*Np+n] = b1; +// Aq[2*Np+n] = a2; +// Bq[2*Np+n] = b2; +// +// //............................................... +// // q = 2 +// // Cq = {0,1,0} +// delta = beta*nA*nB*nAB*0.1111111111111111*ny; +// if (!(nA*nB*nAB>0)) delta=0; +// a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; +// b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; +// a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; +// b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; +// +// Aq[3*Np+n] = a1; +// Bq[3*Np+n] = b1; +// Aq[4*Np+n] = a2; +// Bq[4*Np+n] = b2; +// //............................................... +// // q = 4 +// // Cq = {0,0,1} +// delta = beta*nA*nB*nAB*0.1111111111111111*nz; +// if (!(nA*nB*nAB>0)) delta=0; +// a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; +// b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; +// a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; +// b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; +// +// Aq[5*Np+n] = a1; +// Bq[5*Np+n] = b1; +// Aq[6*Np+n] = a2; +// Bq[6*Np+n] = b2; +// //............................................... +// +// } +// } +//} //__global__ void dvc_ScaLBL_D3Q19_GreyscaleColor_Init(double *dist, double *Porosity, int Np) //{ @@ -1413,15 +2840,16 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, // } //} +//Model-1 extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, - double *ColorGrad,double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, + double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np){ //cudaProfilerStart(); //cudaFuncSetCacheConfig(dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor, cudaFuncCachePreferL1); - dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor<<>>(Map, dist, Aq, Bq, Den,ColorGrad, Phi, GreySolidGrad, Poros, Perm, Vel, + dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor<<>>(Map, dist, Aq, Bq, Den, Phi, GreySolidGrad, Poros, Perm, Vel, rhoA, rhoB, tauA, tauB, tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, strideY, strideZ, start, finish, Np); cudaError_t err = cudaGetLastError(); if (cudaSuccess != err){ @@ -1431,15 +2859,16 @@ extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, doubl } +//Model-1 extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *d_neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, - double *ColorGrad,double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, + double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, double rhoA, double rhoB, double tauA, double tauB, double tauA_eff,double tauB_eff, double alpha, double beta, double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np){ //cudaProfilerStart(); //cudaFuncSetCacheConfig(dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor, cudaFuncCachePreferL1); - dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor<<>>(d_neighborList, Map, dist, Aq, Bq, Den,ColorGrad, Phi, GreySolidGrad, Poros, Perm,Vel, + dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor<<>>(d_neighborList, Map, dist, Aq, Bq, Den, Phi, GreySolidGrad, Poros, Perm,Vel, rhoA, rhoB, tauA, tauB, tauA_eff, tauB_eff,alpha, beta, Fx, Fy, Fz, strideY, strideZ, start, finish, Np); cudaError_t err = cudaGetLastError(); @@ -1449,3 +2878,40 @@ extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *d_neighborList, int *Map, //cudaProfilerStop(); } +////Model-2&3 +//extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, +// double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, +// double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, +// double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np){ +// +// //cudaProfilerStart(); +// //cudaFuncSetCacheConfig(dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor, cudaFuncCachePreferL1); +// +// dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor<<>>(Map, dist, Aq, Bq, Den, Phi, GreySolidGrad, Poros, Perm, Vel, +// rhoA, rhoB, tauA, tauB, tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, strideY, strideZ, start, finish, Np); +// cudaError_t err = cudaGetLastError(); +// if (cudaSuccess != err){ +// printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleColor: %s \n",cudaGetErrorString(err)); +// } +// //cudaProfilerStop(); +// +//} +// +////Model-2&3 +//extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *d_neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, +// double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, +// double rhoA, double rhoB, double tauA, double tauB, double tauA_eff,double tauB_eff, double alpha, double beta, +// double Fx, double Fy, double Fz, int strideY, int strideZ, int start, int finish, int Np){ +// +// //cudaProfilerStart(); +// //cudaFuncSetCacheConfig(dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor, cudaFuncCachePreferL1); +// +// dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor<<>>(d_neighborList, Map, dist, Aq, Bq, Den, Phi, GreySolidGrad, Poros, Perm,Vel, +// rhoA, rhoB, tauA, tauB, tauA_eff, tauB_eff,alpha, beta, Fx, Fy, Fz, strideY, strideZ, start, finish, Np); +// +// cudaError_t err = cudaGetLastError(); +// if (cudaSuccess != err){ +// printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleColor: %s \n",cudaGetErrorString(err)); +// } +// //cudaProfilerStop(); +//} diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index dcbab77e..16e5ece5 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -318,7 +318,7 @@ void ScaLBL_GreyscaleColorModel::AssignComponentLabels() label_count_global[idx] = Dm->Comm.sumReduce( label_count[idx] ); if (rank==0){ - printf("Component labels: %lu \n",NLABELS); + printf("Number of component labels: %lu \n",NLABELS); for (unsigned int idx=0; idx 0 - // water-wet < 0 - // neutral = 0 - double *SolidPotential_host = new double [Nx*Ny*Nz]; - double *GreySolidGrad_host = new double [3*Np]; - - size_t NLABELS=0; - signed char VALUE=0; - double AFFINITY=0.f; - - auto LabelList = greyscaleColor_db->getVector( "GreySolidLabels" ); - auto AffinityList = greyscaleColor_db->getVector( "GreySolidAffinity" ); - - NLABELS=LabelList.size(); - if (NLABELS != AffinityList.size()){ - ERROR("Error: GreySolidLabels and GreySolidAffinity must be the same length! \n"); - } - - double label_count[NLABELS]; - double label_count_global[NLABELS]; - // Assign the labels - - for (size_t idx=0; idxid[n] = 0; // set mask to zero since this is an immobile component - } - } - SolidPotential_host[n] = AFFINITY; - } - } - } - - // Calculate grey-solid color-gradient - double *Dst; - Dst = new double [3*3*3]; - for (int kk=0; kk<3; kk++){ - for (int jj=0; jj<3; jj++){ - for (int ii=0; ii<3; ii++){ - int index = kk*9+jj*3+ii; - Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); - } - } - } - double w_face = 1.f; - double w_edge = 0.5; - double w_corner = 0.f; - //local - Dst[13] = 0.f; - //faces - Dst[4] = w_face; - Dst[10] = w_face; - Dst[12] = w_face; - Dst[14] = w_face; - Dst[16] = w_face; - Dst[22] = w_face; - // corners - Dst[0] = w_corner; - Dst[2] = w_corner; - Dst[6] = w_corner; - Dst[8] = w_corner; - Dst[18] = w_corner; - Dst[20] = w_corner; - Dst[24] = w_corner; - Dst[26] = w_corner; - // edges - Dst[1] = w_edge; - Dst[3] = w_edge; - Dst[5] = w_edge; - Dst[7] = w_edge; - Dst[9] = w_edge; - Dst[11] = w_edge; - Dst[15] = w_edge; - Dst[17] = w_edge; - Dst[19] = w_edge; - Dst[21] = w_edge; - Dst[23] = w_edge; - Dst[25] = w_edge; - - for (int k=1; kComm.sumReduce( label_count[idx] ); - - if (rank==0){ - printf("Grey-solid labels: %lu \n",NLABELS); - for (unsigned int idx=0; idx 0 +// // water-wet < 0 +// // neutral = 0 +// +// double *GreySolidPhi_host = new double [Nx*Ny*Nz]; +// //initialize grey solid phase field +// for (int k=0;kgetVector( "GreySolidLabels" ); +// auto AffinityList = greyscaleColor_db->getVector( "GreySolidAffinity" ); +// +// size_t NLABELS=0; +// NLABELS=LabelList.size(); +// if (NLABELS != AffinityList.size()){ +// ERROR("Error: GreySolidLabels and GreySolidAffinity must be the same length! \n"); +// } +// +// double *Dst; +// Dst = new double [3*3*3]; +// for (int kk=0; kk<3; kk++){ +// for (int jj=0; jj<3; jj++){ +// for (int ii=0; ii<3; ii++){ +// int index = kk*9+jj*3+ii; +// Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); +// } +// } +// } +// double w_face = 1.f; +// double w_edge = 1.f; +// double w_corner = 0.f; +// //local +// Dst[13] = 0.f; +// //faces +// Dst[4] = w_face; +// Dst[10] = w_face; +// Dst[12] = w_face; +// Dst[14] = w_face; +// Dst[16] = w_face; +// Dst[22] = w_face; +// // corners +// Dst[0] = w_corner; +// Dst[2] = w_corner; +// Dst[6] = w_corner; +// Dst[8] = w_corner; +// Dst[18] = w_corner; +// Dst[20] = w_corner; +// Dst[24] = w_corner; +// Dst[26] = w_corner; +// // edges +// Dst[1] = w_edge; +// Dst[3] = w_edge; +// Dst[5] = w_edge; +// Dst[7] = w_edge; +// Dst[9] = w_edge; +// Dst[11] = w_edge; +// Dst[15] = w_edge; +// Dst[17] = w_edge; +// Dst[19] = w_edge; +// Dst[21] = w_edge; +// Dst[23] = w_edge; +// Dst[25] = w_edge; +// +// for (int k=1; kid[n]; +// double AFFINITY=0.f; +// // Assign the affinity from the paired list +// for (unsigned int idx=0; idx < NLABELS; idx++){ +// //printf("idx=%i, value=%i, %i, \n",idx, VALUE,LabelList[idx]); +// if (VALUE == LabelList[idx]){ +// AFFINITY=AffinityList[idx]; +// idx = NLABELS; +// //Mask->id[n] = 0; // set mask to zero since this is an immobile component +// } +// } +// +// if (VALUE>2){//i.e. a grey node +// double neighbor_counter = 0; +// for (int kk=0; kk<3; kk++){ +// for (int jj=0; jj<3; jj++){ +// for (int ii=0; ii<3; ii++){ +// +// int index = kk*9+jj*3+ii; +// double weight= Dst[index]; +// +// int idi=i+ii-1; +// int idj=j+jj-1; +// int idk=k+kk-1; +// +// if (idi < 0) idi=0; +// if (idj < 0) idj=0; +// if (idk < 0) idk=0; +// if (!(idi < Nx)) idi=Nx-1; +// if (!(idj < Ny)) idj=Ny-1; +// if (!(idk < Nz)) idk=Nz-1; +// +// int nn = idk*Nx*Ny + idj*Nx + idi; +// //if (Mask->id[nn] != VALUE){//Model-2:i.e. open nodes, impermeable solid nodes or any other type of greynodes +// if (Mask->id[nn] <=0){//Model-3:i.e. only impermeable solid nodes or any other type of greynodes +// neighbor_counter +=weight; +// } +// } +// } +// } +// if (neighbor_counter>0){ +// GreySolidPhi_host[n] = AFFINITY; +// } +// } +// } +// } +// } +// +// if (rank==0){ +// printf("Number of grey-solid labels: %lu \n",NLABELS); +// for (unsigned int idx=0; idxSendHalo(Phi); if (greyMode==true){ - ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den,ColorGrad, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, + //Model-1 + ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ////Model-2&3 + //ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi,GreySolidPhi,Porosity_dvc,Permeability_dvc,Velocity, + // rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, + // alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); } else{ ScaLBL_D3Q19_AAodd_Color(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, @@ -1039,9 +1033,14 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); } if (greyMode==true){ - ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den,ColorGrad, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, + //Model-1 + ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + ////Model-2&3 + //ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi,GreySolidPhi,Porosity_dvc,Permeability_dvc,Velocity, + // rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, + // alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); } else{ ScaLBL_D3Q19_AAodd_Color(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, @@ -1068,9 +1067,14 @@ void ScaLBL_GreyscaleColorModel::Run(){ } ScaLBL_Comm_Regular->SendHalo(Phi); if (greyMode==true){ - ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den,ColorGrad, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, + //Model-1 + ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + ////Model-2&3 + //ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den, Phi,GreySolidPhi,Porosity_dvc,Permeability_dvc,Velocity, + // rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, + // alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); } else{ ScaLBL_D3Q19_AAeven_Color(dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, @@ -1089,9 +1093,14 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); } if (greyMode==true){ - ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den,ColorGrad, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, + //Model-1 + ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); + ////Model-2&3 + //ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den, Phi,GreySolidPhi,Porosity_dvc,Permeability_dvc,Velocity, + // rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, + // alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); } else{ ScaLBL_D3Q19_AAeven_Color(dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, @@ -2020,25 +2029,415 @@ void ScaLBL_GreyscaleColorModel::WriteDebug(){ fwrite(PhaseField.data(),8,N,GreySG_Z_FILE); fclose(GreySG_Z_FILE); - ScaLBL_Comm->RegularLayout(Map,&ColorGrad[0],PhaseField); - FILE *CGX_FILE; - sprintf(LocalRankFilename,"Gradient_X.%05i.raw",rank); - CGX_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,CGX_FILE); - fclose(CGX_FILE); - - ScaLBL_Comm->RegularLayout(Map,&ColorGrad[Np],PhaseField); - FILE *CGY_FILE; - sprintf(LocalRankFilename,"Gradient_Y.%05i.raw",rank); - CGY_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,CGY_FILE); - fclose(CGY_FILE); - - ScaLBL_Comm->RegularLayout(Map,&ColorGrad[2*Np],PhaseField); - FILE *CGZ_FILE; - sprintf(LocalRankFilename,"Gradient_Z.%05i.raw",rank); - CGZ_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,CGZ_FILE); - fclose(CGZ_FILE); +// ScaLBL_Comm->RegularLayout(Map,&ColorGrad[0],PhaseField); +// FILE *CGX_FILE; +// sprintf(LocalRankFilename,"Gradient_X.%05i.raw",rank); +// CGX_FILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,CGX_FILE); +// fclose(CGX_FILE); +// +// ScaLBL_Comm->RegularLayout(Map,&ColorGrad[Np],PhaseField); +// FILE *CGY_FILE; +// sprintf(LocalRankFilename,"Gradient_Y.%05i.raw",rank); +// CGY_FILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,CGY_FILE); +// fclose(CGY_FILE); +// +// ScaLBL_Comm->RegularLayout(Map,&ColorGrad[2*Np],PhaseField); +// FILE *CGZ_FILE; +// sprintf(LocalRankFilename,"Gradient_Z.%05i.raw",rank); +// CGZ_FILE = fopen(LocalRankFilename,"wb"); +// fwrite(PhaseField.data(),8,N,CGZ_FILE); +// fclose(CGZ_FILE); } + +//void ScaLBL_GreyscaleColorModel::AssignGreySolidLabels()//Model-1 +//{ +// // ONLY initialize grey nodes +// // Key input parameters: +// // 1. GreySolidLabels +// // labels for grey nodes +// // 2. GreySolidAffinity +// // affinity ranges [-1,1] +// // oil-wet > 0 +// // water-wet < 0 +// // neutral = 0 +// double *SolidPotential_host = new double [Nx*Ny*Nz]; +// double *GreySolidGrad_host = new double [3*Np]; +// +// size_t NLABELS=0; +// signed char VALUE=0; +// double AFFINITY=0.f; +// +// auto LabelList = greyscaleColor_db->getVector( "GreySolidLabels" ); +// auto AffinityList = greyscaleColor_db->getVector( "GreySolidAffinity" ); +// +// NLABELS=LabelList.size(); +// if (NLABELS != AffinityList.size()){ +// ERROR("Error: GreySolidLabels and GreySolidAffinity must be the same length! \n"); +// } +// +// for (int k=0;kid[n] = 0; // set mask to zero since this is an immobile component +// } +// } +// SolidPotential_host[n] = AFFINITY; +// } +// } +// } +// +// // Calculate grey-solid color-gradient +// double *Dst; +// Dst = new double [3*3*3]; +// for (int kk=0; kk<3; kk++){ +// for (int jj=0; jj<3; jj++){ +// for (int ii=0; ii<3; ii++){ +// int index = kk*9+jj*3+ii; +// Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); +// } +// } +// } +// double w_face = 1.f; +// double w_edge = 0.5; +// double w_corner = 0.f; +// //local +// Dst[13] = 0.f; +// //faces +// Dst[4] = w_face; +// Dst[10] = w_face; +// Dst[12] = w_face; +// Dst[14] = w_face; +// Dst[16] = w_face; +// Dst[22] = w_face; +// // corners +// Dst[0] = w_corner; +// Dst[2] = w_corner; +// Dst[6] = w_corner; +// Dst[8] = w_corner; +// Dst[18] = w_corner; +// Dst[20] = w_corner; +// Dst[24] = w_corner; +// Dst[26] = w_corner; +// // edges +// Dst[1] = w_edge; +// Dst[3] = w_edge; +// Dst[5] = w_edge; +// Dst[7] = w_edge; +// Dst[9] = w_edge; +// Dst[11] = w_edge; +// Dst[15] = w_edge; +// Dst[17] = w_edge; +// Dst[19] = w_edge; +// Dst[21] = w_edge; +// Dst[23] = w_edge; +// Dst[25] = w_edge; +// +// for (int k=1; k 0 + // water-wet < 0 + // neutral = 0 + double *SolidPotential_host = new double [Nx*Ny*Nz]; + double *GreySolidGrad_host = new double [3*Np]; + + size_t NLABELS=0; + signed char VALUE=0; + double AFFINITY=0.f; + + auto LabelList = greyscaleColor_db->getVector( "GreySolidLabels" ); + auto AffinityList = greyscaleColor_db->getVector( "GreySolidAffinity" ); + + NLABELS=LabelList.size(); + if (NLABELS != AffinityList.size()){ + ERROR("Error: GreySolidLabels and GreySolidAffinity must be the same length! \n"); + } + + for (int k=0;kid[n] = 0; // set mask to zero since this is an immobile component + } + } + SolidPotential_host[n] = AFFINITY; + } + } + } + + // Calculate grey-solid color-gradient + double *Dst; + Dst = new double [3*3*3]; + for (int kk=0; kk<3; kk++){ + for (int jj=0; jj<3; jj++){ + for (int ii=0; ii<3; ii++){ + int index = kk*9+jj*3+ii; + Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); + } + } + } + double w_face = 1.f; + double w_edge = 0.5; + double w_corner = 0.f; + //local + Dst[13] = 0.f; + //faces + Dst[4] = w_face; + Dst[10] = w_face; + Dst[12] = w_face; + Dst[14] = w_face; + Dst[16] = w_face; + Dst[22] = w_face; + // corners + Dst[0] = w_corner; + Dst[2] = w_corner; + Dst[6] = w_corner; + Dst[8] = w_corner; + Dst[18] = w_corner; + Dst[20] = w_corner; + Dst[24] = w_corner; + Dst[26] = w_corner; + // edges + Dst[1] = w_edge; + Dst[3] = w_edge; + Dst[5] = w_edge; + Dst[7] = w_edge; + Dst[9] = w_edge; + Dst[11] = w_edge; + Dst[15] = w_edge; + Dst[17] = w_edge; + Dst[19] = w_edge; + Dst[21] = w_edge; + Dst[23] = w_edge; + Dst[25] = w_edge; + + for (int k=1; kSDs(i,j,k)<2.0){ + GreySolidGrad_host[idx+0*Np] = phi_x; + GreySolidGrad_host[idx+1*Np] = phi_y; + GreySolidGrad_host[idx+2*Np] = phi_z; + } + else{ + GreySolidGrad_host[idx+0*Np] = 0.0; + GreySolidGrad_host[idx+1*Np] = 0.0; + GreySolidGrad_host[idx+2*Np] = 0.0; + } + } + } + } + } + + + if (rank==0){ + printf("Number of Grey-solid labels: %lu \n",NLABELS); + for (unsigned int idx=0; idx 0 +// // water-wet < 0 +// // neutral = 0 +// +// //double *SolidPotential_host = new double [Nx*Ny*Nz]; +// double *GreySolidPhi_host = new double [Nx*Ny*Nz]; +// signed char VALUE=0; +// double AFFINITY=0.f; +// +// auto LabelList = greyscaleColor_db->getVector( "GreySolidLabels" ); +// auto AffinityList = greyscaleColor_db->getVector( "GreySolidAffinity" ); +// +// size_t NLABELS=0; +// NLABELS=LabelList.size(); +// if (NLABELS != AffinityList.size()){ +// ERROR("Error: GreySolidLabels and GreySolidAffinity must be the same length! \n"); +// } +// +// for (int k=0;kid[n] = 0; // set mask to zero since this is an immobile component +// } +// } +// GreySolidPhi_host[n] = AFFINITY; +// } +// } +// } +// +// if (rank==0){ +// printf("Number of grey-solid labels: %lu \n",NLABELS); +// for (unsigned int idx=0; idx Date: Wed, 29 Jul 2020 09:56:52 -0400 Subject: [PATCH 66/75] adding option to refine distance with phase field --- analysis/Minkowski.cpp | 32 ++++++++++++++++++++++++++++++++ analysis/Minkowski.h | 1 + 2 files changed, 33 insertions(+) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index 9e6e0f43..ddc6382e 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -156,6 +156,38 @@ void Minkowski::MeasureObject(){ } +void Minkowski::MeasureObject(double factor, const DoubleArray &Phi){ + /* + * compute the distance to an object + * + * THIS ALGORITHM ASSUMES THAT id() is populated with phase id to distinguish objects + * 0 - labels the object + * 1 - labels the rest of the + */ + for (int k=0; k -2.5) + distance(i,j,k) = factor*log((1.0+value)/(1.0-value)); + } + } + } + + ComputeScalar(distance,0.0); + +} + + int Minkowski::MeasureConnectedPathway(){ /* * compute the connected pathway for object with LABEL in id field diff --git a/analysis/Minkowski.h b/analysis/Minkowski.h index bcdf95f7..d6f06f56 100644 --- a/analysis/Minkowski.h +++ b/analysis/Minkowski.h @@ -63,6 +63,7 @@ public: Minkowski(std::shared_ptr Dm); ~Minkowski(); void MeasureObject(); + void MeasureObject(double factor, const DoubleArray &Phi); int MeasureConnectedPathway(); void ComputeScalar(const DoubleArray& Field, const double isovalue); From 6e9b808925738fd0c79cb6ca3a012ba0f03cbda6 Mon Sep 17 00:00:00 2001 From: James McClure Date: Wed, 29 Jul 2020 10:03:16 -0400 Subject: [PATCH 67/75] adding option to refine distance with phase field --- analysis/Minkowski.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++ analysis/Minkowski.h | 1 + 2 files changed, 45 insertions(+) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index ddc6382e..7228157f 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -232,6 +232,50 @@ int Minkowski::MeasureConnectedPathway(){ return n_connected_components; } +int Minkowski::MeasureConnectedPathway(double factor, const DoubleArray &Phi){ + /* + * compute the connected pathway for object with LABEL in id field + * compute the labels for connected components + * compute the distance to the connected pathway + * + * THIS ALGORITHM ASSUMES THAT id() is populated with phase id to distinguish objects + */ + + char LABEL = 0; + for (int k=0; krank_info,distance,distance,vF,vF,label,Dm->Comm); +// int n_connected_components = ComputeGlobalPhaseComponent(Nx-2,Ny-2,Nz-2,Dm->rank_info,const IntArray &PhaseID, int &VALUE, BlobIDArray &GlobalBlobID, Dm->Comm ) + MPI_Barrier(Dm->Comm); + + for (int k=0; k Date: Wed, 29 Jul 2020 10:08:29 -0400 Subject: [PATCH 68/75] using phase to update distance in subphase --- analysis/SubPhase.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/analysis/SubPhase.cpp b/analysis/SubPhase.cpp index 2a5e3350..8920fabd 100644 --- a/analysis/SubPhase.cpp +++ b/analysis/SubPhase.cpp @@ -427,13 +427,13 @@ void SubPhase::Full(){ } } // measure the whole object - morph_n->MeasureObject(); + morph_n->MeasureObject(0.5/beta,Phi); nd.V = morph_n->V(); nd.A = morph_n->A(); nd.H = morph_n->H(); nd.X = morph_n->X(); // measure only the connected part - nd.Nc = morph_n->MeasureConnectedPathway(); + nd.Nc = morph_n->MeasureConnectedPathway(0.5/beta,Phi); nc.V = morph_n->V(); nc.A = morph_n->A(); nc.H = morph_n->H(); @@ -475,13 +475,13 @@ void SubPhase::Full(){ } } } - morph_w->MeasureObject(); + morph_w->MeasureObject(-0.5/beta,Phi); wd.V = morph_w->V(); wd.A = morph_w->A(); wd.H = morph_w->H(); wd.X = morph_w->X(); // measure only the connected part - wd.Nc = morph_w->MeasureConnectedPathway(); + wd.Nc = morph_w->MeasureConnectedPathway(-0.5/beta,Phi); wc.V = morph_w->V(); wc.A = morph_w->A(); wc.H = morph_w->H(); From d88455a854d7b8226b77022aac2dd68c847d047a Mon Sep 17 00:00:00 2001 From: James McClure Date: Fri, 31 Jul 2020 22:09:34 -0400 Subject: [PATCH 69/75] distance from color, fix sign --- analysis/Minkowski.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index 7228157f..70d38173 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -176,9 +176,14 @@ void Minkowski::MeasureObject(double factor, const DoubleArray &Phi){ for (int k=0; k -2.5) - distance(i,j,k) = factor*log((1.0+value)/(1.0-value)); + double value = Phi(i,j,k); + double dist_value = distance(i,j,k); + if (dist_value < 2.5 && dist_value > -2.5) { + double new_distance = factor*log((1.0+value)/(1.0-value)); + if (dist_value*new_distance < 0.0 ) + new_distance = (-1.0)*new_distance; + distance(i,j,k) = new_distance; + } } } } From a1df2b57dee08a53fd85063e9969f1b381a044a6 Mon Sep 17 00:00:00 2001 From: James E McClure Date: Mon, 3 Aug 2020 07:08:14 -0400 Subject: [PATCH 70/75] update subphase / minkowski for Euler --- analysis/Minkowski.cpp | 9 +++++---- analysis/SubPhase.cpp | 8 ++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/analysis/Minkowski.cpp b/analysis/Minkowski.cpp index 70d38173..668875b9 100644 --- a/analysis/Minkowski.cpp +++ b/analysis/Minkowski.cpp @@ -94,11 +94,13 @@ void Minkowski::ComputeScalar(const DoubleArray& Field, const double isovalue) //Xi += 0.25*double(object.VertexCount); // check if vertices are at corners for (int idx=0; idxMeasureObject(0.5/beta,Phi); + morph_n->MeasureObject();//0.5/beta,Phi); nd.V = morph_n->V(); nd.A = morph_n->A(); nd.H = morph_n->H(); nd.X = morph_n->X(); // measure only the connected part - nd.Nc = morph_n->MeasureConnectedPathway(0.5/beta,Phi); + nd.Nc = morph_n->MeasureConnectedPathway();//0.5/beta,Phi); nc.V = morph_n->V(); nc.A = morph_n->A(); nc.H = morph_n->H(); @@ -475,13 +475,13 @@ void SubPhase::Full(){ } } } - morph_w->MeasureObject(-0.5/beta,Phi); + morph_w->MeasureObject();//-0.5/beta,Phi); wd.V = morph_w->V(); wd.A = morph_w->A(); wd.H = morph_w->H(); wd.X = morph_w->X(); // measure only the connected part - wd.Nc = morph_w->MeasureConnectedPathway(-0.5/beta,Phi); + wd.Nc = morph_w->MeasureConnectedPathway();//-0.5/beta,Phi); wc.V = morph_w->V(); wc.A = morph_w->A(); wc.H = morph_w->H(); From 99ee51d8e11a4e8a40d140b6324b79330367ec65 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Wed, 5 Aug 2020 17:33:54 -0400 Subject: [PATCH 71/75] add a full form of Guo-type body force scheme, but now using it now --- gpu/GreyscaleColor.cu | 84 ++++- models/GreyscaleColorModel.cpp | 635 +++++++++++++++++---------------- 2 files changed, 398 insertions(+), 321 deletions(-) diff --git a/gpu/GreyscaleColor.cu b/gpu/GreyscaleColor.cu index 9ac4ce00..2af5760b 100644 --- a/gpu/GreyscaleColor.cu +++ b/gpu/GreyscaleColor.cu @@ -4,7 +4,7 @@ #define NBLOCKS 1024 #define NTHREADS 256 -//Model-1 +//Model-1 & 4 __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff,double alpha, double beta, @@ -516,6 +516,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Ma //........................................................................ //..............carry out relaxation process.............................. //..........Toelke, Fruediger et. al. 2006................................ + //---------------- NO higher-order force -------------------------------// if (C == 0.0) nx = ny = nz = 0.0; m1 = m1 + rlx_setA*((19*(ux*ux+uy*uy+uz*uz)*rho0/porosity - 11*rho) -19*alpha*C - m1); m2 = m2 + rlx_setA*((3*rho - 5.5*(ux*ux+uy*uy+uz*uz)*rho0/porosity)- m2); @@ -540,6 +541,43 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Ma m16 = m16 + rlx_setB*( - m16); m17 = m17 + rlx_setB*( - m17); m18 = m18 + rlx_setB*( - m18); + //----------------------------------------------------------------------// + + //----------------With higher-order force ------------------------------// + //if (C == 0.0) nx = ny = nz = 0.0; + //m1 = m1 + rlx_setA*((19*(ux*ux+uy*uy+uz*uz)*rho0/porosity - 11*rho) -19*alpha*C - m1) + // + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; + //m2 = m2 + rlx_setA*((3*rho - 5.5*(ux*ux+uy*uy+uz*uz)*rho0/porosity)- m2) + // + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; + //jx = jx + Fx; + //m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0)- m4) + // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + //jy = jy + Fy; + //m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0)- m6) + // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + //jz = jz + Fz; + //m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0)- m8) + // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + //m9 = m9 + rlx_setA*(((2*ux*ux-uy*uy-uz*uz)*rho0/porosity) + 0.5*alpha*C*(2*nx*nx-ny*ny-nz*nz) - m9) + // + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; + ////m10 = m10 + rlx_setA*( - m10); + //m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) + // + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; + //m11 = m11 + rlx_setA*(((uy*uy-uz*uz)*rho0/porosity) + 0.5*alpha*C*(ny*ny-nz*nz)- m11) + // + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; + ////m12 = m12 + rlx_setA*( - m12); + //m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) + // + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; + //m13 = m13 + rlx_setA*( (ux*uy*rho0/porosity) + 0.5*alpha*C*nx*ny - m13); + // + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; + //m14 = m14 + rlx_setA*( (uy*uz*rho0/porosity) + 0.5*alpha*C*ny*nz - m14); + // + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; + //m15 = m15 + rlx_setA*( (ux*uz*rho0/porosity) + 0.5*alpha*C*nx*nz - m15); + // + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; + //m16 = m16 + rlx_setB*( - m16); + //m17 = m17 + rlx_setB*( - m17); + //m18 = m18 + rlx_setB*( - m18); + //----------------------------------------------------------------------// //.................inverse transformation...................................................... // q=0 @@ -727,7 +765,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleColor(int *neighborList, int *Ma } } -//Model-1 +//Model-1 & 4 __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, double *Phi, double *GreySolidGrad, double *Poros,double *Perm, double *Velocity, double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, @@ -1183,6 +1221,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, //........................................................................ //..............carry out relaxation process.............................. //..........Toelke, Fruediger et. al. 2006................................ + //---------------- NO higher-order force -------------------------------// if (C == 0.0) nx = ny = nz = 0.0; m1 = m1 + rlx_setA*((19*(ux*ux+uy*uy+uz*uz)*rho0/porosity - 11*rho) -19*alpha*C - m1); m2 = m2 + rlx_setA*((3*rho - 5.5*(ux*ux+uy*uy+uz*uz)*rho0/porosity)- m2); @@ -1207,6 +1246,43 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, m16 = m16 + rlx_setB*( - m16); m17 = m17 + rlx_setB*( - m17); m18 = m18 + rlx_setB*( - m18); + //----------------------------------------------------------------------// + + //----------------With higher-order force ------------------------------// + //if (C == 0.0) nx = ny = nz = 0.0; + //m1 = m1 + rlx_setA*((19*(ux*ux+uy*uy+uz*uz)*rho0/porosity - 11*rho) -19*alpha*C - m1) + // + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; + //m2 = m2 + rlx_setA*((3*rho - 5.5*(ux*ux+uy*uy+uz*uz)*rho0/porosity)- m2) + // + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; + //jx = jx + Fx; + //m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0)- m4) + // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); + //jy = jy + Fy; + //m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0)- m6) + // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); + //jz = jz + Fz; + //m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0)- m8) + // + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); + //m9 = m9 + rlx_setA*(((2*ux*ux-uy*uy-uz*uz)*rho0/porosity) + 0.5*alpha*C*(2*nx*nx-ny*ny-nz*nz) - m9) + // + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; + ////m10 = m10 + rlx_setA*( - m10); + //m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) + // + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; + //m11 = m11 + rlx_setA*(((uy*uy-uz*uz)*rho0/porosity) + 0.5*alpha*C*(ny*ny-nz*nz)- m11) + // + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; + ////m12 = m12 + rlx_setA*( - m12); + //m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) + // + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; + //m13 = m13 + rlx_setA*( (ux*uy*rho0/porosity) + 0.5*alpha*C*nx*ny - m13); + // + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; + //m14 = m14 + rlx_setA*( (uy*uz*rho0/porosity) + 0.5*alpha*C*ny*nz - m14); + // + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; + //m15 = m15 + rlx_setA*( (ux*uz*rho0/porosity) + 0.5*alpha*C*nx*nz - m15); + // + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; + //m16 = m16 + rlx_setB*( - m16); + //m17 = m17 + rlx_setB*( - m17); + //m18 = m18 + rlx_setB*( - m18); + //----------------------------------------------------------------------// //.................inverse transformation...................................................... // q=0 @@ -2840,7 +2916,7 @@ __global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, // } //} -//Model-1 +//Model-1 & 4 extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, double *Aq, double *Bq, double *Den, double *Phi,double *GreySolidGrad, double *Poros,double *Perm,double *Vel, double rhoA, double rhoB, double tauA, double tauB,double tauA_eff,double tauB_eff, double alpha, double beta, @@ -2859,7 +2935,7 @@ extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleColor(int *Map, double *dist, doubl } -//Model-1 +//Model-1 & 4 extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleColor(int *d_neighborList, int *Map, double *dist, double *Aq, double *Bq, double *Den, double *Phi, double *GreySolidGrad, double *Poros,double *Perm,double *Vel, double rhoA, double rhoB, double tauA, double tauB, double tauA_eff,double tauB_eff, double alpha, double beta, diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 16e5ece5..49f1e14d 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -332,158 +332,168 @@ void ScaLBL_GreyscaleColorModel::AssignComponentLabels() delete [] phase; } -//void ScaLBL_GreyscaleColorModel::AssignGreySolidLabels()//Model-2 & Model-3 -//{ -// // ONLY initialize grey nodes -// // Key input parameters: -// // 1. GreySolidLabels -// // labels for grey nodes -// // 2. GreySolidAffinity -// // affinity ranges [-1,1] -// // oil-wet > 0 -// // water-wet < 0 -// // neutral = 0 -// -// double *GreySolidPhi_host = new double [Nx*Ny*Nz]; -// //initialize grey solid phase field -// for (int k=0;kgetVector( "GreySolidLabels" ); -// auto AffinityList = greyscaleColor_db->getVector( "GreySolidAffinity" ); -// -// size_t NLABELS=0; -// NLABELS=LabelList.size(); -// if (NLABELS != AffinityList.size()){ -// ERROR("Error: GreySolidLabels and GreySolidAffinity must be the same length! \n"); -// } -// -// double *Dst; -// Dst = new double [3*3*3]; -// for (int kk=0; kk<3; kk++){ -// for (int jj=0; jj<3; jj++){ -// for (int ii=0; ii<3; ii++){ -// int index = kk*9+jj*3+ii; -// Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); -// } -// } -// } -// double w_face = 1.f; -// double w_edge = 1.f; -// double w_corner = 0.f; -// //local -// Dst[13] = 0.f; -// //faces -// Dst[4] = w_face; -// Dst[10] = w_face; -// Dst[12] = w_face; -// Dst[14] = w_face; -// Dst[16] = w_face; -// Dst[22] = w_face; -// // corners -// Dst[0] = w_corner; -// Dst[2] = w_corner; -// Dst[6] = w_corner; -// Dst[8] = w_corner; -// Dst[18] = w_corner; -// Dst[20] = w_corner; -// Dst[24] = w_corner; -// Dst[26] = w_corner; -// // edges -// Dst[1] = w_edge; -// Dst[3] = w_edge; -// Dst[5] = w_edge; -// Dst[7] = w_edge; -// Dst[9] = w_edge; -// Dst[11] = w_edge; -// Dst[15] = w_edge; -// Dst[17] = w_edge; -// Dst[19] = w_edge; -// Dst[21] = w_edge; -// Dst[23] = w_edge; -// Dst[25] = w_edge; -// -// for (int k=1; kid[n]; -// double AFFINITY=0.f; -// // Assign the affinity from the paired list -// for (unsigned int idx=0; idx < NLABELS; idx++){ -// //printf("idx=%i, value=%i, %i, \n",idx, VALUE,LabelList[idx]); -// if (VALUE == LabelList[idx]){ -// AFFINITY=AffinityList[idx]; -// idx = NLABELS; -// //Mask->id[n] = 0; // set mask to zero since this is an immobile component -// } -// } -// -// if (VALUE>2){//i.e. a grey node -// double neighbor_counter = 0; -// for (int kk=0; kk<3; kk++){ -// for (int jj=0; jj<3; jj++){ -// for (int ii=0; ii<3; ii++){ -// -// int index = kk*9+jj*3+ii; -// double weight= Dst[index]; -// -// int idi=i+ii-1; -// int idj=j+jj-1; -// int idk=k+kk-1; -// -// if (idi < 0) idi=0; -// if (idj < 0) idj=0; -// if (idk < 0) idk=0; -// if (!(idi < Nx)) idi=Nx-1; -// if (!(idj < Ny)) idj=Ny-1; -// if (!(idk < Nz)) idk=Nz-1; -// -// int nn = idk*Nx*Ny + idj*Nx + idi; -// //if (Mask->id[nn] != VALUE){//Model-2:i.e. open nodes, impermeable solid nodes or any other type of greynodes -// if (Mask->id[nn] <=0){//Model-3:i.e. only impermeable solid nodes or any other type of greynodes -// neighbor_counter +=weight; -// } -// } -// } -// } -// if (neighbor_counter>0){ -// GreySolidPhi_host[n] = AFFINITY; -// } -// } -// } -// } -// } -// -// if (rank==0){ -// printf("Number of grey-solid labels: %lu \n",NLABELS); -// for (unsigned int idx=0; idx 0 + // water-wet < 0 + // neutral = 0 + double *SolidPotential_host = new double [Nx*Ny*Nz]; + double *GreySolidGrad_host = new double [3*Np]; + + size_t NLABELS=0; + signed char VALUE=0; + double AFFINITY=0.f; + + auto LabelList = greyscaleColor_db->getVector( "GreySolidLabels" ); + auto AffinityList = greyscaleColor_db->getVector( "GreySolidAffinity" ); + + NLABELS=LabelList.size(); + if (NLABELS != AffinityList.size()){ + ERROR("Error: GreySolidLabels and GreySolidAffinity must be the same length! \n"); + } + + for (int k=0;kid[n] = 0; // set mask to zero since this is an immobile component + } + } + SolidPotential_host[n] = AFFINITY; + } + } + } + + // Calculate grey-solid color-gradient + double *Dst; + Dst = new double [3*3*3]; + for (int kk=0; kk<3; kk++){ + for (int jj=0; jj<3; jj++){ + for (int ii=0; ii<3; ii++){ + int index = kk*9+jj*3+ii; + Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); + } + } + } + double w_face = 1.f; + double w_edge = 0.5; + double w_corner = 0.f; + //local + Dst[13] = 0.f; + //faces + Dst[4] = w_face; + Dst[10] = w_face; + Dst[12] = w_face; + Dst[14] = w_face; + Dst[16] = w_face; + Dst[22] = w_face; + // corners + Dst[0] = w_corner; + Dst[2] = w_corner; + Dst[6] = w_corner; + Dst[8] = w_corner; + Dst[18] = w_corner; + Dst[20] = w_corner; + Dst[24] = w_corner; + Dst[26] = w_corner; + // edges + Dst[1] = w_edge; + Dst[3] = w_edge; + Dst[5] = w_edge; + Dst[7] = w_edge; + Dst[9] = w_edge; + Dst[11] = w_edge; + Dst[15] = w_edge; + Dst[17] = w_edge; + Dst[19] = w_edge; + Dst[21] = w_edge; + Dst[23] = w_edge; + Dst[25] = w_edge; + + for (int k=1; kSDs(i,j,k)<2.0){ + GreySolidGrad_host[idx+0*Np] = phi_x; + GreySolidGrad_host[idx+1*Np] = phi_y; + GreySolidGrad_host[idx+2*Np] = phi_z; + } + else{ + GreySolidGrad_host[idx+0*Np] = 0.0; + GreySolidGrad_host[idx+1*Np] = 0.0; + GreySolidGrad_host[idx+2*Np] = 0.0; + } + } + } + } + } + + + if (rank==0){ + printf("Number of Grey-solid labels: %lu \n",NLABELS); + for (unsigned int idx=0; idxSendHalo(Phi); if (greyMode==true){ - //Model-1 + //Model-1&4 ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); @@ -1033,7 +1043,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); } if (greyMode==true){ - //Model-1 + //Model-1&4 ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); @@ -1067,7 +1077,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ } ScaLBL_Comm_Regular->SendHalo(Phi); if (greyMode==true){ - //Model-1 + //Model-1&4 ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); @@ -1093,7 +1103,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); } if (greyMode==true){ - //Model-1 + //Model-1&4 ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, rhoA, rhoB, tauA, tauB,tauA_eff, tauB_eff, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); @@ -2207,168 +2217,159 @@ void ScaLBL_GreyscaleColorModel::WriteDebug(){ //} ////----------------------------------------------------------------------------------------------------------// -void ScaLBL_GreyscaleColorModel::AssignGreySolidLabels()//Model-4 -{ - // ONLY initialize grey nodes - // Key input parameters: - // 1. GreySolidLabels - // labels for grey nodes - // 2. GreySolidAffinity - // affinity ranges [-1,1] - // oil-wet > 0 - // water-wet < 0 - // neutral = 0 - double *SolidPotential_host = new double [Nx*Ny*Nz]; - double *GreySolidGrad_host = new double [3*Np]; - size_t NLABELS=0; - signed char VALUE=0; - double AFFINITY=0.f; - - auto LabelList = greyscaleColor_db->getVector( "GreySolidLabels" ); - auto AffinityList = greyscaleColor_db->getVector( "GreySolidAffinity" ); - - NLABELS=LabelList.size(); - if (NLABELS != AffinityList.size()){ - ERROR("Error: GreySolidLabels and GreySolidAffinity must be the same length! \n"); - } - - for (int k=0;kid[n] = 0; // set mask to zero since this is an immobile component - } - } - SolidPotential_host[n] = AFFINITY; - } - } - } - - // Calculate grey-solid color-gradient - double *Dst; - Dst = new double [3*3*3]; - for (int kk=0; kk<3; kk++){ - for (int jj=0; jj<3; jj++){ - for (int ii=0; ii<3; ii++){ - int index = kk*9+jj*3+ii; - Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); - } - } - } - double w_face = 1.f; - double w_edge = 0.5; - double w_corner = 0.f; - //local - Dst[13] = 0.f; - //faces - Dst[4] = w_face; - Dst[10] = w_face; - Dst[12] = w_face; - Dst[14] = w_face; - Dst[16] = w_face; - Dst[22] = w_face; - // corners - Dst[0] = w_corner; - Dst[2] = w_corner; - Dst[6] = w_corner; - Dst[8] = w_corner; - Dst[18] = w_corner; - Dst[20] = w_corner; - Dst[24] = w_corner; - Dst[26] = w_corner; - // edges - Dst[1] = w_edge; - Dst[3] = w_edge; - Dst[5] = w_edge; - Dst[7] = w_edge; - Dst[9] = w_edge; - Dst[11] = w_edge; - Dst[15] = w_edge; - Dst[17] = w_edge; - Dst[19] = w_edge; - Dst[21] = w_edge; - Dst[23] = w_edge; - Dst[25] = w_edge; - - for (int k=1; kSDs(i,j,k)<2.0){ - GreySolidGrad_host[idx+0*Np] = phi_x; - GreySolidGrad_host[idx+1*Np] = phi_y; - GreySolidGrad_host[idx+2*Np] = phi_z; - } - else{ - GreySolidGrad_host[idx+0*Np] = 0.0; - GreySolidGrad_host[idx+1*Np] = 0.0; - GreySolidGrad_host[idx+2*Np] = 0.0; - } - } - } - } - } - - - if (rank==0){ - printf("Number of Grey-solid labels: %lu \n",NLABELS); - for (unsigned int idx=0; idx 0 +// // water-wet < 0 +// // neutral = 0 +// +// double *GreySolidPhi_host = new double [Nx*Ny*Nz]; +// //initialize grey solid phase field +// for (int k=0;kgetVector( "GreySolidLabels" ); +// auto AffinityList = greyscaleColor_db->getVector( "GreySolidAffinity" ); +// +// size_t NLABELS=0; +// NLABELS=LabelList.size(); +// if (NLABELS != AffinityList.size()){ +// ERROR("Error: GreySolidLabels and GreySolidAffinity must be the same length! \n"); +// } +// +// double *Dst; +// Dst = new double [3*3*3]; +// for (int kk=0; kk<3; kk++){ +// for (int jj=0; jj<3; jj++){ +// for (int ii=0; ii<3; ii++){ +// int index = kk*9+jj*3+ii; +// Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); +// } +// } +// } +// double w_face = 1.f; +// double w_edge = 1.f; +// double w_corner = 0.f; +// //local +// Dst[13] = 0.f; +// //faces +// Dst[4] = w_face; +// Dst[10] = w_face; +// Dst[12] = w_face; +// Dst[14] = w_face; +// Dst[16] = w_face; +// Dst[22] = w_face; +// // corners +// Dst[0] = w_corner; +// Dst[2] = w_corner; +// Dst[6] = w_corner; +// Dst[8] = w_corner; +// Dst[18] = w_corner; +// Dst[20] = w_corner; +// Dst[24] = w_corner; +// Dst[26] = w_corner; +// // edges +// Dst[1] = w_edge; +// Dst[3] = w_edge; +// Dst[5] = w_edge; +// Dst[7] = w_edge; +// Dst[9] = w_edge; +// Dst[11] = w_edge; +// Dst[15] = w_edge; +// Dst[17] = w_edge; +// Dst[19] = w_edge; +// Dst[21] = w_edge; +// Dst[23] = w_edge; +// Dst[25] = w_edge; +// +// for (int k=1; kid[n]; +// double AFFINITY=0.f; +// // Assign the affinity from the paired list +// for (unsigned int idx=0; idx < NLABELS; idx++){ +// //printf("idx=%i, value=%i, %i, \n",idx, VALUE,LabelList[idx]); +// if (VALUE == LabelList[idx]){ +// AFFINITY=AffinityList[idx]; +// idx = NLABELS; +// //Mask->id[n] = 0; // set mask to zero since this is an immobile component +// } +// } +// +// if (VALUE>2){//i.e. a grey node +// double neighbor_counter = 0; +// for (int kk=0; kk<3; kk++){ +// for (int jj=0; jj<3; jj++){ +// for (int ii=0; ii<3; ii++){ +// +// int index = kk*9+jj*3+ii; +// double weight= Dst[index]; +// +// int idi=i+ii-1; +// int idj=j+jj-1; +// int idk=k+kk-1; +// +// if (idi < 0) idi=0; +// if (idj < 0) idj=0; +// if (idk < 0) idk=0; +// if (!(idi < Nx)) idi=Nx-1; +// if (!(idj < Ny)) idj=Ny-1; +// if (!(idk < Nz)) idk=Nz-1; +// +// int nn = idk*Nx*Ny + idj*Nx + idi; +// //if (Mask->id[nn] != VALUE){//Model-2:i.e. open nodes, impermeable solid nodes or any other type of greynodes +// if (Mask->id[nn] <=0){//Model-3:i.e. only impermeable solid nodes or any other type of greynodes +// neighbor_counter +=weight; +// } +// } +// } +// } +// if (neighbor_counter>0){ +// GreySolidPhi_host[n] = AFFINITY; +// } +// } +// } +// } +// } +// +// if (rank==0){ +// printf("Number of grey-solid labels: %lu \n",NLABELS); +// for (unsigned int idx=0; idx Date: Wed, 19 Aug 2020 11:31:32 -0400 Subject: [PATCH 72/75] save the work; to be continued to clean up the code --- common/ScaLBL.cpp | 501 ---- common/ScaLBL.h | 164 +- cpu/GreyscaleFE.cpp | 3113 --------------------- cpu/GreyscaleSC.cpp | 3625 ------------------------ gpu/GreyscaleFE.cu | 3338 ---------------------- gpu/GreyscaleSC.cu | 3819 -------------------------- models/GreyscaleColorModel.cpp | 669 ++--- models/GreyscaleColorModel.h | 10 +- models/GreyscaleFEModel.cpp | 1247 --------- models/GreyscaleFEModel.h | 108 - models/GreyscaleModel.cpp | 13 +- models/GreyscaleSCModel.cpp | 1433 ---------- models/GreyscaleSCModel.h | 103 - tests/CMakeLists.txt | 2 - tests/lbpm_greyscaleFE_simulator.cpp | 59 - tests/lbpm_greyscaleSC_simulator.cpp | 58 - 16 files changed, 373 insertions(+), 17889 deletions(-) delete mode 100644 cpu/GreyscaleFE.cpp delete mode 100644 cpu/GreyscaleSC.cpp delete mode 100644 gpu/GreyscaleFE.cu delete mode 100644 gpu/GreyscaleSC.cu delete mode 100644 models/GreyscaleFEModel.cpp delete mode 100644 models/GreyscaleFEModel.h delete mode 100644 models/GreyscaleSCModel.cpp delete mode 100644 models/GreyscaleSCModel.h delete mode 100644 tests/lbpm_greyscaleFE_simulator.cpp delete mode 100644 tests/lbpm_greyscaleSC_simulator.cpp diff --git a/common/ScaLBL.cpp b/common/ScaLBL.cpp index 4e9f95e7..13508dd4 100644 --- a/common/ScaLBL.cpp +++ b/common/ScaLBL.cpp @@ -1094,368 +1094,6 @@ void ScaLBL_Communicator::RecvD3Q19AA(double *dist){ } -void ScaLBL_Communicator::BiSendD3Q19AA(double *Aq, double *Bq){ - - // NOTE: the center distribution f0 must NOT be at the start of feven, provide offset to start of f2 - if (Lock==true){ - ERROR("ScaLBL Error (SendD3Q19): ScaLBL_Communicator is locked -- did you forget to match Send/Recv calls?"); - } - else{ - Lock=true; - } - // assign tag of 19 to D3Q19 communication - sendtag = recvtag = 38; - ScaLBL_DeviceBarrier(); - // Pack the distributions - //...Packing for x face(2,8,10,12,14)................................ - ScaLBL_D3Q19_Pack(2 ,dvcSendList_x,0*sendCount_x,sendCount_x,sendbuf_x,Aq,N); - ScaLBL_D3Q19_Pack(8 ,dvcSendList_x,1*sendCount_x,sendCount_x,sendbuf_x,Aq,N); - ScaLBL_D3Q19_Pack(10,dvcSendList_x,2*sendCount_x,sendCount_x,sendbuf_x,Aq,N); - ScaLBL_D3Q19_Pack(12,dvcSendList_x,3*sendCount_x,sendCount_x,sendbuf_x,Aq,N); - ScaLBL_D3Q19_Pack(14,dvcSendList_x,4*sendCount_x,sendCount_x,sendbuf_x,Aq,N); - ScaLBL_D3Q19_Pack(2 ,dvcSendList_x,5*sendCount_x,sendCount_x,sendbuf_x,Bq,N); - ScaLBL_D3Q19_Pack(8 ,dvcSendList_x,6*sendCount_x,sendCount_x,sendbuf_x,Bq,N); - ScaLBL_D3Q19_Pack(10,dvcSendList_x,7*sendCount_x,sendCount_x,sendbuf_x,Bq,N); - ScaLBL_D3Q19_Pack(12,dvcSendList_x,8*sendCount_x,sendCount_x,sendbuf_x,Bq,N); - ScaLBL_D3Q19_Pack(14,dvcSendList_x,9*sendCount_x,sendCount_x,sendbuf_x,Bq,N); - - req1[0] = MPI_COMM_SCALBL.Isend(sendbuf_x, 10*sendCount_x,rank_x,sendtag); - req2[0] = MPI_COMM_SCALBL.Irecv(recvbuf_X, 10*recvCount_X,rank_X,recvtag); - - //...Packing for X face(1,7,9,11,13)................................ - ScaLBL_D3Q19_Pack(1 ,dvcSendList_X,0*sendCount_X,sendCount_X,sendbuf_X,Aq,N); - ScaLBL_D3Q19_Pack(7 ,dvcSendList_X,1*sendCount_X,sendCount_X,sendbuf_X,Aq,N); - ScaLBL_D3Q19_Pack(9 ,dvcSendList_X,2*sendCount_X,sendCount_X,sendbuf_X,Aq,N); - ScaLBL_D3Q19_Pack(11,dvcSendList_X,3*sendCount_X,sendCount_X,sendbuf_X,Aq,N); - ScaLBL_D3Q19_Pack(13,dvcSendList_X,4*sendCount_X,sendCount_X,sendbuf_X,Aq,N); - ScaLBL_D3Q19_Pack(1 ,dvcSendList_X,5*sendCount_X,sendCount_X,sendbuf_X,Bq,N); - ScaLBL_D3Q19_Pack(7 ,dvcSendList_X,6*sendCount_X,sendCount_X,sendbuf_X,Bq,N); - ScaLBL_D3Q19_Pack(9 ,dvcSendList_X,7*sendCount_X,sendCount_X,sendbuf_X,Bq,N); - ScaLBL_D3Q19_Pack(11,dvcSendList_X,8*sendCount_X,sendCount_X,sendbuf_X,Bq,N); - ScaLBL_D3Q19_Pack(13,dvcSendList_X,9*sendCount_X,sendCount_X,sendbuf_X,Bq,N); - - req1[1] = MPI_COMM_SCALBL.Isend(sendbuf_X, 10*sendCount_X,rank_X,sendtag); - req2[1] = MPI_COMM_SCALBL.Irecv(recvbuf_x, 10*recvCount_x,rank_x,recvtag); - - //...Packing for y face(4,8,9,16,18)................................. - ScaLBL_D3Q19_Pack(4 ,dvcSendList_y,0*sendCount_y,sendCount_y,sendbuf_y,Aq,N); - ScaLBL_D3Q19_Pack(8 ,dvcSendList_y,1*sendCount_y,sendCount_y,sendbuf_y,Aq,N); - ScaLBL_D3Q19_Pack(9 ,dvcSendList_y,2*sendCount_y,sendCount_y,sendbuf_y,Aq,N); - ScaLBL_D3Q19_Pack(16,dvcSendList_y,3*sendCount_y,sendCount_y,sendbuf_y,Aq,N); - ScaLBL_D3Q19_Pack(18,dvcSendList_y,4*sendCount_y,sendCount_y,sendbuf_y,Aq,N); - ScaLBL_D3Q19_Pack(4 ,dvcSendList_y,5*sendCount_y,sendCount_y,sendbuf_y,Bq,N); - ScaLBL_D3Q19_Pack(8 ,dvcSendList_y,6*sendCount_y,sendCount_y,sendbuf_y,Bq,N); - ScaLBL_D3Q19_Pack(9 ,dvcSendList_y,7*sendCount_y,sendCount_y,sendbuf_y,Bq,N); - ScaLBL_D3Q19_Pack(16,dvcSendList_y,8*sendCount_y,sendCount_y,sendbuf_y,Bq,N); - ScaLBL_D3Q19_Pack(18,dvcSendList_y,9*sendCount_y,sendCount_y,sendbuf_y,Bq,N); - - req1[2] = MPI_COMM_SCALBL.Isend(sendbuf_y, 10*sendCount_y,rank_y,sendtag); - req2[2] = MPI_COMM_SCALBL.Irecv(recvbuf_Y, 10*recvCount_Y,rank_Y,recvtag); - - //...Packing for Y face(3,7,10,15,17)................................. - ScaLBL_D3Q19_Pack(3 ,dvcSendList_Y,0*sendCount_Y,sendCount_Y,sendbuf_Y,Aq,N); - ScaLBL_D3Q19_Pack(7 ,dvcSendList_Y,1*sendCount_Y,sendCount_Y,sendbuf_Y,Aq,N); - ScaLBL_D3Q19_Pack(10,dvcSendList_Y,2*sendCount_Y,sendCount_Y,sendbuf_Y,Aq,N); - ScaLBL_D3Q19_Pack(15,dvcSendList_Y,3*sendCount_Y,sendCount_Y,sendbuf_Y,Aq,N); - ScaLBL_D3Q19_Pack(17,dvcSendList_Y,4*sendCount_Y,sendCount_Y,sendbuf_Y,Aq,N); - ScaLBL_D3Q19_Pack(3 ,dvcSendList_Y,5*sendCount_Y,sendCount_Y,sendbuf_Y,Bq,N); - ScaLBL_D3Q19_Pack(7 ,dvcSendList_Y,6*sendCount_Y,sendCount_Y,sendbuf_Y,Bq,N); - ScaLBL_D3Q19_Pack(10,dvcSendList_Y,7*sendCount_Y,sendCount_Y,sendbuf_Y,Bq,N); - ScaLBL_D3Q19_Pack(15,dvcSendList_Y,8*sendCount_Y,sendCount_Y,sendbuf_Y,Bq,N); - ScaLBL_D3Q19_Pack(17,dvcSendList_Y,9*sendCount_Y,sendCount_Y,sendbuf_Y,Bq,N); - - req1[3] = MPI_COMM_SCALBL.Isend(sendbuf_Y, 10*sendCount_Y,rank_Y,sendtag); - req2[3] = MPI_COMM_SCALBL.Irecv(recvbuf_y, 10*recvCount_y,rank_y,recvtag); - - //...Packing for z face(6,12,13,16,17)................................ - ScaLBL_D3Q19_Pack(6 ,dvcSendList_z,0*sendCount_z,sendCount_z,sendbuf_z,Aq,N); - ScaLBL_D3Q19_Pack(12,dvcSendList_z,1*sendCount_z,sendCount_z,sendbuf_z,Aq,N); - ScaLBL_D3Q19_Pack(13,dvcSendList_z,2*sendCount_z,sendCount_z,sendbuf_z,Aq,N); - ScaLBL_D3Q19_Pack(16,dvcSendList_z,3*sendCount_z,sendCount_z,sendbuf_z,Aq,N); - ScaLBL_D3Q19_Pack(17,dvcSendList_z,4*sendCount_z,sendCount_z,sendbuf_z,Aq,N); - ScaLBL_D3Q19_Pack(6 ,dvcSendList_z,5*sendCount_z,sendCount_z,sendbuf_z,Bq,N); - ScaLBL_D3Q19_Pack(12,dvcSendList_z,6*sendCount_z,sendCount_z,sendbuf_z,Bq,N); - ScaLBL_D3Q19_Pack(13,dvcSendList_z,7*sendCount_z,sendCount_z,sendbuf_z,Bq,N); - ScaLBL_D3Q19_Pack(16,dvcSendList_z,8*sendCount_z,sendCount_z,sendbuf_z,Bq,N); - ScaLBL_D3Q19_Pack(17,dvcSendList_z,9*sendCount_z,sendCount_z,sendbuf_z,Bq,N); - - req1[4] = MPI_COMM_SCALBL.Isend(sendbuf_z, 10*sendCount_z,rank_z,sendtag); - req2[4] = MPI_COMM_SCALBL.Irecv(recvbuf_Z, 10*recvCount_Z,rank_Z,recvtag); - - //...Packing for Z face(5,11,14,15,18)................................ - ScaLBL_D3Q19_Pack(5 ,dvcSendList_Z,0*sendCount_Z,sendCount_Z,sendbuf_Z,Aq,N); - ScaLBL_D3Q19_Pack(11,dvcSendList_Z,1*sendCount_Z,sendCount_Z,sendbuf_Z,Aq,N); - ScaLBL_D3Q19_Pack(14,dvcSendList_Z,2*sendCount_Z,sendCount_Z,sendbuf_Z,Aq,N); - ScaLBL_D3Q19_Pack(15,dvcSendList_Z,3*sendCount_Z,sendCount_Z,sendbuf_Z,Aq,N); - ScaLBL_D3Q19_Pack(18,dvcSendList_Z,4*sendCount_Z,sendCount_Z,sendbuf_Z,Aq,N); - ScaLBL_D3Q19_Pack(5 ,dvcSendList_Z,5*sendCount_Z,sendCount_Z,sendbuf_Z,Bq,N); - ScaLBL_D3Q19_Pack(11,dvcSendList_Z,6*sendCount_Z,sendCount_Z,sendbuf_Z,Bq,N); - ScaLBL_D3Q19_Pack(14,dvcSendList_Z,7*sendCount_Z,sendCount_Z,sendbuf_Z,Bq,N); - ScaLBL_D3Q19_Pack(15,dvcSendList_Z,8*sendCount_Z,sendCount_Z,sendbuf_Z,Bq,N); - ScaLBL_D3Q19_Pack(18,dvcSendList_Z,9*sendCount_Z,sendCount_Z,sendbuf_Z,Bq,N); - - req1[5] = MPI_COMM_SCALBL.Isend(sendbuf_Z, 10*sendCount_Z,rank_Z,sendtag); - req2[5] = MPI_COMM_SCALBL.Irecv(recvbuf_z, 10*recvCount_z,rank_z,recvtag); - - //...Pack the xy edge (8)................................ - ScaLBL_D3Q19_Pack(8,dvcSendList_xy,0*sendCount_xy,sendCount_xy,sendbuf_xy,Aq,N); - ScaLBL_D3Q19_Pack(8,dvcSendList_xy,1*sendCount_xy,sendCount_xy,sendbuf_xy,Bq,N); - req1[6] = MPI_COMM_SCALBL.Isend(sendbuf_xy, 2*sendCount_xy,rank_xy,sendtag); - req2[6] = MPI_COMM_SCALBL.Irecv(recvbuf_XY, 2*recvCount_XY,rank_XY,recvtag); - - //...Pack the Xy edge (9)................................ - ScaLBL_D3Q19_Pack(9,dvcSendList_Xy,0*sendCount_Xy,sendCount_Xy,sendbuf_Xy,Aq,N); - ScaLBL_D3Q19_Pack(9,dvcSendList_Xy,1*sendCount_Xy,sendCount_Xy,sendbuf_Xy,Bq,N); - req1[8] = MPI_COMM_SCALBL.Isend(sendbuf_Xy, 2*sendCount_Xy,rank_Xy,sendtag); - req2[8] = MPI_COMM_SCALBL.Irecv(recvbuf_xY, 2*recvCount_xY,rank_xY,recvtag); - - //...Pack the xY edge (10)................................ - ScaLBL_D3Q19_Pack(10,dvcSendList_xY,0*sendCount_xY,sendCount_xY,sendbuf_xY,Aq,N); - ScaLBL_D3Q19_Pack(10,dvcSendList_xY,1*sendCount_xY,sendCount_xY,sendbuf_xY,Bq,N); - req1[9] = MPI_COMM_SCALBL.Isend(sendbuf_xY, 2*sendCount_xY,rank_xY,sendtag); - req2[9] = MPI_COMM_SCALBL.Irecv(recvbuf_Xy, 2*recvCount_Xy,rank_Xy,recvtag); - - //...Pack the XY edge (7)................................ - ScaLBL_D3Q19_Pack(7,dvcSendList_XY,0*sendCount_XY,sendCount_XY,sendbuf_XY,Aq,N); - ScaLBL_D3Q19_Pack(7,dvcSendList_XY,1*sendCount_XY,sendCount_XY,sendbuf_XY,Bq,N); - req1[7] = MPI_COMM_SCALBL.Isend(sendbuf_XY, 2*sendCount_XY,rank_XY,sendtag); - req2[7] = MPI_COMM_SCALBL.Irecv(recvbuf_xy, 2*recvCount_xy,rank_xy,recvtag); - - //...Pack the xz edge (12)................................ - ScaLBL_D3Q19_Pack(12,dvcSendList_xz,0*sendCount_xz,sendCount_xz,sendbuf_xz,Aq,N); - ScaLBL_D3Q19_Pack(12,dvcSendList_xz,1*sendCount_xz,sendCount_xz,sendbuf_xz,Bq,N); - req1[10] = MPI_COMM_SCALBL.Isend(sendbuf_xz, 2*sendCount_xz,rank_xz,sendtag); - req2[10] = MPI_COMM_SCALBL.Irecv(recvbuf_XZ, 2*recvCount_XZ,rank_XZ,recvtag); - - //...Pack the xZ edge (14)................................ - ScaLBL_D3Q19_Pack(14,dvcSendList_xZ,0*sendCount_xZ,sendCount_xZ,sendbuf_xZ,Aq,N); - ScaLBL_D3Q19_Pack(14,dvcSendList_xZ,1*sendCount_xZ,sendCount_xZ,sendbuf_xZ,Bq,N); - req1[13] = MPI_COMM_SCALBL.Isend(sendbuf_xZ, 2*sendCount_xZ,rank_xZ,sendtag); - req2[13] = MPI_COMM_SCALBL.Irecv(recvbuf_Xz, 2*recvCount_Xz,rank_Xz,recvtag); - - //...Pack the Xz edge (13)................................ - ScaLBL_D3Q19_Pack(13,dvcSendList_Xz,0*sendCount_Xz,sendCount_Xz,sendbuf_Xz,Aq,N); - ScaLBL_D3Q19_Pack(13,dvcSendList_Xz,1*sendCount_Xz,sendCount_Xz,sendbuf_Xz,Bq,N); - req1[12] = MPI_COMM_SCALBL.Isend(sendbuf_Xz, 2*sendCount_Xz,rank_Xz,sendtag); - req2[12] = MPI_COMM_SCALBL.Irecv(recvbuf_xZ, 2*recvCount_xZ,rank_xZ,recvtag); - - //...Pack the XZ edge (11)................................ - ScaLBL_D3Q19_Pack(11,dvcSendList_XZ,0*sendCount_XZ,sendCount_XZ,sendbuf_XZ,Aq,N); - ScaLBL_D3Q19_Pack(11,dvcSendList_XZ,1*sendCount_XZ,sendCount_XZ,sendbuf_XZ,Bq,N); - req1[11] = MPI_COMM_SCALBL.Isend(sendbuf_XZ, 2*sendCount_XZ,rank_XZ,sendtag); - req2[11] = MPI_COMM_SCALBL.Irecv(recvbuf_xz, 2*recvCount_xz,rank_xz,recvtag); - - //...Pack the yz edge (16)................................ - ScaLBL_D3Q19_Pack(16,dvcSendList_yz,0*sendCount_yz,sendCount_yz,sendbuf_yz,Aq,N); - ScaLBL_D3Q19_Pack(16,dvcSendList_yz,1*sendCount_yz,sendCount_yz,sendbuf_yz,Bq,N); - req1[14] = MPI_COMM_SCALBL.Isend(sendbuf_yz, 2*sendCount_yz,rank_yz,sendtag); - req2[14] = MPI_COMM_SCALBL.Irecv(recvbuf_YZ, 2*recvCount_YZ,rank_YZ,recvtag); - - //...Pack the yZ edge (18)................................ - ScaLBL_D3Q19_Pack(18,dvcSendList_yZ,0*sendCount_yZ,sendCount_yZ,sendbuf_yZ,Aq,N); - ScaLBL_D3Q19_Pack(18,dvcSendList_yZ,1*sendCount_yZ,sendCount_yZ,sendbuf_yZ,Bq,N); - req1[17] = MPI_COMM_SCALBL.Isend(sendbuf_yZ, 2*sendCount_yZ,rank_yZ,sendtag); - req2[17] = MPI_COMM_SCALBL.Irecv(recvbuf_Yz, 2*recvCount_Yz,rank_Yz,recvtag); - - //...Pack the Yz edge (17)................................ - ScaLBL_D3Q19_Pack(17,dvcSendList_Yz,0*sendCount_Yz,sendCount_Yz,sendbuf_Yz,Aq,N); - ScaLBL_D3Q19_Pack(17,dvcSendList_Yz,1*sendCount_Yz,sendCount_Yz,sendbuf_Yz,Bq,N); - req1[16] = MPI_COMM_SCALBL.Isend(sendbuf_Yz, 2*sendCount_Yz,rank_Yz,sendtag); - req2[16] = MPI_COMM_SCALBL.Irecv(recvbuf_yZ, 2*recvCount_yZ,rank_yZ,recvtag); - - //...Pack the YZ edge (15)................................ - ScaLBL_D3Q19_Pack(15,dvcSendList_YZ,0*sendCount_YZ,sendCount_YZ,sendbuf_YZ,Aq,N); - ScaLBL_D3Q19_Pack(15,dvcSendList_YZ,1*sendCount_YZ,sendCount_YZ,sendbuf_YZ,Bq,N); - req1[15] = MPI_COMM_SCALBL.Isend(sendbuf_YZ, 2*sendCount_YZ,rank_YZ,sendtag); - req2[15] = MPI_COMM_SCALBL.Irecv(recvbuf_yz, 2*recvCount_yz,rank_yz,recvtag); - //................................................................................... -} - -void ScaLBL_Communicator::BiRecvD3Q19AA(double *Aq, double *Bq){ - - // NOTE: the center distribution f0 must NOT be at the start of feven, provide offset to start of f2 - //................................................................................... - // Wait for completion of D3Q19 communication - MPI_COMM_SCALBL.waitAll(18,req1); - MPI_COMM_SCALBL.waitAll(18,req2); - ScaLBL_DeviceBarrier(); - - //................................................................................... - // NOTE: AA Routine writes to opposite - // Unpack the distributions on the device - //................................................................................... - //...Unpacking for x face(2,8,10,12,14)................................ - ScaLBL_D3Q19_Unpack(2, dvcRecvDist_x,0*recvCount_x,recvCount_x,recvbuf_x,Aq,N); - ScaLBL_D3Q19_Unpack(8, dvcRecvDist_x,1*recvCount_x,recvCount_x,recvbuf_x,Aq,N); - ScaLBL_D3Q19_Unpack(10,dvcRecvDist_x,2*recvCount_x,recvCount_x,recvbuf_x,Aq,N); - ScaLBL_D3Q19_Unpack(12,dvcRecvDist_x,3*recvCount_x,recvCount_x,recvbuf_x,Aq,N); - ScaLBL_D3Q19_Unpack(14,dvcRecvDist_x,4*recvCount_x,recvCount_x,recvbuf_x,Aq,N); - ScaLBL_D3Q19_Unpack(2, dvcRecvDist_x,0*recvCount_x,recvCount_x,&recvbuf_x[5*recvCount_x],Bq,N); - ScaLBL_D3Q19_Unpack(8, dvcRecvDist_x,1*recvCount_x,recvCount_x,&recvbuf_x[5*recvCount_x],Bq,N); - ScaLBL_D3Q19_Unpack(10,dvcRecvDist_x,2*recvCount_x,recvCount_x,&recvbuf_x[5*recvCount_x],Bq,N); - ScaLBL_D3Q19_Unpack(12,dvcRecvDist_x,3*recvCount_x,recvCount_x,&recvbuf_x[5*recvCount_x],Bq,N); - ScaLBL_D3Q19_Unpack(14,dvcRecvDist_x,4*recvCount_x,recvCount_x,&recvbuf_x[5*recvCount_x],Bq,N); - //................................................................................... - //...Packing for X face(1,7,9,11,13)................................ - ScaLBL_D3Q19_Unpack(1, dvcRecvDist_X,0*recvCount_X,recvCount_X,recvbuf_X,Aq,N); - ScaLBL_D3Q19_Unpack(7, dvcRecvDist_X,1*recvCount_X,recvCount_X,recvbuf_X,Aq,N); - ScaLBL_D3Q19_Unpack(9, dvcRecvDist_X,2*recvCount_X,recvCount_X,recvbuf_X,Aq,N); - ScaLBL_D3Q19_Unpack(11,dvcRecvDist_X,3*recvCount_X,recvCount_X,recvbuf_X,Aq,N); - ScaLBL_D3Q19_Unpack(13,dvcRecvDist_X,4*recvCount_X,recvCount_X,recvbuf_X,Aq,N); - ScaLBL_D3Q19_Unpack(1, dvcRecvDist_X,0*recvCount_X,recvCount_X,&recvbuf_X[5*recvCount_X],Bq,N); - ScaLBL_D3Q19_Unpack(7, dvcRecvDist_X,1*recvCount_X,recvCount_X,&recvbuf_X[5*recvCount_X],Bq,N); - ScaLBL_D3Q19_Unpack(9, dvcRecvDist_X,2*recvCount_X,recvCount_X,&recvbuf_X[5*recvCount_X],Bq,N); - ScaLBL_D3Q19_Unpack(11,dvcRecvDist_X,3*recvCount_X,recvCount_X,&recvbuf_X[5*recvCount_X],Bq,N); - ScaLBL_D3Q19_Unpack(13,dvcRecvDist_X,4*recvCount_X,recvCount_X,&recvbuf_X[5*recvCount_X],Bq,N); - //................................................................................... - //...Packing for y face(4,8,9,16,18)................................. - ScaLBL_D3Q19_Unpack(4, dvcRecvDist_y,0*recvCount_y,recvCount_y,recvbuf_y,Aq,N); - ScaLBL_D3Q19_Unpack(8, dvcRecvDist_y,1*recvCount_y,recvCount_y,recvbuf_y,Aq,N); - ScaLBL_D3Q19_Unpack(9, dvcRecvDist_y,2*recvCount_y,recvCount_y,recvbuf_y,Aq,N); - ScaLBL_D3Q19_Unpack(16,dvcRecvDist_y,3*recvCount_y,recvCount_y,recvbuf_y,Aq,N); - ScaLBL_D3Q19_Unpack(18,dvcRecvDist_y,4*recvCount_y,recvCount_y,recvbuf_y,Aq,N); - ScaLBL_D3Q19_Unpack(4, dvcRecvDist_y,0*recvCount_y,recvCount_y,&recvbuf_y[5*recvCount_y],Bq,N); - ScaLBL_D3Q19_Unpack(8, dvcRecvDist_y,1*recvCount_y,recvCount_y,&recvbuf_y[5*recvCount_y],Bq,N); - ScaLBL_D3Q19_Unpack(9, dvcRecvDist_y,2*recvCount_y,recvCount_y,&recvbuf_y[5*recvCount_y],Bq,N); - ScaLBL_D3Q19_Unpack(16,dvcRecvDist_y,3*recvCount_y,recvCount_y,&recvbuf_y[5*recvCount_y],Bq,N); - ScaLBL_D3Q19_Unpack(18,dvcRecvDist_y,4*recvCount_y,recvCount_y,&recvbuf_y[5*recvCount_y],Bq,N); - //................................................................................... - //...Packing for Y face(3,7,10,15,17)................................. - ScaLBL_D3Q19_Unpack(3, dvcRecvDist_Y,0*recvCount_Y,recvCount_Y,recvbuf_Y,Aq,N); - ScaLBL_D3Q19_Unpack(7, dvcRecvDist_Y,1*recvCount_Y,recvCount_Y,recvbuf_Y,Aq,N); - ScaLBL_D3Q19_Unpack(10,dvcRecvDist_Y,2*recvCount_Y,recvCount_Y,recvbuf_Y,Aq,N); - ScaLBL_D3Q19_Unpack(15,dvcRecvDist_Y,3*recvCount_Y,recvCount_Y,recvbuf_Y,Aq,N); - ScaLBL_D3Q19_Unpack(17,dvcRecvDist_Y,4*recvCount_Y,recvCount_Y,recvbuf_Y,Aq,N); - ScaLBL_D3Q19_Unpack(3, dvcRecvDist_Y,0*recvCount_Y,recvCount_Y,&recvbuf_Y[5*recvCount_Y],Bq,N); - ScaLBL_D3Q19_Unpack(7, dvcRecvDist_Y,1*recvCount_Y,recvCount_Y,&recvbuf_Y[5*recvCount_Y],Bq,N); - ScaLBL_D3Q19_Unpack(10,dvcRecvDist_Y,2*recvCount_Y,recvCount_Y,&recvbuf_Y[5*recvCount_Y],Bq,N); - ScaLBL_D3Q19_Unpack(15,dvcRecvDist_Y,3*recvCount_Y,recvCount_Y,&recvbuf_Y[5*recvCount_Y],Bq,N); - ScaLBL_D3Q19_Unpack(17,dvcRecvDist_Y,4*recvCount_Y,recvCount_Y,&recvbuf_Y[5*recvCount_Y],Bq,N); - //................................................................................... - - //...Pack the xy edge (8)................................ - ScaLBL_D3Q19_Unpack(8,dvcRecvDist_xy,0,recvCount_xy,recvbuf_xy,Aq,N); - ScaLBL_D3Q19_Unpack(8,dvcRecvDist_xy,0,recvCount_xy,&recvbuf_xy[recvCount_xy],Bq,N); - - //...Pack the Xy edge (9)................................ - ScaLBL_D3Q19_Unpack(9,dvcRecvDist_Xy,0,recvCount_Xy,recvbuf_Xy,Aq,N); - ScaLBL_D3Q19_Unpack(9,dvcRecvDist_Xy,0,recvCount_Xy,&recvbuf_Xy[recvCount_Xy],Bq,N); - - //...Pack the xY edge (10)................................ - ScaLBL_D3Q19_Unpack(10,dvcRecvDist_xY,0,recvCount_xY,recvbuf_xY,Aq,N); - ScaLBL_D3Q19_Unpack(10,dvcRecvDist_xY,0,recvCount_xY,&recvbuf_xY[recvCount_xY],Bq,N); - - //...Pack the XY edge (7)................................ - ScaLBL_D3Q19_Unpack(7,dvcRecvDist_XY,0,recvCount_XY,recvbuf_XY,Aq,N); - ScaLBL_D3Q19_Unpack(7,dvcRecvDist_XY,0,recvCount_XY,&recvbuf_XY[recvCount_XY],Bq,N); - - if (BoundaryCondition > 0 && kproc == 0){ - // don't unpack little z - //...Packing for Z face(5,11,14,15,18)................................ - ScaLBL_D3Q19_Unpack(5, dvcRecvDist_Z,0*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); - ScaLBL_D3Q19_Unpack(11,dvcRecvDist_Z,1*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); - ScaLBL_D3Q19_Unpack(14,dvcRecvDist_Z,2*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); - ScaLBL_D3Q19_Unpack(15,dvcRecvDist_Z,3*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); - ScaLBL_D3Q19_Unpack(18,dvcRecvDist_Z,4*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); - ScaLBL_D3Q19_Unpack(5, dvcRecvDist_Z,0*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); - ScaLBL_D3Q19_Unpack(11,dvcRecvDist_Z,1*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); - ScaLBL_D3Q19_Unpack(14,dvcRecvDist_Z,2*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); - ScaLBL_D3Q19_Unpack(15,dvcRecvDist_Z,3*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); - ScaLBL_D3Q19_Unpack(18,dvcRecvDist_Z,4*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); - //...Pack the xZ edge (14)................................ - ScaLBL_D3Q19_Unpack(14,dvcRecvDist_xZ,0,recvCount_xZ,recvbuf_xZ,Aq,N); - ScaLBL_D3Q19_Unpack(14,dvcRecvDist_xZ,0,recvCount_xZ,&recvbuf_xZ[recvCount_xZ],Bq,N); - //...Pack the XZ edge (11)................................ - ScaLBL_D3Q19_Unpack(11,dvcRecvDist_XZ,0,recvCount_XZ,recvbuf_XZ,Aq,N); - ScaLBL_D3Q19_Unpack(11,dvcRecvDist_XZ,0,recvCount_XZ,&recvbuf_XZ[recvCount_XZ],Bq,N); - //...Pack the yZ edge (18)................................ - ScaLBL_D3Q19_Unpack(18,dvcRecvDist_yZ,0,recvCount_yZ,recvbuf_yZ,Aq,N); - ScaLBL_D3Q19_Unpack(18,dvcRecvDist_yZ,0,recvCount_yZ,&recvbuf_yZ[recvCount_yZ],Bq,N); - //...Pack the YZ edge (15)................................ - ScaLBL_D3Q19_Unpack(15,dvcRecvDist_YZ,0,recvCount_YZ,recvbuf_YZ,Aq,N); - ScaLBL_D3Q19_Unpack(15,dvcRecvDist_YZ,0,recvCount_YZ,&recvbuf_YZ[recvCount_YZ],Bq,N); - } - else if (BoundaryCondition > 0 && kproc == nprocz-1){ - // don't unpack big Z - //...Packing for z face(6,12,13,16,17)................................ - ScaLBL_D3Q19_Unpack(6, dvcRecvDist_z,0*recvCount_z,recvCount_z,recvbuf_z,Aq,N); - ScaLBL_D3Q19_Unpack(12,dvcRecvDist_z,1*recvCount_z,recvCount_z,recvbuf_z,Aq,N); - ScaLBL_D3Q19_Unpack(13,dvcRecvDist_z,2*recvCount_z,recvCount_z,recvbuf_z,Aq,N); - ScaLBL_D3Q19_Unpack(16,dvcRecvDist_z,3*recvCount_z,recvCount_z,recvbuf_z,Aq,N); - ScaLBL_D3Q19_Unpack(17,dvcRecvDist_z,4*recvCount_z,recvCount_z,recvbuf_z,Aq,N); - ScaLBL_D3Q19_Unpack(6, dvcRecvDist_z,0*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); - ScaLBL_D3Q19_Unpack(12,dvcRecvDist_z,1*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); - ScaLBL_D3Q19_Unpack(13,dvcRecvDist_z,2*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); - ScaLBL_D3Q19_Unpack(16,dvcRecvDist_z,3*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); - ScaLBL_D3Q19_Unpack(17,dvcRecvDist_z,4*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); - //...Pack the xz edge (12)................................ - ScaLBL_D3Q19_Unpack(12,dvcRecvDist_xz,0,recvCount_xz,recvbuf_xz,Aq,N); - ScaLBL_D3Q19_Unpack(12,dvcRecvDist_xz,0,recvCount_xz,&recvbuf_xz[recvCount_xz],Bq,N); - //...Pack the Xz edge (13)................................ - ScaLBL_D3Q19_Unpack(13,dvcRecvDist_Xz,0,recvCount_Xz,recvbuf_Xz,Aq,N); - ScaLBL_D3Q19_Unpack(13,dvcRecvDist_Xz,0,recvCount_Xz,&recvbuf_Xz[recvCount_Xz],Bq,N); - //...Pack the yz edge (16)................................ - ScaLBL_D3Q19_Unpack(16,dvcRecvDist_yz,0,recvCount_yz,recvbuf_yz,Aq,N); - ScaLBL_D3Q19_Unpack(16,dvcRecvDist_yz,0,recvCount_yz,&recvbuf_yz[recvCount_yz],Bq,N); - //...Pack the Yz edge (17)................................ - ScaLBL_D3Q19_Unpack(17,dvcRecvDist_Yz,0,recvCount_Yz,recvbuf_Yz,Aq,N); - ScaLBL_D3Q19_Unpack(17,dvcRecvDist_Yz,0,recvCount_Yz,&recvbuf_Yz[recvCount_Yz],Bq,N); - } - else { - //...Packing for z face(6,12,13,16,17)................................ - ScaLBL_D3Q19_Unpack(6, dvcRecvDist_z,0*recvCount_z,recvCount_z,recvbuf_z,Aq,N); - ScaLBL_D3Q19_Unpack(12,dvcRecvDist_z,1*recvCount_z,recvCount_z,recvbuf_z,Aq,N); - ScaLBL_D3Q19_Unpack(13,dvcRecvDist_z,2*recvCount_z,recvCount_z,recvbuf_z,Aq,N); - ScaLBL_D3Q19_Unpack(16,dvcRecvDist_z,3*recvCount_z,recvCount_z,recvbuf_z,Aq,N); - ScaLBL_D3Q19_Unpack(17,dvcRecvDist_z,4*recvCount_z,recvCount_z,recvbuf_z,Aq,N); - ScaLBL_D3Q19_Unpack(6, dvcRecvDist_z,0*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); - ScaLBL_D3Q19_Unpack(12,dvcRecvDist_z,1*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); - ScaLBL_D3Q19_Unpack(13,dvcRecvDist_z,2*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); - ScaLBL_D3Q19_Unpack(16,dvcRecvDist_z,3*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); - ScaLBL_D3Q19_Unpack(17,dvcRecvDist_z,4*recvCount_z,recvCount_z,&recvbuf_z[5*recvCount_z],Bq,N); - //...Packing for Z face(5,11,14,15,18)................................ - ScaLBL_D3Q19_Unpack(5, dvcRecvDist_Z,0*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); - ScaLBL_D3Q19_Unpack(11,dvcRecvDist_Z,1*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); - ScaLBL_D3Q19_Unpack(14,dvcRecvDist_Z,2*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); - ScaLBL_D3Q19_Unpack(15,dvcRecvDist_Z,3*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); - ScaLBL_D3Q19_Unpack(18,dvcRecvDist_Z,4*recvCount_Z,recvCount_Z,recvbuf_Z,Aq,N); - ScaLBL_D3Q19_Unpack(5, dvcRecvDist_Z,0*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); - ScaLBL_D3Q19_Unpack(11,dvcRecvDist_Z,1*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); - ScaLBL_D3Q19_Unpack(14,dvcRecvDist_Z,2*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); - ScaLBL_D3Q19_Unpack(15,dvcRecvDist_Z,3*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); - ScaLBL_D3Q19_Unpack(18,dvcRecvDist_Z,4*recvCount_Z,recvCount_Z,&recvbuf_Z[5*recvCount_Z],Bq,N); - //...Pack the xZ edge (14)................................ - ScaLBL_D3Q19_Unpack(14,dvcRecvDist_xZ,0,recvCount_xZ,recvbuf_xZ,Aq,N); - ScaLBL_D3Q19_Unpack(14,dvcRecvDist_xZ,0,recvCount_xZ,&recvbuf_xZ[recvCount_xZ],Bq,N); - //...Pack the XZ edge (11)................................ - ScaLBL_D3Q19_Unpack(11,dvcRecvDist_XZ,0,recvCount_XZ,recvbuf_XZ,Aq,N); - ScaLBL_D3Q19_Unpack(11,dvcRecvDist_XZ,0,recvCount_XZ,&recvbuf_XZ[recvCount_XZ],Bq,N); - //...Pack the yZ edge (18)................................ - ScaLBL_D3Q19_Unpack(18,dvcRecvDist_yZ,0,recvCount_yZ,recvbuf_yZ,Aq,N); - ScaLBL_D3Q19_Unpack(18,dvcRecvDist_yZ,0,recvCount_yZ,&recvbuf_yZ[recvCount_yZ],Bq,N); - //...Pack the YZ edge (15)................................ - ScaLBL_D3Q19_Unpack(15,dvcRecvDist_YZ,0,recvCount_YZ,recvbuf_YZ,Aq,N); - ScaLBL_D3Q19_Unpack(15,dvcRecvDist_YZ,0,recvCount_YZ,&recvbuf_YZ[recvCount_YZ],Bq,N); - //...Pack the xz edge (12)................................ - ScaLBL_D3Q19_Unpack(12,dvcRecvDist_xz,0,recvCount_xz,recvbuf_xz,Aq,N); - ScaLBL_D3Q19_Unpack(12,dvcRecvDist_xz,0,recvCount_xz,&recvbuf_xz[recvCount_xz],Bq,N); - //...Pack the Xz edge (13)................................ - ScaLBL_D3Q19_Unpack(13,dvcRecvDist_Xz,0,recvCount_Xz,recvbuf_Xz,Aq,N); - ScaLBL_D3Q19_Unpack(13,dvcRecvDist_Xz,0,recvCount_Xz,&recvbuf_Xz[recvCount_Xz],Bq,N); - //...Pack the yz edge (16)................................ - ScaLBL_D3Q19_Unpack(16,dvcRecvDist_yz,0,recvCount_yz,recvbuf_yz,Aq,N); - ScaLBL_D3Q19_Unpack(16,dvcRecvDist_yz,0,recvCount_yz,&recvbuf_yz[recvCount_yz],Bq,N); - //...Pack the Yz edge (17)................................ - ScaLBL_D3Q19_Unpack(17,dvcRecvDist_Yz,0,recvCount_Yz,recvbuf_Yz,Aq,N); - ScaLBL_D3Q19_Unpack(17,dvcRecvDist_Yz,0,recvCount_Yz,&recvbuf_Yz[recvCount_Yz],Bq,N); - } - - //................................................................................... - Lock=false; // unlock the communicator after communications complete - //................................................................................... - -} - void ScaLBL_Communicator::RecvGrad(double *phi, double *grad){ // Recieves halo and incorporates into D3Q19 based stencil gradient computation @@ -1539,106 +1177,6 @@ void ScaLBL_Communicator::RecvGrad(double *phi, double *grad){ } -void ScaLBL_Communicator::SendD3Q7AA(double *Aq){ - - // NOTE: the center distribution f0 must NOT be at the start of feven, provide offset to start of f2 - if (Lock==true){ - ERROR("ScaLBL Error (SendD3Q7): ScaLBL_Communicator is locked -- did you forget to match Send/Recv calls?"); - } - else{ - Lock=true; - } - // assign tag of 19 to D3Q19 communication - sendtag = recvtag = 7; - ScaLBL_DeviceBarrier(); - // Pack the distributions - //...Packing for x face(2,8,10,12,14)................................ - ScaLBL_D3Q19_Pack(2,dvcSendList_x,0,sendCount_x,sendbuf_x,Aq,N); - - req1[0] = MPI_COMM_SCALBL.Isend(sendbuf_x, sendCount_x,rank_x,sendtag); - req2[0] = MPI_COMM_SCALBL.Irecv(recvbuf_X, recvCount_X,rank_X,recvtag); - - //...Packing for X face(1,7,9,11,13)................................ - ScaLBL_D3Q19_Pack(1,dvcSendList_X,0,sendCount_X,sendbuf_X,Aq,N); - - req1[1] = MPI_COMM_SCALBL.Isend(sendbuf_X, sendCount_X,rank_X,sendtag); - req2[1] = MPI_COMM_SCALBL.Irecv(recvbuf_x, recvCount_x,rank_x,recvtag); - - //...Packing for y face(4,8,9,16,18)................................. - ScaLBL_D3Q19_Pack(4,dvcSendList_y,0,sendCount_y,sendbuf_y,Aq,N); - - req1[2] = MPI_COMM_SCALBL.Isend(sendbuf_y, sendCount_y,rank_y,sendtag); - req2[2] = MPI_COMM_SCALBL.Irecv(recvbuf_Y, recvCount_Y,rank_Y,recvtag); - - //...Packing for Y face(3,7,10,15,17)................................. - ScaLBL_D3Q19_Pack(3,dvcSendList_Y,0,sendCount_Y,sendbuf_Y,Aq,N); - - req1[3] = MPI_COMM_SCALBL.Isend(sendbuf_Y, sendCount_Y,rank_Y,sendtag); - req2[3] = MPI_COMM_SCALBL.Irecv(recvbuf_y, recvCount_y,rank_y,recvtag); - - //...Packing for z face(6,12,13,16,17)................................ - ScaLBL_D3Q19_Pack(6,dvcSendList_z,0,sendCount_z,sendbuf_z,Aq,N); - - req1[4] = MPI_COMM_SCALBL.Isend(sendbuf_z, sendCount_z,rank_z,sendtag); - req2[4] = MPI_COMM_SCALBL.Irecv(recvbuf_Z, recvCount_Z,rank_Z,recvtag); - - //...Packing for Z face(5,11,14,15,18)................................ - ScaLBL_D3Q19_Pack(5,dvcSendList_Z,0,sendCount_Z,sendbuf_Z,Aq,N); - - req1[5] = MPI_COMM_SCALBL.Isend(sendbuf_Z, sendCount_Z,rank_Z,sendtag); - req2[5] = MPI_COMM_SCALBL.Irecv(recvbuf_z, recvCount_z,rank_z,recvtag); - //................................................................................... -} - -void ScaLBL_Communicator::RecvD3Q7AA(double *Aq){ - - // NOTE: the center distribution f0 must NOT be at the start of feven, provide offset to start of f2 - //................................................................................... - // Wait for completion of D3Q19 communication - MPI_COMM_SCALBL.waitAll(6,req1); - MPI_COMM_SCALBL.waitAll(6,req2); - ScaLBL_DeviceBarrier(); - - //................................................................................... - // NOTE: AA Routine writes to opposite - // Unpack the distributions on the device - //................................................................................... - //...Unpacking for x face(2,8,10,12,14)................................ - ScaLBL_D3Q7_Unpack(2,dvcRecvDist_x,0,recvCount_x,recvbuf_x,Aq,N); - //................................................................................... - //...Packing for X face(1,7,9,11,13)................................ - ScaLBL_D3Q7_Unpack(1,dvcRecvDist_X,0,recvCount_X,recvbuf_X,Aq,N); - //................................................................................... - //...Packing for y face(4,8,9,16,18)................................. - ScaLBL_D3Q7_Unpack(4,dvcRecvDist_y,0,recvCount_y,recvbuf_y,Aq,N); - //................................................................................... - //...Packing for Y face(3,7,10,15,17)................................. - ScaLBL_D3Q7_Unpack(3,dvcRecvDist_Y,0,recvCount_Y,recvbuf_Y,Aq,N); - //................................................................................... - - if (BoundaryCondition > 0 && kproc == 0){ - // don't unpack little z - //...Packing for Z face(5,11,14,15,18)................................ - ScaLBL_D3Q7_Unpack(5,dvcRecvDist_Z,0,recvCount_Z,recvbuf_Z,Aq,N); - } - else if (BoundaryCondition > 0 && kproc == nprocz-1){ - // don't unpack big z - //...Packing for z face(6,12,13,16,17)................................ - ScaLBL_D3Q7_Unpack(6,dvcRecvDist_z,0,recvCount_z,recvbuf_z,Aq,N); - } - else { - //...Packing for z face(6,12,13,16,17)................................ - ScaLBL_D3Q7_Unpack(6,dvcRecvDist_z,0,recvCount_z,recvbuf_z,Aq,N); - //...Packing for Z face(5,11,14,15,18)................................ - ScaLBL_D3Q7_Unpack(5,dvcRecvDist_Z,0,recvCount_Z,recvbuf_Z,Aq,N); - } - - //................................................................................... - Lock=false; // unlock the communicator after communications complete - //................................................................................... - -} - void ScaLBL_Communicator::BiSendD3Q7AA(double *Aq, double *Bq){ // NOTE: the center distribution f0 must NOT be at the start of feven, provide offset to start of f2 @@ -2171,42 +1709,3 @@ void ScaLBL_Communicator::PrintD3Q19(){ delete [] TempBuffer; } -void ScaLBL_Communicator::GreyscaleSC_BC_z(int *Map, double *DenA, double *DenB, double vA, double vB) -{ - if (kproc == 0) { - // Set the density field on the z inlet - ScaLBL_GreyscaleSC_BC_z(dvcSendList_z, Map, DenA, DenB, vA, vB, sendCount_z); - } -} - -void ScaLBL_Communicator::GreyscaleSC_BC_Z(int *Map, double *DenA, double *DenB, double vA, double vB) -{ - if (kproc == nprocz-1){ - // Set the density field on the Z outlet - ScaLBL_GreyscaleSC_BC_Z(dvcSendList_Z, Map, DenA, DenB, vA, vB, sendCount_Z); - } -} - -void ScaLBL_Communicator::GreyscaleSC_Pressure_BC_z(int *neighborList, double *fqA, double *fqB, double dinA, double dinB, int time) -{ - if (kproc == 0) { - if (time%2==0){ - ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z(dvcSendList_z, fqA, fqB, dinA, dinB, sendCount_z, N); - } - else{ - ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z(neighborList, dvcSendList_z, fqA, fqB, dinA, dinB, sendCount_z, N); - } - } -} - -void ScaLBL_Communicator::GreyscaleSC_Pressure_BC_Z(int *neighborList, double *fqA, double *fqB, double doutA, double doutB, int time) -{ - if (kproc == nprocz-1){ - if (time%2==0){ - ScaLBL_GreyscaleSC_AAeven_Pressure_BC_Z(dvcSendList_Z, fqA, fqB, doutA, doutB, sendCount_Z, N); - } - else{ - ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z(neighborList, dvcSendList_Z, fqA, fqB, doutA, doutB, sendCount_Z, N); - } - } -} diff --git a/common/ScaLBL.h b/common/ScaLBL.h index f29cfa60..2e8eef1a 100644 --- a/common/ScaLBL.h +++ b/common/ScaLBL.h @@ -79,89 +79,89 @@ extern "C" void ScaLBL_D3Q19_AAodd_Greyscale_MRT(int *neighborList, double *dist double *Poros,double *Perm, double *Velocity,double Den,double *Pressure); // GREYSCALE FREE-ENERGY MODEL (Two-component) -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFE(double *dist, double *Aq, double *Bq, double *Den, - double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure); - -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFE(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, - double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure); - -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFEChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, - double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); - -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFEChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, - double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); - -extern "C" void ScaLBL_D3Q7_GreyscaleFE_Init(double *Den, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np); - -extern "C" void ScaLBL_D3Q19_GreyscaleFE_IMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np); - -extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleFEDensity(int *NeighborList, double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np); - -extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleFEDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np); - -extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleFEPhi(int *NeighborList, double *Cq, double *Phi, int start, int finish, int Np); - -extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleFEPhi(double *Cq, double *Phi, int start, int finish, int Np); - -extern "C" void ScaLBL_D3Q19_GreyscaleFE_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np); - -extern "C" void ScaLBL_D3Q19_GreyscaleFE_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np); - -extern "C" void ScaLBL_D3Q19_GreyscaleFE_Pressure(double *dist, double *Den, double *Porosity,double *Velocity, - double *Pressure, double rhoA,double rhoB, int Np); - -extern "C" void ScaLBL_D3Q19_GreyscaleFE_PressureTensor(int *neighborList, double *Phi,double *Pressure, double *PressTensor, double *PhiLap, - double kappaA,double kappaB,double lambdaA,double lambdaB, int start, int finish, int Np); +//extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFE(double *dist, double *Aq, double *Bq, double *Den, +// double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, +// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, +// double *Poros,double *Perm, double *Velocity,double *Pressure); +// +//extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFE(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, +// double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, +// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, +// double *Poros,double *Perm, double *Velocity,double *Pressure); +// +//extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFEChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, +// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, +// double Gx, double Gy, double Gz, +// double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); +// +//extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFEChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, +// double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, +// double Gx, double Gy, double Gz, +// double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap); +// +//extern "C" void ScaLBL_D3Q7_GreyscaleFE_Init(double *Den, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np); +// +//extern "C" void ScaLBL_D3Q19_GreyscaleFE_IMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np); +// +//extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleFEDensity(int *NeighborList, double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np); +// +//extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleFEDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np); +// +//extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleFEPhi(int *NeighborList, double *Cq, double *Phi, int start, int finish, int Np); +// +//extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleFEPhi(double *Cq, double *Phi, int start, int finish, int Np); +// +//extern "C" void ScaLBL_D3Q19_GreyscaleFE_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np); +// +//extern "C" void ScaLBL_D3Q19_GreyscaleFE_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np); +// +//extern "C" void ScaLBL_D3Q19_GreyscaleFE_Pressure(double *dist, double *Den, double *Porosity,double *Velocity, +// double *Pressure, double rhoA,double rhoB, int Np); +// +//extern "C" void ScaLBL_D3Q19_GreyscaleFE_PressureTensor(int *neighborList, double *Phi,double *Pressure, double *PressTensor, double *PhiLap, +// double kappaA,double kappaB,double lambdaA,double lambdaB, int start, int finish, int Np); // GREYSCALE SHAN-CHEN MODEL (Two-component) -extern "C" void ScaLBL_D3Q19_GreyscaleSC_Init(int *Map, double *distA, double *distB, double *DenA, double *DenB, int Np); - -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); - -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(int *Map, double *distA, double *distB, double *DenA, double *DenB, int start, int finish, int Np); - -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, int *Mpa, 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); - -extern "C" void 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); - -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); - -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); - -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); - -extern "C" void ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count); - -extern "C" void ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count); - -extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z(int *list, double *distA, double *distB, double dinA, double dinB, int count, int N); - -extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_Z(int *list, double *distA, double *distB, double doutA, double doutB, int count, int N); - -extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z(int *neighborList, int *list, double *distA, double *distB, double dinA, double dinB, int count, int N); - -extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z(int *neighborList, int *list, double *distA, double *distB, double doutA, double doutB, int count, int N); +//extern "C" void ScaLBL_D3Q19_GreyscaleSC_Init(int *Map, double *distA, double *distB, double *DenA, double *DenB, int Np); +// +//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); +// +//extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(int *Map, double *distA, double *distB, double *DenA, double *DenB, int start, int finish, int Np); +// +//extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT(int *neighborList, int *Mpa, 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); +// +//extern "C" void 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); +// +//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); +// +//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); +// +//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); +// +//extern "C" void ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count); +// +//extern "C" void ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count); +// +//extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z(int *list, double *distA, double *distB, double dinA, double dinB, int count, int N); +// +//extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_Z(int *list, double *distA, double *distB, double doutA, double doutB, int count, int N); +// +//extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z(int *neighborList, int *list, double *distA, double *distB, double dinA, double dinB, int count, int N); +// +//extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z(int *neighborList, int *list, double *distA, double *distB, double doutA, double doutB, int count, int N); // GREYSCALE COLOR MODEL (Two-component) //extern "C" void ScaLBL_D3Q19_GreyscaleColor_Init(double *dist, double *Porosity, int Np); @@ -298,12 +298,8 @@ public: int MemoryOptimizedLayoutAA(IntArray &Map, int *neighborList, signed char *id, int Np); void SendD3Q19AA(double *dist); void RecvD3Q19AA(double *dist); - void BiSendD3Q19AA(double *Aq, double *Bq); - void BiRecvD3Q19AA(double *Aq, double *Bq); // void BiSendD3Q7(double *A_even, double *A_odd, double *B_even, double *B_odd); // void BiRecvD3Q7(double *A_even, double *A_odd, double *B_even, double *B_odd); - void SendD3Q7AA(double *Aq); - void RecvD3Q7AA(double *Aq); void BiSendD3Q7AA(double *Aq, double *Bq); void BiRecvD3Q7AA(double *Aq, double *Bq); void TriSendD3Q7AA(double *Aq, double *Bq, double *Cq); diff --git a/cpu/GreyscaleFE.cpp b/cpu/GreyscaleFE.cpp deleted file mode 100644 index 1b9fd753..00000000 --- a/cpu/GreyscaleFE.cpp +++ /dev/null @@ -1,3113 +0,0 @@ -#include -#include - -extern "C" void ScaLBL_D3Q19_GreyscaleFE_Pressure(double *dist, double *Den, double *Poros,double *Velocity, - double *Pressure, double rhoA,double rhoB, int N){ - - int n; - double ux,uy,uz,u_mag; - double pressure; - double porosity; - double rho0; - double phi; - double nA,nB; - - for (n=0; n0.0)-Gsc*nB*nA_gradx*int(phi<0.0); -// Gff_y = -Gsc*nA*nB_grady*int(phi>0.0)-Gsc*nB*nA_grady*int(phi<0.0); -// Gff_z = -Gsc*nA*nB_gradz*int(phi>0.0)-Gsc*nB*nA_gradz*int(phi<0.0); - Gff_x = -Gsc*(nA*nB_gradx+nB*nA_gradx); - Gff_y = -Gsc*(nA*nB_grady+nB*nA_grady); - Gff_z = -Gsc*(nA*nB_gradz+nB*nA_gradz); - // fluid-solid force - Gfs_x = (nA-nB)*SolidForce[n+0*Np]; - Gfs_y = (nA-nB)*SolidForce[n+1*Np]; - Gfs_z = (nA-nB)*SolidForce[n+2*Np]; - - porosity = Poros[n]; - // use local saturation as an estimation of effective relperm values - perm = Perm[n]*nA/(nA+nB)*int(phi>0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); - vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); - vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); - Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); - Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); - if (porosity==1.0){ - Fx=rho0*(Gx + Gff_x + Gfs_x); - Fy=rho0*(Gy + Gff_y + Gfs_y); - Fz=rho0*(Gz + Gff_z + Gfs_z); - } - - //Calculate pressure for Incompressible-MRT model - pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); - -// //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) -// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) -// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; -// jx = jx + Fx; -// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -// jy = jy + Fy; -// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -// jz = jz + Fz; -// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) -// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; -// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) -// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; -// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) -// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; -// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) -// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; -// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) -// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; -// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) -// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; -// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) -// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); -// //....................................................................................................... - - //-------------------- IMRT collison where body force has NO higher-order terms -------------// - //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); - m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); - m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); - m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); - m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... - - //.................inverse transformation...................................................... - // q=0 - fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; - dist[n] = fq; - - // q = 1 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - dist[1*Np+n] = fq; - - // q=2 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); - dist[2*Np+n] = fq; - - // q = 3 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - dist[3*Np+n] = fq; - - // q = 4 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - dist[4*Np+n] = fq; - - // q = 5 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - dist[5*Np+n] = fq; - - // q = 6 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - dist[6*Np+n] = fq; - - // q = 7 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - dist[7*Np+n] = fq; - - // q = 8 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); - dist[8*Np+n] = fq; - - // q = 9 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - dist[9*Np+n] = fq; - - // q = 10 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - dist[10*Np+n] = fq; - - // q = 11 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); - dist[11*Np+n] = fq; - - // q = 12 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - dist[12*Np+n] = fq; - - // q = 13 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); - dist[13*Np+n] = fq; - - // q= 14 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); - dist[14*Np+n] = fq; - - // q = 15 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - dist[15*Np+n] = fq; - - // q = 16 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - dist[16*Np+n] = fq; - - // q = 17 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - dist[17*Np+n] = fq; - - // q = 18 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - dist[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] = pressure; - - //-----------------------Mass transport------------------------// - // Calculate the color gradient - nx = (2*nB*nA_gradx-2*nA*nB_gradx)/(nA+nB)/(nA+nB); - ny = (2*nB*nA_grady-2*nA*nB_grady)/(nA+nB)/(nA+nB); - nz = (2*nB*nA_gradz-2*nA*nB_gradz)/(nA+nB)/(nA+nB); - //...........Normalize the Color Gradient................................. - C = sqrt(nx*nx+ny*ny+nz*nz); - double ColorMag = C; - if (C==0.0) ColorMag=1.0; - nx = nx/ColorMag; - ny = ny/ColorMag; - nz = nz/ColorMag; - if (C == 0.0) nx = ny = nz = 0.0; - - // Instantiate mass transport distributions - // Stationary value - distribution 0 - nAB = 1.0/(nA+nB); - Aq[n] = 0.3333333333333333*nA; - Bq[n] = 0.3333333333333333*nB; - - //............................................... - // q = 0,2,4 - // Cq = {1,0,0}, {0,1,0}, {0,0,1} - delta = beta*nA*nB*nAB*0.1111111111111111*nx; - if (!(nA*nB*nAB>0)) delta=0; - a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; - b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; - a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; - b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; - - Aq[1*Np+n] = a1; - Bq[1*Np+n] = b1; - Aq[2*Np+n] = a2; - Bq[2*Np+n] = b2; - - //............................................... - // q = 2 - // Cq = {0,1,0} - delta = beta*nA*nB*nAB*0.1111111111111111*ny; - if (!(nA*nB*nAB>0)) delta=0; - a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; - b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; - a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; - b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; - - Aq[3*Np+n] = a1; - Bq[3*Np+n] = b1; - Aq[4*Np+n] = a2; - Bq[4*Np+n] = b2; - //............................................... - // q = 4 - // Cq = {0,0,1} - delta = beta*nA*nB*nAB*0.1111111111111111*nz; - if (!(nA*nB*nAB>0)) delta=0; - a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; - b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; - a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; - b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; - - Aq[5*Np+n] = a1; - Bq[5*Np+n] = b1; - Aq[6*Np+n] = a2; - Bq[6*Np+n] = b2; - //............................................... - } -} - -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFE(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, - double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure){ - - int n, nread, nr1,nr2,nr3,nr4,nr5,nr6; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; - double fq; - // currently disable 'GeoFun' - double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) - double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double tau,tau_eff,rlx_setA,rlx_setB; - double mu_eff;//effective kinematic viscosity for Darcy term - double rho0; - double phi; - double nx,ny,nz,C; - double nA,nB; - double a1,b1,a2,b2,nAB,delta; - double beta=0.95; - double nA_gradx,nA_grady,nA_gradz; - double nB_gradx,nB_grady,nB_gradz; - double Gff_x,Gff_y,Gff_z; - double Gfs_x,Gfs_y,Gfs_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; - - for (n=start; n 10Np => odd part of dist) - fq = dist[nr1]; // reading the f1 data into register fq - pressure = fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jx = fq; - m4 = -4.0*fq; - m9 = 2.0*fq; - m10 = -4.0*fq; - - // q=2 - nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) - fq = dist[nr2]; // reading the f2 data into register fq - pressure += fq; - m1 -= 11.0*(fq); - m2 -= 4.0*(fq); - jx -= fq; - m4 += 4.0*(fq); - m9 += 2.0*(fq); - m10 -= 4.0*(fq); - - // q=3 - nr3 = neighborList[n+2*Np]; // neighbor 4 - fq = dist[nr3]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy = fq; - m6 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 = fq; - m12 = -2.0*fq; - - // q = 4 - nr4 = neighborList[n+3*Np]; // neighbor 3 - fq = dist[nr4]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy -= fq; - m6 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 += fq; - m12 -= 2.0*fq; - - // q=5 - nr5 = neighborList[n+4*Np]; - fq = dist[nr5]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz = fq; - m8 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q = 6 - nr6 = neighborList[n+5*Np]; - fq = dist[nr6]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz -= fq; - m8 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q=7 - nread = neighborList[n+6*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 = fq; - m16 = fq; - m17 = -fq; - - // q = 8 - nread = neighborList[n+7*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 += fq; - m16 -= fq; - m17 += fq; - - // q=9 - nread = neighborList[n+8*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 += fq; - m17 += fq; - - // q = 10 - nread = neighborList[n+9*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 -= fq; - m17 -= fq; - - // q=11 - nread = neighborList[n+10*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 = fq; - m16 -= fq; - m18 = fq; - - // q=12 - nread = neighborList[n+11*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 += fq; - m16 += fq; - m18 -= fq; - - // q=13 - nread = neighborList[n+12*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 -= fq; - m18 -= fq; - - // q=14 - nread = neighborList[n+13*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 += fq; - m18 += fq; - - // q=15 - nread = neighborList[n+14*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 = fq; - m17 += fq; - m18 -= fq; - - // q=16 - nread = neighborList[n+15*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 += fq; - m17 -= fq; - m18 += fq; - - // q=17 - nread = neighborList[n+16*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 += fq; - m18 += fq; - - // q=18 - nread = neighborList[n+17*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 -= fq; - m18 -= fq; - //---------------------------------------------------------------------// - - //---------------- Calculate SC fluid-fluid and fluid-solid forces ---------------// - // fluid-fluid force -// Gff_x = -Gsc*nA*nB_gradx*int(phi>0.0)-Gsc*nB*nA_gradx*int(phi<0.0); -// Gff_y = -Gsc*nA*nB_grady*int(phi>0.0)-Gsc*nB*nA_grady*int(phi<0.0); -// Gff_z = -Gsc*nA*nB_gradz*int(phi>0.0)-Gsc*nB*nA_gradz*int(phi<0.0); - Gff_x = -Gsc*(nA*nB_gradx+nB*nA_gradx); - Gff_y = -Gsc*(nA*nB_grady+nB*nA_grady); - Gff_z = -Gsc*(nA*nB_gradz+nB*nA_gradz); - // fluid-solid force - Gfs_x = (nA-nB)*SolidForce[n+0*Np]; - Gfs_y = (nA-nB)*SolidForce[n+1*Np]; - Gfs_z = (nA-nB)*SolidForce[n+2*Np]; - - porosity = Poros[n]; - // use local saturation as an estimation of effective relperm values - perm = Perm[n]*nA/(nA+nB)*int(phi>0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); - vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); - vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); - Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); - Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); - if (porosity==1.0){ - Fx=rho0*(Gx + Gff_x + Gfs_x); - Fy=rho0*(Gy + Gff_y + Gfs_y); - Fz=rho0*(Gz + Gff_z + Gfs_z); - } - - //Calculate pressure for Incompressible-MRT model - pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); - -// //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) -// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) -// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; -// jx = jx + Fx; -// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -// jy = jy + Fy; -// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -// jz = jz + Fz; -// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) -// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; -// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) -// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; -// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) -// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; -// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) -// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; -// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) -// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; -// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) -// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; -// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) -// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); -// //....................................................................................................... - - //-------------------- IMRT collison where body force has NO higher-order terms -------------// - //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); - m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); - m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); - m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); - m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... - - - //.................inverse transformation...................................................... - // q=0 - fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; - dist[n] = fq; - - // q = 1 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - //nread = neighborList[n+Np]; - dist[nr2] = fq; - - // q=2 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); - //nread = neighborList[n]; - dist[nr1] = fq; - - // q = 3 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - //nread = neighborList[n+3*Np]; - dist[nr4] = fq; - - // q = 4 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - //nread = neighborList[n+2*Np]; - dist[nr3] = fq; - - // q = 5 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - //nread = neighborList[n+5*Np]; - dist[nr6] = fq; - - // q = 6 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - //nread = neighborList[n+4*Np]; - dist[nr5] = fq; - - // q = 7 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - nread = neighborList[n+7*Np]; - dist[nread] = fq; - - // q = 8 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); - nread = neighborList[n+6*Np]; - dist[nread] = fq; - - // q = 9 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - nread = neighborList[n+9*Np]; - dist[nread] = fq; - - // q = 10 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - nread = neighborList[n+8*Np]; - dist[nread] = fq; - - // q = 11 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); - nread = neighborList[n+11*Np]; - dist[nread] = fq; - - // q = 12 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - nread = neighborList[n+10*Np]; - dist[nread]= fq; - - // q = 13 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); - nread = neighborList[n+13*Np]; - dist[nread] = fq; - - // q= 14 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); - nread = neighborList[n+12*Np]; - dist[nread] = fq; - - // q = 15 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - nread = neighborList[n+15*Np]; - dist[nread] = fq; - - // q = 16 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - nread = neighborList[n+14*Np]; - dist[nread] = fq; - - // q = 17 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - nread = neighborList[n+17*Np]; - dist[nread] = fq; - - // q = 18 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - nread = neighborList[n+16*Np]; - dist[nread] = fq; - //........................................................................ - - //Update velocity on device - Velocity[0*Np+n] = ux; - Velocity[1*Np+n] = uy; - Velocity[2*Np+n] = uz; - //Update pressure on device - Pressure[n] = pressure; - - //-----------------------Mass transport------------------------// - // Calculate the color gradient - nx = (2*nB*nA_gradx-2*nA*nB_gradx)/(nA+nB)/(nA+nB); - ny = (2*nB*nA_grady-2*nA*nB_grady)/(nA+nB)/(nA+nB); - nz = (2*nB*nA_gradz-2*nA*nB_gradz)/(nA+nB)/(nA+nB); - //...........Normalize the Color Gradient................................. - C = sqrt(nx*nx+ny*ny+nz*nz); - double ColorMag = C; - if (C==0.0) ColorMag=1.0; - nx = nx/ColorMag; - ny = ny/ColorMag; - nz = nz/ColorMag; - if (C == 0.0) nx = ny = nz = 0.0; - - // Instantiate mass transport distributions - // Stationary value - distribution 0 - nAB = 1.0/(nA+nB); - Aq[n] = 0.3333333333333333*nA; - Bq[n] = 0.3333333333333333*nB; - - //............................................... - // q = 0,2,4 - // Cq = {1,0,0}, {0,1,0}, {0,0,1} - delta = beta*nA*nB*nAB*0.1111111111111111*nx; - if (!(nA*nB*nAB>0)) delta=0; - a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; - b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; - a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; - b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; - - // q = 1 - //nread = neighborList[n+Np]; - Aq[nr2] = a1; - Bq[nr2] = b1; - // q=2 - //nread = neighborList[n]; - Aq[nr1] = a2; - Bq[nr1] = b2; - - //............................................... - // Cq = {0,1,0} - delta = beta*nA*nB*nAB*0.1111111111111111*ny; - if (!(nA*nB*nAB>0)) delta=0; - a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; - b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; - a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; - b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; - - // q = 3 - //nread = neighborList[n+3*Np]; - Aq[nr4] = a1; - Bq[nr4] = b1; - // q = 4 - //nread = neighborList[n+2*Np]; - Aq[nr3] = a2; - Bq[nr3] = b2; - - //............................................... - // q = 4 - // Cq = {0,0,1} - delta = beta*nA*nB*nAB*0.1111111111111111*nz; - if (!(nA*nB*nAB>0)) delta=0; - a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; - b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; - a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; - b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; - - // q = 5 - //nread = neighborList[n+5*Np]; - Aq[nr6] = a1; - Bq[nr6] = b1; - // q = 6 - //nread = neighborList[n+4*Np]; - Aq[nr5] = a2; - Bq[nr5] = b2; - //............................................... - } -} - -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFEChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, - double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - - int n, nread, nr1,nr2,nr3,nr4,nr5,nr6; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; - double fq; - // currently disable 'GeoFun' - double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) - double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double tau,tau_eff,rlx_setA,rlx_setB; - double mu_eff;//effective kinematic viscosity for Darcy term - double rho,rho0; - double phi; - double phi_lap;//laplacian of phase field - double nA,nB; - double Gfs_x,Gfs_y,Gfs_z; - double Gff_x,Gff_y,Gff_z; - double chem; - double rlx_phi; - double a1,a2;//PDF of phase field - // *---------------------------------Pressure Tensor Gradient------------------------------------*// - double Pxx_x,Pyy_y,Pzz_z; - double Pxy_x,Pxy_y; - double Pyz_y,Pyz_z; - double Pxz_x,Pxz_z; - double px,py,pz; //pressure gradient - - 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; - - for (n=start; n0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); - - //Load pressure gradient - px=PressureGrad[0*Np+n]; - py=PressureGrad[1*Np+n]; - pz=PressureGrad[2*Np+n]; - - //Load pressure tensor gradient - //For reference full list of PressTensorGrad - //PressTensorGrad[n+0*Np] = Pxx_x - //PressTensorGrad[n+1*Np] = Pxx_y - //PressTensorGrad[n+2*Np] = Pxx_z - //PressTensorGrad[n+3*Np] = Pyy_x - //PressTensorGrad[n+4*Np] = Pyy_y - //PressTensorGrad[n+5*Np] = Pyy_z - //PressTensorGrad[n+6*Np] = Pzz_x - //PressTensorGrad[n+7*Np] = Pzz_y - //PressTensorGrad[n+8*Np] = Pzz_z - //PressTensorGrad[n+9*Np] = Pxy_x - //PressTensorGrad[n+10*Np] = Pxy_y - //PressTensorGrad[n+11*Np] = Pxy_z - //PressTensorGrad[n+12*Np] = Pyz_x - //PressTensorGrad[n+13*Np] = Pyz_y - //PressTensorGrad[n+14*Np] = Pyz_z - //PressTensorGrad[n+15*Np] = Pxz_x - //PressTensorGrad[n+16*Np] = Pxz_y - //PressTensorGrad[n+17*Np] = Pxz_z - Pxx_x = PressTensorGrad[0*Np+n]; - Pyy_y = PressTensorGrad[4*Np+n]; - Pzz_z = PressTensorGrad[8*Np+n]; - Pxy_x = PressTensorGrad[9*Np+n]; - Pxz_x = PressTensorGrad[15*Np+n]; - Pxy_y = PressTensorGrad[10*Np+n]; - Pyz_y = PressTensorGrad[13*Np+n]; - Pyz_z = PressTensorGrad[14*Np+n]; - Pxz_z = PressTensorGrad[17*Np+n]; - //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... - //TODO double check if you need porosity as a fre-factor - Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); - Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); - Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); - // fluid-solid force - Gfs_x = (nA-nB)*SolidForce[n+0*Np]; - Gfs_y = (nA-nB)*SolidForce[n+1*Np]; - Gfs_z = (nA-nB)*SolidForce[n+2*Np]; - - // local density - rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); - // local relaxation time - tau=tauA + 0.5*(1.0-phi)*(tauB-tauA); - rlx_setA = 1.f/tau; - rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); - tau_eff=tauA_eff + 0.5*(1.0-phi)*(tauB_eff-tauA_eff); - mu_eff = (tau_eff-0.5)/3.f;//kinematic viscosity - - //........................................................................ - // READ THE DISTRIBUTIONS - // (read from opposite array due to previous swap operation) - //........................................................................ - // q=0 - fq = dist[n]; - rho = fq; - m1 = -30.0*fq; - m2 = 12.0*fq; - - // q=1 - nr1 = neighborList[n]; // neighbor 2 ( > 10Np => odd part of dist) - fq = dist[nr1]; // reading the f1 data into register fq - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jx = fq; - m4 = -4.0*fq; - m9 = 2.0*fq; - m10 = -4.0*fq; - - // q=2 - nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) - fq = dist[nr2]; // reading the f2 data into register fq - rho += fq; - m1 -= 11.0*(fq); - m2 -= 4.0*(fq); - jx -= fq; - m4 += 4.0*(fq); - m9 += 2.0*(fq); - m10 -= 4.0*(fq); - - // q=3 - nr3 = neighborList[n+2*Np]; // neighbor 4 - fq = dist[nr3]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy = fq; - m6 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 = fq; - m12 = -2.0*fq; - - // q = 4 - nr4 = neighborList[n+3*Np]; // neighbor 3 - fq = dist[nr4]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy -= fq; - m6 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 += fq; - m12 -= 2.0*fq; - - // q=5 - nr5 = neighborList[n+4*Np]; - fq = dist[nr5]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz = fq; - m8 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q = 6 - nr6 = neighborList[n+5*Np]; - fq = dist[nr6]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz -= fq; - m8 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q=7 - nread = neighborList[n+6*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 = fq; - m16 = fq; - m17 = -fq; - - // q = 8 - nread = neighborList[n+7*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 += fq; - m16 -= fq; - m17 += fq; - - // q=9 - nread = neighborList[n+8*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 += fq; - m17 += fq; - - // q = 10 - nread = neighborList[n+9*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 -= fq; - m17 -= fq; - - // q=11 - nread = neighborList[n+10*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 = fq; - m16 -= fq; - m18 = fq; - - // q=12 - nread = neighborList[n+11*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 += fq; - m16 += fq; - m18 -= fq; - - // q=13 - nread = neighborList[n+12*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 -= fq; - m18 -= fq; - - // q=14 - nread = neighborList[n+13*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 += fq; - m18 += fq; - - // q=15 - nread = neighborList[n+14*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 = fq; - m17 += fq; - m18 -= fq; - - // q=16 - nread = neighborList[n+15*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 += fq; - m17 -= fq; - m18 += fq; - - // q=17 - nread = neighborList[n+16*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 += fq; - m18 += fq; - - // q=18 - nread = neighborList[n+17*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 -= fq; - m18 -= fq; - //---------------------------------------------------------------------// - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); - vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); - vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); - Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); - Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); - if (porosity==1.0){ - Fx=rho0*(Gx + Gff_x + Gfs_x); - Fy=rho0*(Gy + Gff_y + Gfs_y); - Fz=rho0*(Gz + Gff_z + Gfs_z); - } - - //Calculate pressure for Incompressible-MRT model - //pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); - pressure=rho/3.0; - - //-------------------- IMRT collison where body force has NO higher-order terms -------------// - //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho0 - 11*rho) - m1); - m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho0)- m2); - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*jx)- m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*jy)- m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*jz)- m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho0) - m9); - m10 = m10 + rlx_setA*( - m10); - m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho0) - m11); - m12 = m12 + rlx_setA*( - m12); - m13 = m13 + rlx_setA*( (jx*jy/rho0) - m13); - m14 = m14 + rlx_setA*( (jy*jz/rho0) - m14); - m15 = m15 + rlx_setA*( (jx*jz/rho0) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... - - - //.................inverse transformation...................................................... - // q=0 - fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; - dist[n] = fq; - - // q = 1 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - //nread = neighborList[n+Np]; - dist[nr2] = fq; - - // q=2 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); - //nread = neighborList[n]; - dist[nr1] = fq; - - // q = 3 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - //nread = neighborList[n+3*Np]; - dist[nr4] = fq; - - // q = 4 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - //nread = neighborList[n+2*Np]; - dist[nr3] = fq; - - // q = 5 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - //nread = neighborList[n+5*Np]; - dist[nr6] = fq; - - // q = 6 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - //nread = neighborList[n+4*Np]; - dist[nr5] = fq; - - // q = 7 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - nread = neighborList[n+7*Np]; - dist[nread] = fq; - - // q = 8 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); - nread = neighborList[n+6*Np]; - dist[nread] = fq; - - // q = 9 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - nread = neighborList[n+9*Np]; - dist[nread] = fq; - - // q = 10 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - nread = neighborList[n+8*Np]; - dist[nread] = fq; - - // q = 11 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); - nread = neighborList[n+11*Np]; - dist[nread] = fq; - - // q = 12 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - nread = neighborList[n+10*Np]; - dist[nread]= fq; - - // q = 13 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); - nread = neighborList[n+13*Np]; - dist[nread] = fq; - - // q= 14 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); - nread = neighborList[n+12*Np]; - dist[nread] = fq; - - // q = 15 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - nread = neighborList[n+15*Np]; - dist[nread] = fq; - - // q = 16 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - nread = neighborList[n+14*Np]; - dist[nread] = fq; - - // q = 17 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - nread = neighborList[n+17*Np]; - dist[nread] = fq; - - // q = 18 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - nread = neighborList[n+16*Np]; - dist[nread] = fq; - //........................................................................ - - //Update velocity on device - Velocity[0*Np+n] = ux; - Velocity[1*Np+n] = uy; - Velocity[2*Np+n] = uz; - //Update pressure on device - Pressure[n] = pressure; - - //-----------------------Mass transport------------------------// - // calcuale chemical potential - chem = 0.125*(lambdaA+lambdaB)*(-phi+phi*phi*phi)-0.25*(kappaA+kappaB)*phi_lap; - //rlx_phi = 3.f-sqrt(3.f); - rlx_phi = 1.0; - - //............................................... - // q = 0,2,4 - // Cq = {1,0,0}, {0,1,0}, {0,0,1} - //a1 = Cq[nr2]; - //a2 = Cq[nr1]; - //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*ux)); - //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*ux)); - a1 = 0.1111111111111111*4.5*(gamma*chem+phi*ux); - a2 = 0.1111111111111111*4.5*(gamma*chem-phi*ux); - - // q = 1 - //nread = neighborList[n+Np]; - Cq[nr2] = a1; - // q=2 - //nread = neighborList[n]; - Cq[nr1] = a2; - - //............................................... - // Cq = {0,1,0} - //a1 = Cq[nr4]; - //a2 = Cq[nr3]; - //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uy)); - //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uy)); - a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uy); - a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uy); - - // q = 3 - //nread = neighborList[n+3*Np]; - Cq[nr4] = a1; - // q = 4 - //nread = neighborList[n+2*Np]; - Cq[nr3] = a2; - - //............................................... - // q = 4 - // Cq = {0,0,1} - //a1 = Cq[nr6]; - //a2 = Cq[nr5]; - //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uz)); - //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uz)); - a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uz); - a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uz); - - // q = 5 - //nread = neighborList[n+5*Np]; - Cq[nr6] = a1; - // q = 6 - //nread = neighborList[n+4*Np]; - Cq[nr5] = a2; - //............................................... - - // Instantiate mass transport distributions - // Stationary value - distribution 0 - //a1=Cq[n]; - //Cq[n] = (1.0-rlx_phi)*a1+rlx_phi*(phi-3.0*gamma*chem); - Cq[n] = phi-3.0*gamma*chem; - } -} - -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFEChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, - double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - - int n; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; - double fq; - // currently disable 'GeoFun' - double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) - double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double tau,tau_eff,rlx_setA,rlx_setB; - double mu_eff;//effective kinematic viscosity for Darcy term - double rho,rho0; - double phi; - double phi_lap;//laplacian of phase field - double nA,nB; - double Gfs_x,Gfs_y,Gfs_z; - double Gff_x,Gff_y,Gff_z; - double chem; - double rlx_phi; - double a1,a2;//PDF of phase field - // *---------------------------------Pressure Tensor Gradient------------------------------------*// - double Pxx_x,Pyy_y,Pzz_z; - double Pxy_x,Pxy_y; - double Pyz_y,Pyz_z; - double Pxz_x,Pxz_z; - double px,py,pz; //pressure gradient - - - 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; - - - for (n=start; n0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); - - //Load pressure gradient - px=PressureGrad[0*Np+n]; - py=PressureGrad[1*Np+n]; - pz=PressureGrad[2*Np+n]; - - //Load pressure tensor gradient - //For reference full list of PressTensorGrad - //PressTensorGrad[n+0*Np] = Pxx_x - //PressTensorGrad[n+1*Np] = Pxx_y - //PressTensorGrad[n+2*Np] = Pxx_z - //PressTensorGrad[n+3*Np] = Pyy_x - //PressTensorGrad[n+4*Np] = Pyy_y - //PressTensorGrad[n+5*Np] = Pyy_z - //PressTensorGrad[n+6*Np] = Pzz_x - //PressTensorGrad[n+7*Np] = Pzz_y - //PressTensorGrad[n+8*Np] = Pzz_z - //PressTensorGrad[n+9*Np] = Pxy_x - //PressTensorGrad[n+10*Np] = Pxy_y - //PressTensorGrad[n+11*Np] = Pxy_z - //PressTensorGrad[n+12*Np] = Pyz_x - //PressTensorGrad[n+13*Np] = Pyz_y - //PressTensorGrad[n+14*Np] = Pyz_z - //PressTensorGrad[n+15*Np] = Pxz_x - //PressTensorGrad[n+16*Np] = Pxz_y - //PressTensorGrad[n+17*Np] = Pxz_z - Pxx_x = PressTensorGrad[0*Np+n]; - Pyy_y = PressTensorGrad[4*Np+n]; - Pzz_z = PressTensorGrad[8*Np+n]; - Pxy_x = PressTensorGrad[9*Np+n]; - Pxz_x = PressTensorGrad[15*Np+n]; - Pxy_y = PressTensorGrad[10*Np+n]; - Pyz_y = PressTensorGrad[13*Np+n]; - Pyz_z = PressTensorGrad[14*Np+n]; - Pxz_z = PressTensorGrad[17*Np+n]; - //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... - //TODO double check if you need porosity as a fre-factor - Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); - Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); - Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); - // fluid-solid force - Gfs_x = (nA-nB)*SolidForce[n+0*Np]; - Gfs_y = (nA-nB)*SolidForce[n+1*Np]; - Gfs_z = (nA-nB)*SolidForce[n+2*Np]; - - // local density - rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); - // local relaxation time - tau=tauA + 0.5*(1.0-phi)*(tauB-tauA); - rlx_setA = 1.f/tau; - rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); - tau_eff=tauA_eff + 0.5*(1.0-phi)*(tauB_eff-tauA_eff); - mu_eff = (tau_eff-0.5)/3.f;//kinematic viscosity - - - //........................................................................ - // READ THE DISTRIBUTIONS - // (read from opposite array due to previous swap operation) - //........................................................................ - // q=0 - fq = dist[n]; - rho = fq; - m1 = -30.0*fq; - m2 = 12.0*fq; - - // q=1 - fq = dist[2*Np+n]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jx = fq; - m4 = -4.0*fq; - m9 = 2.0*fq; - m10 = -4.0*fq; - - // f2 = dist[10*Np+n]; - fq = dist[1*Np+n]; - rho += fq; - m1 -= 11.0*(fq); - m2 -= 4.0*(fq); - jx -= fq; - m4 += 4.0*(fq); - m9 += 2.0*(fq); - m10 -= 4.0*(fq); - - // q=3 - fq = dist[4*Np+n]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy = fq; - m6 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 = fq; - m12 = -2.0*fq; - - // q = 4 - fq = dist[3*Np+n]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy -= fq; - m6 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 += fq; - m12 -= 2.0*fq; - - // q=5 - fq = dist[6*Np+n]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz = fq; - m8 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q = 6 - fq = dist[5*Np+n]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz -= fq; - m8 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q=7 - fq = dist[8*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 = fq; - m16 = fq; - m17 = -fq; - - // q = 8 - fq = dist[7*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 += fq; - m16 -= fq; - m17 += fq; - - // q=9 - fq = dist[10*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 += fq; - m17 += fq; - - // q = 10 - fq = dist[9*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 -= fq; - m17 -= fq; - - // q=11 - fq = dist[12*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 = fq; - m16 -= fq; - m18 = fq; - - // q=12 - fq = dist[11*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 += fq; - m16 += fq; - m18 -= fq; - - // q=13 - fq = dist[14*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 -= fq; - m18 -= fq; - - // q=14 - fq = dist[13*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 += fq; - m18 += fq; - - // q=15 - fq = dist[16*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 = fq; - m17 += fq; - m18 -= fq; - - // q=16 - fq = dist[15*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 += fq; - m17 -= fq; - m18 += fq; - - // q=17 - fq = dist[18*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 += fq; - m18 += fq; - - // q=18 - fq = dist[17*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 -= fq; - m18 -= fq; - //---------------------------------------------------------------------// - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); - vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); - vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); - Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); - Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); - if (porosity==1.0){ - Fx=rho0*(Gx + Gff_x + Gfs_x); - Fy=rho0*(Gy + Gff_y + Gfs_y); - Fz=rho0*(Gz + Gff_z + Gfs_z); - } - - //Calculate pressure for Incompressible-MRT model - //pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); - pressure=rho/3.0; - - //-------------------- IMRT collison where body force has NO higher-order terms -------------// - //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho0 - 11*rho) - m1); - m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho0)- m2); - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*jx)- m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*jy)- m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*jz)- m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho0) - m9); - m10 = m10 + rlx_setA*( - m10); - m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho0) - m11); - m12 = m12 + rlx_setA*( - m12); - m13 = m13 + rlx_setA*( (jx*jy/rho0) - m13); - m14 = m14 + rlx_setA*( (jy*jz/rho0) - m14); - m15 = m15 + rlx_setA*( (jx*jz/rho0) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... - - //.................inverse transformation...................................................... - // q=0 - fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; - dist[n] = fq; - - // q = 1 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - dist[1*Np+n] = fq; - - // q=2 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); - dist[2*Np+n] = fq; - - // q = 3 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - dist[3*Np+n] = fq; - - // q = 4 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - dist[4*Np+n] = fq; - - // q = 5 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - dist[5*Np+n] = fq; - - // q = 6 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - dist[6*Np+n] = fq; - - // q = 7 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - dist[7*Np+n] = fq; - - // q = 8 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); - dist[8*Np+n] = fq; - - // q = 9 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - dist[9*Np+n] = fq; - - // q = 10 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - dist[10*Np+n] = fq; - - // q = 11 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); - dist[11*Np+n] = fq; - - // q = 12 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - dist[12*Np+n] = fq; - - // q = 13 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); - dist[13*Np+n] = fq; - - // q= 14 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); - dist[14*Np+n] = fq; - - // q = 15 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - dist[15*Np+n] = fq; - - // q = 16 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - dist[16*Np+n] = fq; - - // q = 17 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - dist[17*Np+n] = fq; - - // q = 18 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - dist[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] = pressure; - - //-----------------------Mass transport------------------------// - // calcuale chemical potential - chem = 0.125*(lambdaA+lambdaB)*(-phi+phi*phi*phi)-0.25*(kappaA+kappaB)*phi_lap; - //rlx_phi = 3.f-sqrt(3.f); - rlx_phi = 1.0; - - //............................................... - // q = 0,2,4 - // Cq = {1,0,0}, {0,1,0}, {0,0,1} - //a1 = Cq[1*Np+n]; - //a2 = Cq[2*Np+n]; - //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*ux)); - //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*ux)); - a1 = 0.1111111111111111*4.5*(gamma*chem+phi*ux); - a2 = 0.1111111111111111*4.5*(gamma*chem-phi*ux); - - Cq[1*Np+n] = a1; - Cq[2*Np+n] = a2; - - //............................................... - // q = 2 - // Cq = {0,1,0} - //a1 = Cq[3*Np+n]; - //a2 = Cq[4*Np+n]; - //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uy)); - //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uy)); - a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uy); - a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uy); - - Cq[3*Np+n] = a1; - Cq[4*Np+n] = a2; - //............................................... - // q = 4 - // Cq = {0,0,1} - //a1 = Cq[5*Np+n]; - //a2 = Cq[6*Np+n]; - //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uz)); - //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uz)); - a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uz); - a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uz); - - Cq[5*Np+n] = a1; - Cq[6*Np+n] = a2; - //............................................... - - // Instantiate mass transport distributions - // Stationary value - distribution 0 - //a1=Cq[n]; - //Cq[n] = (1.0-rlx_phi)*a1+rlx_phi*(phi-3.0*gamma*chem); - Cq[n] = phi-3.0*gamma*chem; - } -} - -extern "C" void ScaLBL_D3Q19_GreyscaleFE_IMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np){ - int n; - double phi; - double nA,nB; - double Den0; - for (n=0; n -#include - -//__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 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 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 - -#define NBLOCKS 1024 -#define NTHREADS 256 - -__global__ void dvc_ScaLBL_D3Q19_GreyscaleFE_Pressure(double *dist, double *Den, double *Poros,double *Velocity, - double *Pressure, double rhoA,double rhoB, int N){ - - int n; - double ux,uy,uz,u_mag; - double pressure; - double porosity; - double rho0; - double phi; - double nA,nB; - - int S = N/NBLOCKS/NTHREADS + 1; - for (int s=0; s0.0)-Gsc*nB*nA_gradx*int(phi<0.0); -// Gff_y = -Gsc*nA*nB_grady*int(phi>0.0)-Gsc*nB*nA_grady*int(phi<0.0); -// Gff_z = -Gsc*nA*nB_gradz*int(phi>0.0)-Gsc*nB*nA_gradz*int(phi<0.0); - Gff_x = -Gsc*(nA*nB_gradx+nB*nA_gradx); - Gff_y = -Gsc*(nA*nB_grady+nB*nA_grady); - Gff_z = -Gsc*(nA*nB_gradz+nB*nA_gradz); - // fluid-solid force - Gfs_x = (nA-nB)*SolidForce[n+0*Np]; - Gfs_y = (nA-nB)*SolidForce[n+1*Np]; - Gfs_z = (nA-nB)*SolidForce[n+2*Np]; - - porosity = Poros[n]; - // use local saturation as an estimation of effective relperm values - perm = Perm[n]*nA/(nA+nB)*int(phi>0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); - vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); - vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); - Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); - Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); - if (porosity==1.0){ - Fx=rho0*(Gx + Gff_x + Gfs_x); - Fy=rho0*(Gy + Gff_y + Gfs_y); - Fz=rho0*(Gz + Gff_z + Gfs_z); - } - - //Calculate pressure for Incompressible-MRT model - pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); - -// //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) -// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) -// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; -// jx = jx + Fx; -// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -// jy = jy + Fy; -// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -// jz = jz + Fz; -// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) -// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; -// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) -// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; -// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) -// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; -// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) -// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; -// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) -// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; -// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) -// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; -// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) -// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); -// //....................................................................................................... - - //-------------------- IMRT collison where body force has NO higher-order terms -------------// - //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); - m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); - m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); - m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); - m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... - - //.................inverse transformation...................................................... - // q=0 - fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; - dist[n] = fq; - - // q = 1 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - dist[1*Np+n] = fq; - - // q=2 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); - dist[2*Np+n] = fq; - - // q = 3 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - dist[3*Np+n] = fq; - - // q = 4 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - dist[4*Np+n] = fq; - - // q = 5 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - dist[5*Np+n] = fq; - - // q = 6 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - dist[6*Np+n] = fq; - - // q = 7 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - dist[7*Np+n] = fq; - - // q = 8 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); - dist[8*Np+n] = fq; - - // q = 9 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - dist[9*Np+n] = fq; - - // q = 10 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - dist[10*Np+n] = fq; - - // q = 11 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); - dist[11*Np+n] = fq; - - // q = 12 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - dist[12*Np+n] = fq; - - // q = 13 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); - dist[13*Np+n] = fq; - - // q= 14 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); - dist[14*Np+n] = fq; - - // q = 15 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - dist[15*Np+n] = fq; - - // q = 16 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - dist[16*Np+n] = fq; - - // q = 17 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - dist[17*Np+n] = fq; - - // q = 18 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - dist[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] = pressure; - - //-----------------------Mass transport------------------------// - // Calculate the color gradient - nx = (2*nB*nA_gradx-2*nA*nB_gradx)/(nA+nB)/(nA+nB); - ny = (2*nB*nA_grady-2*nA*nB_grady)/(nA+nB)/(nA+nB); - nz = (2*nB*nA_gradz-2*nA*nB_gradz)/(nA+nB)/(nA+nB); - //...........Normalize the Color Gradient................................. - C = sqrt(nx*nx+ny*ny+nz*nz); - double ColorMag = C; - if (C==0.0) ColorMag=1.0; - nx = nx/ColorMag; - ny = ny/ColorMag; - nz = nz/ColorMag; - if (C == 0.0) nx = ny = nz = 0.0; - - // Instantiate mass transport distributions - // Stationary value - distribution 0 - nAB = 1.0/(nA+nB); - Aq[n] = 0.3333333333333333*nA; - Bq[n] = 0.3333333333333333*nB; - - //............................................... - // q = 0,2,4 - // Cq = {1,0,0}, {0,1,0}, {0,0,1} - delta = beta*nA*nB*nAB*0.1111111111111111*nx; - if (!(nA*nB*nAB>0)) delta=0; - a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; - b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; - a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; - b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; - - Aq[1*Np+n] = a1; - Bq[1*Np+n] = b1; - Aq[2*Np+n] = a2; - Bq[2*Np+n] = b2; - - //............................................... - // q = 2 - // Cq = {0,1,0} - delta = beta*nA*nB*nAB*0.1111111111111111*ny; - if (!(nA*nB*nAB>0)) delta=0; - a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; - b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; - a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; - b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; - - Aq[3*Np+n] = a1; - Bq[3*Np+n] = b1; - Aq[4*Np+n] = a2; - Bq[4*Np+n] = b2; - //............................................... - // q = 4 - // Cq = {0,0,1} - delta = beta*nA*nB*nAB*0.1111111111111111*nz; - if (!(nA*nB*nAB>0)) delta=0; - a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; - b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; - a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; - b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; - - Aq[5*Np+n] = a1; - Bq[5*Np+n] = b1; - Aq[6*Np+n] = a2; - Bq[6*Np+n] = b2; - //............................................... - - } - } -} - -__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleFE(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, - double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure){ - - int n, nread, nr1,nr2,nr3,nr4,nr5,nr6; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; - double fq; - // currently disable 'GeoFun' - double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) - double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double tau,tau_eff,rlx_setA,rlx_setB; - double mu_eff;//effective kinematic viscosity for Darcy term - double rho0; - double phi; - double nx,ny,nz,C; - double nA,nB; - double a1,b1,a2,b2,nAB,delta; - double beta=0.95; - double nA_gradx,nA_grady,nA_gradz; - double nB_gradx,nB_grady,nB_gradz; - double Gff_x,Gff_y,Gff_z; - double Gfs_x,Gfs_y,Gfs_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 10Np => odd part of dist) - fq = dist[nr1]; // reading the f1 data into register fq - pressure = fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jx = fq; - m4 = -4.0*fq; - m9 = 2.0*fq; - m10 = -4.0*fq; - - // q=2 - nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) - fq = dist[nr2]; // reading the f2 data into register fq - pressure += fq; - m1 -= 11.0*(fq); - m2 -= 4.0*(fq); - jx -= fq; - m4 += 4.0*(fq); - m9 += 2.0*(fq); - m10 -= 4.0*(fq); - - // q=3 - nr3 = neighborList[n+2*Np]; // neighbor 4 - fq = dist[nr3]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy = fq; - m6 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 = fq; - m12 = -2.0*fq; - - // q = 4 - nr4 = neighborList[n+3*Np]; // neighbor 3 - fq = dist[nr4]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy -= fq; - m6 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 += fq; - m12 -= 2.0*fq; - - // q=5 - nr5 = neighborList[n+4*Np]; - fq = dist[nr5]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz = fq; - m8 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q = 6 - nr6 = neighborList[n+5*Np]; - fq = dist[nr6]; - pressure += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz -= fq; - m8 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q=7 - nread = neighborList[n+6*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 = fq; - m16 = fq; - m17 = -fq; - - // q = 8 - nread = neighborList[n+7*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 += fq; - m16 -= fq; - m17 += fq; - - // q=9 - nread = neighborList[n+8*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 += fq; - m17 += fq; - - // q = 10 - nread = neighborList[n+9*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 -= fq; - m17 -= fq; - - // q=11 - nread = neighborList[n+10*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 = fq; - m16 -= fq; - m18 = fq; - - // q=12 - nread = neighborList[n+11*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 += fq; - m16 += fq; - m18 -= fq; - - // q=13 - nread = neighborList[n+12*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 -= fq; - m18 -= fq; - - // q=14 - nread = neighborList[n+13*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 += fq; - m18 += fq; - - // q=15 - nread = neighborList[n+14*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 = fq; - m17 += fq; - m18 -= fq; - - // q=16 - nread = neighborList[n+15*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 += fq; - m17 -= fq; - m18 += fq; - - // q=17 - nread = neighborList[n+16*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 += fq; - m18 += fq; - - // q=18 - nread = neighborList[n+17*Np]; - fq = dist[nread]; - pressure += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 -= fq; - m18 -= fq; - //---------------------------------------------------------------------// - - //---------------- Calculate SC fluid-fluid and fluid-solid forces ---------------// - // fluid-fluid force -// Gff_x = -Gsc*nA*nB_gradx*int(phi>0.0)-Gsc*nB*nA_gradx*int(phi<0.0); -// Gff_y = -Gsc*nA*nB_grady*int(phi>0.0)-Gsc*nB*nA_grady*int(phi<0.0); -// Gff_z = -Gsc*nA*nB_gradz*int(phi>0.0)-Gsc*nB*nA_gradz*int(phi<0.0); - Gff_x = -Gsc*(nA*nB_gradx+nB*nA_gradx); - Gff_y = -Gsc*(nA*nB_grady+nB*nA_grady); - Gff_z = -Gsc*(nA*nB_gradz+nB*nA_gradz); - // fluid-solid force - Gfs_x = (nA-nB)*SolidForce[n+0*Np]; - Gfs_y = (nA-nB)*SolidForce[n+1*Np]; - Gfs_z = (nA-nB)*SolidForce[n+2*Np]; - - porosity = Poros[n]; - // use local saturation as an estimation of effective relperm values - perm = Perm[n]*nA/(nA+nB)*int(phi>0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); - vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); - vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); - Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); - Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); - if (porosity==1.0){ - Fx=rho0*(Gx + Gff_x + Gfs_x); - Fy=rho0*(Gy + Gff_y + Gfs_y); - Fz=rho0*(Gz + Gff_z + Gfs_z); - } - - //Calculate pressure for Incompressible-MRT model - pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); - -// //..............carry out relaxation process............................................... -// m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1) -// + (1-0.5*rlx_setA)*38*(Fx*ux+Fy*uy+Fz*uz)/porosity; -// m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2) -// + (1-0.5*rlx_setA)*11*(-Fx*ux-Fy*uy-Fz*uz)/porosity; -// jx = jx + Fx; -// m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); -// jy = jy + Fy; -// m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); -// jz = jz + Fz; -// m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) -// + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); -// m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9) -// + (1-0.5*rlx_setA)*(4*Fx*ux-2*Fy*uy-2*Fz*uz)/porosity; -// m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10) -// + (1-0.5*rlx_setA)*(-2*Fx*ux+Fy*uy+Fz*uz)/porosity; -// m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11) -// + (1-0.5*rlx_setA)*(2*Fy*uy-2*Fz*uz)/porosity; -// m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12) -// + (1-0.5*rlx_setA)*(-Fy*uy+Fz*uz)/porosity; -// m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13) -// + (1-0.5*rlx_setA)*(Fy*ux+Fx*uy)/porosity; -// m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14) -// + (1-0.5*rlx_setA)*(Fz*uy+Fy*uz)/porosity; -// m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15) -// + (1-0.5*rlx_setA)*(Fz*ux+Fx*uz)/porosity; -// m16 = m16 + rlx_setB*( - m16); -// m17 = m17 + rlx_setB*( - m17); -// m18 = m18 + rlx_setB*( - m18); -// //....................................................................................................... - - //-------------------- IMRT collison where body force has NO higher-order terms -------------// - //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((-30*rho0+19*(ux*ux+uy*uy+uz*uz)/porosity + 57*pressure*porosity) - m1); - m2 = m2 + rlx_setA*((12*rho0 - 5.5*(ux*ux+uy*uy+uz*uz)/porosity-27*pressure*porosity) - m2); - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*ux*rho0) - m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*uy*rho0) - m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*uz*rho0) - m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*((rho0*(2*ux*ux-uy*uy-uz*uz)/porosity) - m9); - m10 = m10 + rlx_setA*(-0.5*rho0*((2*ux*ux-uy*uy-uz*uz)/porosity)- m10); - m11 = m11 + rlx_setA*((rho0*(uy*uy-uz*uz)/porosity) - m11); - m12 = m12 + rlx_setA*(-0.5*(rho0*(uy*uy-uz*uz)/porosity)- m12); - m13 = m13 + rlx_setA*((rho0*ux*uy/porosity) - m13); - m14 = m14 + rlx_setA*((rho0*uy*uz/porosity) - m14); - m15 = m15 + rlx_setA*((rho0*ux*uz/porosity) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... - - - //.................inverse transformation...................................................... - // q=0 - fq = mrt_V1*rho0-mrt_V2*m1+mrt_V3*m2; - dist[n] = fq; - - // q = 1 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - //nread = neighborList[n+Np]; - dist[nr2] = fq; - - // q=2 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); - //nread = neighborList[n]; - dist[nr1] = fq; - - // q = 3 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - //nread = neighborList[n+3*Np]; - dist[nr4] = fq; - - // q = 4 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - //nread = neighborList[n+2*Np]; - dist[nr3] = fq; - - // q = 5 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - //nread = neighborList[n+5*Np]; - dist[nr6] = fq; - - // q = 6 - fq = mrt_V1*rho0-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - //nread = neighborList[n+4*Np]; - dist[nr5] = fq; - - // q = 7 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - nread = neighborList[n+7*Np]; - dist[nread] = fq; - - // q = 8 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); - nread = neighborList[n+6*Np]; - dist[nread] = fq; - - // q = 9 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - nread = neighborList[n+9*Np]; - dist[nread] = fq; - - // q = 10 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - nread = neighborList[n+8*Np]; - dist[nread] = fq; - - // q = 11 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); - nread = neighborList[n+11*Np]; - dist[nread] = fq; - - // q = 12 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - nread = neighborList[n+10*Np]; - dist[nread]= fq; - - // q = 13 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); - nread = neighborList[n+13*Np]; - dist[nread] = fq; - - // q= 14 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); - nread = neighborList[n+12*Np]; - dist[nread] = fq; - - // q = 15 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - nread = neighborList[n+15*Np]; - dist[nread] = fq; - - // q = 16 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - nread = neighborList[n+14*Np]; - dist[nread] = fq; - - // q = 17 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - nread = neighborList[n+17*Np]; - dist[nread] = fq; - - // q = 18 - fq = mrt_V1*rho0+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - nread = neighborList[n+16*Np]; - dist[nread] = fq; - //........................................................................ - - //Update velocity on device - Velocity[0*Np+n] = ux; - Velocity[1*Np+n] = uy; - Velocity[2*Np+n] = uz; - //Update pressure on device - Pressure[n] = pressure; - - //-----------------------Mass transport------------------------// - // Calculate the color gradient - nx = (2*nB*nA_gradx-2*nA*nB_gradx)/(nA+nB)/(nA+nB); - ny = (2*nB*nA_grady-2*nA*nB_grady)/(nA+nB)/(nA+nB); - nz = (2*nB*nA_gradz-2*nA*nB_gradz)/(nA+nB)/(nA+nB); - //...........Normalize the Color Gradient................................. - C = sqrt(nx*nx+ny*ny+nz*nz); - double ColorMag = C; - if (C==0.0) ColorMag=1.0; - nx = nx/ColorMag; - ny = ny/ColorMag; - nz = nz/ColorMag; - if (C == 0.0) nx = ny = nz = 0.0; - - // Instantiate mass transport distributions - // Stationary value - distribution 0 - nAB = 1.0/(nA+nB); - Aq[n] = 0.3333333333333333*nA; - Bq[n] = 0.3333333333333333*nB; - - //............................................... - // q = 0,2,4 - // Cq = {1,0,0}, {0,1,0}, {0,0,1} - delta = beta*nA*nB*nAB*0.1111111111111111*nx; - if (!(nA*nB*nAB>0)) delta=0; - a1 = nA*(0.1111111111111111*(1+4.5*ux))+delta; - b1 = nB*(0.1111111111111111*(1+4.5*ux))-delta; - a2 = nA*(0.1111111111111111*(1-4.5*ux))-delta; - b2 = nB*(0.1111111111111111*(1-4.5*ux))+delta; - - // q = 1 - //nread = neighborList[n+Np]; - Aq[nr2] = a1; - Bq[nr2] = b1; - // q=2 - //nread = neighborList[n]; - Aq[nr1] = a2; - Bq[nr1] = b2; - - //............................................... - // Cq = {0,1,0} - delta = beta*nA*nB*nAB*0.1111111111111111*ny; - if (!(nA*nB*nAB>0)) delta=0; - a1 = nA*(0.1111111111111111*(1+4.5*uy))+delta; - b1 = nB*(0.1111111111111111*(1+4.5*uy))-delta; - a2 = nA*(0.1111111111111111*(1-4.5*uy))-delta; - b2 = nB*(0.1111111111111111*(1-4.5*uy))+delta; - - // q = 3 - //nread = neighborList[n+3*Np]; - Aq[nr4] = a1; - Bq[nr4] = b1; - // q = 4 - //nread = neighborList[n+2*Np]; - Aq[nr3] = a2; - Bq[nr3] = b2; - - //............................................... - // q = 4 - // Cq = {0,0,1} - delta = beta*nA*nB*nAB*0.1111111111111111*nz; - if (!(nA*nB*nAB>0)) delta=0; - a1 = nA*(0.1111111111111111*(1+4.5*uz))+delta; - b1 = nB*(0.1111111111111111*(1+4.5*uz))-delta; - a2 = nA*(0.1111111111111111*(1-4.5*uz))-delta; - b2 = nB*(0.1111111111111111*(1-4.5*uz))+delta; - - // q = 5 - //nread = neighborList[n+5*Np]; - Aq[nr6] = a1; - Bq[nr6] = b1; - // q = 6 - //nread = neighborList[n+4*Np]; - Aq[nr5] = a2; - Bq[nr5] = b2; - //............................................... - } - } -} - -__global__ void dvc_ScaLBL_D3Q19_AAodd_GreyscaleFEChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, - double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - - int n, nread, nr1,nr2,nr3,nr4,nr5,nr6; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; - double fq; - // currently disable 'GeoFun' - double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) - double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double tau,tau_eff,rlx_setA,rlx_setB; - double mu_eff;//effective kinematic viscosity for Darcy term - double rho,rho0; - double phi; - double phi_lap;//laplacian of phase field - double nA,nB; - double Gfs_x,Gfs_y,Gfs_z; - double Gff_x,Gff_y,Gff_z; - double chem; - double rlx_phi; - double a1,a2;//PDF of phase field - // *---------------------------------Pressure Tensor Gradient------------------------------------*// - double Pxx_x,Pyy_y,Pzz_z; - double Pxy_x,Pxy_y; - double Pyz_y,Pyz_z; - double Pxz_x,Pxz_z; - double px,py,pz; //pressure gradient - - 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; s0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); - - //Load pressure gradient - px=PressureGrad[0*Np+n]; - py=PressureGrad[1*Np+n]; - pz=PressureGrad[2*Np+n]; - - //Load pressure tensor gradient - //For reference full list of PressTensorGrad - //PressTensorGrad[n+0*Np] = Pxx_x - //PressTensorGrad[n+1*Np] = Pxx_y - //PressTensorGrad[n+2*Np] = Pxx_z - //PressTensorGrad[n+3*Np] = Pyy_x - //PressTensorGrad[n+4*Np] = Pyy_y - //PressTensorGrad[n+5*Np] = Pyy_z - //PressTensorGrad[n+6*Np] = Pzz_x - //PressTensorGrad[n+7*Np] = Pzz_y - //PressTensorGrad[n+8*Np] = Pzz_z - //PressTensorGrad[n+9*Np] = Pxy_x - //PressTensorGrad[n+10*Np] = Pxy_y - //PressTensorGrad[n+11*Np] = Pxy_z - //PressTensorGrad[n+12*Np] = Pyz_x - //PressTensorGrad[n+13*Np] = Pyz_y - //PressTensorGrad[n+14*Np] = Pyz_z - //PressTensorGrad[n+15*Np] = Pxz_x - //PressTensorGrad[n+16*Np] = Pxz_y - //PressTensorGrad[n+17*Np] = Pxz_z - Pxx_x = PressTensorGrad[0*Np+n]; - Pyy_y = PressTensorGrad[4*Np+n]; - Pzz_z = PressTensorGrad[8*Np+n]; - Pxy_x = PressTensorGrad[9*Np+n]; - Pxz_x = PressTensorGrad[15*Np+n]; - Pxy_y = PressTensorGrad[10*Np+n]; - Pyz_y = PressTensorGrad[13*Np+n]; - Pyz_z = PressTensorGrad[14*Np+n]; - Pxz_z = PressTensorGrad[17*Np+n]; - //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... - //TODO double check if you need porosity as a fre-factor - Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); - Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); - Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); - // fluid-solid force - Gfs_x = (nA-nB)*SolidForce[n+0*Np]; - Gfs_y = (nA-nB)*SolidForce[n+1*Np]; - Gfs_z = (nA-nB)*SolidForce[n+2*Np]; - - // local density - rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); - // local relaxation time - tau=tauA + 0.5*(1.0-phi)*(tauB-tauA); - rlx_setA = 1.f/tau; - rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); - tau_eff=tauA_eff + 0.5*(1.0-phi)*(tauB_eff-tauA_eff); - mu_eff = (tau_eff-0.5)/3.f;//kinematic viscosity - - //........................................................................ - // READ THE DISTRIBUTIONS - // (read from opposite array due to previous swap operation) - //........................................................................ - // q=0 - fq = dist[n]; - rho = fq; - m1 = -30.0*fq; - m2 = 12.0*fq; - - // q=1 - nr1 = neighborList[n]; // neighbor 2 ( > 10Np => odd part of dist) - fq = dist[nr1]; // reading the f1 data into register fq - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jx = fq; - m4 = -4.0*fq; - m9 = 2.0*fq; - m10 = -4.0*fq; - - // q=2 - nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) - fq = dist[nr2]; // reading the f2 data into register fq - rho += fq; - m1 -= 11.0*(fq); - m2 -= 4.0*(fq); - jx -= fq; - m4 += 4.0*(fq); - m9 += 2.0*(fq); - m10 -= 4.0*(fq); - - // q=3 - nr3 = neighborList[n+2*Np]; // neighbor 4 - fq = dist[nr3]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy = fq; - m6 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 = fq; - m12 = -2.0*fq; - - // q = 4 - nr4 = neighborList[n+3*Np]; // neighbor 3 - fq = dist[nr4]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy -= fq; - m6 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 += fq; - m12 -= 2.0*fq; - - // q=5 - nr5 = neighborList[n+4*Np]; - fq = dist[nr5]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz = fq; - m8 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q = 6 - nr6 = neighborList[n+5*Np]; - fq = dist[nr6]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz -= fq; - m8 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q=7 - nread = neighborList[n+6*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 = fq; - m16 = fq; - m17 = -fq; - - // q = 8 - nread = neighborList[n+7*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 += fq; - m16 -= fq; - m17 += fq; - - // q=9 - nread = neighborList[n+8*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 += fq; - m17 += fq; - - // q = 10 - nread = neighborList[n+9*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 -= fq; - m17 -= fq; - - // q=11 - nread = neighborList[n+10*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 = fq; - m16 -= fq; - m18 = fq; - - // q=12 - nread = neighborList[n+11*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 += fq; - m16 += fq; - m18 -= fq; - - // q=13 - nread = neighborList[n+12*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 -= fq; - m18 -= fq; - - // q=14 - nread = neighborList[n+13*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 += fq; - m18 += fq; - - // q=15 - nread = neighborList[n+14*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 = fq; - m17 += fq; - m18 -= fq; - - // q=16 - nread = neighborList[n+15*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 += fq; - m17 -= fq; - m18 += fq; - - // q=17 - nread = neighborList[n+16*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 += fq; - m18 += fq; - - // q=18 - nread = neighborList[n+17*Np]; - fq = dist[nread]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 -= fq; - m18 -= fq; - //---------------------------------------------------------------------// - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); - vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); - vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); - Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); - Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); - if (porosity==1.0){ - Fx=rho0*(Gx + Gff_x + Gfs_x); - Fy=rho0*(Gy + Gff_y + Gfs_y); - Fz=rho0*(Gz + Gff_z + Gfs_z); - } - - //Calculate pressure for Incompressible-MRT model - //pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); - pressure=rho/3.0; - - //-------------------- IMRT collison where body force has NO higher-order terms -------------// - //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho0 - 11*rho) - m1); - m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho0)- m2); - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*jx)- m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*jy)- m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*jz)- m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho0) - m9); - m10 = m10 + rlx_setA*( - m10); - m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho0) - m11); - m12 = m12 + rlx_setA*( - m12); - m13 = m13 + rlx_setA*( (jx*jy/rho0) - m13); - m14 = m14 + rlx_setA*( (jy*jz/rho0) - m14); - m15 = m15 + rlx_setA*( (jx*jz/rho0) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... - - - //.................inverse transformation...................................................... - // q=0 - fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; - dist[n] = fq; - - // q = 1 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - //nread = neighborList[n+Np]; - dist[nr2] = fq; - - // q=2 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); - //nread = neighborList[n]; - dist[nr1] = fq; - - // q = 3 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - //nread = neighborList[n+3*Np]; - dist[nr4] = fq; - - // q = 4 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - //nread = neighborList[n+2*Np]; - dist[nr3] = fq; - - // q = 5 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - //nread = neighborList[n+5*Np]; - dist[nr6] = fq; - - // q = 6 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - //nread = neighborList[n+4*Np]; - dist[nr5] = fq; - - // q = 7 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - nread = neighborList[n+7*Np]; - dist[nread] = fq; - - // q = 8 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); - nread = neighborList[n+6*Np]; - dist[nread] = fq; - - // q = 9 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - nread = neighborList[n+9*Np]; - dist[nread] = fq; - - // q = 10 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - nread = neighborList[n+8*Np]; - dist[nread] = fq; - - // q = 11 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); - nread = neighborList[n+11*Np]; - dist[nread] = fq; - - // q = 12 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - nread = neighborList[n+10*Np]; - dist[nread]= fq; - - // q = 13 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); - nread = neighborList[n+13*Np]; - dist[nread] = fq; - - // q= 14 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); - nread = neighborList[n+12*Np]; - dist[nread] = fq; - - // q = 15 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - nread = neighborList[n+15*Np]; - dist[nread] = fq; - - // q = 16 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - nread = neighborList[n+14*Np]; - dist[nread] = fq; - - // q = 17 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - nread = neighborList[n+17*Np]; - dist[nread] = fq; - - // q = 18 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - nread = neighborList[n+16*Np]; - dist[nread] = fq; - //........................................................................ - - //Update velocity on device - Velocity[0*Np+n] = ux; - Velocity[1*Np+n] = uy; - Velocity[2*Np+n] = uz; - //Update pressure on device - Pressure[n] = pressure; - - //-----------------------Mass transport------------------------// - // calcuale chemical potential - chem = 0.125*(lambdaA+lambdaB)*(-phi+phi*phi*phi)-0.25*(kappaA+kappaB)*phi_lap; - //rlx_phi = 3.f-sqrt(3.f); - rlx_phi = 1.0; - - //............................................... - // q = 0,2,4 - // Cq = {1,0,0}, {0,1,0}, {0,0,1} - //a1 = Cq[nr2]; - //a2 = Cq[nr1]; - //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*ux)); - //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*ux)); - a1 = 0.1111111111111111*4.5*(gamma*chem+phi*ux); - a2 = 0.1111111111111111*4.5*(gamma*chem-phi*ux); - - // q = 1 - //nread = neighborList[n+Np]; - Cq[nr2] = a1; - // q=2 - //nread = neighborList[n]; - Cq[nr1] = a2; - - //............................................... - // Cq = {0,1,0} - //a1 = Cq[nr4]; - //a2 = Cq[nr3]; - //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uy)); - //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uy)); - a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uy); - a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uy); - - // q = 3 - //nread = neighborList[n+3*Np]; - Cq[nr4] = a1; - // q = 4 - //nread = neighborList[n+2*Np]; - Cq[nr3] = a2; - - //............................................... - // q = 4 - // Cq = {0,0,1} - //a1 = Cq[nr6]; - //a2 = Cq[nr5]; - //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uz)); - //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uz)); - a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uz); - a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uz); - - // q = 5 - //nread = neighborList[n+5*Np]; - Cq[nr6] = a1; - // q = 6 - //nread = neighborList[n+4*Np]; - Cq[nr5] = a2; - //............................................... - - // Instantiate mass transport distributions - // Stationary value - distribution 0 - //a1=Cq[n]; - //Cq[n] = (1.0-rlx_phi)*a1+rlx_phi*(phi-3.0*gamma*chem); - Cq[n] = phi-3.0*gamma*chem; - - } - } -} - -__global__ void dvc_ScaLBL_D3Q19_AAeven_GreyscaleFEChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, - double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - int n; - double vx,vy,vz,v_mag; - double ux,uy,uz,u_mag; - double pressure;//defined for this incompressible model - // conserved momemnts - double jx,jy,jz; - // non-conserved moments - double m1,m2,m4,m6,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18; - double fq; - // currently disable 'GeoFun' - double GeoFun=0.0;//geometric function from Guo's PRE 66, 036304 (2002) - double porosity; - double perm;//voxel permeability - double c0, c1; //Guo's model parameters - double Fx, Fy, Fz;//The total body force including Brinkman force and user-specified (Gx,Gy,Gz) - double tau,tau_eff,rlx_setA,rlx_setB; - double mu_eff;//effective kinematic viscosity for Darcy term - double rho,rho0; - double phi; - double phi_lap;//laplacian of phase field - double nA,nB; - double Gfs_x,Gfs_y,Gfs_z; - double Gff_x,Gff_y,Gff_z; - double chem; - double rlx_phi; - double a1,a2;//PDF of phase field - // *---------------------------------Pressure Tensor Gradient------------------------------------*// - double Pxx_x,Pyy_y,Pzz_z; - double Pxy_x,Pxy_y; - double Pyz_y,Pyz_z; - double Pxz_x,Pxz_z; - double px,py,pz; //pressure gradient - - - 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; s0.0)+Perm[n]*nB/(nA+nB)*int(phi<0.0); - - //Load pressure gradient - px=PressureGrad[0*Np+n]; - py=PressureGrad[1*Np+n]; - pz=PressureGrad[2*Np+n]; - - //Load pressure tensor gradient - //For reference full list of PressTensorGrad - //PressTensorGrad[n+0*Np] = Pxx_x - //PressTensorGrad[n+1*Np] = Pxx_y - //PressTensorGrad[n+2*Np] = Pxx_z - //PressTensorGrad[n+3*Np] = Pyy_x - //PressTensorGrad[n+4*Np] = Pyy_y - //PressTensorGrad[n+5*Np] = Pyy_z - //PressTensorGrad[n+6*Np] = Pzz_x - //PressTensorGrad[n+7*Np] = Pzz_y - //PressTensorGrad[n+8*Np] = Pzz_z - //PressTensorGrad[n+9*Np] = Pxy_x - //PressTensorGrad[n+10*Np] = Pxy_y - //PressTensorGrad[n+11*Np] = Pxy_z - //PressTensorGrad[n+12*Np] = Pyz_x - //PressTensorGrad[n+13*Np] = Pyz_y - //PressTensorGrad[n+14*Np] = Pyz_z - //PressTensorGrad[n+15*Np] = Pxz_x - //PressTensorGrad[n+16*Np] = Pxz_y - //PressTensorGrad[n+17*Np] = Pxz_z - Pxx_x = PressTensorGrad[0*Np+n]; - Pyy_y = PressTensorGrad[4*Np+n]; - Pzz_z = PressTensorGrad[8*Np+n]; - Pxy_x = PressTensorGrad[9*Np+n]; - Pxz_x = PressTensorGrad[15*Np+n]; - Pxy_y = PressTensorGrad[10*Np+n]; - Pyz_y = PressTensorGrad[13*Np+n]; - Pyz_z = PressTensorGrad[14*Np+n]; - Pxz_z = PressTensorGrad[17*Np+n]; - //............Compute the fluid-fluid force (gfx,gfy,gfz)................................... - //TODO double check if you need porosity as a fre-factor - Gff_x = porosity*px-(Pxx_x+Pxy_y+Pxz_z); - Gff_y = porosity*py-(Pxy_x+Pyy_y+Pyz_z); - Gff_z = porosity*pz-(Pxz_x+Pyz_y+Pzz_z); - // fluid-solid force - Gfs_x = (nA-nB)*SolidForce[n+0*Np]; - Gfs_y = (nA-nB)*SolidForce[n+1*Np]; - Gfs_z = (nA-nB)*SolidForce[n+2*Np]; - - // local density - rho0=rhoA + 0.5*(1.0-phi)*(rhoB-rhoA); - // local relaxation time - tau=tauA + 0.5*(1.0-phi)*(tauB-tauA); - rlx_setA = 1.f/tau; - rlx_setB = 8.f*(2.f-rlx_setA)/(8.f-rlx_setA); - tau_eff=tauA_eff + 0.5*(1.0-phi)*(tauB_eff-tauA_eff); - mu_eff = (tau_eff-0.5)/3.f;//kinematic viscosity - - - //........................................................................ - // READ THE DISTRIBUTIONS - // (read from opposite array due to previous swap operation) - //........................................................................ - // q=0 - fq = dist[n]; - rho = fq; - m1 = -30.0*fq; - m2 = 12.0*fq; - - // q=1 - fq = dist[2*Np+n]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jx = fq; - m4 = -4.0*fq; - m9 = 2.0*fq; - m10 = -4.0*fq; - - // f2 = dist[10*Np+n]; - fq = dist[1*Np+n]; - rho += fq; - m1 -= 11.0*(fq); - m2 -= 4.0*(fq); - jx -= fq; - m4 += 4.0*(fq); - m9 += 2.0*(fq); - m10 -= 4.0*(fq); - - // q=3 - fq = dist[4*Np+n]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy = fq; - m6 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 = fq; - m12 = -2.0*fq; - - // q = 4 - fq = dist[3*Np+n]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jy -= fq; - m6 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 += fq; - m12 -= 2.0*fq; - - // q=5 - fq = dist[6*Np+n]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz = fq; - m8 = -4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q = 6 - fq = dist[5*Np+n]; - rho += fq; - m1 -= 11.0*fq; - m2 -= 4.0*fq; - jz -= fq; - m8 += 4.0*fq; - m9 -= fq; - m10 += 2.0*fq; - m11 -= fq; - m12 += 2.0*fq; - - // q=7 - fq = dist[8*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 = fq; - m16 = fq; - m17 = -fq; - - // q = 8 - fq = dist[7*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 += fq; - m16 -= fq; - m17 += fq; - - // q=9 - fq = dist[10*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jy -= fq; - m6 -= fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 += fq; - m17 += fq; - - // q = 10 - fq = dist[9*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jy += fq; - m6 += fq; - m9 += fq; - m10 += fq; - m11 += fq; - m12 += fq; - m13 -= fq; - m16 -= fq; - m17 -= fq; - - // q=11 - fq = dist[12*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 = fq; - m16 -= fq; - m18 = fq; - - // q=12 - fq = dist[11*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 += fq; - m16 += fq; - m18 -= fq; - - // q=13 - fq = dist[14*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx += fq; - m4 += fq; - jz -= fq; - m8 -= fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 -= fq; - m18 -= fq; - - // q=14 - fq = dist[13*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jx -= fq; - m4 -= fq; - jz += fq; - m8 += fq; - m9 += fq; - m10 += fq; - m11 -= fq; - m12 -= fq; - m15 -= fq; - m16 += fq; - m18 += fq; - - // q=15 - fq = dist[16*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 = fq; - m17 += fq; - m18 -= fq; - - // q=16 - fq = dist[15*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 += fq; - m17 -= fq; - m18 += fq; - - // q=17 - fq = dist[18*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy += fq; - m6 += fq; - jz -= fq; - m8 -= fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 += fq; - m18 += fq; - - // q=18 - fq = dist[17*Np+n]; - rho += fq; - m1 += 8.0*fq; - m2 += fq; - jy -= fq; - m6 -= fq; - jz += fq; - m8 += fq; - m9 -= 2.0*fq; - m10 -= 2.0*fq; - m14 -= fq; - m17 -= fq; - m18 -= fq; - //---------------------------------------------------------------------// - - c0 = 0.5*(1.0+porosity*0.5*mu_eff/perm); - if (porosity==1.0) c0 = 0.5;//i.e. apparent pore nodes - //GeoFun = 1.75/sqrt(150.0*porosity*porosity*porosity); - c1 = porosity*0.5*GeoFun/sqrt(perm); - if (porosity==1.0) c1 = 0.0;//i.e. apparent pore nodes - - vx = jx/rho0+0.5*(porosity*Gx+Gff_x+Gfs_x); - vy = jy/rho0+0.5*(porosity*Gy+Gff_y+Gfs_y); - vz = jz/rho0+0.5*(porosity*Gz+Gff_z+Gfs_z); - v_mag=sqrt(vx*vx+vy*vy+vz*vz); - ux = vx/(c0+sqrt(c0*c0+c1*v_mag)); - uy = vy/(c0+sqrt(c0*c0+c1*v_mag)); - uz = vz/(c0+sqrt(c0*c0+c1*v_mag)); - u_mag=sqrt(ux*ux+uy*uy+uz*uz); - - //Update the total force to include linear (Darcy) and nonlinear (Forchheimer) drags due to the porous medium - Fx = rho0*(-porosity*mu_eff/perm*ux - porosity*GeoFun/sqrt(perm)*u_mag*ux + porosity*Gx + Gff_x + Gfs_x); - Fy = rho0*(-porosity*mu_eff/perm*uy - porosity*GeoFun/sqrt(perm)*u_mag*uy + porosity*Gy + Gff_y + Gfs_y); - Fz = rho0*(-porosity*mu_eff/perm*uz - porosity*GeoFun/sqrt(perm)*u_mag*uz + porosity*Gz + Gff_z + Gfs_z); - if (porosity==1.0){ - Fx=rho0*(Gx + Gff_x + Gfs_x); - Fy=rho0*(Gy + Gff_y + Gfs_y); - Fz=rho0*(Gz + Gff_z + Gfs_z); - } - - //Calculate pressure for Incompressible-MRT model - //pressure=0.5/porosity*(pressure-0.5*rho0*u_mag*u_mag/porosity); - pressure=rho/3.0; - - //-------------------- IMRT collison where body force has NO higher-order terms -------------// - //..............carry out relaxation process............................................... - m1 = m1 + rlx_setA*((19*(jx*jx+jy*jy+jz*jz)/rho0 - 11*rho) - m1); - m2 = m2 + rlx_setA*((3*rho - 5.5*(jx*jx+jy*jy+jz*jz)/rho0)- m2); - jx = jx + Fx; - m4 = m4 + rlx_setB*((-0.6666666666666666*jx)- m4) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fx); - jy = jy + Fy; - m6 = m6 + rlx_setB*((-0.6666666666666666*jy)- m6) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fy); - jz = jz + Fz; - m8 = m8 + rlx_setB*((-0.6666666666666666*jz)- m8) - + (1-0.5*rlx_setB)*(-0.6666666666666666*Fz); - m9 = m9 + rlx_setA*(((2*jx*jx-jy*jy-jz*jz)/rho0) - m9); - m10 = m10 + rlx_setA*( - m10); - m11 = m11 + rlx_setA*(((jy*jy-jz*jz)/rho0) - m11); - m12 = m12 + rlx_setA*( - m12); - m13 = m13 + rlx_setA*( (jx*jy/rho0) - m13); - m14 = m14 + rlx_setA*( (jy*jz/rho0) - m14); - m15 = m15 + rlx_setA*( (jx*jz/rho0) - m15); - m16 = m16 + rlx_setB*( - m16); - m17 = m17 + rlx_setB*( - m17); - m18 = m18 + rlx_setB*( - m18); - //....................................................................................................... - - //.................inverse transformation...................................................... - // q=0 - fq = mrt_V1*rho-mrt_V2*m1+mrt_V3*m2; - dist[n] = fq; - - // q = 1 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jx-m4)+mrt_V6*(m9-m10); - dist[1*Np+n] = fq; - - // q=2 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m4-jx)+mrt_V6*(m9-m10); - dist[2*Np+n] = fq; - - // q = 3 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jy-m6)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - dist[3*Np+n] = fq; - - // q = 4 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m6-jy)+mrt_V7*(m10-m9)+mrt_V8*(m11-m12); - dist[4*Np+n] = fq; - - // q = 5 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(jz-m8)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - dist[5*Np+n] = fq; - - // q = 6 - fq = mrt_V1*rho-mrt_V4*m1-mrt_V5*m2+0.1*(m8-jz)+mrt_V7*(m10-m9)+mrt_V8*(m12-m11); - dist[6*Np+n] = fq; - - // q = 7 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jy)+0.025*(m4+m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m16-m17); - dist[7*Np+n] = fq; - - // q = 8 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jy)-0.025*(m4+m6) +mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12+0.25*m13+0.125*(m17-m16); - dist[8*Np+n] = fq; - - // q = 9 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jy)+0.025*(m4-m6)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13+0.125*(m16+m17); - dist[9*Np+n] = fq; - - // q = 10 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jx)+0.025*(m6-m4)+mrt_V7*m9+mrt_V11*m10+mrt_V8*m11+mrt_V12*m12-0.25*m13-0.125*(m16+m17); - dist[10*Np+n] = fq; - - // q = 11 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx+jz)+0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m18-m16); - dist[11*Np+n] = fq; - - // q = 12 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jx+jz)-0.025*(m4+m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12+0.25*m15+0.125*(m16-m18); - dist[12*Np+n] = fq; - - // q = 13 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jx-jz)+0.025*(m4-m8)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15-0.125*(m16+m18); - dist[13*Np+n] = fq; - - // q= 14 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jx)+0.025*(m8-m4)+mrt_V7*m9+mrt_V11*m10-mrt_V8*m11-mrt_V12*m12-0.25*m15+0.125*(m16+m18); - dist[14*Np+n] = fq; - - // q = 15 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy+jz)+0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m17-m18); - dist[15*Np+n] = fq; - - // q = 16 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2-0.1*(jy+jz)-0.025*(m6+m8)-mrt_V6*m9-mrt_V7*m10+0.25*m14+0.125*(m18-m17); - dist[16*Np+n] = fq; - - // q = 17 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jy-jz)+0.025*(m6-m8)-mrt_V6*m9-mrt_V7*m10-0.25*m14+0.125*(m17+m18); - dist[17*Np+n] = fq; - - // q = 18 - fq = mrt_V1*rho+mrt_V9*m1+mrt_V10*m2+0.1*(jz-jy)+0.025*(m8-m6)-mrt_V6*m9-mrt_V7*m10-0.25*m14-0.125*(m17+m18); - dist[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] = pressure; - - //-----------------------Mass transport------------------------// - // calcuale chemical potential - chem = 0.125*(lambdaA+lambdaB)*(-phi+phi*phi*phi)-0.25*(kappaA+kappaB)*phi_lap; - //rlx_phi = 3.f-sqrt(3.f); - rlx_phi = 1.0; - - //............................................... - // q = 0,2,4 - // Cq = {1,0,0}, {0,1,0}, {0,0,1} - //a1 = Cq[1*Np+n]; - //a2 = Cq[2*Np+n]; - //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*ux)); - //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*ux)); - a1 = 0.1111111111111111*4.5*(gamma*chem+phi*ux); - a2 = 0.1111111111111111*4.5*(gamma*chem-phi*ux); - - Cq[1*Np+n] = a1; - Cq[2*Np+n] = a2; - - //............................................... - // q = 2 - // Cq = {0,1,0} - //a1 = Cq[3*Np+n]; - //a2 = Cq[4*Np+n]; - //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uy)); - //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uy)); - a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uy); - a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uy); - - Cq[3*Np+n] = a1; - Cq[4*Np+n] = a2; - //............................................... - // q = 4 - // Cq = {0,0,1} - //a1 = Cq[5*Np+n]; - //a2 = Cq[6*Np+n]; - //a1 = (1.0-rlx_phi)*a1+rlx_phi*(0.1111111111111111*4.5*(gamma*chem+phi*uz)); - //a2 = (1.0-rlx_phi)*a2+rlx_phi*(0.1111111111111111*4.5*(gamma*chem-phi*uz)); - a1 = 0.1111111111111111*4.5*(gamma*chem+phi*uz); - a2 = 0.1111111111111111*4.5*(gamma*chem-phi*uz); - - Cq[5*Np+n] = a1; - Cq[6*Np+n] = a2; - //............................................... - - // Instantiate mass transport distributions - // Stationary value - distribution 0 - //a1=Cq[n]; - //Cq[n] = (1.0-rlx_phi)*a1+rlx_phi*(phi-3.0*gamma*chem); - Cq[n] = phi-3.0*gamma*chem; - } - } -} - -__global__ void dvc_ScaLBL_D3Q19_GreyscaleFE_IMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np){ - int n; - int S = Np/NBLOCKS/NTHREADS + 1; - double phi; - double nA,nB; - double Den0; - for (int s=0; s>>(dist, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, start, finish, Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, Gsc, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleFE: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFE(int *neighborList, double *dist, double *Aq, double *Bq, double *Den, - double *DenGradA, double *DenGradB, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double Gsc, double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure){ - - dvc_ScaLBL_D3Q19_AAodd_GreyscaleFE<<>>(neighborList, dist, Aq, Bq, Den, DenGradA, DenGradB, SolidForce, start, finish, Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, Gsc, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleFE: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleFEChem(double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, - double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - - dvc_ScaLBL_D3Q19_AAeven_GreyscaleFEChem<<>>(dist, Cq, Phi, SolidForce, start, finish, Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleFEChem: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q19_AAodd_GreyscaleFEChem(int *neighborList, double *dist, double *Cq, double *Phi, double *SolidForce, int start, int finish, int Np, - double tauA,double tauB,double tauA_eff,double tauB_eff,double rhoA,double rhoB,double gamma,double kappaA,double kappaB,double lambdaA,double lambdaB, - double Gx, double Gy, double Gz, - double *Poros,double *Perm, double *Velocity,double *Pressure,double *PressureGrad,double *PressTensorGrad,double *PhiLap){ - - dvc_ScaLBL_D3Q19_AAodd_GreyscaleFEChem<<>>(neighborList, dist, Cq, Phi, SolidForce, start, finish, Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Gx, Gy, Gz, - Poros, Perm, Velocity, Pressure,PressureGrad,PressTensorGrad,PhiLap); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleFEChem: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q7_GreyscaleFE_Init(double *Phi, double *Cq, double *PhiLap, double gamma, double kappaA, double kappaB, double lambdaA, double lambdaB, int start, int finish, int Np){ - dvc_ScaLBL_D3Q7_GreyscaleFE_Init<<>>(Phi, Cq, PhiLap,gamma,kappaA,kappaB,lambdaA,lambdaB, start, finish, Np); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q7_GreyscaleFE_Init: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q19_GreyscaleFE_IMRT_Init(double *dist, double *Den, double rhoA, double rhoB, int Np){ - dvc_ScaLBL_D3Q19_GreyscaleFE_IMRT_Init<<>>(dist,Den,rhoA,rhoB,Np); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyscaleFE_IMRT_Init: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleFEDensity(int *NeighborList, double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ - - dvc_ScaLBL_D3Q7_AAodd_GreyscaleFEDensity<<>>(NeighborList, Aq, Bq, Den, Phi, start, finish, Np); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q7_AAodd_GreyscaleFEDensity: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleFEDensity(double *Aq, double *Bq, double *Den, double *Phi, int start, int finish, int Np){ - - dvc_ScaLBL_D3Q7_AAeven_GreyscaleFEDensity<<>>(Aq, Bq, Den, Phi, start, finish, Np); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q7_AAeven_GreyscaleFEDensity: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q7_AAodd_GreyscaleFEPhi(int *NeighborList, double *Cq, double *Phi, int start, int finish, int Np){ - - dvc_ScaLBL_D3Q7_AAodd_GreyscaleFEPhi<<>>(NeighborList, Cq, Phi, start, finish, Np); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q7_AAodd_GreyscaleFEPhi: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q7_AAeven_GreyscaleFEPhi(double *Cq, double *Phi, int start, int finish, int Np){ - - dvc_ScaLBL_D3Q7_AAeven_GreyscaleFEPhi<<>>(Cq, Phi, start, finish, Np); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q7_AAeven_GreyscaleFEPhi: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q19_GreyscaleFE_Gradient(int *neighborList, double *Den, double *DenGrad, int start, int finish, int Np){ - - dvc_ScaLBL_D3Q19_GreyscaleFE_Gradient<<>>(neighborList, Den, DenGrad, start, finish, Np); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyscaleFE_Gradient: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q19_GreyscaleFE_Laplacian(int *neighborList, double *Den, double *DenLap, int start, int finish, int Np){ - dvc_ScaLBL_D3Q19_GreyscaleFE_Laplacian<<>>(neighborList, Den, DenLap, start, finish, Np); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyscaleFE_Laplacian: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q19_GreyscaleFE_Pressure(double *dist, double *Den, double *Porosity,double *Velocity, - double *Pressure, double rhoA,double rhoB, int Np){ - - dvc_ScaLBL_D3Q19_GreyscaleFE_Pressure<<>>(dist, Den, Porosity, Velocity, Pressure, rhoA, rhoB, Np); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyscaleFE_Pressure: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q19_GreyscaleFE_PressureTensor(int *neighborList, double *Phi,double *Pressure, double *PressTensor, double *PhiLap, - double kappaA,double kappaB,double lambdaA,double lambdaB, int start, int finish, int Np){ - dvc_ScaLBL_D3Q19_GreyscaleFE_PressureTensor<<>>(neighborList,Phi,Pressure,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,start,finish,Np); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyscaleFE_PressureTensor: %s \n",cudaGetErrorString(err)); - } -} diff --git a/gpu/GreyscaleSC.cu b/gpu/GreyscaleSC.cu deleted file mode 100644 index 309a9371..00000000 --- a/gpu/GreyscaleSC.cu +++ /dev/null @@ -1,3819 +0,0 @@ -#include - -#define NBLOCKS 1024 -#define NTHREADS 256 - -__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 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 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; - } - } -} - -__global__ void dvc_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; - - int S = Np/NBLOCKS/NTHREADS + 1; - for (int s=0; s>>(Map,distA,distB,DenA,DenB,Np); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyscaleSC_Init: %s \n",cudaGetErrorString(err)); - } -} - -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){ - - dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_Density<<>>(NeighborList, Map, distA, distB, DenA, DenB, start, finish, Np); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleSC_Density: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(int *Map, double *distA, double *distB, double *DenA, double *DenB, int start, int finish, int Np){ - - dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_Density<<>>(Map,distA, distB, DenA, DenB, start, finish, Np); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleSC_Density: %s \n",cudaGetErrorString(err)); - } -} - - -extern "C" void 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){ - - dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT<<>>(neighborList,Map,distA,distB,DenA,DenB,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, - tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleSC_MRT: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void 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){ - - dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT<<>>(Map,distA,distB,DenA,DenB,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, - tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleSC_MRT: %s \n",cudaGetErrorString(err)); - } -} - -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){ - - dvc_ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK<<>>(neighborList,Map,distA,distB,DenA,DenB,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, - tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK: %s \n",cudaGetErrorString(err)); - } -} - -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){ - - dvc_ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK<<>>(Map,distA,distB,DenA,DenB,DenGradA,DenGradB,SolidForceA,SolidForceB,Poros,Perm,Velocity,Pressure, - tauA,tauB,tauA_eff,tauB_eff,Gsc,Gx,Gy,Gz,start,finish,Np); - - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK: %s \n",cudaGetErrorString(err)); - } -} - -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){ - - dvc_ScaLBL_D3Q19_GreyscaleSC_Gradient<<>>(neighborList, Map, Den, DenGrad, strideY, strideZ,start, finish, Np); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_D3Q19_GreyscaleSC_Gradient: %s \n",cudaGetErrorString(err)); - } -} - - -extern "C" void ScaLBL_GreyscaleSC_BC_z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count){ - int GRID = count / 512 + 1; - dvc_ScaLBL_GreyscaleSC_BC_z<<>>(list, Map, DenA, DenB, vA, vB, count); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_GreyscaleSC_BC_z: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_GreyscaleSC_BC_Z(int *list, int *Map, double *DenA, double *DenB, double vA, double vB, int count){ - int GRID = count / 512 + 1; - dvc_ScaLBL_GreyscaleSC_BC_Z<<>>(list, Map, DenA, DenB, vA, vB, count); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_GreyscaleSC_BC_Z: %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z(int *list, double *distA, double *distB, double dinA, double dinB, int count, int N){ - int GRID = count / 512 + 1; - dvc_ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z<<>>(list, distA, distB, dinA, dinB, count, N); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_GreyscaleSC_AAeven_Pressure_BC_z (kernel): %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_GreyscaleSC_AAeven_Pressure_BC_Z(int *list, double *distA, double *distB, double doutA, double doutB, int count, int N){ - int GRID = count / 512 + 1; - dvc_ScaLBL_GreyscaleSC_AAeven_Pressure_BC_Z<<>>(list, distA, distB, doutA, doutB, count, N); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_GreyscaleSC_AAeven_Pressure_BC_Z (kernel): %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z(int *neighborList, int *list, double *distA, double *distB, double dinA, double dinB, int count, int N){ - int GRID = count / 512 + 1; - dvc_ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z<<>>(neighborList, list, distA, distB, dinA, dinB, count, N); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_GreyscaleSC_AAodd_Pressure_BC_z (kernel): %s \n",cudaGetErrorString(err)); - } -} - -extern "C" void ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z(int *neighborList, int *list, double *distA, double *distB, double doutA, double doutB, int count, int N){ - int GRID = count / 512 + 1; - dvc_ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z<<>>(neighborList, list, distA, distB, doutA, doutB, count, N); - cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err){ - printf("CUDA error in ScaLBL_GreyscaleSC_AAodd_Pressure_BC_Z (kernel): %s \n",cudaGetErrorString(err)); - } -} diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 49f1e14d..6525c09c 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -1,5 +1,5 @@ /* -color lattice boltzmann model +Two-fluid greyscale color lattice boltzmann model */ #include "models/GreyscaleColorModel.h" #include "analysis/distance.h" @@ -9,7 +9,7 @@ color lattice boltzmann model #include #include -ScaLBL_GreyscaleColorModel::ScaLBL_GreyscaleColorModel(int RANK, int NP, const Utilities::MPI& COMM): +ScaLBL_GreyscaleColorModel::ScaLBL_GreyscaleColorModel(int RANK, int NP, MPI_Comm COMM): rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0),rhoA(0),rhoB(0),alpha(0),beta(0), Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),inletA(0),inletB(0),outletA(0),outletB(0),GreyPorosity(0), Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),greyMode(0),Lx(0),Ly(0),Lz(0),comm(COMM) @@ -56,8 +56,6 @@ void ScaLBL_GreyscaleColorModel::ReadCheckpoint(char *FILENAME, double *cPhi, do File.close(); } */ - - void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ // read the input database db = std::make_shared( filename ); @@ -139,21 +137,21 @@ void ScaLBL_GreyscaleColorModel::ReadParams(string filename){ // Override user-specified boundary condition for specific protocols auto protocol = greyscaleColor_db->getWithDefault( "protocol", "none" ); if (protocol == "seed water"){ - if (BoundaryCondition != 0 ){ + if (BoundaryCondition != 0 && BoundaryCondition != 5){ BoundaryCondition = 0; if (rank==0) printf("WARNING: protocol (seed water) supports only full periodic boundary condition \n"); } domain_db->putScalar( "BC", BoundaryCondition ); } else if (protocol == "open connected oil"){ - if (BoundaryCondition != 0 ){ + if (BoundaryCondition != 0 && BoundaryCondition != 5){ BoundaryCondition = 0; if (rank==0) printf("WARNING: protocol (open connected oil) supports only full periodic boundary condition \n"); } domain_db->putScalar( "BC", BoundaryCondition ); } else if (protocol == "shell aggregation"){ - if (BoundaryCondition != 0 ){ + if (BoundaryCondition != 0 && BoundaryCondition != 5){ BoundaryCondition = 0; if (rank==0) printf("WARNING: protocol (shell aggregation) supports only full periodic boundary condition \n"); } @@ -176,9 +174,9 @@ void ScaLBL_GreyscaleColorModel::SetDomain(){ for (int i=0; iid[i] = 1; // initialize this way //Averages = std::shared_ptr ( new TwoPhase(Dm) ); // TwoPhase analysis object Averages = std::shared_ptr ( new SubPhase(Dm) ); // TwoPhase analysis object - comm.barrier(); + MPI_Barrier(comm); Dm->CommInit(); - comm.barrier(); + MPI_Barrier(comm); // Read domain parameters rank = Dm->rank(); nprocx = Dm->nprocx(); @@ -201,12 +199,12 @@ void ScaLBL_GreyscaleColorModel::ReadInput(){ } else if (domain_db->keyExists( "GridFile" )){ // Read the local domain data - auto input_id = readMicroCT( *domain_db, comm ); + auto input_id = readMicroCT( *domain_db, MPI_COMM_WORLD ); // Fill the halo (assuming GCW of 1) array size0 = { (int) input_id.size(0), (int) input_id.size(1), (int) input_id.size(2) }; ArraySize size1 = { (size_t) Mask->Nx, (size_t) Mask->Ny, (size_t) Mask->Nz }; ASSERT( (int) size1[0] == size0[0]+2 && (int) size1[1] == size0[1]+2 && (int) size1[2] == size0[2]+2 ); - fillHalo fill( comm, Mask->rank_info, size0, { 1, 1, 1 }, 0, 1 ); + fillHalo fill( MPI_COMM_WORLD, Mask->rank_info, size0, { 1, 1, 1 }, 0, 1 ); Array id_view; id_view.viewRaw( size1, Mask->id ); fill.copy( input_id, id_view ); @@ -315,7 +313,7 @@ void ScaLBL_GreyscaleColorModel::AssignComponentLabels() for (int i=0; iid[i] = Mask->id[i]; for (size_t idx=0; idxComm.sumReduce( label_count[idx] ); + label_count_global[idx] = sumReduce( Dm->Comm, label_count[idx]); if (rank==0){ printf("Number of component labels: %lu \n",NLABELS); @@ -329,6 +327,7 @@ void ScaLBL_GreyscaleColorModel::AssignComponentLabels() ScaLBL_CopyToDevice(Phi, phase, N*sizeof(double)); ScaLBL_DeviceBarrier(); + MPI_Barrier(ScaLBL_Comm->MPI_COMM_SCALBL); delete [] phase; } @@ -586,7 +585,7 @@ void ScaLBL_GreyscaleColorModel::AssignGreyPoroPermLabels() // Set Dm to match Mask for (int i=0; iid[i] = Mask->id[i]; - for (int idx=0; idxComm.sumReduce(label_count[idx]); + for (int idx=0; idxComm, label_count[idx]); //Initialize a weighted porosity after considering grey voxels GreyPorosity=0.0; @@ -597,7 +596,7 @@ void ScaLBL_GreyscaleColorModel::AssignGreyPoroPermLabels() if (rank==0){ printf("Image resolution: %.5g [um/voxel]\n",Dm->voxel_length); - printf("Component labels: %lu \n",NLABELS); + printf("Number of component labels: %lu \n",NLABELS); for (unsigned int idx=0; idxMemoryOptimizedLayoutAA(Map,neighborList,Mask->id,Np); - comm.barrier(); + MPI_Barrier(comm); //........................................................................... // MAIN VARIABLES ALLOCATED HERE @@ -707,8 +705,8 @@ void ScaLBL_GreyscaleColorModel::Create(){ // copy the neighbor list ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); - - // initialize phi based on PhaseLabel (include solid component labels) + + // initialize phi based on PhaseLabel (include solid component labels) AssignComponentLabels();//do open/black/grey nodes initialization if (greyMode==true){ AssignGreySolidLabels(); @@ -716,7 +714,6 @@ void ScaLBL_GreyscaleColorModel::Create(){ } } - void ScaLBL_GreyscaleColorModel::Initialize(){ if (rank==0) printf ("Initializing distributions \n"); @@ -782,14 +779,15 @@ void ScaLBL_GreyscaleColorModel::Initialize(){ ScaLBL_CopyToDevice(Phi,cPhi,N*sizeof(double)); ScaLBL_DeviceBarrier(); - comm.barrier(); + MPI_Barrier(comm); } if (rank==0) printf ("Initializing phase field \n"); ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - if (BoundaryCondition >0 ){ + // establish reservoirs for external bC + if (BoundaryCondition == 1 || BoundaryCondition == 2 || BoundaryCondition == 3 || BoundaryCondition == 4 ){ if (Dm->kproc()==0){ ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,0); ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,1); @@ -812,6 +810,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ int IMAGE_COUNT = 0; std::vector ImageList; bool SET_CAPILLARY_NUMBER = false; + bool RESCALE_FORCE = false; bool MORPH_ADAPT = false; bool USE_MORPH = false; bool USE_SEED = false; @@ -820,6 +819,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ int MAX_MORPH_TIMESTEPS = 50000; // maximum number of LBM timesteps to spend in morphological adaptation routine int MIN_STEADY_TIMESTEPS = 100000; int MAX_STEADY_TIMESTEPS = 200000; + int RESCALE_FORCE_AFTER_TIMESTEP = 0; int RAMP_TIMESTEPS = 0;//50000; // number of timesteps to run initially (to get a reasonable velocity field before other pieces kick in) int CURRENT_MORPH_TIMESTEPS=0; // counter for number of timesteps spent in morphological adaptation routine (reset each time) int CURRENT_STEADY_TIMESTEPS=0; // counter for number of timesteps spent in morphological adaptation routine (reset each time) @@ -834,17 +834,13 @@ void ScaLBL_GreyscaleColorModel::Run(){ double initial_volume = 0.0; double delta_volume = 0.0; double delta_volume_target = 0.0; - double RESIDUAL_ENDPOINT_THRESHOLD = 0.04; - double NOISE_THRESHOLD = 0.0; - double BUMP_RATE = 2.0; - bool USE_BUMP_RATE = false; /* history for morphological algoirthm */ - double KRA_MORPH_FACTOR=0.8; + double KRA_MORPH_FACTOR=0.5; double volA_prev = 0.0; double log_krA_prev = 1.0; double log_krA_target = 1.0; - double log_krA = 0.0; + double log_krA = 1.0; double slope_krA_volume = 0.0; if (greyscaleColor_db->keyExists( "vol_A_previous" )){ volA_prev = greyscaleColor_db->getScalar( "vol_A_previous" ); @@ -868,46 +864,33 @@ void ScaLBL_GreyscaleColorModel::Run(){ USE_MORPH = true; } else if (protocol == "seed water"){ - morph_delta = 0.05; + morph_delta = -0.05; seed_water = 0.01; USE_SEED = true; USE_MORPH = true; } else if (protocol == "open connected oil"){ - morph_delta = 0.05; + morph_delta = -0.05; USE_MORPH = true; USE_MORPHOPEN_OIL = true; } else if (protocol == "shell aggregation"){ - morph_delta = 0.05; + morph_delta = -0.05; USE_MORPH = true; } - - if (greyscaleColor_db->keyExists( "residual_endpoint_threshold" )){ - RESIDUAL_ENDPOINT_THRESHOLD = greyscaleColor_db->getScalar( "residual_endpoint_threshold" ); - } - NULL_USE( RESIDUAL_ENDPOINT_THRESHOLD ); - if (greyscaleColor_db->keyExists( "noise_threshold" )){ - NOISE_THRESHOLD = greyscaleColor_db->getScalar( "noise_threshold" ); - USE_BUMP_RATE = true; - } - if (greyscaleColor_db->keyExists( "bump_rate" )){ - BUMP_RATE = greyscaleColor_db->getScalar( "bump_rate" ); - USE_BUMP_RATE = true; - } if (greyscaleColor_db->keyExists( "capillary_number" )){ capillary_number = greyscaleColor_db->getScalar( "capillary_number" ); SET_CAPILLARY_NUMBER=true; - //RESCALE_FORCE_MAX = 1; } -// if (analysis_db->keyExists( "rescale_force_count" )){ -// RESCALE_FORCE_MAX = analysis_db->getScalar( "rescale_force_count" ); -// } + if (greyscaleColor_db->keyExists( "rescale_force_after_timestep" )){ + RESCALE_FORCE_AFTER_TIMESTEP = greyscaleColor_db->getScalar( "rescale_force_after_timestep" ); + RESCALE_FORCE = true; + } if (greyscaleColor_db->keyExists( "timestep" )){ timestep = greyscaleColor_db->getScalar( "timestep" ); } - if (BoundaryCondition != 0 && SET_CAPILLARY_NUMBER==true){ - if (rank == 0) printf("WARINING: capillary number target only supported for BC = 0 \n"); + if (BoundaryCondition != 0 && BoundaryCondition != 5 && SET_CAPILLARY_NUMBER==true){ + if (rank == 0) printf("WARINING: capillary number target only supported for BC = 0 or 5 \n"); SET_CAPILLARY_NUMBER=false; } if (analysis_db->keyExists( "seed_water" )){ @@ -984,8 +967,8 @@ void ScaLBL_GreyscaleColorModel::Run(){ //.......create and start timer............ double starttime,stoptime,cputime; ScaLBL_DeviceBarrier(); - comm.barrier(); - starttime = Utilities::MPI::time(); + MPI_Barrier(comm); + starttime = MPI_Wtime(); //......................................... //************ MAIN ITERATION LOOP ***************************************/ @@ -1010,7 +993,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ // Perform the collision operation ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL - if (BoundaryCondition > 0){ + if (BoundaryCondition > 0 && BoundaryCondition < 5){ ScaLBL_Comm->Color_BC_z(dvcMap, Phi, Den, inletA, inletB); ScaLBL_Comm->Color_BC_Z(dvcMap, Phi, Den, outletA, outletB); } @@ -1042,6 +1025,10 @@ void ScaLBL_GreyscaleColorModel::Run(){ din = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fq, flux, timestep); ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); } + else if (BoundaryCondition == 5){ + ScaLBL_Comm->D3Q19_Reflection_BC_z(fq); + ScaLBL_Comm->D3Q19_Reflection_BC_Z(fq); + } if (greyMode==true){ //Model-1&4 ScaLBL_D3Q19_AAodd_GreyscaleColor(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, @@ -1056,8 +1043,8 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_D3Q19_AAodd_Color(NeighborList, dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); } - ScaLBL_DeviceBarrier(); - comm.barrier(); + ScaLBL_DeviceBarrier(); + MPI_Barrier(ScaLBL_Comm->MPI_COMM_SCALBL); // *************EVEN TIMESTEP************* timestep++; @@ -1071,7 +1058,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ // Perform the collision operation ScaLBL_Comm->SendD3Q19AA(fq); //READ FORM NORMAL // Halo exchange for phase field - if (BoundaryCondition > 0){ + if (BoundaryCondition > 0 && BoundaryCondition < 5){ ScaLBL_Comm->Color_BC_z(dvcMap, Phi, Den, inletA, inletB); ScaLBL_Comm->Color_BC_Z(dvcMap, Phi, Den, outletA, outletB); } @@ -1102,6 +1089,10 @@ void ScaLBL_GreyscaleColorModel::Run(){ din = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fq, flux, timestep); ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); } + else if (BoundaryCondition == 5){ + ScaLBL_Comm->D3Q19_Reflection_BC_z(fq); + ScaLBL_Comm->D3Q19_Reflection_BC_Z(fq); + } if (greyMode==true){ //Model-1&4 ScaLBL_D3Q19_AAeven_GreyscaleColor(dvcMap, fq, Aq, Bq, Den, Phi,GreySolidGrad,Porosity_dvc,Permeability_dvc,Velocity, @@ -1116,19 +1107,17 @@ void ScaLBL_GreyscaleColorModel::Run(){ ScaLBL_D3Q19_AAeven_Color(dvcMap, fq, Aq, Bq, Den, Phi, Velocity, rhoA, rhoB, tauA, tauB, alpha, beta, Fx, Fy, Fz, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); } - ScaLBL_DeviceBarrier(); - comm.barrier(); + ScaLBL_DeviceBarrier(); + MPI_Barrier(ScaLBL_Comm->MPI_COMM_SCALBL); //************************************************************************ - PROFILE_STOP("Update"); - if (rank==0 && timestep%analysis_interval == 0 && BoundaryCondition > 0){ + if (rank==0 && timestep%analysis_interval == 0 && BoundaryCondition == 4){ printf("%i %f \n",timestep,din); } // Run the analysis analysis.basic(timestep, current_db, *Averages, Phi, Pressure, Velocity, fq, Den ); - // allow initial ramp-up to get closer to steady state if (timestep > RAMP_TIMESTEPS && timestep%analysis_interval == 0 && USE_MORPH){ analysis.finish(); @@ -1138,7 +1127,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ double volA = Averages->gnb.V; volA /= Dm->Volume; volB /= Dm->Volume;; - initial_volume = volA*Dm->Volume; + //initial_volume = volA*Dm->Volume; double vA_x = Averages->gnb.Px/Averages->gnb.M; double vA_y = Averages->gnb.Py/Averages->gnb.M; double vA_z = Averages->gnb.Pz/Averages->gnb.M; @@ -1163,20 +1152,6 @@ void ScaLBL_GreyscaleColorModel::Run(){ double flow_rate_B = volB*(vB_x*dir_x + vB_y*dir_y + vB_z*dir_z); double Ca = fabs(muA*flow_rate_A + muB*flow_rate_B)/(5.796*alpha); - if (SET_CAPILLARY_NUMBER && CURRENT_STEADY_TIMESTEPS%MIN_STEADY_TIMESTEPS < analysis_interval ){ - Fx *= capillary_number / Ca; - Fy *= capillary_number / Ca; - Fz *= capillary_number / Ca; - if (force_mag > 1e-3){ - Fx *= 1e-3/force_mag; // impose ceiling for stability - Fy *= 1e-3/force_mag; - Fz *= 1e-3/force_mag; - } - if (rank == 0) printf(" -- adjust force by factor %f \n ",capillary_number / Ca); - Averages->SetParams(rhoA,rhoB,tauA,tauB,Fx,Fy,Fz,alpha,beta); - greyscaleColor_db->putVector("F",{Fx,Fy,Fz}); - } - if ( morph_timesteps > morph_interval ){ bool isSteady = false; @@ -1184,20 +1159,49 @@ void ScaLBL_GreyscaleColorModel::Run(){ isSteady = true; if (CURRENT_STEADY_TIMESTEPS > MAX_STEADY_TIMESTEPS) isSteady = true; - + if (RESCALE_FORCE == true && SET_CAPILLARY_NUMBER == true && CURRENT_STEADY_TIMESTEPS > RESCALE_FORCE_AFTER_TIMESTEP){ + RESCALE_FORCE = false; + double RESCALE_FORCE_FACTOR = capillary_number / Ca; + if (RESCALE_FORCE_FACTOR > 2.0) RESCALE_FORCE_FACTOR = 2.0; + if (RESCALE_FORCE_FACTOR < 0.5) RESCALE_FORCE_FACTOR = 0.5; + Fx *= RESCALE_FORCE_FACTOR; + Fy *= RESCALE_FORCE_FACTOR; + Fz *= RESCALE_FORCE_FACTOR; + force_mag = sqrt(Fx*Fx+Fy*Fy+Fz*Fz); + if (force_mag > 1e-3){ + Fx *= 1e-3/force_mag; // impose ceiling for stability + Fy *= 1e-3/force_mag; + Fz *= 1e-3/force_mag; + } + if (rank == 0) printf(" -- adjust force by factor %f \n ",capillary_number / Ca); + Averages->SetParams(rhoA,rhoB,tauA,tauB,Fx,Fy,Fz,alpha,beta); + greyscaleColor_db->putVector("F",{Fx,Fy,Fz}); + } if ( isSteady ){ MORPH_ADAPT = true; CURRENT_MORPH_TIMESTEPS=0; - //delta_volume_target = Dm->Volume*volA *morph_delta; // set target volume change - /** morphological target based on relative permeability for A **/ + delta_volume_target = Dm->Volume*volA *morph_delta; // set target volume change + //****** ENDPOINT ADAPTATION ********/ double krA_TMP= fabs(muA*flow_rate_A / force_mag); + double krB_TMP= fabs(muB*flow_rate_B / force_mag); log_krA = log(krA_TMP); - log_krA_target = log(KRA_MORPH_FACTOR*(krA_TMP)); - slope_krA_volume = (log_krA - log_krA_prev)/(Dm->Volume*(volA - volA_prev)); - delta_volume_target=Dm->Volume*(volA+(log_krA_target - log_krA)/slope_krA_volume); + if (krA_TMP < 0.0){ + // cannot do endpoint adaptation if kr is negative + log_krA = log_krA_prev; + } + else if (krA_TMP < krB_TMP && morph_delta > 0.0){ + /** morphological target based on relative permeability for A **/ + log_krA_target = log(KRA_MORPH_FACTOR*(krA_TMP)); + slope_krA_volume = (log_krA - log_krA_prev)/(Dm->Volume*(volA - volA_prev)); + delta_volume_target=min(delta_volume_target,Dm->Volume*(volA+(log_krA_target - log_krA)/slope_krA_volume)); + if (rank==0){ + printf(" Enabling endpoint adaptation: krA = %f, krB = %f \n",krA_TMP,krB_TMP); + printf(" log(kr)=%f, volume=%f, TARGET log(kr)=%f, volume change=%f \n",log_krA, volA, log_krA_target, delta_volume_target/(volA*Dm->Volume)); + } + } log_krA_prev = log_krA; volA_prev = volA; - printf(" log(kr)=%f, volume=%f, TARGET log(kr)=%f, volume change=%f \n",log_krA, volA, log_krA_target, delta_volume_target/(volA*Dm->Volume)); + //******************************** **/ /** compute averages & write data **/ Averages->Full(); Averages->Write(timestep); @@ -1213,8 +1217,8 @@ void ScaLBL_GreyscaleColorModel::Run(){ double pB = Averages->gwb.p; double pAc = Averages->gnc.p; double pBc = Averages->gwc.p; - double pAB = (pA-pB)/(h*5.796*alpha); - double pAB_connected = (pAc-pBc)/(h*5.796*alpha); + double pAB = (pA-pB)/(h*6.0*alpha); + double pAB_connected = (pAc-pBc)/(h*6.0*alpha); // connected contribution double Vol_nc = Averages->gnc.V/Dm->Volume; double Vol_wc = Averages->gwc.V/Dm->Volume; @@ -1277,16 +1281,6 @@ void ScaLBL_GreyscaleColorModel::Run(){ Fy *= 1e-3/force_mag; Fz *= 1e-3/force_mag; } - if (flow_rate_A < NOISE_THRESHOLD && USE_BUMP_RATE){ - if (rank==0) printf("Hit noise threshold (%f): bumping capillary number by %f X \n",NOISE_THRESHOLD,BUMP_RATE); - Fx *= BUMP_RATE; // impose bump condition - Fy *= BUMP_RATE; - Fz *= BUMP_RATE; - capillary_number *= BUMP_RATE; - greyscaleColor_db->putScalar("capillary_number",capillary_number); - current_db->putDatabase("Color", greyscaleColor_db); - MORPH_ADAPT = false; // re-run current point if below noise threshold - } if (rank == 0) printf(" -- adjust force by factor %f \n ",capillary_number / Ca); Averages->SetParams(rhoA,rhoB,tauA,tauB,Fx,Fy,Fz,alpha,beta); greyscaleColor_db->putVector("F",{Fx,Fy,Fz}); @@ -1314,7 +1308,7 @@ void ScaLBL_GreyscaleColorModel::Run(){ std::string next_image = ImageList[IMAGE_INDEX]; if (rank==0) printf("***Loading next image in sequence (%i) ***\n",IMAGE_INDEX); greyscaleColor_db->putScalar("image_index",IMAGE_INDEX); - //ImageInit(next_image); + ImageInit(next_image); } else{ if (rank==0) printf("Finished simulating image sequence \n"); @@ -1343,42 +1337,30 @@ void ScaLBL_GreyscaleColorModel::Run(){ CURRENT_STEADY_TIMESTEPS=0; initial_volume = volA*Dm->Volume; delta_volume = 0.0; - if (USE_DIRECT){ - //BoundaryCondition = 0; - //ScaLBL_Comm->BoundaryCondition = 0; - //ScaLBL_Comm_Regular->BoundaryCondition = 0; - //Fx = capillary_number*dir_x*force_mag / Ca; - //Fy = capillary_number*dir_y*force_mag / Ca; - //Fz = capillary_number*dir_z*force_mag / Ca; - } + if (RESCALE_FORCE_AFTER_TIMESTEP > 0) + RESCALE_FORCE = true; } else if (!(USE_DIRECT) && CURRENT_MORPH_TIMESTEPS > MAX_MORPH_TIMESTEPS) { MORPH_ADAPT = false; CURRENT_STEADY_TIMESTEPS=0; initial_volume = volA*Dm->Volume; delta_volume = 0.0; + RESCALE_FORCE = true; + if (RESCALE_FORCE_AFTER_TIMESTEP > 0) + RESCALE_FORCE = true; } - if ( REVERSE_FLOW_DIRECTION ){ - //if (rank==0) printf("*****REVERSE FLOW DIRECTION***** \n"); - delta_volume = 0.0; - // flow direction will reverse after next steady point - MORPH_ADAPT = false; - CURRENT_STEADY_TIMESTEPS=0; - //morph_delta *= (-1.0); - REVERSE_FLOW_DIRECTION = false; - } - comm.barrier(); } morph_timesteps += analysis_interval; } + MPI_Barrier(ScaLBL_Comm->MPI_COMM_SCALBL); } analysis.finish(); PROFILE_STOP("Loop"); PROFILE_SAVE("lbpm_color_simulator",1); //************************************************************************ ScaLBL_DeviceBarrier(); - comm.barrier(); - stoptime = Utilities::MPI::time(); + MPI_Barrier(ScaLBL_Comm->MPI_COMM_SCALBL); + stoptime = MPI_Wtime(); if (rank==0) printf("-------------------------------------------------------------------\n"); // Compute the walltime per timestep cputime = (stoptime - starttime)/timestep; @@ -1395,52 +1377,47 @@ void ScaLBL_GreyscaleColorModel::Run(){ // ************************************************************************ } -//double ScaLBL_GreyscaleColorModel::ImageInit(std::string Filename){ -// -// if (rank==0) printf("Re-initializing fluids from file: %s \n", Filename.c_str()); -// Mask->Decomp(Filename); -// for (int i=0; iid[i]; // save what was read -// for (int i=0; iid[i] = Mask->id[i]; // save what was read -// -// //double *PhaseLabel; -// //PhaseLabel = new double[Nx*Ny*Nz]; -// //AssignComponentLabels(PhaseLabel); -// AssignComponentLabels(); -// -// double Count = 0.0; -// double PoreCount = 0.0; -// for (int k=1; kComm.sumReduce( Count ); -// PoreCount = Dm->Comm.sumReduce( PoreCount ); -// -// if (rank==0) printf(" new saturation: %f (%f / %f) \n", Count / PoreCount, Count, PoreCount); -// ScaLBL_CopyToDevice(Phi, PhaseLabel, Nx*Ny*Nz*sizeof(double)); -// comm.barrier(); -// -// ScaLBL_D3Q19_Init(fq, Np); -// ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np); -// ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); -// comm.barrier(); -// -// ScaLBL_CopyToHost(Averages->Phi.data(),Phi,Nx*Ny*Nz*sizeof(double)); -// -// double saturation = Count/PoreCount; -// return saturation; -// -//} +double ScaLBL_GreyscaleColorModel::ImageInit(std::string Filename){ + + if (rank==0) printf("Re-initializing fluids from file: %s \n", Filename.c_str()); + Mask->Decomp(Filename); + for (int i=0; iid[i]; // save what was read + for (int i=0; iid[i] = Mask->id[i]; // save what was read + + AssignComponentLabels(); + + double Count = 0.0; + double PoreCount = 0.0; + for (int k=1; kComm, Count); + PoreCount=sumReduce( Dm->Comm, PoreCount); + + if (rank==0) printf(" new saturation: %f (%f / %f) \n", Count / PoreCount, Count, PoreCount); + + ScaLBL_D3Q19_Init(fq, Np); + ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np); + ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); + MPI_Barrier(ScaLBL_Comm->MPI_COMM_SCALBL); + + ScaLBL_CopyToHost(Averages->Phi.data(),Phi,Nx*Ny*Nz*sizeof(double)); + + double saturation = Count/PoreCount; + return saturation; + +} double ScaLBL_GreyscaleColorModel::MorphOpenConnected(double target_volume_change){ @@ -1465,7 +1442,7 @@ double ScaLBL_GreyscaleColorModel::MorphOpenConnected(double target_volume_chang BlobIDstruct new_index; double vF=0.0; double vS=0.0; ComputeGlobalBlobIDs(nx-2,ny-2,nz-2,Dm->rank_info,phase,Averages->SDs,vF,vS,phase_label,Dm->Comm); - Dm->Comm.barrier(); + MPI_Barrier(Dm->Comm); long long count_connected=0; long long count_porespace=0; @@ -1487,9 +1464,9 @@ double ScaLBL_GreyscaleColorModel::MorphOpenConnected(double target_volume_chang } } } - count_connected = Dm->Comm.sumReduce( count_connected); - count_porespace = Dm->Comm.sumReduce( count_porespace); - count_water = Dm->Comm.sumReduce( count_water); + count_connected=sumReduce( Dm->Comm, count_connected); + count_porespace=sumReduce( Dm->Comm, count_porespace); + count_water=sumReduce( Dm->Comm, count_water); for (int k=0; kComm.sumReduce( count_morphopen); + count_morphopen=sumReduce( Dm->Comm, count_morphopen); volume_change = double(count_morphopen - count_connected); if (rank==0) printf(" opening of connected oil %f \n",volume_change/count_connected); @@ -1569,7 +1546,7 @@ double ScaLBL_GreyscaleColorModel::MorphOpenConnected(double target_volume_chang ScaLBL_CopyToDevice(Phi,phase.data(),N*sizeof(double)); ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - if (BoundaryCondition >0 ){ + if (BoundaryCondition == 1 || BoundaryCondition == 2 || BoundaryCondition == 3 || BoundaryCondition == 4){ if (Dm->kproc()==0){ ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,0); ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,1); @@ -1584,194 +1561,89 @@ double ScaLBL_GreyscaleColorModel::MorphOpenConnected(double target_volume_chang } return(volume_change); } - double ScaLBL_GreyscaleColorModel::SeedPhaseField(const double seed_water_in_oil){ - srand(time(NULL)); - double mass_loss =0.f; - double count =0.f; - double *Aq_tmp, *Bq_tmp; - double *Vel_tmp; - - Aq_tmp = new double [7*Np]; - Bq_tmp = new double [7*Np]; - Vel_tmp = new double [3*Np]; + srand(time(NULL)); + double mass_loss =0.f; + double count =0.f; + double *Aq_tmp, *Bq_tmp; + + Aq_tmp = new double [7*Np]; + Bq_tmp = new double [7*Np]; - ScaLBL_CopyToHost(Aq_tmp, Aq, 7*Np*sizeof(double)); - ScaLBL_CopyToHost(Bq_tmp, Bq, 7*Np*sizeof(double)); - ScaLBL_CopyToHost(Vel_tmp, Velocity, 7*Np*sizeof(double)); - - //Extract averged velocity - double vx_glb = (Averages->gnb.Px+Averages->gwb.Px)/(Averages->gnb.M+Averages->gwb.M); - double vy_glb = (Averages->gnb.Py+Averages->gwb.Py)/(Averages->gnb.M+Averages->gwb.M); - double vz_glb = (Averages->gnb.Pz+Averages->gwb.Pz)/(Averages->gnb.M+Averages->gwb.M); - double v_mag_glb = sqrt(vx_glb*vx_glb+vy_glb*vy_glb+vz_glb*vz_glb); + ScaLBL_CopyToHost(Aq_tmp, Aq, 7*Np*sizeof(double)); + ScaLBL_CopyToHost(Bq_tmp, Bq, 7*Np*sizeof(double)); + + + for (int n=0; n < ScaLBL_Comm->LastExterior(); n++){ + double random_value = seed_water_in_oil*double(rand())/ RAND_MAX; + double dA = Aq_tmp[n] + Aq_tmp[n+Np] + Aq_tmp[n+2*Np] + Aq_tmp[n+3*Np] + Aq_tmp[n+4*Np] + Aq_tmp[n+5*Np] + Aq_tmp[n+6*Np]; + double dB = Bq_tmp[n] + Bq_tmp[n+Np] + Bq_tmp[n+2*Np] + Bq_tmp[n+3*Np] + Bq_tmp[n+4*Np] + Bq_tmp[n+5*Np] + Bq_tmp[n+6*Np]; + double phase_id = (dA - dB) / (dA + dB); + if (phase_id > 0.0){ + Aq_tmp[n] -= 0.3333333333333333*random_value; + Aq_tmp[n+Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+2*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+3*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+4*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+5*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+6*Np] -= 0.1111111111111111*random_value; + + Bq_tmp[n] += 0.3333333333333333*random_value; + Bq_tmp[n+Np] += 0.1111111111111111*random_value; + Bq_tmp[n+2*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+3*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+4*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+5*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+6*Np] += 0.1111111111111111*random_value; + } + mass_loss += random_value*seed_water_in_oil; + } - for (int n=0; n < ScaLBL_Comm->LastExterior(); n++){ - double v_mag_local = sqrt(Vel_tmp[n]*Vel_tmp[n]+Vel_tmp[n+1*Np]*Vel_tmp[n+1*Np]+Vel_tmp[n+2*Np]*Vel_tmp[n+2*Np]); - double weight = (v_mag_local 0.0){ - Aq_tmp[n] -= 0.3333333333333333*random_value; - Aq_tmp[n+Np] -= 0.1111111111111111*random_value; - Aq_tmp[n+2*Np] -= 0.1111111111111111*random_value; - Aq_tmp[n+3*Np] -= 0.1111111111111111*random_value; - Aq_tmp[n+4*Np] -= 0.1111111111111111*random_value; - Aq_tmp[n+5*Np] -= 0.1111111111111111*random_value; - Aq_tmp[n+6*Np] -= 0.1111111111111111*random_value; - - Bq_tmp[n] += 0.3333333333333333*random_value; - Bq_tmp[n+Np] += 0.1111111111111111*random_value; - Bq_tmp[n+2*Np] += 0.1111111111111111*random_value; - Bq_tmp[n+3*Np] += 0.1111111111111111*random_value; - Bq_tmp[n+4*Np] += 0.1111111111111111*random_value; - Bq_tmp[n+5*Np] += 0.1111111111111111*random_value; - Bq_tmp[n+6*Np] += 0.1111111111111111*random_value; - } - mass_loss += random_value*seed_water_in_oil; - } + for (int n=ScaLBL_Comm->FirstInterior(); n < ScaLBL_Comm->LastInterior(); n++){ + double random_value = seed_water_in_oil*double(rand())/ RAND_MAX; + double dA = Aq_tmp[n] + Aq_tmp[n+Np] + Aq_tmp[n+2*Np] + Aq_tmp[n+3*Np] + Aq_tmp[n+4*Np] + Aq_tmp[n+5*Np] + Aq_tmp[n+6*Np]; + double dB = Bq_tmp[n] + Bq_tmp[n+Np] + Bq_tmp[n+2*Np] + Bq_tmp[n+3*Np] + Bq_tmp[n+4*Np] + Bq_tmp[n+5*Np] + Bq_tmp[n+6*Np]; + double phase_id = (dA - dB) / (dA + dB); + if (phase_id > 0.0){ + Aq_tmp[n] -= 0.3333333333333333*random_value; + Aq_tmp[n+Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+2*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+3*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+4*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+5*Np] -= 0.1111111111111111*random_value; + Aq_tmp[n+6*Np] -= 0.1111111111111111*random_value; + + Bq_tmp[n] += 0.3333333333333333*random_value; + Bq_tmp[n+Np] += 0.1111111111111111*random_value; + Bq_tmp[n+2*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+3*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+4*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+5*Np] += 0.1111111111111111*random_value; + Bq_tmp[n+6*Np] += 0.1111111111111111*random_value; + } + mass_loss += random_value*seed_water_in_oil; + } - for (int n=ScaLBL_Comm->FirstInterior(); n < ScaLBL_Comm->LastInterior(); n++){ - double v_mag_local = sqrt(Vel_tmp[n]*Vel_tmp[n]+Vel_tmp[n+1*Np]*Vel_tmp[n+1*Np]+Vel_tmp[n+2*Np]*Vel_tmp[n+2*Np]); - double weight = (v_mag_local 0.0){ - Aq_tmp[n] -= 0.3333333333333333*random_value; - Aq_tmp[n+Np] -= 0.1111111111111111*random_value; - Aq_tmp[n+2*Np] -= 0.1111111111111111*random_value; - Aq_tmp[n+3*Np] -= 0.1111111111111111*random_value; - Aq_tmp[n+4*Np] -= 0.1111111111111111*random_value; - Aq_tmp[n+5*Np] -= 0.1111111111111111*random_value; - Aq_tmp[n+6*Np] -= 0.1111111111111111*random_value; - - Bq_tmp[n] += 0.3333333333333333*random_value; - Bq_tmp[n+Np] += 0.1111111111111111*random_value; - Bq_tmp[n+2*Np] += 0.1111111111111111*random_value; - Bq_tmp[n+3*Np] += 0.1111111111111111*random_value; - Bq_tmp[n+4*Np] += 0.1111111111111111*random_value; - Bq_tmp[n+5*Np] += 0.1111111111111111*random_value; - Bq_tmp[n+6*Np] += 0.1111111111111111*random_value; - } - mass_loss += random_value*seed_water_in_oil; - } + count= sumReduce( Dm->Comm, count); + mass_loss= sumReduce( Dm->Comm, mass_loss); + if (rank == 0) printf("Remove mass %f from %f voxels \n",mass_loss,count); - count = Dm->Comm.sumReduce( count ); - mass_loss = Dm->Comm.sumReduce( mass_loss ); - if (rank == 0) printf("Remove mass %f from %f voxels \n",mass_loss,count); + // Need to initialize Aq, Bq, Den, Phi directly + //ScaLBL_CopyToDevice(Phi,phase.data(),7*Np*sizeof(double)); + ScaLBL_CopyToDevice(Aq, Aq_tmp, 7*Np*sizeof(double)); + ScaLBL_CopyToDevice(Bq, Bq_tmp, 7*Np*sizeof(double)); - // Need to initialize Aq, Bq, Den, Phi directly - //ScaLBL_CopyToDevice(Phi,phase.data(),7*Np*sizeof(double)); - ScaLBL_CopyToDevice(Aq, Aq_tmp, 7*Np*sizeof(double)); - ScaLBL_CopyToDevice(Bq, Bq_tmp, 7*Np*sizeof(double)); - - return(mass_loss); + return(mass_loss); } -//double ScaLBL_GreyscaleColorModel::SeedPhaseField(const double seed_water_in_oil){ -// srand(time(NULL)); -// double mass_loss =0.f; -// double count =0.f; -// double *Aq_tmp, *Bq_tmp; -// -// Aq_tmp = new double [7*Np]; -// Bq_tmp = new double [7*Np]; -// -// ScaLBL_CopyToHost(Aq_tmp, Aq, 7*Np*sizeof(double)); -// ScaLBL_CopyToHost(Bq_tmp, Bq, 7*Np*sizeof(double)); -// -///* for (int k=1; kSDs(i,j,k) < 0.f){ -// // skip -// } -// else if (phase(i,j,k) > 0.f ){ -// phase(i,j,k) -= random_value*seed_water_in_oil; -// mass_loss += random_value*seed_water_in_oil; -// count++; -// } -// else { -// -// } -// } -// } -// } -// */ -// for (int n=0; n < ScaLBL_Comm->LastExterior(); n++){ -// double random_value = seed_water_in_oil*double(rand())/ RAND_MAX; -// double dA = Aq_tmp[n] + Aq_tmp[n+Np] + Aq_tmp[n+2*Np] + Aq_tmp[n+3*Np] + Aq_tmp[n+4*Np] + Aq_tmp[n+5*Np] + Aq_tmp[n+6*Np]; -// double dB = Bq_tmp[n] + Bq_tmp[n+Np] + Bq_tmp[n+2*Np] + Bq_tmp[n+3*Np] + Bq_tmp[n+4*Np] + Bq_tmp[n+5*Np] + Bq_tmp[n+6*Np]; -// double phase_id = (dA - dB) / (dA + dB); -// if (phase_id > 0.0){ -// Aq_tmp[n] -= 0.3333333333333333*random_value; -// Aq_tmp[n+Np] -= 0.1111111111111111*random_value; -// Aq_tmp[n+2*Np] -= 0.1111111111111111*random_value; -// Aq_tmp[n+3*Np] -= 0.1111111111111111*random_value; -// Aq_tmp[n+4*Np] -= 0.1111111111111111*random_value; -// Aq_tmp[n+5*Np] -= 0.1111111111111111*random_value; -// Aq_tmp[n+6*Np] -= 0.1111111111111111*random_value; -// -// Bq_tmp[n] += 0.3333333333333333*random_value; -// Bq_tmp[n+Np] += 0.1111111111111111*random_value; -// Bq_tmp[n+2*Np] += 0.1111111111111111*random_value; -// Bq_tmp[n+3*Np] += 0.1111111111111111*random_value; -// Bq_tmp[n+4*Np] += 0.1111111111111111*random_value; -// Bq_tmp[n+5*Np] += 0.1111111111111111*random_value; -// Bq_tmp[n+6*Np] += 0.1111111111111111*random_value; -// } -// mass_loss += random_value*seed_water_in_oil; -// } -// -// for (int n=ScaLBL_Comm->FirstInterior(); n < ScaLBL_Comm->LastInterior(); n++){ -// double random_value = seed_water_in_oil*double(rand())/ RAND_MAX; -// double dA = Aq_tmp[n] + Aq_tmp[n+Np] + Aq_tmp[n+2*Np] + Aq_tmp[n+3*Np] + Aq_tmp[n+4*Np] + Aq_tmp[n+5*Np] + Aq_tmp[n+6*Np]; -// double dB = Bq_tmp[n] + Bq_tmp[n+Np] + Bq_tmp[n+2*Np] + Bq_tmp[n+3*Np] + Bq_tmp[n+4*Np] + Bq_tmp[n+5*Np] + Bq_tmp[n+6*Np]; -// double phase_id = (dA - dB) / (dA + dB); -// if (phase_id > 0.0){ -// Aq_tmp[n] -= 0.3333333333333333*random_value; -// Aq_tmp[n+Np] -= 0.1111111111111111*random_value; -// Aq_tmp[n+2*Np] -= 0.1111111111111111*random_value; -// Aq_tmp[n+3*Np] -= 0.1111111111111111*random_value; -// Aq_tmp[n+4*Np] -= 0.1111111111111111*random_value; -// Aq_tmp[n+5*Np] -= 0.1111111111111111*random_value; -// Aq_tmp[n+6*Np] -= 0.1111111111111111*random_value; -// -// Bq_tmp[n] += 0.3333333333333333*random_value; -// Bq_tmp[n+Np] += 0.1111111111111111*random_value; -// Bq_tmp[n+2*Np] += 0.1111111111111111*random_value; -// Bq_tmp[n+3*Np] += 0.1111111111111111*random_value; -// Bq_tmp[n+4*Np] += 0.1111111111111111*random_value; -// Bq_tmp[n+5*Np] += 0.1111111111111111*random_value; -// Bq_tmp[n+6*Np] += 0.1111111111111111*random_value; -// } -// mass_loss += random_value*seed_water_in_oil; -// } -// -// count = Dm->Comm.sumReduce( count ); -// mass_loss = Dm->Comm.sumReduce( mass_loss ); -// if (rank == 0) printf("Remove mass %f from %f voxels \n",mass_loss,count); -// -// // Need to initialize Aq, Bq, Den, Phi directly -// //ScaLBL_CopyToDevice(Phi,phase.data(),7*Np*sizeof(double)); -// ScaLBL_CopyToDevice(Aq, Aq_tmp, 7*Np*sizeof(double)); -// ScaLBL_CopyToDevice(Bq, Bq_tmp, 7*Np*sizeof(double)); -// -// return(mass_loss); -//} - double ScaLBL_GreyscaleColorModel::MorphInit(const double beta, const double target_delta_volume){ const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); double vF = 0.f; double vS = 0.f; double delta_volume; + double WallFactor = 0.0; + bool USE_CONNECTED_NWP = false; DoubleArray phase(Nx,Ny,Nz); IntArray phase_label(Nx,Ny,Nz);; @@ -1792,7 +1664,7 @@ double ScaLBL_GreyscaleColorModel::MorphInit(const double beta, const double tar } } } - double volume_initial = Dm->Comm.sumReduce( count); + double volume_initial = sumReduce( Dm->Comm, count); /* sprintf(LocalRankFilename,"phi_initial.%05i.raw",rank); FILE *INPUT = fopen(LocalRankFilename,"wb"); @@ -1800,32 +1672,56 @@ double ScaLBL_GreyscaleColorModel::MorphInit(const double beta, const double tar fclose(INPUT); */ // 2. Identify connected components of phase field -> phase_label - BlobIDstruct new_index; - ComputeGlobalBlobIDs(Nx-2,Ny-2,Nz-2,rank_info,phase,Averages->SDs,vF,vS,phase_label,comm); - comm.barrier(); - // only operate on component "0" - count = 0.0; - double second_biggest = 0.0; + double volume_connected = 0.0; + double second_biggest = 0.0; + if (USE_CONNECTED_NWP){ + BlobIDstruct new_index; + ComputeGlobalBlobIDs(Nx-2,Ny-2,Nz-2,rank_info,phase,Averages->SDs,vF,vS,phase_label,comm); + MPI_Barrier(Dm->Comm); - for (int k=0; kComm, count); + second_biggest = sumReduce( Dm->Comm, second_biggest); + } + else { + // use the whole NWP + for (int k=0; kSDs(i,j,k) > 0.f){ + if (phase(i,j,k) > 0.f ){ + phase_id(i,j,k) = 0; + } + else { + phase_id(i,j,k) = 1; + } + } + else { + phase_id(i,j,k) = 1; + } } } } - } - double volume_connected = Dm->Comm.sumReduce( count ); - second_biggest = Dm->Comm.sumReduce( second_biggest ); + } /*int reach_x, reach_y, reach_z; for (int k=0; k 0.01*volume_initial) target_delta_volume_incremental = 0.01*volume_initial*target_delta_volume/fabs(target_delta_volume); - delta_volume = MorphGrow(Averages->SDs,phase_distance,phase_id,Averages->Dm, target_delta_volume_incremental); + delta_volume = MorphGrow(Averages->SDs,phase_distance,phase_id,Averages->Dm, target_delta_volume_incremental, WallFactor); for (int k=0; kComm.sumReduce( count ); + double volume_final= sumReduce( Dm->Comm, count); delta_volume = (volume_final-volume_initial); if (rank == 0) printf("MorphInit: change fluid volume fraction by %f \n", delta_volume/volume_initial); @@ -1935,7 +1834,7 @@ double ScaLBL_GreyscaleColorModel::MorphInit(const double beta, const double tar // 7. Re-initialize phase field and density ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, 0, ScaLBL_Comm->LastExterior(), Np); ScaLBL_PhaseField_Init(dvcMap, Phi, Den, Aq, Bq, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - if (BoundaryCondition >0 ){ + if (BoundaryCondition == 1 || BoundaryCondition == 2 || BoundaryCondition == 3 || BoundaryCondition == 4){ if (Dm->kproc()==0){ ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,0); ScaLBL_SetSlice_z(Phi,1.0,Nx,Ny,Nz,1); @@ -2039,27 +1938,27 @@ void ScaLBL_GreyscaleColorModel::WriteDebug(){ fwrite(PhaseField.data(),8,N,GreySG_Z_FILE); fclose(GreySG_Z_FILE); -// ScaLBL_Comm->RegularLayout(Map,&ColorGrad[0],PhaseField); -// FILE *CGX_FILE; -// sprintf(LocalRankFilename,"Gradient_X.%05i.raw",rank); -// CGX_FILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,CGX_FILE); -// fclose(CGX_FILE); -// -// ScaLBL_Comm->RegularLayout(Map,&ColorGrad[Np],PhaseField); -// FILE *CGY_FILE; -// sprintf(LocalRankFilename,"Gradient_Y.%05i.raw",rank); -// CGY_FILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,CGY_FILE); -// fclose(CGY_FILE); -// -// ScaLBL_Comm->RegularLayout(Map,&ColorGrad[2*Np],PhaseField); -// FILE *CGZ_FILE; -// sprintf(LocalRankFilename,"Gradient_Z.%05i.raw",rank); -// CGZ_FILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,CGZ_FILE); -// fclose(CGZ_FILE); +/* ScaLBL_Comm->RegularLayout(Map,&ColorGrad[0],PhaseField); + FILE *CGX_FILE; + sprintf(LocalRankFilename,"Gradient_X.%05i.raw",rank); + CGX_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,CGX_FILE); + fclose(CGX_FILE); + ScaLBL_Comm->RegularLayout(Map,&ColorGrad[Np],PhaseField); + FILE *CGY_FILE; + sprintf(LocalRankFilename,"Gradient_Y.%05i.raw",rank); + CGY_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,CGY_FILE); + fclose(CGY_FILE); + + ScaLBL_Comm->RegularLayout(Map,&ColorGrad[2*Np],PhaseField); + FILE *CGZ_FILE; + sprintf(LocalRankFilename,"Gradient_Z.%05i.raw",rank); + CGZ_FILE = fopen(LocalRankFilename,"wb"); + fwrite(PhaseField.data(),8,N,CGZ_FILE); + fclose(CGZ_FILE); +*/ } //void ScaLBL_GreyscaleColorModel::AssignGreySolidLabels()//Model-1 diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h index 9d5a6a65..d7dde941 100644 --- a/models/GreyscaleColorModel.h +++ b/models/GreyscaleColorModel.h @@ -1,5 +1,5 @@ /* -Implementation of color lattice boltzmann model +Implementation of two-fluid greyscale color lattice boltzmann model */ #include #include @@ -12,13 +12,13 @@ Implementation of color lattice boltzmann model #include "common/Communication.h" #include "analysis/TwoPhase.h" #include "analysis/runAnalysis.h" -#include "common/MPI.h" +#include "common/MPI_Helpers.h" #include "ProfilerApp.h" #include "threadpool/thread_pool.h" class ScaLBL_GreyscaleColorModel{ public: - ScaLBL_GreyscaleColorModel(int RANK, int NP, const Utilities::MPI& COMM); + ScaLBL_GreyscaleColorModel(int RANK, int NP, MPI_Comm COMM); ~ScaLBL_GreyscaleColorModel(); // functions in they should be run @@ -67,7 +67,7 @@ public: double *fq, *Aq, *Bq; double *Den, *Phi; //double *GreySolidPhi; //Model 2 & 3 - double *GreySolidGrad;//Model 1 + double *GreySolidGrad;//Model 1 & 4 //double *ColorGrad; double *Velocity; double *Pressure; @@ -75,7 +75,7 @@ public: double *Permeability_dvc; private: - Utilities::MPI comm; + MPI_Comm comm; int dist_mem_size; int neighborSize; diff --git a/models/GreyscaleFEModel.cpp b/models/GreyscaleFEModel.cpp deleted file mode 100644 index 97ed0f98..00000000 --- a/models/GreyscaleFEModel.cpp +++ /dev/null @@ -1,1247 +0,0 @@ -/* -Greyscale lattice boltzmann model - */ -#include "models/GreyscaleFEModel.h" -#include "analysis/distance.h" -#include "analysis/morphology.h" -#include -#include - -template -void DeleteArray( const TYPE *p ) -{ - delete [] p; -} - -ScaLBL_GreyscaleFEModel::ScaLBL_GreyscaleFEModel(int RANK, int NP, MPI_Comm COMM): -rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0), -rhoA(0),rhoB(0),gamma(0),kappaA(0),kappaB(0),lambdaA(0),lambdaB(0), -Fx(0),Fy(0),Fz(0),flux(0),din(0),dout(0),GreyPorosity(0), -Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) -{ - SignDist.resize(Nx,Ny,Nz); - SignDist.fill(0); - -} -ScaLBL_GreyscaleFEModel::~ScaLBL_GreyscaleFEModel(){ - -} - -void ScaLBL_GreyscaleFEModel::ReadParams(string filename){ - // read the input database - db = std::make_shared( filename ); - domain_db = db->getDatabase( "Domain" ); - greyscaleFE_db = db->getDatabase( "GreyscaleFE" ); - analysis_db = db->getDatabase( "Analysis" ); - vis_db = db->getDatabase( "Visualization" ); - - // set defaults - timestepMax = 100000; - tauA = 1.0; - tauB = 1.0; - tauA_eff = tauA;//the effective viscosity of the Darcy term - tauB_eff = tauB; - rhoA = 1.0;//constant molecular mass (after LB scaling) - rhoB = 1.0; - tolerance = 0.01; - Fx = Fy = Fz = 0.0; - Restart=false; - din=dout=1.0; - flux=0.0; - dp = 10.0; //unit of 'dp': voxel - //Gsc = 1.0; - gamma = 1.0;//may also have gammaA and gammaB; - kappaA = 1.0e-3; - kappaB = 1.0e-3; - lambdaA = 1.0e-3; - lambdaB = 1.0e-3; - - // ---------------------- Greyscale Model parameters -----------------------// - if (greyscaleFE_db->keyExists( "timestepMax" )){ - timestepMax = greyscaleFE_db->getScalar( "timestepMax" ); - } - if (greyscaleFE_db->keyExists( "tauA" )){ - tauA = greyscaleFE_db->getScalar( "tauA" ); - } - if (greyscaleFE_db->keyExists( "tauB" )){ - tauB = greyscaleFE_db->getScalar( "tauB" ); - } - tauA_eff = greyscaleFE_db->getWithDefault( "tauA_eff", tauA); - tauB_eff = greyscaleFE_db->getWithDefault( "tauB_eff", tauB); - if (greyscaleFE_db->keyExists( "rhoA" )){ - rhoA = greyscaleFE_db->getScalar( "rhoA" ); - } - if (greyscaleFE_db->keyExists( "rhoB" )){ - rhoB = greyscaleFE_db->getScalar( "rhoB" ); - } - if (greyscaleFE_db->keyExists( "gamma" )){ - gamma = greyscaleFE_db->getScalar( "gamma" ); - } - if (greyscaleFE_db->keyExists( "kappaA" )){ - kappaA = greyscaleFE_db->getScalar( "kappaA" ); - } - if (greyscaleFE_db->keyExists( "kappaB" )){ - kappaB = greyscaleFE_db->getScalar( "kappaB" ); - } - if (greyscaleFE_db->keyExists( "lambdaA" )){ - lambdaA = greyscaleFE_db->getScalar( "lambdaA" ); - } - if (greyscaleFE_db->keyExists( "lambdaB" )){ - lambdaB = greyscaleFE_db->getScalar( "lambdaB" ); - } - if (greyscaleFE_db->keyExists( "dp" )){ - dp = greyscaleFE_db->getScalar( "dp" ); - } - if (greyscaleFE_db->keyExists( "F" )){ - Fx = greyscaleFE_db->getVector( "F" )[0]; - Fy = greyscaleFE_db->getVector( "F" )[1]; - Fz = greyscaleFE_db->getVector( "F" )[2]; - } - if (greyscaleFE_db->keyExists( "Restart" )){ - Restart = greyscaleFE_db->getScalar( "Restart" ); - } - if (greyscaleFE_db->keyExists( "din" )){ - din = greyscaleFE_db->getScalar( "din" ); - } - if (greyscaleFE_db->keyExists( "dout" )){ - dout = greyscaleFE_db->getScalar( "dout" ); - } - if (greyscaleFE_db->keyExists( "flux" )){ - flux = greyscaleFE_db->getScalar( "flux" ); - } - if (greyscaleFE_db->keyExists( "tolerance" )){ - tolerance = greyscaleFE_db->getScalar( "tolerance" ); - } - //auto collision = greyscaleFE_db->getWithDefault( "collision", "IMRT" ); - //if (collision == "BGK"){ - // CollisionType=2; - //} - // ------------------------------------------------------------------------// - - //------------------------ Other Domain parameters ------------------------// - BoundaryCondition = 0; - if (domain_db->keyExists( "BC" )){ - BoundaryCondition = domain_db->getScalar( "BC" ); - } - // ------------------------------------------------------------------------// -} - -void ScaLBL_GreyscaleFEModel::SetDomain(){ - Dm = std::shared_ptr(new Domain(domain_db,comm)); // full domain for analysis - Mask = std::shared_ptr(new Domain(domain_db,comm)); // mask domain removes immobile phases - // domain parameters - Nx = Dm->Nx; - Ny = Dm->Ny; - Nz = Dm->Nz; - Lx = Dm->Lx; - Ly = Dm->Ly; - Lz = Dm->Lz; - N = Nx*Ny*Nz; - - SignDist.resize(Nx,Ny,Nz); - Velocity_x.resize(Nx,Ny,Nz); - Velocity_y.resize(Nx,Ny,Nz); - Velocity_z.resize(Nx,Ny,Nz); - PorosityMap.resize(Nx,Ny,Nz); - Pressure.resize(Nx,Ny,Nz); - - id = new signed char [N]; - for (int i=0; iid[i] = 1; // initialize this way - MPI_Barrier(comm); - Dm->CommInit(); - MPI_Barrier(comm); - // Read domain parameters - rank = Dm->rank(); - nprocx = Dm->nprocx(); - nprocy = Dm->nprocy(); - nprocz = Dm->nprocz(); -} - -void ScaLBL_GreyscaleFEModel::ReadInput(){ - - sprintf(LocalRankString,"%05d",rank); - sprintf(LocalRankFilename,"%s%s","ID.",LocalRankString); - sprintf(LocalRestartFile,"%s%s","Restart.",LocalRankString); - - if (domain_db->keyExists( "Filename" )){ - auto Filename = domain_db->getScalar( "Filename" ); - Mask->Decomp(Filename); - } - else{ - if (rank==0) printf("Filename of input image is not found, reading ID.0* instead."); - Mask->ReadIDs(); - } - for (int i=0; iid[i]; // save what was read - - // Generate the signed distance map - // Initialize the domain and communication - Array id_solid(Nx,Ny,Nz); - int count = 0; - // Solve for the position of the solid phase - for (int k=0;kid[n]; - if (label > 0) id_solid(i,j,k) = 1; - else id_solid(i,j,k) = 0; - } - } - } - // Initialize the signed distance function - for (int k=0;kid[nn] <= 0)||(Mask->id[nn]>=3)){ - double vec_x = double(ii-1); - double vec_y = double(jj-1); - double vec_z = double(kk-1); - double GWNS=SolidPotential[nn]; - phi_x += GWNS*weight*vec_x; - phi_y += GWNS*weight*vec_y; - phi_z += GWNS*weight*vec_z; - } - } - } - } - SolidForce[idx] = phi_x; - SolidForce[idx+Np] = phi_y; - SolidForce[idx+2*Np] = phi_z; - } - } - } - } - delete [] Dst; -} - - -void ScaLBL_GreyscaleFEModel::AssignComponentLabels(double *Porosity, double *Permeability, double *SolidPotential) -{ - size_t NLABELS=0; - signed char VALUE=0; - double POROSITY=0.f; - double PERMEABILITY=0.f; - double AFFINITY=0.f; - - auto LabelList = greyscaleFE_db->getVector( "ComponentLabels" ); - auto AffinityList = greyscaleFE_db->getVector( "ComponentAffinity" ); - auto PorosityList = greyscaleFE_db->getVector( "PorosityList" ); - auto PermeabilityList = greyscaleFE_db->getVector( "PermeabilityList" ); - - //1. Requirement for "ComponentLabels": - // *labels can be a nagative integer, 0, 1, 2, or a positive integer >= 3 - // *label = 1 and 2 are reserved for NW and W phase respectively. - //2. Requirement for "ComponentAffinity": - // *should be in the same length as "ComponentLabels" - // *could leave Affinity=0.0 for label=1 and 2 - //3. Requirement for "PorosityList": - // *for ComponentLables <=0, put porosity value = 0.0; - // *for ComponentLabels >=3, put the corresponding sub-resolution porosity - // *for ComponentLabels =1, 2, put porosity=1 (or if users accidentally put other values it should still be fine) - //4. Requirement for "PermeabilityList": - // *for ComponentLabels <=2, does not matter, can leave it as 1.0 - - NLABELS=LabelList.size(); - if (NLABELS != PorosityList.size() || NLABELS != AffinityList.size() || NLABELS != PermeabilityList.size()){ - ERROR("Error: ComponentLabels, ComponentAffinity, PorosityList and PermeabilityList must all be the same length! \n"); - } - - double label_count[NLABELS]; - double label_count_global[NLABELS]; - - for (int idx=0; idx 0, i.e. open or grey nodes - //For node_ID <= 0: these are solid nodes of various wettability - for (int k=0;k0) && (VALUE == LabelList[idx])){ - POROSITY=PorosityList[idx]; - label_count[idx] += 1.0; - idx = NLABELS; - } - } - int idx = Map(i,j,k); - if (!(idx < 0)){ - if (POROSITY<=0.0){ - ERROR("Error: Porosity for grey voxels must be 0.0 < Porosity <= 1.0 !\n"); - } - else{ - Porosity[idx] = POROSITY; - } - } - } - } - } - - //Populate the permeability map, NOTE only for node_ID > 0, i.e. open or grey nodes - //For node_ID <= 0: these are solid nodes of various wettability - for (int k=0;k0) && (VALUE == LabelList[idx])){ - PERMEABILITY=PermeabilityList[idx]; - idx = NLABELS; - //Mask->id[n] = 0; // set mask to zero since this is an immobile component - } - } - int idx = Map(i,j,k); - if (!(idx < 0)){ - if (PERMEABILITY<=0.0){ - ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); - } - else{ - Permeability[idx] = PERMEABILITY/Dm->voxel_length/Dm->voxel_length; - } - } - } - } - } - - //Populate the solid potential map, for ALL range of node_ID except node = 1,2, i.e. NW and W phase - for (int k=0;k=3){ - AFFINITY=AffinityList[idx]*(1.0-PorosityList[idx]);//BE CAREFUL! Requires for node_ID<=0, user puts porosity=0.0 - } - else{//i.e. label = 1 or 2 - AFFINITY=0.0; - } - idx = NLABELS; - } - } - //NOTE: node_ID = 1 and 2 are reserved - if ((VALUE == 1)||(VALUE == 2)) AFFINITY=0.0;//NOTE: still need this as users may forget to put label=1,2 in ComponentLabelLists - SolidPotential[n] = AFFINITY; - } - } - } - - - // Set Dm to match Mask - for (int i=0; iid[i] = Mask->id[i]; - - for (int idx=0; idxComm.sumReduce(label_count[idx]); - - //Initialize a weighted porosity after considering grey voxels - GreyPorosity=0.0; - for (unsigned int idx=0; idxvoxel_length); - printf("Component labels: %lu \n",NLABELS); - for (unsigned int idx=0; idxvoxel_length/Dm->voxel_length,volume_fraction); - printf(" effective porosity=%.3g\n",volume_fraction*POROSITY); - } - printf("The weighted porosity, considering both open and grey voxels, is %.3g\n",GreyPorosity); - } -} - -void ScaLBL_GreyscaleFEModel::Density_and_Phase_Init(){ - - size_t NLABELS=0; - signed char VALUE=0; - - vector LabelList{1,2}; - vector SwList{0.0,1.0}; - - if (greyscaleFE_db->keyExists( "GreyNodeLabels" )){ - LabelList.clear(); - LabelList = greyscaleFE_db->getVector( "GreyNodeLabels" ); - } - if (greyscaleFE_db->keyExists( "GreyNodeSw" )){ - SwList.clear(); - SwList = greyscaleFE_db->getVector( "GreyNodeSw" ); - } - - NLABELS=LabelList.size(); - if (NLABELS != SwList.size()){ - ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); - } - -// double *Den_temp; -// Den_temp=new double [2*Np]; - double nA=0.5;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. - double nB=0.5; - - double *Phi_temp; - Phi_temp=new double [Np]; - double phi = 0.0; - - for (int k=0; kid[n]; - if (VALUE>0){ - for (unsigned int idx=0; idx < NLABELS; idx++){ - if (VALUE == LabelList[idx]){ - double Sw = SwList[idx]; - if ((Sw<0.0) || (Sw>1.0)) ERROR("Error: Initial saturation for grey nodes must be between [0.0, 1.0]! \n"); - nB=Sw; - nA=1.0-Sw; - phi = nA-nB; - idx = NLABELS; - } - } - if (VALUE==1){//label=1 reserved for NW phase - nA=1.0; - nB=0.0; - phi = nA-nB; - } - else if(VALUE==2){//label=2 reserved for W phase - nA=0.0; - nB=1.0; - phi = nA-nB; - } - int idx = Map(i,j,k); - //Den_temp[idx+0*Np] = nA; - //Den_temp[idx+1*Np] = nB; - Phi_temp[idx] = phi; - } - } - } - } - //copy to device - //ScaLBL_CopyToDevice(Den, Den_temp, 2*Np*sizeof(double)); - ScaLBL_CopyToDevice(Phi, Phi_temp, 1*Np*sizeof(double)); - ScaLBL_DeviceBarrier(); - //delete [] Den_temp; - delete [] Phi_temp; -} - -void ScaLBL_GreyscaleFEModel::Create(){ - /* - * This function creates the variables needed to run a LBM - */ - //......................................................... - // don't perform computations at the eight corners - //id[0] = id[Nx-1] = id[(Ny-1)*Nx] = id[(Ny-1)*Nx + Nx-1] = 0; - //id[(Nz-1)*Nx*Ny] = id[(Nz-1)*Nx*Ny+Nx-1] = id[(Nz-1)*Nx*Ny+(Ny-1)*Nx] = id[(Nz-1)*Nx*Ny+(Ny-1)*Nx + Nx-1] = 0; - - //......................................................... - // Initialize communication structures in averaging domain - for (int i=0; iid[i] = Mask->id[i]; - Mask->CommInit(); - Np=Mask->PoreCount(); - //........................................................................... - if (rank==0) printf ("Create ScaLBL_Communicator \n"); - // Create a communicator for the device (will use optimized layout) - // ScaLBL_Communicator ScaLBL_Comm(Mask); // original - ScaLBL_Comm = std::shared_ptr(new ScaLBL_Communicator(Mask)); - - int Npad=(Np/16 + 2)*16; - if (rank==0) printf ("Set up memory efficient layout, %i | %i | %i \n", Np, Npad, N); - Map.resize(Nx,Ny,Nz); Map.fill(-2); - auto neighborList= new int[18*Npad]; - Np = ScaLBL_Comm->MemoryOptimizedLayoutAA(Map,neighborList,Mask->id,Np); - MPI_Barrier(comm); - - //........................................................................... - // MAIN VARIABLES ALLOCATED HERE - //........................................................................... - // LBM variables - if (rank==0) printf ("Allocating distributions \n"); - //......................device distributions................................. - dist_mem_size = Np*sizeof(double); - neighborSize=18*(Np*sizeof(int)); - //........................................................................... - ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); - ScaLBL_AllocateDeviceMemory((void **) &fq, 19*dist_mem_size); - ScaLBL_AllocateDeviceMemory((void **) &Cq, 7*sizeof(double)*Np);//phase field distribution - ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &PressureGrad, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Phi, sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &PhiLap, sizeof(double)*Np);//laplacian of phase field - ScaLBL_AllocateDeviceMemory((void **) &SolidForce, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &PressTensor, 6*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &PressTensorGrad, 18*sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &Den, 2*sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &Aq, 7*sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &Bq, 7*sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &DenGradA, 3*sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &DenGradB, 3*sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &DenLapA, sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &DenLapB, sizeof(double)*Np); - //........................................................................... - // Update GPU data structures - if (rank==0) printf ("Setting up device neighbor list \n"); - fflush(stdout); - // copy the neighbor list - ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); - // initialize phi based on PhaseLabel (include solid component labels) - double *Poros, *Perm; - Poros = new double[Np]; - Perm = new double[Np]; - double *SolidForce_host = new double[3*Np]; - double *SolidPotential_host = new double [Nx*Ny*Nz]; - AssignComponentLabels(Poros,Perm,SolidPotential_host); - AssignSolidForce(SolidPotential_host,SolidForce_host); - ScaLBL_CopyToDevice(Porosity, Poros, Np*sizeof(double)); - ScaLBL_CopyToDevice(Permeability, Perm, Np*sizeof(double)); - ScaLBL_CopyToDevice(SolidForce, SolidForce_host, 3*Np*sizeof(double)); - - ScaLBL_DeviceBarrier(); - //TODO make the following smart pointers - delete [] SolidForce_host; - delete [] SolidPotential_host; - delete [] Poros; - delete [] Perm; -} - - -void ScaLBL_GreyscaleFEModel::Initialize(){ - if (Restart == true){ - //TODO: Restart funtion is currently not working; need updates - if (rank==0){ - printf("Initializing density field and distributions from Restart! \n"); - } - // Read in the restart file to CPU buffers - std::shared_ptr cfq; - cfq = std::shared_ptr(new double[19*Np],DeleteArray); - std::shared_ptr cDen; - cDen = std::shared_ptr(new double[2*Np],DeleteArray); - FILE *File; - File=fopen(LocalRestartFile,"rb"); - fread(cfq.get(),sizeof(double),19*Np,File); - fread(cDen.get(),sizeof(double),2*Np,File); - fclose(File); - - // Copy the restart data to the GPU - ScaLBL_CopyToDevice(fq,cfq.get(),19*Np*sizeof(double)); - ScaLBL_CopyToDevice(Den,cDen.get(),2*Np*sizeof(double)); - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - - //TODO need proper initialization ! - - //TODO need to initialize velocity field ! - //this is required for calculating the pressure_dvc - //can make a funciton to update velocity, such as ScaLBL_D3Q19_GreyColorIMRT_Velocity - } - else{ - if (rank==0) printf ("Initializing density field \n"); - Density_and_Phase_Init();//initialize density field - ScaLBL_D3Q19_GreyscaleFE_Laplacian(NeighborList, Phi, PhiLap, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_D3Q19_GreyscaleFE_Laplacian(NeighborList, Phi, PhiLap, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_D3Q7_GreyscaleFE_Init(Phi, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, 0, ScaLBL_Comm->LastExterior(), Np);//initialize D3Q7 density components - ScaLBL_D3Q7_GreyscaleFE_Init(Phi, Cq, PhiLap, gamma,kappaA,kappaB,lambdaA,lambdaB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - - if (rank==0) printf ("Initializing distributions \n"); - //ScaLBL_D3Q19_GreyColorIMRT_Init(fq, Den, rhoA, rhoB, Np); - ScaLBL_D3Q19_Init(fq, Np); - - //Velocity also needs initialization (for old incompressible momentum transport) - //if (rank==0) printf ("Initializing velocity field \n"); - //double *vel_init; - //vel_init = new double [3*Np]; - //for (int i=0;i<3*Np;i++) vel_init[i]=0.0; - //ScaLBL_CopyToDevice(Velocity,vel_init,3*Np*sizeof(double)); - //ScaLBL_DeviceBarrier(); - //delete [] vel_init; - } -} - -void ScaLBL_GreyscaleFEModel::Run(){ - int nprocs=nprocx*nprocy*nprocz; - const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); - - int analysis_interval = 1000; // number of timesteps in between in situ analysis - int visualization_interval = 1000; - int restart_interval = 10000; // number of timesteps in between in saving distributions for restart - if (analysis_db->keyExists( "analysis_interval" )){ - analysis_interval = analysis_db->getScalar( "analysis_interval" ); - } - if (analysis_db->keyExists( "visualization_interval" )){ - visualization_interval = analysis_db->getScalar( "visualization_interval" ); - } - if (analysis_db->keyExists( "restart_interval" )){ - restart_interval = analysis_db->getScalar( "restart_interval" ); - } - if (greyscaleFE_db->keyExists( "timestep" )){ - timestep = greyscaleFE_db->getScalar( "timestep" ); - } - - if (rank==0){ - printf("********************************************************\n"); - printf("No. of timesteps: %i \n", timestepMax); - fflush(stdout); - } - - //.......create and start timer............ - double starttime,stoptime,cputime; - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - starttime = MPI_Wtime(); - //......................................... - - Minkowski Morphology(Mask); - - //************ MAIN ITERATION LOOP ***************************************/ - PROFILE_START("Loop"); - auto current_db = db->cloneDatabase(); - double error = 1.0; - double flow_rate_previous = 0.0; - while (timestep < timestepMax && error > tolerance) { - //************************************************************************/ - // *************ODD TIMESTEP*************// - timestep++; - // Compute the density field - // Read for Aq, Bq happens in this routine (requires communication) - ScaLBL_Comm->SendD3Q7AA(Cq); //READ FROM NORMAL - ScaLBL_D3Q7_AAodd_GreyscaleFEPhi(NeighborList, Cq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->RecvD3Q7AA(Cq); //WRITE INTO OPPOSITE - ScaLBL_DeviceBarrier(); - ScaLBL_D3Q7_AAodd_GreyscaleFEPhi(NeighborList, Cq, Phi, 0, ScaLBL_Comm->LastExterior(), Np); - - // Update local pressure - //ScaLBL_D3Q19_GreyscaleFE_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); - ScaLBL_D3Q19_Pressure(fq, Pressure_dvc, Np); - // Compute pressure gradient - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, Pressure_dvc, PressureGrad, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(Pressure_dvc); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, Pressure_dvc, PressureGrad, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(Pressure_dvc,PressureGrad); - ScaLBL_DeviceBarrier(); - // Compute Pressure Tensor - //NOTE send and recv halo causes problems - it errorneously changes Phi - //ScaLBL_Comm->SendHalo(Phi); - ScaLBL_D3Q19_GreyscaleFE_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(),Np); - //ScaLBL_Comm->RecvHalo(Phi); - //ScaLBL_DeviceBarrier(); - ScaLBL_D3Q19_GreyscaleFE_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,0,ScaLBL_Comm->LastExterior(),Np); - - /* Compute gradient of the pressure tensor */ - // call the recv Grad function once per tensor element - // 1st tensor element - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&PressTensor[0*Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&PressTensor[0*Np],&PressTensorGrad[0*Np]); - // 2nd tensor element - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&PressTensor[1*Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&PressTensor[1*Np],&PressTensorGrad[3*Np]); - // 3rd tensor element - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&PressTensor[2*Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&PressTensor[2*Np],&PressTensorGrad[6*Np]); - // 4th tensor element - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&PressTensor[3*Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&PressTensor[3*Np],&PressTensorGrad[9*Np]); - // 5th tensor element - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&PressTensor[4*Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&PressTensor[4*Np],&PressTensorGrad[12*Np]); - // 6th tensor element - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&PressTensor[5*Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&PressTensor[5*Np],&PressTensorGrad[15*Np]); - - - ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL - ScaLBL_D3Q19_AAodd_GreyscaleFEChem(NeighborList, fq, Cq, Phi, SolidForce, - ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, - Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); - ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE - ScaLBL_DeviceBarrier(); - -// // Set BCs -// if (BoundaryCondition == 3){ -// ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); -// ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); -// } - ScaLBL_D3Q19_AAodd_GreyscaleFEChem(NeighborList, fq, Cq, Phi, SolidForce, - 0, ScaLBL_Comm->LastExterior(), Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, - Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - - - // *************EVEN TIMESTEP*************// - timestep++; - // Compute the density field - // Read for Aq, Bq happens in this routine (requires communication) - ScaLBL_Comm->SendD3Q7AA(Cq); //READ FROM NORMAL - ScaLBL_D3Q7_AAeven_GreyscaleFEPhi(Cq, Phi, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->RecvD3Q7AA(Cq); //WRITE INTO OPPOSITE - ScaLBL_DeviceBarrier(); - ScaLBL_D3Q7_AAeven_GreyscaleFEPhi(Cq, Phi, 0, ScaLBL_Comm->LastExterior(), Np); - - // Update local pressure - //ScaLBL_D3Q19_GreyscaleFE_Pressure(fq, Den, Porosity, Velocity, Pressure_dvc, rhoA, rhoB, Np); - ScaLBL_D3Q19_Pressure(fq, Pressure_dvc, Np); - // Compute pressure gradient - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, Pressure_dvc, PressureGrad, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(Pressure_dvc); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, Pressure_dvc, PressureGrad, 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(Pressure_dvc,PressureGrad); - ScaLBL_DeviceBarrier(); - // Compute Pressure Tensor - //ScaLBL_Comm->SendHalo(Phi); - //NOTE send and recv halo causes problems - it errorneously changes Phi - ScaLBL_D3Q19_GreyscaleFE_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(),Np); - //ScaLBL_Comm->RecvHalo(Phi); - //ScaLBL_DeviceBarrier(); - ScaLBL_D3Q19_GreyscaleFE_PressureTensor(NeighborList,Phi,Pressure_dvc,PressTensor,PhiLap,kappaA,kappaB,lambdaA,lambdaB,0,ScaLBL_Comm->LastExterior(),Np); - /* Compute gradient of the pressure tensor */ - // call the recv Grad function once per tensor element - // 1st tensor element - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&PressTensor[0*Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[0*Np], &PressTensorGrad[0*Np], 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&PressTensor[0*Np],&PressTensorGrad[0*Np]); - // 2nd tensor element - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&PressTensor[1*Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[1*Np], &PressTensorGrad[3*Np], 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&PressTensor[1*Np],&PressTensorGrad[3*Np]); - // 3rd tensor element - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&PressTensor[2*Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[2*Np], &PressTensorGrad[6*Np], 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&PressTensor[2*Np],&PressTensorGrad[6*Np]); - // 4th tensor element - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&PressTensor[3*Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[3*Np], &PressTensorGrad[9*Np], 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&PressTensor[3*Np],&PressTensorGrad[9*Np]); - // 5th tensor element - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&PressTensor[4*Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[4*Np], &PressTensorGrad[12*Np], 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&PressTensor[4*Np],&PressTensorGrad[12*Np]); - // 6th tensor element - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->SendHalo(&PressTensor[5*Np]); - ScaLBL_D3Q19_GreyscaleFE_Gradient(NeighborList, &PressTensor[5*Np], &PressTensorGrad[15*Np], 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_Comm->RecvGrad(&PressTensor[5*Np],&PressTensorGrad[15*Np]); - - - ScaLBL_Comm->SendD3Q19AA(fq); //READ FROM NORMAL - ScaLBL_D3Q19_AAeven_GreyscaleFEChem(fq, Cq, Phi, SolidForce, - ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, - Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); - ScaLBL_Comm->RecvD3Q19AA(fq); //WRITE INTO OPPOSITE - ScaLBL_DeviceBarrier(); - -// // Set BCs -// if (BoundaryCondition == 3){ -// ScaLBL_Comm->D3Q19_Pressure_BC_z(NeighborList, fq, din, timestep); -// ScaLBL_Comm->D3Q19_Pressure_BC_Z(NeighborList, fq, dout, timestep); -// } - ScaLBL_D3Q19_AAeven_GreyscaleFEChem(fq, Cq, Phi, SolidForce, - 0, ScaLBL_Comm->LastExterior(), Np, - tauA, tauB, tauA_eff, tauB_eff, rhoA, rhoB, gamma,kappaA,kappaB,lambdaA,lambdaB, Fx, Fy, Fz, - Porosity, Permeability, Velocity, Pressure_dvc,PressureGrad,PressTensorGrad,PhiLap); - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - //************************************************************************/ - -// if (timestep%analysis_interval==0){ -// ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); -// ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); -// ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); -// //ScaLBL_Comm->RegularLayout(Map,Porosity,PorosityMap); -// //ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); -// -// double count_loc=0; -// double count; -// double vax,vay,vaz; -// double vax_loc,vay_loc,vaz_loc; -// //double px_loc,py_loc,pz_loc; -// //double px,py,pz; -// //double mass_loc,mass_glb; -// -// //parameters for domain average -// int64_t i,j,k,n,imin,jmin,kmin,kmax; -// // If external boundary conditions are set, do not average over the inlet and outlet -// kmin=1; kmax=Nz-1; -// //In case user forgets to specify the inlet/outlet buffer layers for BC>0 -// if (BoundaryCondition > 0 && Dm->kproc() == 0) kmin=4; -// if (BoundaryCondition > 0 && Dm->kproc() == Dm->nprocz()-1) kmax=Nz-4; -// -// imin=jmin=1; -// // If inlet/outlet layers exist use these as default -// //if (Dm->inlet_layers_x > 0) imin = Dm->inlet_layers_x; -// //if (Dm->inlet_layers_y > 0) jmin = Dm->inlet_layers_y; -// if (BoundaryCondition > 0 && Dm->inlet_layers_z > 0 && Dm->kproc() == 0) kmin = 1 + Dm->inlet_layers_z;//"1" indicates the halo layer -// if (BoundaryCondition > 0 && Dm->outlet_layers_z > 0 && Dm->kproc() == Dm->nprocz()-1) kmax = Nz-1 - Dm->outlet_layers_z; -// -//// px_loc = py_loc = pz_loc = 0.f; -//// mass_loc = 0.f; -//// for (int k=kmin; k 0){ -//// px_loc += Velocity_x(i,j,k)*Den*PorosityMap(i,j,k); -//// py_loc += Velocity_y(i,j,k)*Den*PorosityMap(i,j,k); -//// pz_loc += Velocity_z(i,j,k)*Den*PorosityMap(i,j,k); -//// mass_loc += Den*PorosityMap(i,j,k); -//// } -//// } -//// } -//// } -//// MPI_Allreduce(&px_loc, &px, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -//// MPI_Allreduce(&py_loc, &py, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -//// MPI_Allreduce(&pz_loc, &pz, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -//// MPI_Allreduce(&mass_loc,&mass_glb,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -//// -//// vax = px/mass_glb; -//// vay = py/mass_glb; -//// vaz = pz/mass_glb; -// -// vax_loc = vay_loc = vaz_loc = 0.f; -// for (int k=kmin; k 0){ -// vax_loc += Velocity_x(i,j,k); -// vay_loc += Velocity_y(i,j,k); -// vaz_loc += Velocity_z(i,j,k); -// count_loc+=1.0; -// } -// } -// } -// } -// //MPI_Allreduce(&vax_loc,&vax,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -// //MPI_Allreduce(&vay_loc,&vay,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -// //MPI_Allreduce(&vaz_loc,&vaz,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -// //MPI_Allreduce(&count_loc,&count,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -// -// vax = Mask->Comm.sumReduce( vax_loc ); -// vay = Mask->Comm.sumReduce( vay_loc ); -// vaz = Mask->Comm.sumReduce( vaz_loc ); -// count = Mask->Comm.sumReduce( count_loc ); -// -// vax /= count; -// vay /= count; -// vaz /= count; -// -// double force_mag = sqrt(Fx*Fx+Fy*Fy+Fz*Fz); -// double dir_x = Fx/force_mag; -// double dir_y = Fy/force_mag; -// double dir_z = Fz/force_mag; -// if (force_mag == 0.0){ -// // default to z direction -// dir_x = 0.0; -// dir_y = 0.0; -// dir_z = 1.0; -// force_mag = 1.0; -// } -// //double flow_rate = (px*dir_x + py*dir_y + pz*dir_z)/mass_glb; -// double flow_rate = (vax*dir_x + vay*dir_y + vaz*dir_z); -// -// error = fabs(flow_rate - flow_rate_previous) / fabs(flow_rate); -// flow_rate_previous = flow_rate; -// -// //if (rank==0) printf("Computing Minkowski functionals \n"); -// Morphology.ComputeScalar(SignDist,0.f); -// //Morphology.PrintAll(); -// double mu = (tau-0.5)/3.f; -// double Vs = Morphology.V(); -// double As = Morphology.A(); -// double Hs = Morphology.H(); -// double Xs = Morphology.X(); -// Vs = Dm->Comm.sumReduce( Vs); -// As = Dm->Comm.sumReduce( As); -// Hs = Dm->Comm.sumReduce( Hs); -// Xs = Dm->Comm.sumReduce( Xs); -// -// double h = Dm->voxel_length; -// //double absperm = h*h*mu*Mask->Porosity()*flow_rate / force_mag; -// double absperm = h*h*mu*GreyPorosity*flow_rate / force_mag; -// -// if (rank==0){ -// printf(" AbsPerm = %.5g [micron^2]\n",absperm); -// bool WriteHeader=false; -// FILE * log_file = fopen("Permeability.csv","r"); -// if (log_file != NULL) -// fclose(log_file); -// else -// WriteHeader=true; -// log_file = fopen("Permeability.csv","a"); -// if (WriteHeader) -// fprintf(log_file,"timestep Fx Fy Fz mu Vs As Hs Xs vax vay vaz AbsPerm \n", -// timestep,Fx,Fy,Fz,mu,h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz,absperm); -// -// fprintf(log_file,"%i %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",timestep, Fx, Fy, Fz, mu, -// h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz, absperm); -// fclose(log_file); -// } -// } - - if (timestep%visualization_interval==0){ - VelocityField(); - } - - if (timestep%restart_interval==0){ - //Use rank=0 write out Restart.db - if (rank==0) { - greyscaleFE_db->putScalar("timestep",timestep); - greyscaleFE_db->putScalar( "Restart", true ); - current_db->putDatabase("GreyscaleFE", greyscaleFE_db); - std::ofstream OutStream("Restart.db"); - current_db->print(OutStream, ""); - OutStream.close(); - - } - //Write out Restart data. - std::shared_ptr cfq; - cfq = std::shared_ptr(new double[19*Np],DeleteArray); - ScaLBL_CopyToHost(cfq.get(),fq,19*Np*sizeof(double));// Copy restart data to the CPU - std::shared_ptr cDen; - cDen = std::shared_ptr(new double[2*Np],DeleteArray); - ScaLBL_CopyToHost(cDen.get(),Den,2*Np*sizeof(double));// Copy restart data to the CPU - - FILE *RESTARTFILE; - RESTARTFILE=fopen(LocalRestartFile,"wb"); - fwrite(cfq.get(),sizeof(double),19*Np,RESTARTFILE); - fwrite(cDen.get(),sizeof(double),2*Np,RESTARTFILE); - fclose(RESTARTFILE); - MPI_Barrier(comm); - } - } - - PROFILE_STOP("Loop"); - PROFILE_SAVE("lbpm_greyscaleFE_simulator",1); - //************************************************************************ - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - stoptime = MPI_Wtime(); - if (rank==0) printf("-------------------------------------------------------------------\n"); - // Compute the walltime per timestep - cputime = (stoptime - starttime)/timestep; - // Performance obtained from each node - double MLUPS = double(Np)/cputime/1000000; - - if (rank==0) printf("********************************************************\n"); - if (rank==0) printf("CPU time = %f \n", cputime); - if (rank==0) printf("Lattice update rate (per core)= %f MLUPS \n", MLUPS); - MLUPS *= nprocs; - if (rank==0) printf("Lattice update rate (total)= %f MLUPS \n", MLUPS); - if (rank==0) printf("********************************************************\n"); - - // ************************************************************************ -} - -void ScaLBL_GreyscaleFEModel::VelocityField(){ - -/* Minkowski Morphology(Mask); - int SIZE=Np*sizeof(double); - ScaLBL_D3Q19_Momentum(fq,Velocity, Np); - ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - ScaLBL_CopyToHost(&VELOCITY[0],&Velocity[0],3*SIZE); - - memcpy(Morphology.SDn.data(), Distance.data(), Nx*Ny*Nz*sizeof(double)); - Morphology.Initialize(); - Morphology.UpdateMeshValues(); - Morphology.ComputeLocal(); - Morphology.Reduce(); - - double count_loc=0; - double count; - double vax,vay,vaz; - double vax_loc,vay_loc,vaz_loc; - vax_loc = vay_loc = vaz_loc = 0.f; - for (int n=0; nLastExterior(); n++){ - vax_loc += VELOCITY[n]; - vay_loc += VELOCITY[Np+n]; - vaz_loc += VELOCITY[2*Np+n]; - count_loc+=1.0; - } - - for (int n=ScaLBL_Comm->FirstInterior(); nLastInterior(); n++){ - vax_loc += VELOCITY[n]; - vay_loc += VELOCITY[Np+n]; - vaz_loc += VELOCITY[2*Np+n]; - count_loc+=1.0; - } - MPI_Allreduce(&vax_loc,&vax,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - MPI_Allreduce(&vay_loc,&vay,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - MPI_Allreduce(&vaz_loc,&vaz,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - MPI_Allreduce(&count_loc,&count,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - - vax /= count; - vay /= count; - vaz /= count; - - double mu = (tau-0.5)/3.f; - if (rank==0) printf("Fx Fy Fz mu Vs As Js Xs vx vy vz\n"); - if (rank==0) printf("%.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",Fx, Fy, Fz, mu, - Morphology.V(),Morphology.A(),Morphology.J(),Morphology.X(),vax,vay,vaz); - */ - - std::vector visData; - fillHalo fillData(Dm->Comm,Dm->rank_info,{Dm->Nx-2,Dm->Ny-2,Dm->Nz-2},{1,1,1},0,1); - - auto VxVar = std::make_shared(); - auto VyVar = std::make_shared(); - auto VzVar = std::make_shared(); - auto SignDistVar = std::make_shared(); - auto PressureVar = std::make_shared(); - - IO::initialize("","silo","false"); - // Create the MeshDataStruct - visData.resize(1); - visData[0].meshName = "domain"; - visData[0].mesh = std::make_shared( Dm->rank_info,Dm->Nx-2,Dm->Ny-2,Dm->Nz-2,Dm->Lx,Dm->Ly,Dm->Lz ); - SignDistVar->name = "SignDist"; - SignDistVar->type = IO::VariableType::VolumeVariable; - SignDistVar->dim = 1; - SignDistVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(SignDistVar); - - VxVar->name = "Velocity_x"; - VxVar->type = IO::VariableType::VolumeVariable; - VxVar->dim = 1; - VxVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(VxVar); - VyVar->name = "Velocity_y"; - VyVar->type = IO::VariableType::VolumeVariable; - VyVar->dim = 1; - VyVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(VyVar); - VzVar->name = "Velocity_z"; - VzVar->type = IO::VariableType::VolumeVariable; - VzVar->dim = 1; - VzVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(VzVar); - - PressureVar->name = "Pressure"; - PressureVar->type = IO::VariableType::VolumeVariable; - PressureVar->dim = 1; - PressureVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(PressureVar); - - Array& SignData = visData[0].vars[0]->data; - Array& VelxData = visData[0].vars[1]->data; - Array& VelyData = visData[0].vars[2]->data; - Array& VelzData = visData[0].vars[3]->data; - Array& PressureData = visData[0].vars[4]->data; - - ASSERT(visData[0].vars[0]->name=="SignDist"); - ASSERT(visData[0].vars[1]->name=="Velocity_x"); - ASSERT(visData[0].vars[2]->name=="Velocity_y"); - ASSERT(visData[0].vars[3]->name=="Velocity_z"); - ASSERT(visData[0].vars[4]->name=="Pressure"); - - ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); - ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); - ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); - ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); - - fillData.copy(SignDist,SignData); - fillData.copy(Velocity_x,VelxData); - fillData.copy(Velocity_y,VelyData); - fillData.copy(Velocity_z,VelzData); - fillData.copy(Pressure,PressureData); - - IO::writeData( timestep, visData, Dm->Comm ); - -} - -void ScaLBL_GreyscaleFEModel::WriteDebug(){ - // Copy back final phase indicator field and convert to regular layout - DoubleArray PhaseField(Nx,Ny,Nz); - - //ScaLBL_CopyToHost(Porosity.data(), Poros, sizeof(double)*N); - -// FILE *OUTFILE; -// sprintf(LocalRankFilename,"Phase.%05i.raw",rank); -// OUTFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,OUTFILE); -// fclose(OUTFILE); -// - -// ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); -// FILE *AFILE; -// sprintf(LocalRankFilename,"A.%05i.raw",rank); -// AFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,AFILE); -// fclose(AFILE); -// -// ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); -// FILE *BFILE; -// sprintf(LocalRankFilename,"B.%05i.raw",rank); -// BFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,BFILE); -// fclose(BFILE); - - ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,PhaseField); - FILE *PFILE; - sprintf(LocalRankFilename,"Pressure.%05i.raw",rank); - PFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,PFILE); - fclose(PFILE); - - ScaLBL_Comm->RegularLayout(Map,&Velocity[0],PhaseField); - FILE *VELX_FILE; - sprintf(LocalRankFilename,"Velocity_X.%05i.raw",rank); - VELX_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,VELX_FILE); - fclose(VELX_FILE); - - ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],PhaseField); - FILE *VELY_FILE; - sprintf(LocalRankFilename,"Velocity_Y.%05i.raw",rank); - VELY_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,VELY_FILE); - fclose(VELY_FILE); - - ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],PhaseField); - FILE *VELZ_FILE; - sprintf(LocalRankFilename,"Velocity_Z.%05i.raw",rank); - VELZ_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,VELZ_FILE); - fclose(VELZ_FILE); - - - ScaLBL_Comm->RegularLayout(Map,Phi,PhaseField); - FILE *PhiFILE; - sprintf(LocalRankFilename,"Phase.%05i.raw",rank); - PhiFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,PhiFILE); - fclose(PhiFILE); - -// ScaLBL_Comm->RegularLayout(Map,&Porosity[0],PhaseField); -// FILE *POROS_FILE; -// sprintf(LocalRankFilename,"Porosity.%05i.raw",rank); -// POROS_FILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,POROS_FILE); -// fclose(POROS_FILE); -// -// ScaLBL_Comm->RegularLayout(Map,&Permeability[0],PhaseField); -// FILE *PERM_FILE; -// sprintf(LocalRankFilename,"Permeability.%05i.raw",rank); -// PERM_FILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,PERM_FILE); -// fclose(PERM_FILE); -} diff --git a/models/GreyscaleFEModel.h b/models/GreyscaleFEModel.h deleted file mode 100644 index 34a6f999..00000000 --- a/models/GreyscaleFEModel.h +++ /dev/null @@ -1,108 +0,0 @@ -/* -Implementation of multicomponent greyscale free-energy based lattice boltzmann model - */ -#include -#include -#include -#include -#include -#include -#include - -#include "common/Communication.h" -#include "common/MPI.h" -#include "common/Database.h" -#include "common/ScaLBL.h" -#include "ProfilerApp.h" -#include "threadpool/thread_pool.h" - -class ScaLBL_GreyscaleFEModel{ -public: - ScaLBL_GreyscaleFEModel(int RANK, int NP, MPI_Comm COMM); - ~ScaLBL_GreyscaleFEModel(); - - // functions in they should be run - void ReadParams(string filename); - void ReadParams(std::shared_ptr db0); - void SetDomain(); - void ReadInput(); - void Create(); - void Initialize(); - void Run(); - void WriteDebug(); - void VelocityField(); - - bool Restart,pBC; - int timestep,timestepMax; - int BoundaryCondition; - double tauA,tauB; - double tauA_eff,tauB_eff; - double rhoA,rhoB; - double tolerance; - double Fx,Fy,Fz,flux; - double din,dout; - double dp;//solid particle diameter, unit in voxel - double GreyPorosity; - //double Gsc; - double gamma; - double kappaA,kappaB; - double lambdaA,lambdaB; - - int Nx,Ny,Nz,N,Np; - int rank,nprocx,nprocy,nprocz,nprocs; - double Lx,Ly,Lz; - - std::shared_ptr Dm; // this domain is for analysis - std::shared_ptr Mask; // this domain is for lbm - std::shared_ptr ScaLBL_Comm; - - // input database - std::shared_ptr db; - std::shared_ptr domain_db; - std::shared_ptr greyscaleFE_db; - std::shared_ptr analysis_db; - std::shared_ptr vis_db; - - signed char *id; - int *NeighborList; - //double *fq,*Aq,*Bq; - double *fq,*Cq; - double *Den; - double *Permeability;//grey voxel permeability - double *Porosity; - double *Velocity; - double *SolidForce; - double *Pressure_dvc; - double *PressureGrad;// gradiant of pressure - double *PressTensor;//pressure tensor - double *PressTensorGrad;// gradient of pressure tensor - double *Phi; - double *PhiLap;//laplacian of phase field phi -// double *DenGradA; -// double *DenGradB; -// double *DenLapA; -// double *DenLapB; - IntArray Map; - DoubleArray SignDist; - DoubleArray Velocity_x; - DoubleArray Velocity_y; - DoubleArray Velocity_z; - DoubleArray PorosityMap; - DoubleArray Pressure; - -private: - MPI_Comm comm; - - int dist_mem_size; - int neighborSize; - // filenames - char LocalRankString[8]; - char LocalRankFilename[40]; - char LocalRestartFile[40]; - - void AssignComponentLabels(double *Porosity, double *Permeablity, double *SolidPotential); - void AssignSolidForce(double *SolidPotential, double *SolidForce); - void Density_and_Phase_Init(); - -}; - diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index 5dd3e0a5..f2f94f9d 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -584,15 +584,10 @@ void ScaLBL_GreyscaleModel::Run(){ } } } - // Disable the this, if the one below does not work, then enable this - //vax = sumReduce( Mask->Comm, vax_loc); - //vay = sumReduce( Mask->Comm, vay_loc); - //vaz = sumReduce( Mask->Comm, vaz_loc); - //count = sumReduce( Mask->Comm, count_loc); - vax = Mask->Comm.sumReduce( vax_loc ); - vay = Mask->Comm.sumReduce( vay_loc ); - vaz = Mask->Comm.sumReduce( vaz_loc ); - count = Mask->Comm.sumReduce( count_loc ); + vax = sumReduce( Mask->Comm, vax_loc); + vay = sumReduce( Mask->Comm, vay_loc); + vaz = sumReduce( Mask->Comm, vaz_loc); + count = sumReduce( Mask->Comm, count_loc); vax /= count; vay /= count; diff --git a/models/GreyscaleSCModel.cpp b/models/GreyscaleSCModel.cpp deleted file mode 100644 index 6fa125fd..00000000 --- a/models/GreyscaleSCModel.cpp +++ /dev/null @@ -1,1433 +0,0 @@ -/* -Greyscale lattice boltzmann model - */ -#include "models/GreyscaleSCModel.h" -#include "analysis/distance.h" -#include "analysis/morphology.h" -#include -#include - -template -void DeleteArray( const TYPE *p ) -{ - delete [] p; -} - -ScaLBL_GreyscaleSCModel::ScaLBL_GreyscaleSCModel(int RANK, int NP, MPI_Comm COMM): -rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),tauA_eff(0),tauB_eff(0),Gsc(0), -rhoA(0),rhoB(0),rhoA_minor(0),rhoB_minor(0),Fx(0),Fy(0),Fz(0),fluxA(0),fluxB(0),dinA(0),doutA(0),dinB(0),doutB(0),GreyPorosity(0), -Nx(0),Ny(0),Nz(0),N(0),Np(0),nprocx(0),nprocy(0),nprocz(0),BoundaryCondition(0),Lx(0),Ly(0),Lz(0),comm(COMM) -{ - SignDist.resize(Nx,Ny,Nz); - SignDist.fill(0); - -} -ScaLBL_GreyscaleSCModel::~ScaLBL_GreyscaleSCModel(){ - -} - -void ScaLBL_GreyscaleSCModel::ReadParams(string filename){ - // read the input database - db = std::make_shared( filename ); - domain_db = db->getDatabase( "Domain" ); - greyscaleSC_db = db->getDatabase( "GreyscaleSC" ); - analysis_db = db->getDatabase( "Analysis" ); - vis_db = db->getDatabase( "Visualization" ); - - // set defaults - timestepMax = 100000; - tauA = 1.0; - tauB = 1.0; - tauA_eff = tauA; - tauB_eff = tauB; - rhoA = rhoB = 1.0; - rhoA_minor = rhoB_minor = 0.01;//dissolved density - Gsc = 2.0;//SC fluid-fluid interaction coefficient - tolerance = 0.01; - Fx = Fy = Fz = 0.0; - Restart=false; - dinA=rhoA;//inlet density for fluid A - dinB=rhoB_minor;//inlet density for fluid B - doutA=rhoA_minor;//outlet denisty for fluid A - doutB=rhoB;//outlet density for fluid B - fluxA=fluxB=0.0; - - // ---------------------- Greyscale Model parameters -----------------------// - if (greyscaleSC_db->keyExists( "timestepMax" )){ - timestepMax = greyscaleSC_db->getScalar( "timestepMax" ); - } - if (greyscaleSC_db->keyExists( "tauA" )){ - tauA = greyscaleSC_db->getScalar( "tauA" ); - } - if (greyscaleSC_db->keyExists( "tauB" )){ - tauB = greyscaleSC_db->getScalar( "tauB" ); - } - tauA_eff = greyscaleSC_db->getWithDefault( "tauA_eff", tauA ); - tauB_eff = greyscaleSC_db->getWithDefault( "tauB_eff", tauB ); - rhoA = greyscaleSC_db->getWithDefault( "rhoA", rhoA ); - rhoB = greyscaleSC_db->getWithDefault( "rhoB", rhoB ); - rhoA_minor = greyscaleSC_db->getWithDefault( "rhoA_minor", rhoA_minor ); - rhoB_minor = greyscaleSC_db->getWithDefault( "rhoB_minor", rhoB_minor ); - dinA = greyscaleSC_db->getWithDefault( "dinA", dinA ); - dinB = greyscaleSC_db->getWithDefault( "dinB", dinB ); - doutA = greyscaleSC_db->getWithDefault( "doutA", doutA ); - doutB = greyscaleSC_db->getWithDefault( "doutB", doutB ); - if (greyscaleSC_db->keyExists( "Gsc" )){ - Gsc = greyscaleSC_db->getScalar( "Gsc" ); - } - if (greyscaleSC_db->keyExists( "F" )){ - Fx = greyscaleSC_db->getVector( "F" )[0]; - Fy = greyscaleSC_db->getVector( "F" )[1]; - Fz = greyscaleSC_db->getVector( "F" )[2]; - } - if (greyscaleSC_db->keyExists( "Restart" )){ - Restart = greyscaleSC_db->getScalar( "Restart" ); - } - if (greyscaleSC_db->keyExists( "fluxA" )){ - fluxA = greyscaleSC_db->getScalar( "fluxA" ); - } - if (greyscaleSC_db->keyExists( "fluxB" )){ - fluxB = greyscaleSC_db->getScalar( "fluxB" ); - } - if (greyscaleSC_db->keyExists( "tolerance" )){ - tolerance = greyscaleSC_db->getScalar( "tolerance" ); - } - // ------------------------------------------------------------------------// - - //------------------------ Other Domain parameters ------------------------// - BoundaryCondition = 0; - if (domain_db->keyExists( "BC" )){ - BoundaryCondition = domain_db->getScalar( "BC" ); - } - // ------------------------------------------------------------------------// -} - -void ScaLBL_GreyscaleSCModel::SetDomain(){ - Dm = std::shared_ptr(new Domain(domain_db,comm)); // full domain for analysis - Mask = std::shared_ptr(new Domain(domain_db,comm)); // mask domain removes immobile phases - // domain parameters - Nx = Dm->Nx; - Ny = Dm->Ny; - Nz = Dm->Nz; - Lx = Dm->Lx; - Ly = Dm->Ly; - Lz = Dm->Lz; - N = Nx*Ny*Nz; - - SignDist.resize(Nx,Ny,Nz); - Velocity_x.resize(Nx,Ny,Nz); - Velocity_y.resize(Nx,Ny,Nz); - Velocity_z.resize(Nx,Ny,Nz); - PorosityMap.resize(Nx,Ny,Nz); - Pressure.resize(Nx,Ny,Nz); - DenA_data.resize(Nx,Ny,Nz); - DenB_data.resize(Nx,Ny,Nz); - - id = new signed char [N]; - for (int i=0; iid[i] = 1; // initialize this way - MPI_Barrier(comm); - Dm->CommInit(); - MPI_Barrier(comm); - // Read domain parameters - rank = Dm->rank(); - nprocx = Dm->nprocx(); - nprocy = Dm->nprocy(); - nprocz = Dm->nprocz(); -} - -void ScaLBL_GreyscaleSCModel::ReadInput(){ - - sprintf(LocalRankString,"%05d",rank); - sprintf(LocalRankFilename,"%s%s","ID.",LocalRankString); - sprintf(LocalRestartFile,"%s%s","Restart.",LocalRankString); - - if (domain_db->keyExists( "Filename" )){ - auto Filename = domain_db->getScalar( "Filename" ); - Mask->Decomp(Filename); - } - else{ - if (rank==0) printf("Filename of input image is not found, reading ID.0* instead."); - Mask->ReadIDs(); - } - for (int i=0; iid[i]; // save what was read - - // Generate the signed distance map - // Initialize the domain and communication - Array id_solid(Nx,Ny,Nz); - int count = 0; - // Solve for the position of the solid phase - for (int k=0;kid[n]; - if (label > 0) id_solid(i,j,k) = 1; - else id_solid(i,j,k) = 0; - } - } - } - // Initialize the signed distance function - for (int k=0;kgetVector( "PorosityList" ); - auto PermeabilityList = greyscaleSC_db->getVector( "PermeabilityList" ); - //auto RelPermListA = greyscaleSC_db->getVector( "RelPermListA" ); - //auto RelPermListB = greyscaleSC_db->getVector( "RelPermListB" ); - auto LabelList = greyscaleSC_db->getVector( "ComponentLabels" ); - auto AffinityListA = greyscaleSC_db->getVector( "ComponentAffinityA" ); - auto AffinityListB = greyscaleSC_db->getVector( "ComponentAffinityB" ); - - //1. Requirement for "ComponentLabels": - // *labels can be a nagative integer, 0, 1, 2, or a positive integer >= 3 - // *label = 1 and 2 are reserved for NW and W phase respectively. - //2. Requirement for "ComponentAffinity": - // *should be in the same length as "ComponentLabels" - // *could leave ComponentAffinityA and B=0.0 for label=1 and 2 - //3. Requirement for "PorosityList": - // *for ComponentLables <=0, put porosity value = 0.0; - // *for ComponentLabels >=3, put the corresponding sub-resolution porosity - // *for ComponentLabels =1, 2, put porosity=1 (or if users accidentally put other values it should still be fine) - //4. Requirement for "PermeabilityList": - // *for ComponentLabels <=2, does not matter, can leave it as 1.0 - //5. Requirement for "RelPermListA" and "RelPermListB": - // *for ComponentLabels <=2, does not matter, can leave both RelPermA and RelPermB as 1.0 - - NLABELS=LabelList.size(); - if (NLABELS != PorosityList.size() || NLABELS != PermeabilityList.size() || - NLABELS != AffinityListA.size() || NLABELS != AffinityListB.size() ){ - ERROR("Error: ComponentLabels, ComponentAffinityA/B, PorosityList, and PermeabilityList must all be the same length! \n"); - } -// if (NLABELS != PorosityList.size() || NLABELS != PermeabilityList.size() || -// NLABELS != RelPermListA.size() || NLABELS != RelPermListB.size() || -// NLABELS != AffinityListA.size() || NLABELS != AffinityListB.size() ){ -// ERROR("Error: ComponentLabels, ComponentAffinityA/B, PorosityList, PermeabilityList, and RelPermListA/B must all be the same length! \n"); -// } - - double label_count[NLABELS]; - double label_count_global[NLABELS]; - - for (int idx=0; idx 0, i.e. open or grey nodes - //For node_ID <= 0: these are solid nodes of various wettability - for (int k=0;k0) && (VALUE == LabelList[idx])){ - POROSITY=PorosityList[idx]; - label_count[idx] += 1.0; - idx = NLABELS; - } - } - int idx = Map(i,j,k); - if (!(idx < 0)){ - if (POROSITY<=0.0){ - ERROR("Error: Porosity for grey voxels must be 0.0 < Porosity <= 1.0 !\n"); - } - else{ - Poros[idx] = POROSITY; - } - } - } - } - } - - //Populate the permeability map, NOTE only for node_ID > 0, i.e. open or grey nodes - //For node_ID <= 0: these are solid nodes of various wettability - for (int k=0;k0) && (VALUE == LabelList[idx])){ - PERMEABILITY=PermeabilityList[idx]; - idx = NLABELS; - //Mask->id[n] = 0; // set mask to zero since this is an immobile component - } - } - int idx = Map(i,j,k); - if (!(idx < 0)){ - if (PERMEABILITY<=0.0){ - ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); - } - else{ - Perm[idx] = PERMEABILITY/Dm->voxel_length/Dm->voxel_length; - } - } - } - } - } -// // New way of initializing the relperm values -// for (int k=0;k0) && (VALUE == LabelList[idx])){ -// RELPERMA=PermeabilityList[idx]*RelPermListA[idx]; -// RELPERMB=PermeabilityList[idx]*RelPermListB[idx]; -// idx = NLABELS; -// //Mask->id[n] = 0; // set mask to zero since this is an immobile component -// } -// } -// int idx = Map(i,j,k); -// if (!(idx < 0)){ -// if (RELPERMA<=0.0 || RELPERMB<=0.0){ -// ERROR("Error: Permeability for grey voxel must be > 0.0 ! \n"); -// } -// else{ -// relPermA_host[idx] = RELPERMA/Dm->voxel_length/Dm->voxel_length; -// relPermB_host[idx] = RELPERMB/Dm->voxel_length/Dm->voxel_length; -// } -// } -// } -// } -// } - - //Populate the solid potential map, for ALL range of node_ID except node = 1,2, i.e. NW and W phase - for (int k=0;k=3){ - AFFINITY_A=AffinityListA[idx]*(1.0-PorosityList[idx]);//BE CAREFUL! Requires for node_ID<=0, user puts porosity=0.0 - AFFINITY_B=AffinityListB[idx]*(1.0-PorosityList[idx]);//BE CAREFUL! Requires for node_ID<=0, user puts porosity=0.0 - } - else{//i.e. label = 1 or 2 - AFFINITY_A=0.0; - AFFINITY_B=0.0; - } - idx = NLABELS; - } - } - //NOTE: node_ID = 1 and 2 are reserved - if ((VALUE == 1)||(VALUE == 2)){ - AFFINITY_A=0.0;//NOTE: still need this as users may forget to put label=1,2 in ComponentLabelLists - AFFINITY_B=0.0;//NOTE: still need this as users may forget to put label=1,2 in ComponentLabelLists - } - SolidPotentialA_host[n] = AFFINITY_A; - SolidPotentialB_host[n] = AFFINITY_B; - } - } - } - - // Calculate Shan-Chen fluid-solid forces - double *Dst; - Dst = new double [3*3*3]; - for (int kk=0; kk<3; kk++){ - for (int jj=0; jj<3; jj++){ - for (int ii=0; ii<3; ii++){ - int index = kk*9+jj*3+ii; - Dst[index] = sqrt(double(ii-1)*double(ii-1) + double(jj-1)*double(jj-1)+ double(kk-1)*double(kk-1)); - } - } - } - double w_face = 1.f/18.f; - double w_edge = 1.f/36.f; - double w_corner = 0.f; - //local - Dst[13] = 0.f; - //faces - Dst[4] = w_face; - Dst[10] = w_face; - Dst[12] = w_face; - Dst[14] = w_face; - Dst[16] = w_face; - Dst[22] = w_face; - // corners - Dst[0] = w_corner; - Dst[2] = w_corner; - Dst[6] = w_corner; - Dst[8] = w_corner; - Dst[18] = w_corner; - Dst[20] = w_corner; - Dst[24] = w_corner; - Dst[26] = w_corner; - // edges - Dst[1] = w_edge; - Dst[3] = w_edge; - Dst[5] = w_edge; - Dst[7] = w_edge; - Dst[9] = w_edge; - Dst[11] = w_edge; - Dst[15] = w_edge; - Dst[17] = w_edge; - Dst[19] = w_edge; - Dst[21] = w_edge; - Dst[23] = w_edge; - Dst[25] = w_edge; - - for (int k=1; kid[nn] <= 0)||(Mask->id[nn]>=3)){ - double vec_x = double(ii-1); - double vec_y = double(jj-1); - double vec_z = double(kk-1); - double GWNS_A=SolidPotentialA_host[nn]; - double GWNS_B=SolidPotentialB_host[nn]; - phi_x_A += -1.0*GWNS_A*weight*vec_x; - phi_y_A += -1.0*GWNS_A*weight*vec_y; - phi_z_A += -1.0*GWNS_A*weight*vec_z; - phi_x_B += -1.0*GWNS_B*weight*vec_x; - phi_y_B += -1.0*GWNS_B*weight*vec_y; - phi_z_B += -1.0*GWNS_B*weight*vec_z; - } - } - } - } - SolidForceA_host[idx+0*Np] = phi_x_A; - SolidForceA_host[idx+1*Np] = phi_y_A; - SolidForceA_host[idx+2*Np] = phi_z_A; - SolidForceB_host[idx+0*Np] = phi_x_B; - SolidForceB_host[idx+1*Np] = phi_y_B; - SolidForceB_host[idx+2*Np] = phi_z_B; - } - } - } - } - - // Set Dm to match Mask - for (int i=0; iid[i] = Mask->id[i]; - - for (int idx=0; idxComm.sumReduce(label_count[idx]); - - //Initialize a weighted porosity after considering grey voxels - GreyPorosity=0.0; - for (unsigned int idx=0; idxvoxel_length); - printf("Component labels: %lu \n",NLABELS); - for (unsigned int idx=0; idxvoxel_length/Dm->voxel_length,volume_fraction); - printf(" effective porosity=%.3g\n",volume_fraction*POROSITY); - } - printf("The weighted porosity, considering both open and grey voxels, is %.3g\n",GreyPorosity); - } - - //Copy all data to device - ScaLBL_CopyToDevice(Porosity, Poros, Np*sizeof(double)); - ScaLBL_CopyToDevice(Permeability, Perm, Np*sizeof(double)); - //ScaLBL_CopyToDevice(relPermA, relPermA_host, Np*sizeof(double)); - //ScaLBL_CopyToDevice(relPermB, relPermB_host, Np*sizeof(double)); - ScaLBL_CopyToDevice(SolidForceA, SolidForceA_host, 3*Np*sizeof(double)); - ScaLBL_CopyToDevice(SolidForceB, SolidForceB_host, 3*Np*sizeof(double)); - ScaLBL_DeviceBarrier(); - delete [] SolidPotentialA_host; - delete [] SolidPotentialB_host; - delete [] SolidForceA_host; - delete [] SolidForceB_host; - delete [] Poros; - delete [] Perm; - //delete [] relPermA_host; - //delete [] relPermB_host; - delete [] Dst; -} - -//void ScaLBL_GreyscaleSCModel::Density_Init(){ -// -// size_t NLABELS=0; -// signed char VALUE=0; -// -// vector LabelList{1,2}; -// vector SwList{0.0,1.0}; -// -// if (greyscaleSC_db->keyExists( "GreyNodeLabels" )){ -// LabelList.clear(); -// LabelList = greyscaleSC_db->getVector( "GreyNodeLabels" ); -// } -// if (greyscaleSC_db->keyExists( "GreyNodeSw" )){ -// SwList.clear(); -// SwList = greyscaleSC_db->getVector( "GreyNodeSw" ); -// } -// -// NLABELS=LabelList.size(); -// if (NLABELS != SwList.size()){ -// ERROR("Error: GreyNodeLabels and GreyNodeSw must be the same length! \n"); -// } -// -// double *Den_temp; -// Den_temp=new double [2*Np]; -// double nA=0.5;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. -// double nB=0.5; -// -// //double *Phi_temp; -// //Phi_temp=new double [Np]; -// //double phi = 0.0; -// -// for (int k=0; kid[n]; -// if (VALUE>0){ -// for (unsigned int idx=0; idx < NLABELS; idx++){ -// if (VALUE == LabelList[idx]){ -// double Sw = SwList[idx]; -// if ((Sw<0.0) || (Sw>1.0)) ERROR("Error: Initial saturation for grey nodes must be between [0.0, 1.0]! \n"); -// nB=Sw; -// nA=1.0-Sw; -// //phi = nA-nB; -// idx = NLABELS; -// } -// } -// if (VALUE==1){//label=1 reserved for NW phase -// //TODO; maybe need rho_major and rho_minor initialization -// nA=rhoA; -// nB=rhoB_minor; -// //phi = nA-nB; -// } -// else if(VALUE==2){//label=2 reserved for W phase -// //TODO; maybe need rho_major and rho_minor initialization -// nA=rhoA_minor; -// nB=rhoB; -// //phi = nA-nB; -// } -// int idx = Map(i,j,k); -// Den_temp[idx+0*Np] = nA; -// Den_temp[idx+1*Np] = nB; -// //Phi_temp[idx] = phi; -// } -// } -// } -// } -// //copy to device -// ScaLBL_CopyToDevice(Den, Den_temp, 2*Np*sizeof(double)); -// //ScaLBL_CopyToDevice(Phi, Phi_temp, 1*Np*sizeof(double)); -// ScaLBL_DeviceBarrier(); -// delete [] Den_temp; -// //delete [] Phi_temp; -//} - -void ScaLBL_GreyscaleSCModel::Density_Init(){ - - size_t NLABELS=0; - signed char VALUE=0; - - vector LabelList{1,2}; - vector GreyDenAList{rhoA,rhoB_minor}; - vector GreyDenBList{rhoB,rhoA_minor}; - - if (greyscaleSC_db->keyExists( "GreyNodeLabels" )){ - LabelList.clear(); - LabelList = greyscaleSC_db->getVector( "GreyNodeLabels" ); - } - if (greyscaleSC_db->keyExists( "GreyNodeDenAInit" )){ - GreyDenAList.clear(); - GreyDenAList = greyscaleSC_db->getVector( "GreyNodeDenAInit" ); - } - if (greyscaleSC_db->keyExists( "GreyNodeDenBInit" )){ - GreyDenBList.clear(); - GreyDenBList = greyscaleSC_db->getVector( "GreyNodeDenBInit" ); - } - - NLABELS=LabelList.size(); - if (NLABELS != GreyDenAList.size() || NLABELS != GreyDenBList.size()){ - ERROR("Error: GreyNodeLabels, GreyNodeDenAInit, and GreyNodeDenBInit must all be the same length! \n"); - } - - double *DenA_temp,*DenB_temp; - DenA_temp=new double [Nx*Ny*Nz]; - DenB_temp=new double [Nx*Ny*Nz]; - double nA=0.0;//to prevent use may forget to specify all greynodes, then must initialize something to start with, givning just zeros is too risky. - double nB=0.0; - - //double *Phi_temp; - //Phi_temp=new double [Np]; - //double phi = 0.0; - - for (int k=0; kid[n]; - if (VALUE>0){ - for (unsigned int idx=0; idx < NLABELS; idx++){ - if (VALUE == LabelList[idx]){ - nA=GreyDenAList[idx]; - nB=GreyDenBList[idx]; - //phi = nA-nB; - idx = NLABELS; - } - } - if (VALUE==1){//label=1 reserved for NW phase - nA=rhoA; - nB=rhoB_minor; - //phi = nA-nB; - } - else if(VALUE==2){//label=2 reserved for W phase - nA=rhoA_minor; - nB=rhoB; - //phi = nA-nB; - } - DenA_temp[n] = nA; - DenB_temp[n] = nB; - } - else{ //for ID<=0, i.e. all sorts of solid minerals, density is zero - DenA_temp[n] = 0.0; - DenB_temp[n] = 0.0; - } - } - } - } - - //copy to device - ScaLBL_CopyToDevice(DenA, DenA_temp, Nx*Ny*Nz*sizeof(double)); - ScaLBL_CopyToDevice(DenB, DenB_temp, Nx*Ny*Nz*sizeof(double)); - ScaLBL_DeviceBarrier(); - delete [] DenA_temp; - delete [] DenB_temp; - - if (BoundaryCondition >0 ){ - if (Dm->kproc()==0){ - ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); - ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,1); - ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,2); - ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); - ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,1); - ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,2); - } - if (Dm->kproc() == nprocz-1){ - ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-1); - ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-2); - ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-3); - ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-1); - ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-2); - ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-3); - } - } - -} - -void ScaLBL_GreyscaleSCModel::Create(){ - /* - * This function creates the variables needed to run a LBM - */ - //......................................................... - // don't perform computations at the eight corners - //id[0] = id[Nx-1] = id[(Ny-1)*Nx] = id[(Ny-1)*Nx + Nx-1] = 0; - //id[(Nz-1)*Nx*Ny] = id[(Nz-1)*Nx*Ny+Nx-1] = id[(Nz-1)*Nx*Ny+(Ny-1)*Nx] = id[(Nz-1)*Nx*Ny+(Ny-1)*Nx + Nx-1] = 0; - - //......................................................... - // Initialize communication structures in averaging domain - for (int i=0; iid[i] = Mask->id[i]; - Mask->CommInit(); - Np=Mask->PoreCount(); - //........................................................................... - if (rank==0) printf ("Create ScaLBL_Communicator \n"); - // Create a communicator for the device (will use optimized layout) - // ScaLBL_Communicator ScaLBL_Comm(Mask); // original - ScaLBL_Comm = std::shared_ptr(new ScaLBL_Communicator(Mask)); - ScaLBL_Comm_Regular = std::shared_ptr(new ScaLBL_Communicator(Mask)); - - int Npad=(Np/16 + 2)*16; - if (rank==0) printf ("Set up memory efficient layout, %i | %i | %i \n", Np, Npad, N); - Map.resize(Nx,Ny,Nz); Map.fill(-2); - auto neighborList= new int[18*Npad]; - Np = ScaLBL_Comm->MemoryOptimizedLayoutAA(Map,neighborList,Mask->id,Np); - MPI_Barrier(comm); - - //........................................................................... - // MAIN VARIABLES ALLOCATED HERE - //........................................................................... - // LBM variables - if (rank==0) printf ("Allocating distributions \n"); - //......................device distributions................................. - dist_mem_size = Np*sizeof(double); - neighborSize=18*(Np*sizeof(int)); - //........................................................................... - ScaLBL_AllocateDeviceMemory((void **) &NeighborList, neighborSize); - ScaLBL_AllocateDeviceMemory((void **) &dvcMap, sizeof(int)*Np); - ScaLBL_AllocateDeviceMemory((void **) &fqA, 19*dist_mem_size); - ScaLBL_AllocateDeviceMemory((void **) &fqB, 19*dist_mem_size); - ScaLBL_AllocateDeviceMemory((void **) &DenA, sizeof(double)*Nx*Ny*Nz); - ScaLBL_AllocateDeviceMemory((void **) &DenB, sizeof(double)*Nx*Ny*Nz); - ScaLBL_AllocateDeviceMemory((void **) &Permeability, sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &relPermA, sizeof(double)*Np); - //ScaLBL_AllocateDeviceMemory((void **) &relPermB, sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Porosity, sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Pressure_dvc, sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &Velocity, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &SolidForceA, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &SolidForceB, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &DenGradA, 3*sizeof(double)*Np); - ScaLBL_AllocateDeviceMemory((void **) &DenGradB, 3*sizeof(double)*Np); - //........................................................................... - // Update GPU data structures - if (rank==0) printf ("Setting up device neighbor list \n"); - fflush(stdout); - // Copy the Map to device - int *TmpMap; - TmpMap=new int[Np]; - for (int k=1; kLastExterior(); idx++){ - auto n = TmpMap[idx]; - if (n > Nx*Ny*Nz){ - printf("Bad value! idx=%i \n", n); - TmpMap[idx] = Nx*Ny*Nz-1; - } - } - for (int idx=ScaLBL_Comm->FirstInterior(); idxLastInterior(); idx++){ - auto n = TmpMap[idx]; - if ( n > Nx*Ny*Nz ){ - printf("Bad value! idx=%i \n",n); - TmpMap[idx] = Nx*Ny*Nz-1; - } - } - ScaLBL_CopyToDevice(dvcMap, TmpMap, sizeof(int)*Np); - ScaLBL_DeviceBarrier(); - delete [] TmpMap; - // copy the neighbor list - ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize); -} - -void ScaLBL_GreyscaleSCModel::Initialize(){ - if (Restart == true){ -// //TODO: Restart funtion is currently not working; need updates -// if (rank==0){ -// printf("Initializing density field and distributions from Restart! \n"); -// } -// // Read in the restart file to CPU buffers -// std::shared_ptr cfq; -// cfq = std::shared_ptr(new double[19*Np],DeleteArray); -// std::shared_ptr cDen; -// cDen = std::shared_ptr(new double[2*Np],DeleteArray); -// FILE *File; -// File=fopen(LocalRestartFile,"rb"); -// fread(cfq.get(),sizeof(double),19*Np,File); -// fread(cDen.get(),sizeof(double),2*Np,File); -// fclose(File); -// -// // Copy the restart data to the GPU -// ScaLBL_CopyToDevice(fq,cfq.get(),19*Np*sizeof(double)); -// ScaLBL_CopyToDevice(Den,cDen.get(),2*Np*sizeof(double)); -// ScaLBL_DeviceBarrier(); -// MPI_Barrier(comm); -// -// //TODO need proper initialization ! -// -// //TODO need to initialize velocity field ! -// //this is required for calculating the pressure_dvc -// //can make a funciton to update velocity, such as ScaLBL_D3Q19_GreyColorIMRT_Velocity - } - else{ - if (rank==0) printf ("Initializing solid affinities \n"); - AssignGreyscaleAndSolidLabels(); - if (rank==0) printf ("Initializing density field \n"); - Density_Init();//initialize density field - if (rank==0) printf ("Initializing distributions \n"); - ScaLBL_D3Q19_GreyscaleSC_Init(dvcMap,fqA, fqB, DenA,DenB, Np); - -// //debug -// DoubleArray PhaseField(Nx,Ny,Nz); -// //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); -// ScaLBL_CopyToHost(PhaseField.data(), DenA, sizeof(double)*N); -// FILE *AFILE; -// sprintf(LocalRankFilename,"A_init.%05i.raw",rank); -// AFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,AFILE); -// fclose(AFILE); -// -// //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); -// ScaLBL_CopyToHost(PhaseField.data(), DenB, sizeof(double)*N); -// FILE *BFILE; -// sprintf(LocalRankFilename,"B_init.%05i.raw",rank); -// BFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,BFILE); -// fclose(BFILE); - - //Velocity also needs initialization (for old incompressible momentum transport) - //if (rank==0) printf ("Initializing velocity field \n"); - //double *vel_init; - //vel_init = new double [3*Np]; - //for (int i=0;i<3*Np;i++) vel_init[i]=0.0; - //ScaLBL_CopyToDevice(Velocity,vel_init,3*Np*sizeof(double)); - //ScaLBL_DeviceBarrier(); - //delete [] vel_init; - } -} - -void ScaLBL_GreyscaleSCModel::Run(){ - int nprocs=nprocx*nprocy*nprocz; - const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz); - - int analysis_interval = 1000; // number of timesteps in between in situ analysis - int visualization_interval = 1000; - int restart_interval = 10000; // number of timesteps in between in saving distributions for restart - if (analysis_db->keyExists( "analysis_interval" )){ - analysis_interval = analysis_db->getScalar( "analysis_interval" ); - } - if (analysis_db->keyExists( "visualization_interval" )){ - visualization_interval = analysis_db->getScalar( "visualization_interval" ); - } - if (analysis_db->keyExists( "restart_interval" )){ - restart_interval = analysis_db->getScalar( "restart_interval" ); - } - if (greyscaleSC_db->keyExists( "timestep" )){ - timestep = greyscaleSC_db->getScalar( "timestep" ); - } - - if (rank==0){ - printf("********************************************************\n"); - printf("No. of timesteps: %i \n", timestepMax); - fflush(stdout); - } - - //.......create and start timer............ - double starttime,stoptime,cputime; - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - starttime = MPI_Wtime(); - //......................................... - - Minkowski Morphology(Mask); - - //************ MAIN ITERATION LOOP ***************************************/ - PROFILE_START("Loop"); - auto current_db = db->cloneDatabase(); - double error = 1.0; - double flow_rate_previous = 0.0; - while (timestep < timestepMax && error > tolerance) { - //************************************************************************/ - // *************ODD TIMESTEP*************// - timestep++; - // Compute the density field - // Read for Aq, Bq happens in this routine (requires communication) - ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL - ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, dvcMap, fqA, fqB, DenA, DenB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE - ScaLBL_DeviceBarrier(); - // Set BCs - if (BoundaryCondition == 3){ - ScaLBL_Comm->GreyscaleSC_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); - ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); - } - if (BoundaryCondition == 4){ - dinA = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fqA, fluxA, timestep); - dinB = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fqB, fluxB, timestep); - ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); - } - ScaLBL_D3Q19_AAodd_GreyscaleSC_Density(NeighborList, dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); - - //if (BoundaryCondition > 0){ - // ScaLBL_Comm->GreyscaleSC_BC_z(dvcMap, DenA, DenB, dinA, dinB); - // ScaLBL_Comm->GreyscaleSC_BC_Z(dvcMap, DenA, DenB, doutA, doutB); - //} - - // Compute density gradient - // fluid component A - ScaLBL_Comm_Regular->SendHalo(DenA); - ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm_Regular->RecvHalo(DenA); - ScaLBL_DeviceBarrier(); - if (BoundaryCondition ==3 || BoundaryCondition ==4){//not necessarily applied to velBC (BC=2) - if (Dm->kproc()==0){ - ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); - } - if (Dm->kproc() == nprocz-1){ - ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-1); - } - } - ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); - // fluid component B - ScaLBL_Comm_Regular->SendHalo(DenB); - ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm_Regular->RecvHalo(DenB); - if (BoundaryCondition ==3 || BoundaryCondition ==4){//not necessarily applied to velBC (BC=2) - if (Dm->kproc()==0){ - ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); - } - if (Dm->kproc() == nprocz-1){ - ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-1); - } - } - ScaLBL_DeviceBarrier(); - ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); - - // Collsion - ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, - tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, - ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - // Collsion - ScaLBL_D3Q19_AAodd_GreyscaleSC_BGK(NeighborList, dvcMap, fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, - tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, - 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - - - // *************EVEN TIMESTEP*************// - timestep++; - // Compute the density field - // Read for Aq, Bq happens in this routine (requires communication) - ScaLBL_Comm->BiSendD3Q19AA(fqA,fqB); //READ FROM NORMAL - ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(dvcMap, fqA, fqB, DenA, DenB, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm->BiRecvD3Q19AA(fqA,fqB); //WRITE INTO OPPOSITE - ScaLBL_DeviceBarrier(); - // Set BCs - if (BoundaryCondition == 3){ - ScaLBL_Comm->GreyscaleSC_Pressure_BC_z(NeighborList, fqA, fqB, dinA, dinB, timestep); - ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); - } - if (BoundaryCondition == 4){ - dinA = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fqA, fluxA, timestep); - dinB = ScaLBL_Comm->D3Q19_Flux_BC_z(NeighborList, fqB, fluxB, timestep); - ScaLBL_Comm->GreyscaleSC_Pressure_BC_Z(NeighborList, fqA, fqB, doutA, doutB, timestep); - } - ScaLBL_D3Q19_AAeven_GreyscaleSC_Density(dvcMap, fqA, fqB, DenA, DenB, 0, ScaLBL_Comm->LastExterior(), Np); - - //if (BoundaryCondition > 0){ - // ScaLBL_Comm->GreyscaleSC_BC_z(dvcMap, DenA, DenB, dinA, dinB); - // ScaLBL_Comm->GreyscaleSC_BC_Z(dvcMap, DenA, DenB, doutA, doutB); - //} - - // Compute density gradient - // fluid component A - ScaLBL_Comm_Regular->SendHalo(DenA); - ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm_Regular->RecvHalo(DenA); - ScaLBL_DeviceBarrier(); - if (BoundaryCondition ==3 || BoundaryCondition ==4){//not necessarily applied to velBC (BC=2) - if (Dm->kproc()==0){ - ScaLBL_SetSlice_z(DenA,dinA,Nx,Ny,Nz,0); - } - if (Dm->kproc() == nprocz-1){ - ScaLBL_SetSlice_z(DenA,doutA,Nx,Ny,Nz,Nz-1); - } - } - ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenA, DenGradA, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); - // fluid component B - ScaLBL_Comm_Regular->SendHalo(DenB); - ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - ScaLBL_Comm_Regular->RecvHalo(DenB); - ScaLBL_DeviceBarrier(); - if (BoundaryCondition ==3 || BoundaryCondition ==4){//not necessarily applied to velBC (BC=2) - if (Dm->kproc()==0){ - ScaLBL_SetSlice_z(DenB,dinB,Nx,Ny,Nz,0); - } - if (Dm->kproc() == nprocz-1){ - ScaLBL_SetSlice_z(DenB,doutB,Nx,Ny,Nz,Nz-1); - } - } - ScaLBL_D3Q19_GreyscaleSC_Gradient(NeighborList, dvcMap, DenB, DenGradB, Nx, Nx*Ny, 0, ScaLBL_Comm->LastExterior(), Np); - - // Collsion - ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, - tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, - ScaLBL_Comm->FirstInterior(), ScaLBL_Comm->LastInterior(), Np); - // Collsion - ScaLBL_D3Q19_AAeven_GreyscaleSC_BGK(dvcMap,fqA, fqB, DenA, DenB, DenGradA, DenGradB, SolidForceA, SolidForceB, Porosity,Permeability,Velocity,Pressure_dvc, - tauA, tauB, tauA_eff, tauB_eff, Gsc, Fx, Fy, Fz, - 0, ScaLBL_Comm->LastExterior(), Np); - ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - - //************************************************************************/ - -// if (timestep%analysis_interval==0){ -// ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); -// ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); -// ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); -// //ScaLBL_Comm->RegularLayout(Map,Porosity,PorosityMap); -// //ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); -// -// double count_loc=0; -// double count; -// double vax,vay,vaz; -// double vax_loc,vay_loc,vaz_loc; -// //double px_loc,py_loc,pz_loc; -// //double px,py,pz; -// //double mass_loc,mass_glb; -// -// //parameters for domain average -// int64_t i,j,k,n,imin,jmin,kmin,kmax; -// // If external boundary conditions are set, do not average over the inlet and outlet -// kmin=1; kmax=Nz-1; -// //In case user forgets to specify the inlet/outlet buffer layers for BC>0 -// if (BoundaryCondition > 0 && Dm->kproc() == 0) kmin=4; -// if (BoundaryCondition > 0 && Dm->kproc() == Dm->nprocz()-1) kmax=Nz-4; -// -// imin=jmin=1; -// // If inlet/outlet layers exist use these as default -// //if (Dm->inlet_layers_x > 0) imin = Dm->inlet_layers_x; -// //if (Dm->inlet_layers_y > 0) jmin = Dm->inlet_layers_y; -// if (BoundaryCondition > 0 && Dm->inlet_layers_z > 0 && Dm->kproc() == 0) kmin = 1 + Dm->inlet_layers_z;//"1" indicates the halo layer -// if (BoundaryCondition > 0 && Dm->outlet_layers_z > 0 && Dm->kproc() == Dm->nprocz()-1) kmax = Nz-1 - Dm->outlet_layers_z; -// -//// px_loc = py_loc = pz_loc = 0.f; -//// mass_loc = 0.f; -//// for (int k=kmin; k 0){ -//// px_loc += Velocity_x(i,j,k)*Den*PorosityMap(i,j,k); -//// py_loc += Velocity_y(i,j,k)*Den*PorosityMap(i,j,k); -//// pz_loc += Velocity_z(i,j,k)*Den*PorosityMap(i,j,k); -//// mass_loc += Den*PorosityMap(i,j,k); -//// } -//// } -//// } -//// } -//// MPI_Allreduce(&px_loc, &px, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -//// MPI_Allreduce(&py_loc, &py, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -//// MPI_Allreduce(&pz_loc, &pz, 1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -//// MPI_Allreduce(&mass_loc,&mass_glb,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); -//// -//// vax = px/mass_glb; -//// vay = py/mass_glb; -//// vaz = pz/mass_glb; -// -// vax_loc = vay_loc = vaz_loc = 0.f; -// for (int k=kmin; k 0){ -// vax_loc += Velocity_x(i,j,k); -// vay_loc += Velocity_y(i,j,k); -// vaz_loc += Velocity_z(i,j,k); -// count_loc+=1.0; -// } -// } -// } -// } -// vax = Mask->Comm.sumReduce( vax_loc ); -// vay = Mask->Comm.sumReduce( vay_loc ); -// vaz = Mask->Comm.sumReduce( vaz_loc ); -// count = Mask->Comm.sumReduce( count_loc ); -// -// vax /= count; -// vay /= count; -// vaz /= count; -// -// double force_mag = sqrt(Fx*Fx+Fy*Fy+Fz*Fz); -// double dir_x = Fx/force_mag; -// double dir_y = Fy/force_mag; -// double dir_z = Fz/force_mag; -// if (force_mag == 0.0){ -// // default to z direction -// dir_x = 0.0; -// dir_y = 0.0; -// dir_z = 1.0; -// force_mag = 1.0; -// } -// //double flow_rate = (px*dir_x + py*dir_y + pz*dir_z)/mass_glb; -// double flow_rate = (vax*dir_x + vay*dir_y + vaz*dir_z); -// -// error = fabs(flow_rate - flow_rate_previous) / fabs(flow_rate); -// flow_rate_previous = flow_rate; -// -// //if (rank==0) printf("Computing Minkowski functionals \n"); -// Morphology.ComputeScalar(SignDist,0.f); -// //Morphology.PrintAll(); -// double mu = (tau-0.5)/3.f; -// double Vs = Morphology.V(); -// double As = Morphology.A(); -// double Hs = Morphology.H(); -// double Xs = Morphology.X(); -// Vs = Dm->Comm.sumReduce( Vs); -// As = Dm->Comm.sumReduce( As); -// Hs = Dm->Comm.sumReduce( Hs); -// Xs = Dm->Comm.sumReduce( Xs); -// -// double h = Dm->voxel_length; -// //double absperm = h*h*mu*Mask->Porosity()*flow_rate / force_mag; -// double absperm = h*h*mu*GreyPorosity*flow_rate / force_mag; -// -// if (rank==0){ -// printf(" AbsPerm = %.5g [micron^2]\n",absperm); -// bool WriteHeader=false; -// FILE * log_file = fopen("Permeability.csv","r"); -// if (log_file != NULL) -// fclose(log_file); -// else -// WriteHeader=true; -// log_file = fopen("Permeability.csv","a"); -// if (WriteHeader) -// fprintf(log_file,"timestep Fx Fy Fz mu Vs As Hs Xs vax vay vaz AbsPerm \n", -// timestep,Fx,Fy,Fz,mu,h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz,absperm); -// -// fprintf(log_file,"%i %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",timestep, Fx, Fy, Fz, mu, -// h*h*h*Vs,h*h*As,h*Hs,Xs,vax,vay,vaz, absperm); -// fclose(log_file); -// } -// } - if (timestep==2&&BoundaryCondition==4){ - if (rank==0) printf(" Timestep dinA dinB doutA doutB\n"); - } - if (timestep%analysis_interval==0){ - if (BoundaryCondition==4){ - if (rank==0) printf(" %i %.3g %.3g %.3g %.3g\n",timestep,dinA,dinB,doutA,doutB); - } - } - - if (timestep%visualization_interval==0){ - WriteOutput(); - } - -// if (timestep%restart_interval==0){ -// //Use rank=0 write out Restart.db -// if (rank==0) { -// greyscaleSC_db->putScalar("timestep",timestep); -// greyscaleSC_db->putScalar( "Restart", true ); -// current_db->putDatabase("GreyscaleSC", greyscaleSC_db); -// std::ofstream OutStream("Restart.db"); -// current_db->print(OutStream, ""); -// OutStream.close(); -// -// } -// //Write out Restart data. -// std::shared_ptr cfq; -// cfq = std::shared_ptr(new double[19*Np],DeleteArray); -// ScaLBL_CopyToHost(cfq.get(),fq,19*Np*sizeof(double));// Copy restart data to the CPU -// -// FILE *RESTARTFILE; -// RESTARTFILE=fopen(LocalRestartFile,"wb"); -// fwrite(cfq.get(),sizeof(double),19*Np,RESTARTFILE); -// fclose(RESTARTFILE); -// MPI_Barrier(comm); -// } - } - - PROFILE_STOP("Loop"); - PROFILE_SAVE("lbpm_greyscale_simulator",1); - //************************************************************************ - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - stoptime = MPI_Wtime(); - if (rank==0) printf("-------------------------------------------------------------------\n"); - // Compute the walltime per timestep - cputime = (stoptime - starttime)/timestep; - // Performance obtained from each node - double MLUPS = double(Np)/cputime/1000000; - - if (rank==0) printf("********************************************************\n"); - if (rank==0) printf("CPU time = %f \n", cputime); - if (rank==0) printf("Lattice update rate (per core)= %f MLUPS \n", MLUPS); - MLUPS *= nprocs; - if (rank==0) printf("Lattice update rate (total)= %f MLUPS \n", MLUPS); - if (rank==0) printf("********************************************************\n"); - - // ************************************************************************ -} - -void ScaLBL_GreyscaleSCModel::WriteOutput(){ - -/* Minkowski Morphology(Mask); - int SIZE=Np*sizeof(double); - ScaLBL_D3Q19_Momentum(fq,Velocity, Np); - ScaLBL_DeviceBarrier(); MPI_Barrier(comm); - ScaLBL_CopyToHost(&VELOCITY[0],&Velocity[0],3*SIZE); - - memcpy(Morphology.SDn.data(), Distance.data(), Nx*Ny*Nz*sizeof(double)); - Morphology.Initialize(); - Morphology.UpdateMeshValues(); - Morphology.ComputeLocal(); - Morphology.Reduce(); - - double count_loc=0; - double count; - double vax,vay,vaz; - double vax_loc,vay_loc,vaz_loc; - vax_loc = vay_loc = vaz_loc = 0.f; - for (int n=0; nLastExterior(); n++){ - vax_loc += VELOCITY[n]; - vay_loc += VELOCITY[Np+n]; - vaz_loc += VELOCITY[2*Np+n]; - count_loc+=1.0; - } - - for (int n=ScaLBL_Comm->FirstInterior(); nLastInterior(); n++){ - vax_loc += VELOCITY[n]; - vay_loc += VELOCITY[Np+n]; - vaz_loc += VELOCITY[2*Np+n]; - count_loc+=1.0; - } - MPI_Allreduce(&vax_loc,&vax,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - MPI_Allreduce(&vay_loc,&vay,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - MPI_Allreduce(&vaz_loc,&vaz,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - MPI_Allreduce(&count_loc,&count,1,MPI_DOUBLE,MPI_SUM,Mask->Comm); - - vax /= count; - vay /= count; - vaz /= count; - - double mu = (tau-0.5)/3.f; - if (rank==0) printf("Fx Fy Fz mu Vs As Js Xs vx vy vz\n"); - if (rank==0) printf("%.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g %.8g\n",Fx, Fy, Fz, mu, - Morphology.V(),Morphology.A(),Morphology.J(),Morphology.X(),vax,vay,vaz); - */ - - std::vector visData; - fillHalo fillData(Dm->Comm,Dm->rank_info,{Dm->Nx-2,Dm->Ny-2,Dm->Nz-2},{1,1,1},0,1); - - auto VxVar = std::make_shared(); - auto VyVar = std::make_shared(); - auto VzVar = std::make_shared(); - auto SignDistVar = std::make_shared(); - auto PressureVar = std::make_shared(); - auto DenAVar = std::make_shared(); - auto DenBVar = std::make_shared(); - - IO::initialize("","silo","false"); - // Create the MeshDataStruct - visData.resize(1); - visData[0].meshName = "domain"; - visData[0].mesh = std::make_shared( Dm->rank_info,Dm->Nx-2,Dm->Ny-2,Dm->Nz-2,Dm->Lx,Dm->Ly,Dm->Lz ); - SignDistVar->name = "SignDist"; - SignDistVar->type = IO::VariableType::VolumeVariable; - SignDistVar->dim = 1; - SignDistVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(SignDistVar); - - VxVar->name = "Velocity_x"; - VxVar->type = IO::VariableType::VolumeVariable; - VxVar->dim = 1; - VxVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(VxVar); - VyVar->name = "Velocity_y"; - VyVar->type = IO::VariableType::VolumeVariable; - VyVar->dim = 1; - VyVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(VyVar); - VzVar->name = "Velocity_z"; - VzVar->type = IO::VariableType::VolumeVariable; - VzVar->dim = 1; - VzVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(VzVar); - - PressureVar->name = "Pressure"; - PressureVar->type = IO::VariableType::VolumeVariable; - PressureVar->dim = 1; - PressureVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(PressureVar); - - DenAVar->name = "DenA"; - DenAVar->type = IO::VariableType::VolumeVariable; - DenAVar->dim = 1; - DenAVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(DenAVar); - DenBVar->name = "DenB"; - DenBVar->type = IO::VariableType::VolumeVariable; - DenBVar->dim = 1; - DenBVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); - visData[0].vars.push_back(DenBVar); - - Array& SignData = visData[0].vars[0]->data; - Array& VelxData = visData[0].vars[1]->data; - Array& VelyData = visData[0].vars[2]->data; - Array& VelzData = visData[0].vars[3]->data; - Array& PressureData = visData[0].vars[4]->data; - Array& DenAData = visData[0].vars[5]->data; - Array& DenBData = visData[0].vars[6]->data; - - ASSERT(visData[0].vars[0]->name=="SignDist"); - ASSERT(visData[0].vars[1]->name=="Velocity_x"); - ASSERT(visData[0].vars[2]->name=="Velocity_y"); - ASSERT(visData[0].vars[3]->name=="Velocity_z"); - ASSERT(visData[0].vars[4]->name=="Pressure"); - ASSERT(visData[0].vars[5]->name=="DenA"); - ASSERT(visData[0].vars[6]->name=="DenB"); - - ScaLBL_Comm->RegularLayout(Map,&Velocity[0],Velocity_x); - ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],Velocity_y); - ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],Velocity_z); - ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,Pressure); - ScaLBL_CopyToHost(DenA_data.data(), DenA, sizeof(double)*N); - ScaLBL_CopyToHost(DenB_data.data(), DenB, sizeof(double)*N); - - fillData.copy(SignDist,SignData); - fillData.copy(Velocity_x,VelxData); - fillData.copy(Velocity_y,VelyData); - fillData.copy(Velocity_z,VelzData); - fillData.copy(Pressure,PressureData); - fillData.copy(DenA_data,DenAData); - fillData.copy(DenB_data,DenBData); - - IO::writeData( timestep, visData, Dm->Comm ); - -} - -void ScaLBL_GreyscaleSCModel::WriteDebug(){ - // Copy back final phase indicator field and convert to regular layout - DoubleArray PhaseField(Nx,Ny,Nz); - - //ScaLBL_CopyToHost(Porosity.data(), Poros, sizeof(double)*N); - -// FILE *OUTFILE; -// sprintf(LocalRankFilename,"Phase.%05i.raw",rank); -// OUTFILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,OUTFILE); -// fclose(OUTFILE); -// - //ScaLBL_Comm->RegularLayout(Map,&Den[0],PhaseField); - ScaLBL_CopyToHost(PhaseField.data(), DenA, sizeof(double)*N); - FILE *AFILE; - sprintf(LocalRankFilename,"A.%05i.raw",rank); - AFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,AFILE); - fclose(AFILE); - - //ScaLBL_Comm->RegularLayout(Map,&Den[Np],PhaseField); - ScaLBL_CopyToHost(PhaseField.data(), DenB, sizeof(double)*N); - FILE *BFILE; - sprintf(LocalRankFilename,"B.%05i.raw",rank); - BFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,BFILE); - fclose(BFILE); - - ScaLBL_Comm->RegularLayout(Map,Pressure_dvc,PhaseField); - FILE *PFILE; - sprintf(LocalRankFilename,"Pressure.%05i.raw",rank); - PFILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,PFILE); - fclose(PFILE); - - ScaLBL_Comm->RegularLayout(Map,&Velocity[0],PhaseField); - FILE *VELX_FILE; - sprintf(LocalRankFilename,"Velocity_X.%05i.raw",rank); - VELX_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,VELX_FILE); - fclose(VELX_FILE); - - ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],PhaseField); - FILE *VELY_FILE; - sprintf(LocalRankFilename,"Velocity_Y.%05i.raw",rank); - VELY_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,VELY_FILE); - fclose(VELY_FILE); - - ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],PhaseField); - FILE *VELZ_FILE; - sprintf(LocalRankFilename,"Velocity_Z.%05i.raw",rank); - VELZ_FILE = fopen(LocalRankFilename,"wb"); - fwrite(PhaseField.data(),8,N,VELZ_FILE); - fclose(VELZ_FILE); - -// ScaLBL_Comm->RegularLayout(Map,&Porosity[0],PhaseField); -// FILE *POROS_FILE; -// sprintf(LocalRankFilename,"Porosity.%05i.raw",rank); -// POROS_FILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,POROS_FILE); -// fclose(POROS_FILE); -// -// ScaLBL_Comm->RegularLayout(Map,&Permeability[0],PhaseField); -// FILE *PERM_FILE; -// sprintf(LocalRankFilename,"Permeability.%05i.raw",rank); -// PERM_FILE = fopen(LocalRankFilename,"wb"); -// fwrite(PhaseField.data(),8,N,PERM_FILE); -// fclose(PERM_FILE); -} diff --git a/models/GreyscaleSCModel.h b/models/GreyscaleSCModel.h deleted file mode 100644 index e5e79d68..00000000 --- a/models/GreyscaleSCModel.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -Implementation of color lattice boltzmann model - */ -#include -#include -#include -#include -#include -#include -#include - -#include "common/Communication.h" -#include "common/MPI.h" -#include "common/Database.h" -#include "common/ScaLBL.h" -#include "ProfilerApp.h" -#include "threadpool/thread_pool.h" - -class ScaLBL_GreyscaleSCModel{ -public: - ScaLBL_GreyscaleSCModel(int RANK, int NP, MPI_Comm COMM); - ~ScaLBL_GreyscaleSCModel(); - - // functions in they should be run - void ReadParams(string filename); - void ReadParams(std::shared_ptr db0); - void SetDomain(); - void ReadInput(); - void Create(); - void Initialize(); - void Run(); - void WriteDebug(); - void WriteOutput(); - - bool Restart,pBC; - int timestep,timestepMax; - int BoundaryCondition; - int CollisionType; - double tauA,tauB; - double tauA_eff,tauB_eff; - double Gsc; - double rhoA,rhoB; - double rhoA_minor,rhoB_minor;//dissolved density - double tolerance; - double Fx,Fy,Fz; - double fluxA,fluxB; - double dinA,doutA; - double dinB,doutB; - double GreyPorosity; - - int Nx,Ny,Nz,N,Np; - int rank,nprocx,nprocy,nprocz,nprocs; - double Lx,Ly,Lz; - - std::shared_ptr Dm; // this domain is for analysis - std::shared_ptr Mask; // this domain is for lbm - std::shared_ptr ScaLBL_Comm; - std::shared_ptr ScaLBL_Comm_Regular; - - // input database - std::shared_ptr db; - std::shared_ptr domain_db; - std::shared_ptr greyscaleSC_db; - std::shared_ptr analysis_db; - std::shared_ptr vis_db; - - signed char *id; - int *NeighborList; - int *dvcMap; - double *fqA, *fqB; - double *Permeability;//grey voxel permeability - //double relPermA,relPermB;//grey voxel relperm - double *Porosity; - double *Velocity; - double *Pressure_dvc; - double *DenA, *DenB; - double *DenGradA,*DenGradB; - double *SolidForceA,*SolidForceB; - - IntArray Map; - DoubleArray SignDist; - DoubleArray Velocity_x; - DoubleArray Velocity_y; - DoubleArray Velocity_z; - DoubleArray PorosityMap; - DoubleArray Pressure; - DoubleArray DenA_data; - DoubleArray DenB_data; - -private: - MPI_Comm comm; - - int dist_mem_size; - int neighborSize; - // filenames - char LocalRankString[8]; - char LocalRankFilename[40]; - char LocalRestartFile[40]; - - void AssignGreyscaleAndSolidLabels(); - void Density_Init(); -}; - diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2495593a..c536a7ec 100755 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -4,8 +4,6 @@ ADD_LBPM_EXECUTABLE( lbpm_color_simulator ) ADD_LBPM_EXECUTABLE( lbpm_permeability_simulator ) ADD_LBPM_EXECUTABLE( lbpm_greyscale_simulator ) -ADD_LBPM_EXECUTABLE( lbpm_greyscaleFE_simulator ) -ADD_LBPM_EXECUTABLE( lbpm_greyscaleSC_simulator ) ADD_LBPM_EXECUTABLE( lbpm_greyscaleColor_simulator ) #ADD_LBPM_EXECUTABLE( lbpm_BGK_simulator ) #ADD_LBPM_EXECUTABLE( lbpm_color_macro_simulator ) diff --git a/tests/lbpm_greyscaleFE_simulator.cpp b/tests/lbpm_greyscaleFE_simulator.cpp deleted file mode 100644 index 22157bee..00000000 --- a/tests/lbpm_greyscaleFE_simulator.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "common/ScaLBL.h" -#include "common/Communication.h" -#include "common/MPI.h" -#include "models/GreyscaleFEModel.h" -//#define WRITE_SURFACES - -using namespace std; - - -int main(int argc, char **argv) -{ - //***************************************** - // ***** MPI STUFF **************** - //***************************************** - // Initialize MPI - int rank,nprocs; - MPI_Init(&argc,&argv); - MPI_Comm comm = MPI_COMM_WORLD; - MPI_Comm_rank(comm,&rank); - MPI_Comm_size(comm,&nprocs); - { - // parallel domain size (# of sub-domains) - int nprocx,nprocy,nprocz; - int iproc,jproc,kproc; - - if (rank == 0){ - printf("****************************************\n"); - printf("Running Greyscale Two-Phase Calculation \n"); - printf("****************************************\n"); - } - // Initialize compute device - int device=ScaLBL_SetDevice(rank); - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - - ScaLBL_GreyscaleFEModel GreyscaleFE(rank,nprocs,comm); - auto filename = argv[1]; - GreyscaleFE.ReadParams(filename); - GreyscaleFE.SetDomain(); // this reads in the domain - GreyscaleFE.ReadInput(); - GreyscaleFE.Create(); // creating the model will create data structure to match the pore structure and allocate variables - GreyscaleFE.Initialize(); // initializing the model will set initial conditions for variables - GreyscaleFE.Run(); - //GreyscaleFE.VelocityField(); - GreyscaleFE.WriteDebug(); - } - // **************************************************** - MPI_Barrier(comm); - MPI_Finalize(); - // **************************************************** -} diff --git a/tests/lbpm_greyscaleSC_simulator.cpp b/tests/lbpm_greyscaleSC_simulator.cpp deleted file mode 100644 index 340be938..00000000 --- a/tests/lbpm_greyscaleSC_simulator.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "common/ScaLBL.h" -#include "common/Communication.h" -#include "common/MPI.h" -#include "models/GreyscaleSCModel.h" -//#define WRITE_SURFACES - -using namespace std; - - -int main(int argc, char **argv) -{ - //***************************************** - // ***** MPI STUFF **************** - //***************************************** - // Initialize MPI - int rank,nprocs; - MPI_Init(&argc,&argv); - MPI_Comm comm = MPI_COMM_WORLD; - MPI_Comm_rank(comm,&rank); - MPI_Comm_size(comm,&nprocs); - { - // parallel domain size (# of sub-domains) - int nprocx,nprocy,nprocz; - int iproc,jproc,kproc; - - if (rank == 0){ - printf("****************************************\n"); - printf("Running Greyscale Two-Phase Calculation \n"); - printf("****************************************\n"); - } - // Initialize compute device - int device=ScaLBL_SetDevice(rank); - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - - ScaLBL_GreyscaleSCModel GreyscaleSC(rank,nprocs,comm); - auto filename = argv[1]; - GreyscaleSC.ReadParams(filename); - GreyscaleSC.SetDomain(); // this reads in the domain - GreyscaleSC.ReadInput(); - GreyscaleSC.Create(); // creating the model will create data structure to match the pore structure and allocate variables - GreyscaleSC.Initialize(); // initializing the model will set initial conditions for variables - GreyscaleSC.Run(); - GreyscaleSC.WriteDebug(); - } - // **************************************************** - MPI_Barrier(comm); - MPI_Finalize(); - // **************************************************** -} From d24198e76a278cc8cd32d6435480555087c05b95 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Wed, 19 Aug 2020 22:22:35 -0400 Subject: [PATCH 73/75] done cleaning up the code --- models/GreyscaleColorModel.cpp | 6 +- models/GreyscaleModel.cpp | 2 +- tests/lbpm_greyscaleColor_simulator.cpp | 93 ++++++++++++++---------- tests/lbpm_greyscale_simulator.cpp | 97 ++++++++++++++----------- 4 files changed, 110 insertions(+), 88 deletions(-) diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 6525c09c..d97c844d 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -596,15 +596,15 @@ void ScaLBL_GreyscaleColorModel::AssignGreyPoroPermLabels() if (rank==0){ printf("Image resolution: %.5g [um/voxel]\n",Dm->voxel_length); - printf("Number of component labels: %lu \n",NLABELS); + printf("Number of Grey-fluid labels: %lu \n",NLABELS); for (unsigned int idx=0; idxvoxel_length/Dm->voxel_length,volume_fraction); - printf(" effective porosity=%.3g\n",volume_fraction*POROSITY); + printf(" effective porosity=%.3g\n",volume_fraction*POROSITY); } printf("The weighted porosity, considering both open and grey voxels, is %.3g\n",GreyPorosity); } diff --git a/models/GreyscaleModel.cpp b/models/GreyscaleModel.cpp index f2f94f9d..85832a4b 100644 --- a/models/GreyscaleModel.cpp +++ b/models/GreyscaleModel.cpp @@ -274,7 +274,7 @@ void ScaLBL_GreyscaleModel::AssignComponentLabels(double *Porosity, double *Perm if (rank==0){ printf("Image resolution: %.5g [um/voxel]\n",Dm->voxel_length); - printf("Component labels: %lu \n",NLABELS); + printf("Number of component labels: %lu \n",NLABELS); for (unsigned int idx=0; idx #include -#include "common/ScaLBL.h" -#include "common/Communication.h" -#include "common/MPI.h" #include "models/GreyscaleColorModel.h" +#include "common/Utilities.h" //#define WRITE_SURFACES +//************************************************************************* +// Implementation of Greyscale Two-Fluid Color LBM using CUDA +//************************************************************************* + using namespace std; int main(int argc, char **argv) { - //***************************************** - // ***** MPI STUFF **************** - //***************************************** - // Initialize MPI - int rank,nprocs; - MPI_Init(&argc,&argv); - MPI_Comm comm = MPI_COMM_WORLD; - MPI_Comm_rank(comm,&rank); - MPI_Comm_size(comm,&nprocs); - { - // parallel domain size (# of sub-domains) - int nprocx,nprocy,nprocz; - int iproc,jproc,kproc; - if (rank == 0){ - printf("****************************************\n"); - printf("Running Greyscale Two-Phase Calculation \n"); - printf("****************************************\n"); - } - // Initialize compute device - int device=ScaLBL_SetDevice(rank); - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - - ScaLBL_GreyscaleColorModel GreyscaleColor(rank,nprocs,comm); - auto filename = argv[1]; - GreyscaleColor.ReadParams(filename); - GreyscaleColor.SetDomain(); // this reads in the domain - GreyscaleColor.ReadInput(); - GreyscaleColor.Create(); // creating the model will create data structure to match the pore structure and allocate variables - GreyscaleColor.Initialize(); // initializing the model will set initial conditions for variables - GreyscaleColor.Run(); - GreyscaleColor.WriteDebug(); - } - // **************************************************** - MPI_Barrier(comm); - MPI_Finalize(); - // **************************************************** + // Initialize MPI and error handlers + Utilities::startup( argc, argv ); + + { // Limit scope so variables that contain communicators will free before MPI_Finialize + + MPI_Comm comm; + MPI_Comm_dup(MPI_COMM_WORLD,&comm); + int rank = comm_rank(comm); + int nprocs = comm_size(comm); + + if (rank == 0){ + printf("****************************************\n"); + printf("Running Greyscale Two-Phase Calculation \n"); + printf("****************************************\n"); + } + // Initialize compute device + ScaLBL_SetDevice(rank); + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); + + PROFILE_ENABLE(1); + //PROFILE_ENABLE_TRACE(); + //PROFILE_ENABLE_MEMORY(); + PROFILE_SYNCHRONIZE(); + PROFILE_START("Main"); + Utilities::setErrorHandlers(); + + auto filename = argv[1]; + ScaLBL_GreyscaleColorModel GreyscaleColor(rank,nprocs,comm); + GreyscaleColor.ReadParams(filename); + GreyscaleColor.SetDomain(); + GreyscaleColor.ReadInput(); + GreyscaleColor.Create(); // creating the model will create data structure to match the pore structure and allocate variables + GreyscaleColor.Initialize(); // initializing the model will set initial conditions for variables + GreyscaleColor.Run(); + GreyscaleColor.WriteDebug(); + + PROFILE_STOP("Main"); + PROFILE_SAVE("lbpm_greyscaleColor_simulator",1); + // **************************************************** + + MPI_Barrier(comm); + MPI_Comm_free(&comm); + + } // Limit scope so variables that contain communicators will free before MPI_Finialize + + Utilities::shutdown(); + } diff --git a/tests/lbpm_greyscale_simulator.cpp b/tests/lbpm_greyscale_simulator.cpp index 782ed5b5..df8cb3cb 100644 --- a/tests/lbpm_greyscale_simulator.cpp +++ b/tests/lbpm_greyscale_simulator.cpp @@ -6,58 +6,67 @@ #include #include -#include "common/ScaLBL.h" -#include "common/Communication.h" -#include "common/MPI_Helpers.h" #include "models/GreyscaleModel.h" +#include "common/Utilities.h" //#define WRITE_SURFACES -/* - * Simulator for two-phase flow in porous media - * James E. McClure 2013-2014 - */ +//**************************************************************** +// Implementation of Greyscale Single-Fluid LBM using CUDA +//**************************************************************** using namespace std; int main(int argc, char **argv) { - //***************************************** - // ***** MPI STUFF **************** - //***************************************** - // Initialize MPI - int rank,nprocs; - MPI_Init(&argc,&argv); - MPI_Comm comm = MPI_COMM_WORLD; - MPI_Comm_rank(comm,&rank); - MPI_Comm_size(comm,&nprocs); - { - // parallel domain size (# of sub-domains) - if (rank == 0){ - printf("********************************************************\n"); - printf("Running Greyscale Single Phase Permeability Calculation \n"); - printf("********************************************************\n"); - } - // Initialize compute device - int device=ScaLBL_SetDevice(rank); - NULL_USE(device); - ScaLBL_DeviceBarrier(); - MPI_Barrier(comm); - - ScaLBL_GreyscaleModel Greyscale(rank,nprocs,comm); - auto filename = argv[1]; - Greyscale.ReadParams(filename); - Greyscale.SetDomain(); // this reads in the domain - Greyscale.ReadInput(); - Greyscale.Create(); // creating the model will create data structure to match the pore structure and allocate variables - Greyscale.Initialize(); // initializing the model will set initial conditions for variables - Greyscale.Run(); - Greyscale.VelocityField(); - //Greyscale.WriteDebug(); - } - // **************************************************** - MPI_Barrier(comm); - MPI_Finalize(); - // **************************************************** + // Initialize MPI and error handlers + Utilities::startup( argc, argv ); + + { // Limit scope so variables that contain communicators will free before MPI_Finialize + + MPI_Comm comm; + MPI_Comm_dup(MPI_COMM_WORLD,&comm); + int rank = comm_rank(comm); + int nprocs = comm_size(comm); + + if (rank == 0){ + printf("********************************************************\n"); + printf("Running Greyscale Single Phase Permeability Calculation \n"); + printf("********************************************************\n"); + } + // Initialize compute device + ScaLBL_SetDevice(rank); + ScaLBL_DeviceBarrier(); + MPI_Barrier(comm); + + PROFILE_ENABLE(1); + //PROFILE_ENABLE_TRACE(); + //PROFILE_ENABLE_MEMORY(); + PROFILE_SYNCHRONIZE(); + PROFILE_START("Main"); + Utilities::setErrorHandlers(); + + auto filename = argv[1]; + ScaLBL_GreyscaleModel Greyscale(rank,nprocs,comm); + Greyscale.ReadParams(filename); + Greyscale.SetDomain(); + Greyscale.ReadInput(); + Greyscale.Create(); // creating the model will create data structure to match the pore structure and allocate variables + Greyscale.Initialize(); // initializing the model will set initial conditions for variables + Greyscale.Run(); + Greyscale.VelocityField(); + //Greyscale.WriteDebug(); + + PROFILE_STOP("Main"); + PROFILE_SAVE("lbpm_greyscale_simulator",1); + // **************************************************** + + MPI_Barrier(comm); + MPI_Comm_free(&comm); + + } // Limit scope so variables that contain communicators will free before MPI_Finialize + + Utilities::shutdown(); + } From 0b480294b5d60e636ed479b75305532537bbc582 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sat, 29 Aug 2020 12:22:20 -0400 Subject: [PATCH 74/75] fix spill of integer index in AggregateLabels --- common/Domain.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/Domain.cpp b/common/Domain.cpp index eadc4592..7a1a6230 100644 --- a/common/Domain.cpp +++ b/common/Domain.cpp @@ -695,7 +695,7 @@ void Domain::AggregateLabels( const std::string& filename ){ int full_ny = npy*(ny-2); int full_nz = npz*(nz-2); int local_size = (nx-2)*(ny-2)*(nz-2); - long int full_size = long(full_nx)*long(full_ny)*long(full_nz); + unsigned long int full_size = long(full_nx)*long(full_ny)*long(full_nz); signed char *LocalID; LocalID = new signed char [local_size]; @@ -725,7 +725,7 @@ void Domain::AggregateLabels( const std::string& filename ){ int y = j-1; int z = k-1; int n_local = (k-1)*(nx-2)*(ny-2) + (j-1)*(nx-2) + i-1; - int n_full = z*full_nx*full_ny + y*full_nx + x; + unsigned long int n_full = z*long(full_nx)*long(full_ny) + y*long(full_nx) + x; FullID[n_full] = LocalID[n_local]; } } @@ -745,7 +745,7 @@ void Domain::AggregateLabels( const std::string& filename ){ int y = j-1 + ipy*(ny-2); int z = k-1 + ipz*(nz-2); int n_local = (k-1)*(nx-2)*(ny-2) + (j-1)*(nx-2) + i-1; - int n_full = z*full_nx*full_ny + y*full_nx + x; + unsigned long int n_full = z*long(full_nx)*long(full_ny) + y*long(full_nx) + x; FullID[n_full] = LocalID[n_local]; } } From ae9e7a04080ac21b400de382cfa789c9c2d1fafc Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sat, 29 Aug 2020 13:11:56 -0400 Subject: [PATCH 75/75] fix integer index bug in AggregateLabels in morphdrain --- common/Domain.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/Domain.cpp b/common/Domain.cpp index eadc4592..7a1a6230 100644 --- a/common/Domain.cpp +++ b/common/Domain.cpp @@ -695,7 +695,7 @@ void Domain::AggregateLabels( const std::string& filename ){ int full_ny = npy*(ny-2); int full_nz = npz*(nz-2); int local_size = (nx-2)*(ny-2)*(nz-2); - long int full_size = long(full_nx)*long(full_ny)*long(full_nz); + unsigned long int full_size = long(full_nx)*long(full_ny)*long(full_nz); signed char *LocalID; LocalID = new signed char [local_size]; @@ -725,7 +725,7 @@ void Domain::AggregateLabels( const std::string& filename ){ int y = j-1; int z = k-1; int n_local = (k-1)*(nx-2)*(ny-2) + (j-1)*(nx-2) + i-1; - int n_full = z*full_nx*full_ny + y*full_nx + x; + unsigned long int n_full = z*long(full_nx)*long(full_ny) + y*long(full_nx) + x; FullID[n_full] = LocalID[n_local]; } } @@ -745,7 +745,7 @@ void Domain::AggregateLabels( const std::string& filename ){ int y = j-1 + ipy*(ny-2); int z = k-1 + ipz*(nz-2); int n_local = (k-1)*(nx-2)*(ny-2) + (j-1)*(nx-2) + i-1; - int n_full = z*full_nx*full_ny + y*full_nx + x; + unsigned long int n_full = z*long(full_nx)*long(full_ny) + y*long(full_nx) + x; FullID[n_full] = LocalID[n_local]; } }