Merge branch 'morphLBM' of github.com:JamesEMcClure/LBPM-WIA into morphLBM

This commit is contained in:
James McClure
2019-09-12 09:47:58 -04:00
4 changed files with 128 additions and 78 deletions

View File

@@ -165,28 +165,34 @@ public:
~WriteVisWorkItem() { } ~WriteVisWorkItem() { }
virtual void run() { virtual void run() {
PROFILE_START("Save Vis",1); PROFILE_START("Save Vis",1);
ASSERT(visData[0].vars[0]->name=="phase"); ASSERT(visData[0].vars[0]->name=="phase");
Array<double>& PhaseData = visData[0].vars[0]->data;
fillData.copy(Averages.SDn,PhaseData);
ASSERT(visData[0].vars[5]->name=="SignDist");
Array<double>& SignData = visData[0].vars[5]->data;
fillData.copy(Averages.SDs,SignData);
ASSERT(visData[0].vars[1]->name=="Pressure"); ASSERT(visData[0].vars[1]->name=="Pressure");
Array<double>& PressData = visData[0].vars[1]->data;
fillData.copy(Averages.Press,PressData);
ASSERT(visData[0].vars[2]->name=="Velocity_x"); ASSERT(visData[0].vars[2]->name=="Velocity_x");
ASSERT(visData[0].vars[3]->name=="Velocity_y"); ASSERT(visData[0].vars[3]->name=="Velocity_y");
ASSERT(visData[0].vars[4]->name=="Velocity_z"); ASSERT(visData[0].vars[4]->name=="Velocity_z");
ASSERT(visData[0].vars[5]->name=="SignDist");
ASSERT(visData[0].vars[6]->name=="BlobID");
Array<double>& PhaseData = visData[0].vars[0]->data;
Array<double>& PressData = visData[0].vars[1]->data;
Array<double>& VelxData = visData[0].vars[2]->data; Array<double>& VelxData = visData[0].vars[2]->data;
Array<double>& VelyData = visData[0].vars[3]->data; Array<double>& VelyData = visData[0].vars[3]->data;
Array<double>& VelzData = visData[0].vars[4]->data; Array<double>& VelzData = visData[0].vars[4]->data;
Array<double>& SignData = visData[0].vars[5]->data;
Array<double>& BlobData = visData[0].vars[6]->data;
fillData.copy(Averages.SDn,PhaseData);
fillData.copy(Averages.Press,PressData);
fillData.copy(Averages.SDs,SignData);
fillData.copy(Averages.Vel_x,VelxData); fillData.copy(Averages.Vel_x,VelxData);
fillData.copy(Averages.Vel_y,VelyData); fillData.copy(Averages.Vel_y,VelyData);
fillData.copy(Averages.Vel_z,VelzData); fillData.copy(Averages.Vel_z,VelzData);
ASSERT(visData[0].vars[6]->name=="BlobID");
Array<double>& BlobData = visData[0].vars[6]->data;
fillData.copy(Averages.Label_NWP,BlobData); fillData.copy(Averages.Label_NWP,BlobData);
IO::writeData( timestep, visData, comm.comm ); IO::writeData( timestep, visData, comm.comm );
PROFILE_STOP("Save Vis",1); PROFILE_STOP("Save Vis",1);
}; };
private: private:
@@ -202,44 +208,68 @@ private:
class IOWorkItem: public ThreadPool::WorkItemRet<void> class IOWorkItem: public ThreadPool::WorkItemRet<void>
{ {
public: public:
IOWorkItem( int timestep_, std::vector<IO::MeshDataStruct>& visData_, IOWorkItem( std::shared_ptr<Database> vis_db_, std::vector<IO::MeshDataStruct>& visData_,
SubPhase& Averages_, fillHalo<double>& fillData_, runAnalysis::commWrapper&& comm_ ): SubPhase& Averages_, fillHalo<double>& fillData_, runAnalysis::commWrapper&& comm_ ):
timestep(timestep_), visData(visData_), Averages(Averages_), fillData(fillData_), comm(std::move(comm_)) vis_db(vis_db_), visData(visData_), Averages(Averages_), fillData(fillData_), comm(std::move(comm_))
{ {
} }
~IOWorkItem() { } ~IOWorkItem() { }
virtual void run() { virtual void run() {
int timestep = vis_db->getWithDefault<int>( "timestep", 0 );
PROFILE_START("Save Vis",1); PROFILE_START("Save Vis",1);
ASSERT(visData[0].vars[0]->name=="phase");
ASSERT(visData[0].vars[1]->name=="Pressure"); if (vis_db->getWithDefault<bool>( "save_phase_field", true )){
ASSERT(visData[0].vars[2]->name=="Velocity_x"); ASSERT(visData[0].vars[0]->name=="phase");
ASSERT(visData[0].vars[3]->name=="Velocity_y"); Array<double>& PhaseData = visData[0].vars[0]->data;
ASSERT(visData[0].vars[4]->name=="Velocity_z"); fillData.copy(Averages.Phi,PhaseData);
ASSERT(visData[0].vars[5]->name=="SignDist"); }
ASSERT(visData[0].vars[6]->name=="BlobID");
Array<double>& PhaseData = visData[0].vars[0]->data; if (vis_db->getWithDefault<bool>( "save_pressure", false )){
Array<double>& PressData = visData[0].vars[1]->data; ASSERT(visData[0].vars[1]->name=="Pressure");
Array<double>& VelxData = visData[0].vars[2]->data; Array<double>& PressData = visData[0].vars[1]->data;
Array<double>& VelyData = visData[0].vars[3]->data; fillData.copy(Averages.Pressure,PressData);
Array<double>& VelzData = visData[0].vars[4]->data; }
Array<double>& SignData = visData[0].vars[5]->data;
Array<double>& BlobData = visData[0].vars[6]->data; if (vis_db->getWithDefault<bool>( "save_velocity", false )){
fillData.copy(Averages.Phi,PhaseData); ASSERT(visData[0].vars[2]->name=="Velocity_x");
fillData.copy(Averages.Pressure,PressData); ASSERT(visData[0].vars[3]->name=="Velocity_y");
fillData.copy(Averages.SDs,SignData); ASSERT(visData[0].vars[4]->name=="Velocity_z");
fillData.copy(Averages.Vel_x,VelxData); Array<double>& VelxData = visData[0].vars[2]->data;
fillData.copy(Averages.Vel_y,VelyData); Array<double>& VelyData = visData[0].vars[3]->data;
fillData.copy(Averages.Vel_z,VelzData); Array<double>& VelzData = visData[0].vars[4]->data;
fillData.copy(Averages.morph_n->label,BlobData); fillData.copy(Averages.Vel_x,VelxData);
IO::writeData( timestep, visData, comm.comm ); fillData.copy(Averages.Vel_y,VelyData);
char CurrentIDFilename[40]; fillData.copy(Averages.Vel_z,VelzData);
sprintf(CurrentIDFilename,"id_t%d.raw",timestep); }
Averages.AggregateLabels(CurrentIDFilename);
if (vis_db->getWithDefault<bool>( "save_distance", false )){
ASSERT(visData[0].vars[5]->name=="SignDist");
Array<double>& SignData = visData[0].vars[5]->data;
fillData.copy(Averages.SDs,SignData);
}
if (vis_db->getWithDefault<bool>( "save_connected_components", false )){
ASSERT(visData[0].vars[6]->name=="BlobID");
Array<double>& BlobData = visData[0].vars[6]->data;
fillData.copy(Averages.morph_n->label,BlobData);
}
if (vis_db->getWithDefault<bool>( "write_silo", true ))
IO::writeData( timestep, visData, comm.comm );
if (vis_db->getWithDefault<bool>( "save_8bit_raw", true )){
char CurrentIDFilename[40];
sprintf(CurrentIDFilename,"id_t%d.raw",timestep);
Averages.AggregateLabels(CurrentIDFilename);
}
PROFILE_STOP("Save Vis",1); PROFILE_STOP("Save Vis",1);
}; };
private: private:
IOWorkItem(); IOWorkItem();
int timestep; int timestep;
std::shared_ptr<Database> vis_db;
std::vector<IO::MeshDataStruct>& visData; std::vector<IO::MeshDataStruct>& visData;
SubPhase& Averages; SubPhase& Averages;
fillHalo<double>& fillData; fillHalo<double>& fillData;
@@ -247,7 +277,6 @@ private:
}; };
// Helper class to run the analysis from within a thread // Helper class to run the analysis from within a thread
// Note: Averages will be modified after the constructor is called // Note: Averages will be modified after the constructor is called
class AnalysisWorkItem: public ThreadPool::WorkItemRet<void> class AnalysisWorkItem: public ThreadPool::WorkItemRet<void>
@@ -487,6 +516,8 @@ runAnalysis::runAnalysis(std::shared_ptr<Database> input_db, const RankInfoStruc
{ {
auto db = input_db->getDatabase( "Analysis" ); auto db = input_db->getDatabase( "Analysis" );
auto vis_db = input_db->getDatabase( "Visualization" );
// Ids of work items to use for dependencies // Ids of work items to use for dependencies
ThreadPool::thread_id_t d_wait_blobID; ThreadPool::thread_id_t d_wait_blobID;
ThreadPool::thread_id_t d_wait_analysis; ThreadPool::thread_id_t d_wait_analysis;
@@ -525,6 +556,7 @@ runAnalysis::runAnalysis(std::shared_ptr<Database> input_db, const RankInfoStruc
IO::initialize("","silo","false"); IO::initialize("","silo","false");
// Create the MeshDataStruct // Create the MeshDataStruct
d_meshData.resize(1); d_meshData.resize(1);
d_meshData[0].meshName = "domain"; d_meshData[0].meshName = "domain";
d_meshData[0].mesh = std::make_shared<IO::DomainMesh>( Dm->rank_info,Dm->Nx-2,Dm->Ny-2,Dm->Nz-2,Dm->Lx,Dm->Ly,Dm->Lz ); d_meshData[0].mesh = std::make_shared<IO::DomainMesh>( Dm->rank_info,Dm->Nx-2,Dm->Ny-2,Dm->Nz-2,Dm->Lx,Dm->Ly,Dm->Lz );
auto PhaseVar = std::make_shared<IO::Variable>(); auto PhaseVar = std::make_shared<IO::Variable>();
@@ -535,43 +567,57 @@ runAnalysis::runAnalysis(std::shared_ptr<Database> input_db, const RankInfoStruc
auto SignDistVar = std::make_shared<IO::Variable>(); auto SignDistVar = std::make_shared<IO::Variable>();
auto BlobIDVar = std::make_shared<IO::Variable>(); auto BlobIDVar = std::make_shared<IO::Variable>();
PhaseVar->name = "phase"; if (vis_db->getWithDefault<bool>( "save_phase_field", true )){
PhaseVar->type = IO::VariableType::VolumeVariable; PhaseVar->name = "phase";
PhaseVar->dim = 1; PhaseVar->type = IO::VariableType::VolumeVariable;
PhaseVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); PhaseVar->dim = 1;
d_meshData[0].vars.push_back(PhaseVar); PhaseVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2);
PressVar->name = "Pressure"; d_meshData[0].vars.push_back(PhaseVar);
PressVar->type = IO::VariableType::VolumeVariable; }
PressVar->dim = 1;
PressVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2); if (vis_db->getWithDefault<bool>( "save_pressure", false )){
d_meshData[0].vars.push_back(PressVar); PressVar->name = "Pressure";
PressVar->type = IO::VariableType::VolumeVariable;
PressVar->dim = 1;
PressVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2);
d_meshData[0].vars.push_back(PressVar);
}
if (vis_db->getWithDefault<bool>( "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);
d_meshData[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);
d_meshData[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);
d_meshData[0].vars.push_back(VzVar);
}
if (vis_db->getWithDefault<bool>( "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);
d_meshData[0].vars.push_back(SignDistVar);
}
if (vis_db->getWithDefault<bool>( "save_connected_components", false )){
BlobIDVar->name = "BlobID";
BlobIDVar->type = IO::VariableType::VolumeVariable;
BlobIDVar->dim = 1;
BlobIDVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2);
d_meshData[0].vars.push_back(BlobIDVar);
}
VxVar->name = "Velocity_x";
VxVar->type = IO::VariableType::VolumeVariable;
VxVar->dim = 1;
VxVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2);
d_meshData[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);
d_meshData[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);
d_meshData[0].vars.push_back(VzVar);
SignDistVar->name = "SignDist";
SignDistVar->type = IO::VariableType::VolumeVariable;
SignDistVar->dim = 1;
SignDistVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2);
d_meshData[0].vars.push_back(SignDistVar);
BlobIDVar->name = "BlobID";
BlobIDVar->type = IO::VariableType::VolumeVariable;
BlobIDVar->dim = 1;
BlobIDVar->data.resize(Dm->Nx-2,Dm->Ny-2,Dm->Nz-2);
d_meshData[0].vars.push_back(BlobIDVar);
// Initialize the comms // Initialize the comms
MPI_Comm_dup(MPI_COMM_WORLD,&d_comm); MPI_Comm_dup(MPI_COMM_WORLD,&d_comm);
for (int i=0; i<1024; i++) { for (int i=0; i<1024; i++) {
@@ -893,6 +939,7 @@ void runAnalysis::basic( std::shared_ptr<Database> input_db, SubPhase &Averages,
// Check which analysis steps we need to perform // Check which analysis steps we need to perform
auto color_db = input_db->getDatabase( "Color" ); auto color_db = input_db->getDatabase( "Color" );
auto vis_db = input_db->getDatabase( "Visualization" );
int timestep = color_db->getWithDefault<int>( "timestep", 0 ); int timestep = color_db->getWithDefault<int>( "timestep", 0 );
auto type = computeAnalysisType( timestep ); auto type = computeAnalysisType( timestep );
@@ -979,7 +1026,7 @@ void runAnalysis::basic( std::shared_ptr<Database> input_db, SubPhase &Averages,
if (timestep%d_visualization_interval==0){ if (timestep%d_visualization_interval==0){
// Write the vis files // Write the vis files
auto work = new IOWorkItem( timestep, d_meshData, Averages, d_fillData, getComm() ); auto work = new IOWorkItem( vis_db, d_meshData, Averages, d_fillData, getComm() );
work->add_dependency(d_wait_analysis); work->add_dependency(d_wait_analysis);
work->add_dependency(d_wait_subphase); work->add_dependency(d_wait_subphase);
work->add_dependency(d_wait_vis); work->add_dependency(d_wait_vis);
@@ -989,9 +1036,10 @@ void runAnalysis::basic( std::shared_ptr<Database> input_db, SubPhase &Averages,
PROFILE_STOP("run"); PROFILE_STOP("run");
} }
void runAnalysis::WriteVisData( int timestep, SubPhase &Averages, const double *Phi, double *Pressure, double *Velocity, double *fq, double *Den) void runAnalysis::WriteVisData( std::shared_ptr<Database> vis_db, SubPhase &Averages, const double *Phi, double *Pressure, double *Velocity, double *fq, double *Den)
{ {
int N = d_N[0]*d_N[1]*d_N[2]; int N = d_N[0]*d_N[1]*d_N[2];
int timestep = vis_db->getWithDefault<int>( "timestep", 0 );
// Check which analysis steps we need to perform // Check which analysis steps we need to perform
auto type = computeAnalysisType( timestep ); auto type = computeAnalysisType( timestep );
@@ -1010,7 +1058,7 @@ void runAnalysis::WriteVisData( int timestep, SubPhase &Averages, const double *
PROFILE_START("write vis",1); PROFILE_START("write vis",1);
// if (Averages.WriteVis == true){ // if (Averages.WriteVis == true){
auto work2 = new IOWorkItem( timestep, d_meshData, Averages, d_fillData, getComm() ); auto work2 = new IOWorkItem( vis_db, d_meshData, Averages, d_fillData, getComm() );
work2->add_dependency(d_wait_vis); work2->add_dependency(d_wait_vis);
d_wait_vis = d_tpool.add_work(work2); d_wait_vis = d_tpool.add_work(work2);

View File

@@ -35,7 +35,7 @@ public:
double *Pressure, double *Velocity, double *fq, double *Den ); double *Pressure, double *Velocity, double *fq, double *Den );
void basic( std::shared_ptr<Database> db, SubPhase &Averages, const double *Phi, double *Pressure, double *Velocity, double *fq, double *Den ); void basic( std::shared_ptr<Database> db, SubPhase &Averages, const double *Phi, double *Pressure, double *Velocity, double *fq, double *Den );
void WriteVisData( int timestep, SubPhase &Averages, const double *Phi, double *Pressure, double *Velocity, double *fq, double *Den); void WriteVisData( std::shared_ptr<Database> vis_db, SubPhase &Averages, const double *Phi, double *Pressure, double *Velocity, double *fq, double *Den);
//! Finish all active analysis //! Finish all active analysis
void finish(); void finish();

View File

@@ -62,6 +62,7 @@ void ScaLBL_ColorModel::ReadParams(string filename){
domain_db = db->getDatabase( "Domain" ); domain_db = db->getDatabase( "Domain" );
color_db = db->getDatabase( "Color" ); color_db = db->getDatabase( "Color" );
analysis_db = db->getDatabase( "Analysis" ); analysis_db = db->getDatabase( "Analysis" );
vis_db = db->getDatabase( "Visualization" );
// set defaults // set defaults
timestepMax = 100000; timestepMax = 100000;
@@ -767,7 +768,7 @@ void ScaLBL_ColorModel::Run(){
delta_volume_target = Dm->Volume*volA *morph_delta; // set target volume change delta_volume_target = Dm->Volume*volA *morph_delta; // set target volume change
Averages->Full(); Averages->Full();
Averages->Write(timestep); Averages->Write(timestep);
analysis.WriteVisData( timestep, *Averages, Phi, Pressure, Velocity, fq, Den ); analysis.WriteVisData( vis_db, *Averages, Phi, Pressure, Velocity, fq, Den );
analysis.finish(); analysis.finish();
if (rank==0){ if (rank==0){

View File

@@ -55,6 +55,7 @@ public:
std::shared_ptr<Database> domain_db; std::shared_ptr<Database> domain_db;
std::shared_ptr<Database> color_db; std::shared_ptr<Database> color_db;
std::shared_ptr<Database> analysis_db; std::shared_ptr<Database> analysis_db;
std::shared_ptr<Database> vis_db;
IntArray Map; IntArray Map;
signed char *id; signed char *id;