Enforcing mass conservation for opposing components in reservoir

This commit is contained in:
James E McClure
2018-03-19 11:00:59 -04:00
parent 517b30f174
commit 820a64c4ca
3 changed files with 75 additions and 46 deletions

View File

@@ -3986,7 +3986,7 @@ void ScaLBL_Communicator::Color_BC_z(int *Map, double *Phi, double *Den, double
double Value=(vA-vB)/(vA+vB);
if (kproc == 0) {
// Set the phase indicator field and density on the z inlet
ScaLBL_Color_BC(dvcSendList_z, Map, Phi, Den, vA, vB, sendCount_z, N);
ScaLBL_Color_BC_z(dvcSendList_z, Map, Phi, Den, vA, vB, sendCount_z, N);
ScaLBL_SetSlice_z(Phi,Value,Nx,Ny,Nz,0);
}
}
@@ -3995,7 +3995,7 @@ void ScaLBL_Communicator::Color_BC_Z(int *Map, double *Phi, double *Den, double
double Value=(vA-vB)/(vA+vB);
if (kproc == nprocz-1){
// Set the phase indicator field and density on the Z outlet
ScaLBL_Color_BC(dvcSendList_Z, Map, Phi, Den, vA, vB, sendCount_Z, N);
ScaLBL_Color_BC_Z(dvcSendList_Z, Map, Phi, Den, vA, vB, sendCount_Z, N);
ScaLBL_SetSlice_z(Phi,Value,Nx,Ny,Nz,Nz-1);
}
}

View File

