From f3ba90337a33836366888edda4290bbc45f29744 Mon Sep 17 00:00:00 2001 From: Rex Zhe Li Date: Sun, 13 Dec 2020 19:34:56 -0500 Subject: [PATCH] to be compiled: add basic restart and write visualization functionality --- models/GreyscaleColorModel.cpp | 169 +++++++++++++++++++++++++++++++++ models/GreyscaleColorModel.h | 1 + 2 files changed, 170 insertions(+) diff --git a/models/GreyscaleColorModel.cpp b/models/GreyscaleColorModel.cpp index 9cb011e2..9ebad61c 100644 --- a/models/GreyscaleColorModel.cpp +++ b/models/GreyscaleColorModel.cpp @@ -9,6 +9,12 @@ Two-fluid greyscale color lattice boltzmann model #include #include +template +void DeleteArray( const TYPE *p ) +{ + delete [] p; +} + 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), @@ -786,6 +792,15 @@ void ScaLBL_GreyscaleColorModel::Run(){ double initial_volume = 0.0; double delta_volume = 0.0; double delta_volume_target = 0.0; + + //TODO -------- For temporary use - should be included in the analysis framework later ------------- + 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" ); + } + //------------------------------------------------------------------------------------------------- /* history for morphological algoirthm */ double KRA_MORPH_FACTOR=0.5; @@ -1015,6 +1030,51 @@ void ScaLBL_GreyscaleColorModel::Run(){ //************************************************************************ PROFILE_STOP("Update"); + //TODO For temporary use - writing Restart and Vis files should be included in the analysis framework in the future + if (timestep%restart_interval==0){ + //Use rank=0 write out Restart.db + if (rank==0) { + greyscaleColor_db->putScalar("timestep",timestep); + greyscaleColor_db->putScalar( "Restart", true ); + current_db->putDatabase("Color", greyscaleColor_db); + std::ofstream OutStream("Restart.db"); + current_db->print(OutStream, ""); + OutStream.close(); + + } + //Write out Restart data. + std::shared_ptr cDen; + std::shared_ptr cfq; + cDen = std::shared_ptr(new double[2*Np], DeleteArray); + cfq = std::shared_ptr(new double[19*Np],DeleteArray); + ScaLBL_CopyToHost(cDen.get(),Den,2*Np*sizeof(double));// Copy restart data to the CPU + ScaLBL_CopyToHost(cfq.get(), fq,19*Np*sizeof(double));// Copy restart data to the CPU + + ofstream RESTARTFILE(LocalRestartFile,ios::binary); + double value; + for (int n=0; n 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 PhaseVar = std::make_shared(); + + // Create the MeshDataStruct + IO::initialize("","silo","false"); + 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 ); + + // create a temp data for copy from device + DoubleArray DataTemp(Nx,Ny,Nz); + + if (vis_db->getWithDefault( "save_phase_field", true )){ + + PhaseVar->name = "Phase"; + PhaseVar->type = IO::VariableType::VolumeVariable; + PhaseVar->dim = 1; + PhaseVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); + visData[0].vars.push_back(PaseVar); + + ASSERT(visData[0].vars[0]->name=="Phase"); + Array& PhaseData = visData[0].vars[0]->data; + ScaLBL_Comm->RegularLayout(Map,Phase,DataTemp); + fillData.copy(DataTemp,PhaseData); + } + + if (vis_db->getWithDefault( "save_pressure", false )){ + + 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); + + ASSERT(visData[0].vars[1]->name=="Pressure"); + Array& PressData = visData[0].vars[1]->data; + ScaLBL_Comm->RegularLayout(Map,Pressure,DataTemp); + fillData.copy(DataTemp,PressData); + } + + if (vis_db->getWithDefault( "save_velocity", false )){ + + 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); + + ASSERT(visData[0].vars[2]->name=="Velocity_x"); + ASSERT(visData[0].vars[3]->name=="Velocity_y"); + ASSERT(visData[0].vars[4]->name=="Velocity_z"); + Array& VelxData = visData[0].vars[2]->data; + Array& VelyData = visData[0].vars[3]->data; + Array& VelzData = visData[0].vars[4]->data; + ScaLBL_Comm->RegularLayout(Map,&Velocity[0],DataTemp); + fillData.copy(DataTemp,VelxData); + ScaLBL_Comm->RegularLayout(Map,&Velocity[Np],DataTemp); + fillData.copy(DataTemp,VelyData); + ScaLBL_Comm->RegularLayout(Map,&Velocity[2*Np],DataTemp); + fillData.copy(DataTemp,VelzData); + } + + if (vis_db->getWithDefault( "save_distance", false )){ + + 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); + + ASSERT(visData[0].vars[5]->name=="SignDist"); + Array& SignData = visData[0].vars[5]->data; + fillData.copy(Averages.SDs,SignData); + } + + if (vis_db->getWithDefault( "write_silo", true )){ + IO::writeData( timestep, visData, Dm->Comm ); + } + + if (vis_db->getWithDefault( "save_8bit_raw", true )){ + //TODO + //char CurrentIDFilename[40]; + //sprintf(CurrentIDFilename,"id_t%d.raw",timestep); + //Averages.AggregateLabels(CurrentIDFilename); + } + +} + void ScaLBL_GreyscaleColorModel::WriteDebug(){ // Copy back final phase indicator field and convert to regular layout DoubleArray PhaseField(Nx,Ny,Nz); diff --git a/models/GreyscaleColorModel.h b/models/GreyscaleColorModel.h index d7043257..1ba92c8a 100644 --- a/models/GreyscaleColorModel.h +++ b/models/GreyscaleColorModel.h @@ -90,5 +90,6 @@ private: double MorphInit(const double beta, const double morph_delta); double SeedPhaseField(const double seed_water_in_oil); double MorphOpenConnected(double target_volume_change); + double WriteVisFiles(); };