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(); - // **************************************************** -}