changed dfh interaction to mean-field type rule
This commit is contained in:
parent
873f5cff7e
commit
6ca49ed5d0
@ -437,6 +437,7 @@ int main(int argc, char **argv)
|
|||||||
Mask.CommInit(comm);
|
Mask.CommInit(comm);
|
||||||
double *PhaseLabel;
|
double *PhaseLabel;
|
||||||
PhaseLabel = new double[N];
|
PhaseLabel = new double[N];
|
||||||
|
Mask.AssignComponentLabels(PhaseLabel);
|
||||||
|
|
||||||
//...........................................................................
|
//...........................................................................
|
||||||
if (rank==0) printf ("Create ScaLBL_Communicator \n");
|
if (rank==0) printf ("Create ScaLBL_Communicator \n");
|
||||||
@ -506,27 +507,77 @@ int main(int argc, char **argv)
|
|||||||
if (rank==0) printf("Computing solid interaction potential \n");
|
if (rank==0) printf("Computing solid interaction potential \n");
|
||||||
double *Tmp;
|
double *Tmp;
|
||||||
Tmp=new double[3*Np];
|
Tmp=new double[3*Np];
|
||||||
Averages->UpdateMeshValues(); // this computes the gradient of distance field (among other things)
|
//Averages->UpdateMeshValues(); // this computes the gradient of distance field (among other things)
|
||||||
double count_wet=0.f;
|
// Create the distance stencil
|
||||||
|
// Compute solid forces based on mean field approximation
|
||||||
|
double *Dst;
|
||||||
|
Dst = new double [5*5*5];
|
||||||
|
for (int kk=0; kk<5; kk++){
|
||||||
|
for (int jj=0; jj<5; jj++){
|
||||||
|
for (int ii=0; ii<5; ii++){
|
||||||
|
int index = kk*25+jj*5+ii;
|
||||||
|
Dst[index] = sqrt(double(ii-2)*double(ii-2) + double(jj-2)*double(jj-2)+ double(kk-2)*double(kk-2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
for (k=1; k<Nz-1; k++){
|
for (k=1; k<Nz-1; k++){
|
||||||
for (j=1; j<Ny-1; j++){
|
for (j=1; j<Ny-1; j++){
|
||||||
for (i=1; i<Nx-1; i++){
|
for (i=1; i<Nx-1; i++){
|
||||||
int idx=Map(i,j,k);
|
int idx=Map(i,j,k);
|
||||||
int n = k*Nx*Ny+j*Nx+i;
|
int n = k*Nx*Ny+j*Nx+i;
|
||||||
if (!(idx < 0)){
|
if (!(idx < 0)){
|
||||||
double d = Averages->SDs(n);
|
|
||||||
double dx = Averages->SDs_x(n);
|
double phi_x = 0.f;
|
||||||
double dy = Averages->SDs_y(n);
|
double phi_y = 0.f;
|
||||||
double dz = Averages->SDs_z(n);
|
double phi_z = 0.f;
|
||||||
double value=cns*exp(-bns*fabs(d))-cws*exp(-bns*fabs(d));
|
for (int kk=0; kk<5; kk++){
|
||||||
|
for (int jj=0; jj<5; jj++){
|
||||||
|
for (int ii=0; ii<5; ii++){
|
||||||
|
|
||||||
|
int index = kk*25+jj*5+ii;
|
||||||
|
double distval= Dst[index];
|
||||||
|
|
||||||
|
int idi=i+ii-2;
|
||||||
|
int idj=j+jj-2;
|
||||||
|
int idk=k+kk-2;
|
||||||
|
|
||||||
|
if (idi < 0) idi=0;
|
||||||
|
if (idj < 0) idj=0;
|
||||||
|
if (idk < 0) idk=0;
|
||||||
|
if (!(idi < Nx)) idi=Nx-1;
|
||||||
|
if (!(idj < Ny)) idj=Ny-1;
|
||||||
|
if (!(idk < Nz)) idk=Nz-1;
|
||||||
|
|
||||||
|
int nn = idk*Nx*Ny + idj*Nx + idi;
|
||||||
|
if (!(Mask.id[nn] > 0)){
|
||||||
|
double vec_x = double(ii-2);
|
||||||
|
double vec_y = double(jj-2);
|
||||||
|
double vec_z = double(kk-2);
|
||||||
|
|
||||||
|
double ALPHA=PhaseLabel[nn];
|
||||||
|
double GAMMA=-2.f;
|
||||||
|
if (distval > 2.f) ALPHA=0.f; // symmetric cutoff distance
|
||||||
|
phi_x += ALPHA*exp(GAMMA*distval)*vec_x/distval;
|
||||||
|
phi_y += ALPHA*exp(GAMMA*distval)*vec_y/distval;
|
||||||
|
phi_z += ALPHA*exp(GAMMA*distval)*vec_z/distval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Tmp[idx] = phi_x;
|
||||||
|
Tmp[idx+Np] = phi_y;
|
||||||
|
Tmp[idx+2*Np] = phi_z;
|
||||||
|
|
||||||
|
/* double d = Averages->SDs(n);
|
||||||
|
double dx = Averages->SDs_x(n);
|
||||||
|
double dy = Averages->SDs_y(n);
|
||||||
|
double dz = Averages->SDs_z(n);
|
||||||
|
double value=cns*exp(-bns*fabs(d))-cws*exp(-bns*fabs(d));
|
||||||
|
|
||||||
Tmp[idx] = value*dx;
|
Tmp[idx] = value*dx;
|
||||||
Tmp[idx+Np] = value*dy;
|
Tmp[idx+Np] = value*dy;
|
||||||
Tmp[idx+2*Np] = value*dz;
|
Tmp[idx+2*Np] = value*dz;
|
||||||
// initialize fluid phases
|
*/
|
||||||
if (Mask.id[n] == 1) PhaseLabel[idx] = 1.0;
|
|
||||||
else {
|
|
||||||
PhaseLabel[idx] = -1.0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -534,7 +585,41 @@ int main(int argc, char **argv)
|
|||||||
ScaLBL_CopyToDevice(SolidPotential, Tmp, 3*sizeof(double)*Np);
|
ScaLBL_CopyToDevice(SolidPotential, Tmp, 3*sizeof(double)*Np);
|
||||||
ScaLBL_DeviceBarrier();
|
ScaLBL_DeviceBarrier();
|
||||||
delete [] Tmp;
|
delete [] Tmp;
|
||||||
|
delete [] Dst;
|
||||||
|
|
||||||
|
DoubleArray Psx(Nx,Ny,Nz);
|
||||||
|
DoubleArray Psy(Nx,Ny,Nz);
|
||||||
|
DoubleArray Psz(Nx,Ny,Nz);
|
||||||
|
DoubleArray Psnorm(Nx,Ny,Nz);
|
||||||
|
ScaLBL_Comm.RegularLayout(Map,&SolidPotential[0],Psx);
|
||||||
|
ScaLBL_Comm.RegularLayout(Map,&SolidPotential[Np],Psy);
|
||||||
|
ScaLBL_Comm.RegularLayout(Map,&SolidPotential[2*Np],Psz);
|
||||||
|
for (n=0; n<N; n++) Psnorm(n) = Psx(n)*Psx(n)+Psy(n)*Psy(n)+Psz(n)*Psz(n);
|
||||||
|
FILE *PFILE;
|
||||||
|
sprintf(LocalRankFilename,"Potential.%05i.raw",rank);
|
||||||
|
PFILE = fopen(LocalRankFilename,"wb");
|
||||||
|
fwrite(Psnorm.data(),8,N,PFILE);
|
||||||
|
fclose(PFILE);
|
||||||
|
|
||||||
|
// initialize fluid phases
|
||||||
|
double count_wet=0.f;
|
||||||
|
for (k=1; k<Nz-1; k++){
|
||||||
|
for (j=1; j<Ny-1; j++){
|
||||||
|
for (i=1; i<Nx-1; i++){
|
||||||
|
int idx=Map(i,j,k);
|
||||||
|
int n = k*Nx*Ny+j*Nx+i;
|
||||||
|
if (!(idx < 0)){
|
||||||
|
if (Mask.id[n] == 1)
|
||||||
|
PhaseLabel[idx] = 1.0;
|
||||||
|
else {
|
||||||
|
PhaseLabel[idx] = -1.0;
|
||||||
|
count_wet+=1.f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("sw=%f \n",count_wet/double(Np));
|
||||||
// copy the neighbor list
|
// copy the neighbor list
|
||||||
ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize);
|
ScaLBL_CopyToDevice(NeighborList, neighborList, neighborSize);
|
||||||
// initialize phi based on PhaseLabel (include solid component labels)
|
// initialize phi based on PhaseLabel (include solid component labels)
|
||||||
@ -676,7 +761,7 @@ int main(int argc, char **argv)
|
|||||||
PROFILE_STOP("Update");
|
PROFILE_STOP("Update");
|
||||||
|
|
||||||
// Run the analysis
|
// Run the analysis
|
||||||
analysis.run( timestep, *Averages, Phi, Pressure, Velocity, fq, Den );
|
//analysis.run( timestep, *Averages, Phi, Pressure, Velocity, fq, Den );
|
||||||
|
|
||||||
}
|
}
|
||||||
analysis.finish();
|
analysis.finish();
|
||||||
|
Loading…
Reference in New Issue
Block a user