refacotr morph LBM with target vol
This commit is contained in:
@@ -3,6 +3,7 @@ color lattice boltzmann model
|
||||
*/
|
||||
#include "models/ColorModel.h"
|
||||
#include "analysis/distance.h"
|
||||
#include "analysis/morphology.h"
|
||||
|
||||
ScaLBL_ColorModel::ScaLBL_ColorModel(int RANK, int NP, MPI_Comm COMM):
|
||||
rank(RANK), nprocs(NP), Restart(0),timestep(0),timestepMax(0),tauA(0),tauB(0),rhoA(0),rhoB(0),alpha(0),beta(0),
|
||||
@@ -644,18 +645,18 @@ void ScaLBL_ColorModel::Run(){
|
||||
if (rank==0) printf("***Morphological step with target saturation %f ***\n",TARGET_SATURATION);
|
||||
double volB = Averages->Volume_w();
|
||||
double volA = Averages->Volume_n();
|
||||
double delta_volume = MorphInit(beta,morph_delta);
|
||||
double delta_volume_target = volB - (volA + volB)*TARGET_SATURATION; // change in volume to A
|
||||
double delta_volume = MorphInit(beta,delta_volume_target);
|
||||
// update the volume
|
||||
volA += delta_volume;
|
||||
volB -= delta_volume;
|
||||
if ((delta_volume_target - delta_volume) / delta_volume > 0.f){
|
||||
/*if ((delta_volume_target - delta_volume) / delta_volume > 0.f){
|
||||
morph_delta *= 1.01*min((delta_volume_target - delta_volume) / delta_volume, 2.0);
|
||||
if (morph_delta > 1.f) morph_delta = 1.f;
|
||||
if (morph_delta < -1.f) morph_delta = -1.f;
|
||||
if (fabs(morph_delta) < 0.05 ) morph_delta = 0.05*(morph_delta)/fabs(morph_delta); // set minimum
|
||||
if (rank==0) printf(" Adjust morph delta: %f \n", morph_delta);
|
||||
}
|
||||
}*/
|
||||
if (morph_delta < 0.f){
|
||||
if (volB/(volA + volB) > TARGET_SATURATION){
|
||||
MORPH_ADAPT = false;
|
||||
@@ -697,11 +698,12 @@ void ScaLBL_ColorModel::Run(){
|
||||
// ************************************************************************
|
||||
}
|
||||
|
||||
double ScaLBL_ColorModel::MorphInit(const double beta, const double morph_delta){
|
||||
double ScaLBL_ColorModel::MorphInit(const double beta, const double target_delta_volume){
|
||||
const RankInfoStruct rank_info(rank,nprocx,nprocy,nprocz);
|
||||
|
||||
double vF = 0.f;
|
||||
double vS = 0.f;
|
||||
double delta_volume;
|
||||
|
||||
DoubleArray phase(Nx,Ny,Nz);
|
||||
IntArray phase_label(Nx,Ny,Nz);;
|
||||
@@ -761,8 +763,8 @@ double ScaLBL_ColorModel::MorphInit(const double beta, const double morph_delta)
|
||||
}
|
||||
}
|
||||
|
||||
// 4. Apply erosion / dilation operation to phase_distance
|
||||
for (int k=0; k<Nz; k++){
|
||||
// 4a. Apply erosion / dilation operation to phase_distance
|
||||
/* for (int k=0; k<Nz; k++){
|
||||
for (int j=0; j<Ny; j++){
|
||||
for (int i=0; i<Nx; i++){
|
||||
double walldist=Averages->SDs(i,j,k);
|
||||
@@ -771,6 +773,15 @@ double ScaLBL_ColorModel::MorphInit(const double beta, const double morph_delta)
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if (target_delta_volume > 0.0){
|
||||
delta_volume = MorphGrow(Averages->SDs,phase_distance,phase_id,Averages->Dm,target_delta_volume);
|
||||
}
|
||||
else{
|
||||
double target_void_fraction = (volume_initial+target_delta_volume)/volume_initial;
|
||||
double void_fraction = MorphOpen(phase_distance,phase_id.data(),Averages->Dm,target_void_fraction);
|
||||
}
|
||||
|
||||
// 5. Update phase indicator field based on new distnace
|
||||
for (int k=0; k<Nz; k++){
|
||||
@@ -799,7 +810,7 @@ double ScaLBL_ColorModel::MorphInit(const double beta, const double morph_delta)
|
||||
MPI_Allreduce(&count,&count_global,1,MPI_DOUBLE,MPI_SUM,comm);
|
||||
volume_final=count_global;
|
||||
|
||||
double delta_volume = (volume_final-volume_initial);
|
||||
delta_volume = (volume_final-volume_initial);
|
||||
if (rank == 0) printf("MorphInit: change fluid volume fraction by %f \n", delta_volume/volume_initial);
|
||||
|
||||
// 6. copy back to the device
|
||||
|
||||
Reference in New Issue
Block a user