refacotr morph LBM with target vol

This commit is contained in:
James E McClure
2018-12-05 13:09:00 -05:00
parent 8595ced0a8
commit 5b78622a89

View File

@@ -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