@@ -103,48 +103,7 @@ extern "C" void ScaLBL_Color_InitDistance(char *ID, double *Den, double *Phi, do
//*************************************************************************
extern "C" void ScaLBL_Color_BC_z(double *Phi, double *Den, double *A_even, double *A_odd,
double *B_even, double *B_odd, int Nx, int Ny, int Nz)
{
int i,j,k,n,N;
N = Nx*Ny*Nz;
// Fill the inlet with component a
for (k=0; k<1; k++){
for (j=0;j<Ny;j++){
for (i=0;i<Nx;i++){
n = k*Nx*Ny+j*Nx+i;
Phi[n] = 1.0;
}
}
}
for (k=1; k<3; k++){
for (j=0;j<Ny;j++){
for (i=0;i<Nx;i++){
n = k*Nx*Ny+j*Nx+i;
Phi[n] = 1.0;
Den[n] = 1.0;
Den[N+n] = 0.0;
A_even[n] = 0.3333333333333333;
A_odd[n] = 0.1111111111111111;
A_even[N+n] = 0.1111111111111111;
A_odd[N+n] = 0.1111111111111111;
A_even[2*N+n] = 0.1111111111111111;
A_odd[2*N+n] = 0.1111111111111111;
A_even[3*N+n] = 0.1111111111111111;
B_even[n] = 0.0;
B_odd[n] = 0.0;
B_even[N+n] = 0.0;
B_odd[N+n] = 0.0;
B_even[2*N+n] = 0.0;
B_odd[2*N+n] = 0.0;
B_even[3*N+n] = 0.0;
}
}
}
}
//*************************************************************************
extern "C" void ScaLBL_Color_BC(int *list, int *Map, double *Phi, double *Den, double vA, double vB, int count, int Np)
{
@@ -160,6 +119,36 @@ extern "C" void ScaLBL_Color_BC(int *list, int *Map, double *Phi, double *Den, d
Phi[nm] = (vA-vB)/(vA+vB);
}
}
extern "C" void ScaLBL_Color_BC_z(int *list, int *Map, double *Phi, double *Den, double vA, double vB, int count, int Np)
{
int idx,n,nm;
// Fill the outlet with component b
for (idx=0; idx<count; idx++){
n = list[idx];
Den[n] = vA;
double valB = Den[Np+n]; // mass that reaches inlet is conserved
nm = Map[n];
Phi[nm] = (vA-valB)/(vA+valB);
}
}
extern "C" void ScaLBL_Color_BC_Z(int *list, int *Map, double *Phi, double *Den, double vA, double vB, int count, int Np)
{
int idx,n,nm;
// Fill the outlet with component b
for (idx=0; idx<count; idx++){
n = list[idx];
double valA = Den[n]; // mass that reaches outlet is conserved
Den[Np+n] = vB;
nm = Map[n];
Phi[nm] = (valA-vB)/(valA+vB);
}
}
//*************************************************************************
//*************************************************************************

View File

@@ -125,6 +125,7 @@ __global__ void dvc_ScaLBL_Color_InitDistance(char *ID, double *Den, double *Ph
}
//*************************************************************************
__global__ void dvc_ScaLBL_Color_BC(int *list, int *Map, double *Phi, double *Den, double vA, double vB, int count, int Np)
{
int idx,n,nm;
@@ -139,6 +140,35 @@ __global__ void dvc_ScaLBL_Color_BC(int *list, int *Map, double *Phi, double *D
Phi[nm] = (vA-vB)/(vA+vB);
}
}
__global__ void dvc_ScaLBL_Color_BC_z(int *list, int *Map, double *Phi, double *Den, double vA, double vB, int count, int Np)
{
int idx,n,nm;
// Fill the outlet with component b
idx = blockIdx.x*blockDim.x + threadIdx.x;
if (idx < count){
n = list[idx];
Den[n] = vA;
double valB = Den[Np+n]; // mass that reaches inlet is conserved
nm = Map[n];
Phi[nm] = (vA-valB)/(vA+valB);
}
}
__global__ void dvc_ScaLBL_Color_BC_Z(int *list, int *Map, double *Phi, double *Den, double vA, double vB, int count, int Np)
{
int idx,n,nm;
// Fill the outlet with component b
idx = blockIdx.x*blockDim.x + threadIdx.x;
if (idx < count){
n = list[idx];
double valA = Den[n]; // mass that reaches outlet is conserved
Den[Np+n] = vB;
nm = Map[n];
Phi[nm] = (valA-vB)/(valA+vB);
}
}
//*************************************************************************
__global__ void dvc_ScaLBL_D3Q19_ColorGradient(char *ID, double *phi, double *ColorGrad, int Nx, int Ny, int Nz)
@@ -4077,13 +4107,23 @@ extern "C" void ScaLBL_D3Q19_AAodd_ColorMass(int *d_neighborList, double *Aq, do
}
}
extern "C" void ScaLBL_Color_BC(int *list, int *Map, double *Phi, double *Den, double vA, double vB, int count, int Np){
extern "C" void ScaLBL_Color_BC_z(int *list, int *Map, double *Phi, double *Den, double vA, double vB, int count, int Np){
int GRID = count / 512 + 1;
dvc_ScaLBL_Color_BC<<<GRID,512>>>(list, Map, Phi, Den, vA, vB, count, Np);
dvc_ScaLBL_Color_BC_z<<<GRID,512>>>(list, Map, Phi, Den, vA, vB, count, Np);
cudaError_t err = cudaGetLastError();
if (cudaSuccess != err){
printf("CUDA error in ScaLBL_Color_BC: %s \n",cudaGetErrorString(err));
printf("CUDA error in ScaLBL_Color_BC_z: %s \n",cudaGetErrorString(err));
}
}
extern "C" void ScaLBL_Color_BC_Z(int *list, int *Map, double *Phi, double *Den, double vA, double vB, int count, int Np){
int GRID = count / 512 + 1;
dvc_ScaLBL_Color_BC_Z<<<GRID,512>>>(list, Map, Phi, Den, vA, vB, count, Np);
cudaError_t err = cudaGetLastError();
if (cudaSuccess != err){
printf("CUDA error in ScaLBL_Color_BC_Z: %s \n",cudaGetErrorString(err));
}
}