From 079d646d7491996e0eb834448e8086c80b6b4720 Mon Sep 17 00:00:00 2001 From: James E McClure Date: Wed, 11 Sep 2019 16:07:52 -0400 Subject: [PATCH] refactor vis --- analysis/runAnalysis.cpp | 107 +++++++++++++++++++++++++-------------- analysis/runAnalysis.h | 2 +- 2 files changed, 69 insertions(+), 40 deletions(-) diff --git a/analysis/runAnalysis.cpp b/analysis/runAnalysis.cpp index 86e414ae..40fa3e23 100644 --- a/analysis/runAnalysis.cpp +++ b/analysis/runAnalysis.cpp @@ -165,28 +165,34 @@ public: ~WriteVisWorkItem() { } virtual void run() { PROFILE_START("Save Vis",1); + ASSERT(visData[0].vars[0]->name=="phase"); + Array& PhaseData = visData[0].vars[0]->data; + fillData.copy(Averages.SDn,PhaseData); + + ASSERT(visData[0].vars[5]->name=="SignDist"); + Array& SignData = visData[0].vars[5]->data; + fillData.copy(Averages.SDs,SignData); + ASSERT(visData[0].vars[1]->name=="Pressure"); + Array& PressData = visData[0].vars[1]->data; + fillData.copy(Averages.Press,PressData); + ASSERT(visData[0].vars[2]->name=="Velocity_x"); ASSERT(visData[0].vars[3]->name=="Velocity_y"); ASSERT(visData[0].vars[4]->name=="Velocity_z"); - ASSERT(visData[0].vars[5]->name=="SignDist"); - ASSERT(visData[0].vars[6]->name=="BlobID"); - Array& PhaseData = visData[0].vars[0]->data; - Array& PressData = visData[0].vars[1]->data; Array& VelxData = visData[0].vars[2]->data; Array& VelyData = visData[0].vars[3]->data; Array& VelzData = visData[0].vars[4]->data; - Array& SignData = visData[0].vars[5]->data; - Array& 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_y,VelyData); fillData.copy(Averages.Vel_z,VelzData); + + ASSERT(visData[0].vars[6]->name=="BlobID"); + Array& BlobData = visData[0].vars[6]->data; fillData.copy(Averages.Label_NWP,BlobData); IO::writeData( timestep, visData, comm.comm ); + PROFILE_STOP("Save Vis",1); }; private: @@ -202,44 +208,66 @@ private: class IOWorkItem: public ThreadPool::WorkItemRet { public: - IOWorkItem( int timestep_, std::vector& visData_, + IOWorkItem( std::shared_ptr vis_db_, std::vector& visData_, SubPhase& Averages_, fillHalo& 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() { } virtual void run() { + int timestep = vis_db->getWithDefault( "timestep", 0 ); + PROFILE_START("Save Vis",1); - ASSERT(visData[0].vars[0]->name=="phase"); - ASSERT(visData[0].vars[1]->name=="Pressure"); - ASSERT(visData[0].vars[2]->name=="Velocity_x"); - ASSERT(visData[0].vars[3]->name=="Velocity_y"); - ASSERT(visData[0].vars[4]->name=="Velocity_z"); - ASSERT(visData[0].vars[5]->name=="SignDist"); - ASSERT(visData[0].vars[6]->name=="BlobID"); - Array& PhaseData = visData[0].vars[0]->data; - Array& PressData = visData[0].vars[1]->data; - Array& VelxData = visData[0].vars[2]->data; - Array& VelyData = visData[0].vars[3]->data; - Array& VelzData = visData[0].vars[4]->data; - Array& SignData = visData[0].vars[5]->data; - Array& BlobData = visData[0].vars[6]->data; - fillData.copy(Averages.Phi,PhaseData); - fillData.copy(Averages.Pressure,PressData); - fillData.copy(Averages.SDs,SignData); - fillData.copy(Averages.Vel_x,VelxData); - fillData.copy(Averages.Vel_y,VelyData); - fillData.copy(Averages.Vel_z,VelzData); - fillData.copy(Averages.morph_n->label,BlobData); + + if (vis_db->getWithDefault( "save_phase_field", true )){ + ASSERT(visData[0].vars[0]->name=="phase"); + Array& PhaseData = visData[0].vars[0]->data; + fillData.copy(Averages.Phi,PhaseData); + } + + if (vis_db->getWithDefault( "save_pressure", false )){ + ASSERT(visData[0].vars[1]->name=="Pressure"); + Array& PressData = visData[0].vars[1]->data; + fillData.copy(Averages.Pressure,PressData); + } + + if (vis_db->getWithDefault( "save_velocity", false )){ + 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; + fillData.copy(Averages.Vel_x,VelxData); + fillData.copy(Averages.Vel_y,VelyData); + fillData.copy(Averages.Vel_z,VelzData); + } + + if (vis_db->getWithDefault( "save_distance", false )){ + ASSERT(visData[0].vars[5]->name=="SignDist"); + Array& SignData = visData[0].vars[5]->data; + fillData.copy(Averages.SDs,SignData); + } + + if (vis_db->getWithDefault( "save_connected_components", false )){ + ASSERT(visData[0].vars[6]->name=="BlobID"); + Array& BlobData = visData[0].vars[6]->data; + fillData.copy(Averages.morph_n->label,BlobData); + } IO::writeData( timestep, visData, comm.comm ); - char CurrentIDFilename[40]; - sprintf(CurrentIDFilename,"id_t%d.raw",timestep); - Averages.AggregateLabels(CurrentIDFilename); + + if (vis_db->getWithDefault( "save_8bit_raw", true )){ + char CurrentIDFilename[40]; + sprintf(CurrentIDFilename,"id_t%d.raw",timestep); + Averages.AggregateLabels(CurrentIDFilename); + } + PROFILE_STOP("Save Vis",1); }; private: IOWorkItem(); int timestep; + std::shared_ptr vis_db; std::vector& visData; SubPhase& Averages; fillHalo& fillData; @@ -247,7 +275,6 @@ private: }; - // Helper class to run the analysis from within a thread // Note: Averages will be modified after the constructor is called class AnalysisWorkItem: public ThreadPool::WorkItemRet @@ -893,6 +920,7 @@ void runAnalysis::basic( std::shared_ptr input_db, SubPhase &Averages, // Check which analysis steps we need to perform auto color_db = input_db->getDatabase( "Color" ); + auto vis_db = input_db->getDatabase( "Visualization" ); int timestep = color_db->getWithDefault( "timestep", 0 ); auto type = computeAnalysisType( timestep ); @@ -979,7 +1007,7 @@ void runAnalysis::basic( std::shared_ptr input_db, SubPhase &Averages, if (timestep%d_visualization_interval==0){ // 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_subphase); work->add_dependency(d_wait_vis); @@ -989,9 +1017,10 @@ void runAnalysis::basic( std::shared_ptr input_db, SubPhase &Averages, 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 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 timestep = vis_db->getWithDefault( "timestep", 0 ); // Check which analysis steps we need to perform auto type = computeAnalysisType( timestep ); @@ -1010,7 +1039,7 @@ void runAnalysis::WriteVisData( int timestep, SubPhase &Averages, const double * PROFILE_START("write vis",1); // 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); d_wait_vis = d_tpool.add_work(work2); diff --git a/analysis/runAnalysis.h b/analysis/runAnalysis.h index a23e961b..9f18577f 100644 --- a/analysis/runAnalysis.h +++ b/analysis/runAnalysis.h @@ -35,7 +35,7 @@ public: double *Pressure, double *Velocity, double *fq, double *Den ); void basic( std::shared_ptr 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 vis_db, SubPhase &Averages, const double *Phi, double *Pressure, double *Velocity, double *fq, double *Den); //! Finish all active analysis void finish();