From 6be9fc423df6f2859ded2dbe5e3b546101a11489 Mon Sep 17 00:00:00 2001 From: gforney Date: Mon, 24 Feb 2025 22:20:01 -0500 Subject: [PATCH] smokeview source: merge 3D smoke and hrrpuv serially not in parallel --- Source/smokeview/IOsmoke.c | 24 ++++++++++++++++++++++++ Source/smokeview/glui_smoke.cpp | 10 ++++++++++ Source/smokeview/glui_smoke.h | 2 ++ Source/smokeview/menus.c | 2 ++ Source/smokeview/options.h | 1 + Source/smokeview/readsmv.c | 4 ++++ Source/smokeview/smokeheaders.h | 6 ++++++ Source/smokeview/smokeviewvars.h | 6 ++++-- Source/smokeview/update.c | 6 ++++++ 9 files changed, 59 insertions(+), 2 deletions(-) diff --git a/Source/smokeview/IOsmoke.c b/Source/smokeview/IOsmoke.c index 2fab1056df..bb9febc110 100644 --- a/Source/smokeview/IOsmoke.c +++ b/Source/smokeview/IOsmoke.c @@ -4226,7 +4226,9 @@ FILE_SIZE ReadSmoke3D(int time_frame,int ifile_arg,int load_flag, int first_time int fortran_skip=0; #endif +#ifdef pp_SMOKE_THREAD update_glui_merge_smoke = 1; +#endif GLUTPOSTREDISPLAY; SetTimeState(); update_smokefire_colors = 1; @@ -4891,6 +4893,7 @@ void MergeSmoke3D(smoke3ddata *smoke3dset){ PRINT_TIMER(merge_smoke_time, "MergeSmoke3D"); } +#ifdef pp_SMOKE_THREAD /* ------------------ UpdateGluiMergeSmoke ------------------------ */ void UpdateGluiMergeSmoke(void){ @@ -4932,6 +4935,27 @@ void *MtMergeSmoke3D(void *arg){ } THREAD_EXIT(mergesmoke_threads); } +#else +void MergeSmoke3DAll(void){ + int i; + + for(i = 0;i < global_scase.smoke3dcoll.nsmoke3dinfo;i++){ + smoke3ddata *smoke3di; + + smoke3di = global_scase.smoke3dcoll.smoke3dinfo + i; + if(smoke3di->loaded == 0 || smoke3di->display == 0)continue; + assert(smoke3di->timeslist != NULL); + if(smoke3di->timeslist==NULL)continue; + smoke3di->ismoke3d_time = smoke3di->timeslist[itimes]; + if(IsSmokeComponentPresent(smoke3di) == 0)continue; + if(smoke3di->ismoke3d_time != smoke3di->lastiframe){ + smoke3di->lastiframe = smoke3di->ismoke3d_time; + UpdateSmoke3D(smoke3di); + } + MergeSmoke3D(smoke3di); + } +} +#endif /* ------------------ UpdateSmoke3dMenuLabels ------------------------ */ diff --git a/Source/smokeview/glui_smoke.cpp b/Source/smokeview/glui_smoke.cpp index 762d14f550..7c08c57e78 100644 --- a/Source/smokeview/glui_smoke.cpp +++ b/Source/smokeview/glui_smoke.cpp @@ -49,7 +49,9 @@ GLUI_Spinner *SPINNER_skipframe=NULL; GLUI_Spinner *SPINNER_hrrpuv_cutoff=NULL; GLUI_Spinner *SPINNER_nongpu_vol_factor=NULL; GLUI_Spinner *SPINNER_gpu_vol_factor=NULL; +#ifdef pp_SMOKE_THREAD GLUI_Spinner *SPINNER_smoke3d_draw_threads = NULL; +#endif GLUI_Spinner *SPINNER_smoke3d_load_start=NULL; GLUI_Spinner *SPINNER_smoke3d_load_skip=NULL; @@ -116,7 +118,9 @@ GLUI_Checkbox **CHECKBOX_meshvisptr = NULL; GLUI_Checkbox *CHECKBOX_meshvis = NULL; GLUI_Checkbox *CHECKBOX_edit_colormap=NULL; GLUI_Checkbox *CHECKBOX_plane_normal=NULL; +#ifdef pp_SMOKE_THREAD GLUI_Checkbox *CHECKBOX_view_parallel = NULL; +#endif GLUI_Panel *PANEL_colormap3 = NULL; GLUI_Panel *PANEL_fire_opacity = NULL; @@ -129,7 +133,9 @@ GLUI_Panel *PANEL_fire_cutoff = NULL; GLUI_Panel *PANEL_blackbody = NULL; GLUI_Panel *PANEL_settings1 = NULL; GLUI_Panel *PANEL_skip_planes = NULL; +#ifdef pp_SMOKE_THREAD GLUI_Panel *PANEL_smoke_parallel = NULL; +#endif GLUI_Panel *PANEL_smokesensor = NULL; GLUI_Panel *PANEL_color = NULL; GLUI_Panel *PANEL_smoke = NULL; @@ -380,11 +386,13 @@ extern "C" void GLUI3dSmokeSetup(int main_window){ CHECKBOX_smoke_flip = glui_3dsmoke->add_checkbox_to_panel(PANEL_settings1, _("flip background"), &background_flip,BACKGROUND_FLIP, GLUISmoke3dCB); CHECKBOX_triangle_display_rate = glui_3dsmoke->add_checkbox_to_panel(PANEL_settings1, _("triangle display rate"), &show_trirates); +#ifdef pp_SMOKE_THREAD PANEL_smoke_parallel = glui_3dsmoke->add_panel_to_panel(PANEL_settings1,"parallel"); CHECKBOX_view_parallel = glui_3dsmoke->add_checkbox_to_panel(PANEL_smoke_parallel, _("drawing setup"), &use_mergesmoke_glui_threads, MERGE_SMOKE, GLUISmoke3dCB); SPINNER_smoke3d_draw_threads = glui_3dsmoke->add_spinner_to_panel(PANEL_smoke_parallel, _("threads"), GLUI_SPINNER_INT, &n_mergesmoke_glui_threads, MERGE_SMOKE, GLUISmoke3dCB); SPINNER_smoke3d_draw_threads->set_int_limits(1, MAX_THREADS); GLUISmoke3dCB(MERGE_SMOKE); +#endif //---------------------------------------------Slice render settings-------------------------------------------------------------- @@ -845,9 +853,11 @@ extern "C" void GLUISmoke3dCB(int var){ ShowHideMenu(MENU_SHOWHIDE_FLIP); updatemenu = 1; break; +#ifdef pp_SMOKE_THREAD case MERGE_SMOKE: UpdateGluiMergeSmoke(); break; +#endif case SMOKE_BLACK: break; case SMOKE_SKIP_XYZ: diff --git a/Source/smokeview/glui_smoke.h b/Source/smokeview/glui_smoke.h index 5e09f58437..b4ab5007d7 100644 --- a/Source/smokeview/glui_smoke.h +++ b/Source/smokeview/glui_smoke.h @@ -78,7 +78,9 @@ #define VOLTEST_DEPTH 102 #define VOLTEST_UPDATE 103 #define FORCE_ALPHA_OPAQUE 104 +#ifdef pp_SMOKE_THREAD #define MERGE_SMOKE 105 +#endif #define SMOKE_FRAME_INC 113 #define REFRESH_FIRE 114 diff --git a/Source/smokeview/menus.c b/Source/smokeview/menus.c index 0ea63d108b..bf647d3006 100644 --- a/Source/smokeview/menus.c +++ b/Source/smokeview/menus.c @@ -3362,7 +3362,9 @@ void UnloadSmoke3D(smoke3ddata *smoke3di){ void UnloadAllSmoke3D(int type){ int i; +#ifdef pp_SMOKE_THREAD update_glui_merge_smoke = 1; +#endif if(global_scase.smoke3dcoll.nsmoke3dinfo > 0){ for(i = 0; i < global_scase.smoke3dcoll.nsmoke3dinfo; i++){ smoke3ddata *smoke3di; diff --git a/Source/smokeview/options.h b/Source/smokeview/options.h index ed965bcad0..25e6449b81 100644 --- a/Source/smokeview/options.h +++ b/Source/smokeview/options.h @@ -8,6 +8,7 @@ //#define pp_LUA // turn on LUA option #define pp_GPU // support the GPU #define pp_THREAD // turn on multi-threading +//#define pp_SMOKE_THREAD // use multi-threading for merging smoke #ifdef pp_FRAME // turn on each frame type if pp_FRAME is set #define pp_BOUNDFRAME // turn on frame code for boundary files diff --git a/Source/smokeview/readsmv.c b/Source/smokeview/readsmv.c index 07be286c3a..16055c6aaa 100644 --- a/Source/smokeview/readsmv.c +++ b/Source/smokeview/readsmv.c @@ -6871,7 +6871,9 @@ int ReadSMV_Init(smv_case *scase){ use_ffmpeg_threads = 0; use_readallgeom_threads = 0; use_isosurface_threads = 0; +#ifdef pp_SMOKE_THREAD use_mergesmoke_threads = 0; +#endif use_meshnabors_threads = 0; } @@ -11535,6 +11537,7 @@ int ReadSMV_Configure(){ MakeIBlankCarve(); PRINT_TIMER(timer_readsmv, "MakeIBlankCarve"); +#ifdef pp_SMOKE_THREAD if(mergesmoke_threads == NULL){ mergesmoke_threads = THREADinit(&n_mergesmoke_threads, &use_mergesmoke_threads, MtMergeSmoke3D); for(i = 0; i < n_mergesmoke_threads; i++){ @@ -11542,6 +11545,7 @@ int ReadSMV_Configure(){ smokethreadinfo[i].nthreads = n_mergesmoke_threads; } } +#endif if(ffmpeg_threads == NULL){ ffmpeg_threads = THREADinit(&n_ffmpeg_threads, &use_ffmpeg_threads, SetupFF); diff --git a/Source/smokeview/smokeheaders.h b/Source/smokeview/smokeheaders.h index 6f69521ee1..4c63b50d97 100644 --- a/Source/smokeview/smokeheaders.h +++ b/Source/smokeview/smokeheaders.h @@ -575,11 +575,17 @@ EXTERNCPP int IsSmokeComponentPresent(smoke3ddata *smoke3di); EXTERNCPP void MakeIBlankSmoke3D(void); EXTERNCPP void MakeTimesMap(float *times, unsigned char **times_map_ptr, int n); EXTERNCPP void MergeSmoke3D(smoke3ddata *smoke3dset); +#ifdef pp_SMOKE_THREAD EXTERNCPP void *MtMergeSmoke3D(void *arg); +#else +EXTERNCPP void MergeSmoke3DAll(void); +#endif EXTERNCPP FILE_SIZE ReadSmoke3D(int iframe, int ifile, int flag, int first_time, int *errorcode); EXTERNCPP void ReadSmoke3DAllMeshes(int iframe, int smoketype, int *errorcode); EXTERNCPP void SmokeWrapup(void); +#ifdef pp_SMOKE_THREAD EXTERNCPP void UpdateGluiMergeSmoke(void); +#endif EXTERNCPP int UpdateSmoke3D(smoke3ddata *smoke3di); EXTERNCPP void UpdateSmoke3dFileParms(void); EXTERNCPP void UpdateSmoke3dMenuLabels(void); diff --git a/Source/smokeview/smokeviewvars.h b/Source/smokeview/smokeviewvars.h index 0f471944f5..58de56a99f 100644 --- a/Source/smokeview/smokeviewvars.h +++ b/Source/smokeview/smokeviewvars.h @@ -32,11 +32,13 @@ //*** threader variables //***mergesmoke -SVEXTERN int SVDECL(n_mergesmoke_threads, 4), SVDECL(use_mergesmoke_threads, 1); +#ifdef pp_SMOKE_THREAD +SVEXTERN int SVDECL(n_mergesmoke_threads, 4), SVDECL(use_mergesmoke_threads, 0); SVEXTERN threaderdata SVDECL(*mergesmoke_threads, NULL); SVEXTERN smokethreaddata smokethreadinfo[MAX_THREADS]; -SVEXTERN int SVDECL(n_mergesmoke_glui_threads, 4), SVDECL(use_mergesmoke_glui_threads, 1); +SVEXTERN int SVDECL(n_mergesmoke_glui_threads, 4), SVDECL(use_mergesmoke_glui_threads, 0); SVEXTERN int SVDECL(update_glui_merge_smoke, 1); +#endif //***isosurface SVEXTERN int SVDECL(n_isosurface_threads, 1), SVDECL(use_isosurface_threads, 1); diff --git a/Source/smokeview/update.c b/Source/smokeview/update.c index 7b7c7aa8a0..798b595e27 100644 --- a/Source/smokeview/update.c +++ b/Source/smokeview/update.c @@ -170,10 +170,14 @@ void UpdateFrameNumber(int changetime){ } if(show3dsmoke==1 && global_scase.smoke3dcoll.nsmoke3dinfo > 0){ INIT_PRINT_TIMER(merge_smoke_time); +#ifdef pp_SMOKE_THREAD THREADcontrol(mergesmoke_threads, THREAD_LOCK); THREADruni(mergesmoke_threads, (unsigned char *)smokethreadinfo, sizeof(smokethreaddata)); THREADcontrol(mergesmoke_threads, THREAD_JOIN); THREADcontrol(mergesmoke_threads, THREAD_UNLOCK); +#else + MergeSmoke3DAll(); +#endif PrintMemoryInfo; PRINT_TIMER(merge_smoke_time, "UpdateSmoke3D + MergeSmoke3D"); } @@ -2327,12 +2331,14 @@ void BoundBoundCB(int var); UpdateSmoke3dMenuLabels(); END_SHOW_UPDATE(update_smoke3dmenulabels); } +#ifdef pp_SMOKE_THREAD if(update_glui_merge_smoke == 1){ SHOW_UPDATE(update_glui_merge_smoke); update_glui_merge_smoke = 0; GLUISmoke3dCB(MERGE_SMOKE); END_SHOW_UPDATE(update_glui_merge_smoke); } +#endif if(glui_meshclip_defined==1&&update_meshclip == 1){ SHOW_UPDATE(update_meshclip); update_meshclip = 0;