From 7b00e564a156ff862b486c3a1cfdc566de3fd9db Mon Sep 17 00:00:00 2001 From: gforney Date: Thu, 7 May 2026 21:59:37 -0400 Subject: [PATCH 1/2] smokeview source: corrections and simplifications to trainer/demo option --- Source/smokeview/glui_trainer.cpp | 81 +++++-------------------------- Source/smokeview/menus.c | 75 +++++++++++----------------- Source/smokeview/smokeheaders.h | 3 +- Source/smokeview/smokeviewvars.h | 3 +- 4 files changed, 43 insertions(+), 119 deletions(-) diff --git a/Source/smokeview/glui_trainer.cpp b/Source/smokeview/glui_trainer.cpp index 8f2d164f6..a973185d4 100644 --- a/Source/smokeview/glui_trainer.cpp +++ b/Source/smokeview/glui_trainer.cpp @@ -16,20 +16,17 @@ #define MOVETYPE 200 #define TRAINERPATH 201 -#define TOGGLE_VIEW 203 #define TRAINER_PAUSE 212 #define TRAINER_LEFTRIGHT_INOUT 221 #define TRAINER_UPDOWN 223 #define TRAINER_AZ_ELEV 231 #define TRAINERVIEWPOINTS 300 -#define TRAINEROUTLINE 301 #define MENU_OUTLINEVIEW -104 GLUI *glui_trainer=NULL; GLUI_Checkbox *CHECKBOX_pause=NULL; -GLUI_Checkbox *CHECKBOX_outline=NULL; GLUI_Listbox *LIST_trainerpath=NULL,*LIST_viewpoint=NULL; @@ -39,7 +36,6 @@ GLUI_Panel *PANEL_manual=NULL;//, *PANEL_automatic=NULL; GLUI_Panel *PANEL_move=NULL,*PANEL_rotate2=NULL; GLUI_Button *BUTTON_smoke3d=NULL, *BUTTON_temp=NULL, *BUTTON_oxy=NULL, *BUTTON_unload=NULL; -GLUI_Button *BUTTON_toggle_view=NULL; GLUI_Translation *TRANSLATE_updown=NULL,*TRANSLATE_leftright_inout=NULL; GLUI_Translation *TRANSLATE_az_elev=NULL; @@ -51,8 +47,8 @@ GLUI *glui_alert=NULL; /* ------------------ GLUISetViewListManual ------------------------ */ extern "C" void GLUISetViewListManual(void){ - if(trainer_viewpoints!=-1){ - LIST_viewpoint->set_int_val(-1); + if(trainer_viewpoints!=-2){ + LIST_viewpoint->set_int_val(-2); } } @@ -97,18 +93,6 @@ extern "C" void GLUIShowTrainer(void){ } } -/* ------------------ GLUIUpdateTrainerOutline ------------------------ */ - -extern "C" void GLUIUpdateTrainerOutline(void){ - if(visBlocks==visBLOCKOutline){ - trainer_outline=0; - } - else{ - trainer_outline=1; - } - if(CHECKBOX_outline!=NULL)CHECKBOX_outline->set_int_val(trainer_outline); -} - /* ------------------ GLUIUpdateTrainerMoves ------------------------ */ extern "C" void GLUIUpdateTrainerMoves(void){ @@ -148,44 +132,13 @@ void TrainerCB(int var){ stept = trainer_pause; Keyboard('t', FROM_SMOKEVIEW); break; - case TOGGLE_VIEW: - if(ntrainer_viewpoints <= 0)break; - trainer_viewpoints--; - if(trainer_viewpoints < 2){ - trainer_viewpoints = ntrainer_viewpoints; - } - LIST_viewpoint->set_int_val(trainer_viewpoints); - TrainerCB(TRAINERVIEWPOINTS); - break; case TRAINERVIEWPOINTS: - if(trainer_viewpoints != -1){ - ResetMenu(trainer_viewpoints); - } - if(trainer_path != -1){ - int viewpoint_save; - - viewpoint_save = trainer_viewpoints; - LIST_trainerpath->set_int_val(-1); - TrainerCB(TRAINERPATH); - if(viewpoint_save != -11){ - LIST_viewpoint->set_int_val(viewpoint_save); - ResetMenu(viewpoint_save); - } - } - break; - case TRAINEROUTLINE: - if(trainer_outline == 0){ - visBlocks = visBLOCKAsInput; - } - else{ - visBlocks = visBLOCKOutline; - } - ResetMenu(MENU_OUTLINEVIEW); + ResetDefaultMenu(trainer_viewpoints); break; case TRAINERPATH: TrainerCB(MOVETYPE); - if(trainer_viewpoints != 1){ - LIST_viewpoint->set_int_val(-1); + if(trainer_viewpoints != -2){ + LIST_viewpoint->set_int_val(-2); } switch(trainer_path){ case -1: @@ -285,8 +238,8 @@ void RotateCB(int var){ SetViewPoint(RESTORE_EXTERIOR_VIEW); } - if(trainer_viewpoints != -1){ - LIST_viewpoint->set_int_val(-1); + if(trainer_viewpoints != -2){ + LIST_viewpoint->set_int_val(-2); } if(trainer_path != -1){ LIST_trainerpath->set_int_val(-1); @@ -350,32 +303,20 @@ extern "C" void GLUITrainerSetup(int main_window){ } } + trainer_viewpoints = -2; LIST_viewpoint = glui_trainer->add_listbox_to_panel(PANEL_explore,"Viewpoint:",&trainer_viewpoints,TRAINERVIEWPOINTS,TrainerCB); { cameradata *ca; for(ca=camera_list_first.next;ca->next!=NULL;ca=ca->next){ - char line[256]; - - if(strcmp(ca->name,"external")==0){ - strcpy(line,"Default"); - LIST_viewpoint->add_item(ca->view_id,line); - LIST_viewpoint->add_item(-1,"-"); + if(strcmp(ca->name,"external")!=0){ + LIST_viewpoint->add_item(ca->view_id, ca->name); } - else{ - strcpy(line,ca->name); - LIST_viewpoint->add_item(ca->view_id,line); - } - if(ca->view_id>=1)ntrainer_viewpoints++; } } - BUTTON_toggle_view = glui_trainer->add_button_to_panel(PANEL_explore,"Toggle View",TOGGLE_VIEW,TrainerCB); - if(ntrainer_viewpoints<=2)BUTTON_toggle_view->disable(); - - CHECKBOX_outline = glui_trainer->add_checkbox_to_panel(PANEL_explore,"Show walls",&trainer_outline,TRAINEROUTLINE,TrainerCB); + LIST_viewpoint->set_int_val(trainer_viewpoints); CHECKBOX_pause = glui_trainer->add_checkbox_to_panel(PANEL_explore,"Pause",&trainer_pause,TRAINER_PAUSE,TrainerCB); - GLUIUpdateTrainerOutline(); PANEL_move = glui_trainer->add_panel_to_panel(PANEL_explore,"Move",false); TRANSLATE_leftright_inout = glui_trainer->add_translation_to_panel(PANEL_move,"Horizontal", GLUI_TRANSLATION_XY,trainer_xzy,TRAINER_LEFTRIGHT_INOUT, RotateCB); diff --git a/Source/smokeview/menus.c b/Source/smokeview/menus.c index fcb8d305d..cde892db5 100644 --- a/Source/smokeview/menus.c +++ b/Source/smokeview/menus.c @@ -613,49 +613,21 @@ void ShowMultiSliceMenu(int value){ /* ------------------ ShowAllSlices ------------------------ */ -void ShowAllSlices(char *type1, char *type2){ +void ShowAllSlices(char *type1){ int i; GLUTSETCURSOR(GLUT_CURSOR_WAIT); - if(trainer_showall_mslice == 1){ - for(i = 0; i < global_scase.slicecoll.nsliceinfo; i++){ - slicedata *slicei; - - slicei = global_scase.slicecoll.sliceinfo + i; - slicei->display = 0; - if(slicei->loaded == 0)continue; - if( - (type1 != NULL&&STRCMP(slicei->label.longlabel, type1) == 0) || - (type2 != NULL&&STRCMP(slicei->label.longlabel, type2) == 0) - ){ - global_scase.slicecoll.sliceinfo[i].display = 1; - slicefile_labelindex = slicei->slicefile_labelindex; - } - } - } - else{ - int msliceindex; + for(i = 0; i < global_scase.slicecoll.nsliceinfo; i++){ + slicedata *slicei; - if(trainerload == 2){ - if(trainerload == trainerload_old){ - trainer_temp_index++; - if(trainer_temp_index > trainer_temp_n - 1){ - trainer_temp_index = 0; - } - } - msliceindex = trainer_temp_indexes[trainer_temp_index]; + slicei = global_scase.slicecoll.sliceinfo + i; + if(slicei->loaded == 0)continue; + if(type1 != NULL&&STRCMP(slicei->label.longlabel, type1) == 0){ + slicei->display = 1; } else{ - if(trainerload == trainerload_old){ - trainer_oxy_index++; - if(trainer_oxy_index > trainer_oxy_n - 1){ - trainer_oxy_index = 0; - } - } - msliceindex = trainer_oxy_indexes[trainer_oxy_index]; + slicei->display = 0; } - ShowMultiSliceMenu(HIDE_ALL); - ShowMultiSliceMenu(msliceindex); } updatemenu = 1; GLUTPOSTREDISPLAY; @@ -664,24 +636,32 @@ void ShowAllSlices(char *type1, char *type2){ /* ------------------ TrainerViewMenu ------------------------ */ +void LoadAllSlicesLabel(char *label); void TrainerViewMenu(int value){ switch(value){ case MENU_TRAINER_smoke: // realistic HideAllSlices(); trainerload=1; + void LoadSmoke3DMenu(int var); + LoadSmoke3DMenu(0); + LoadSmoke3DMenu(1); ShowAllSmoke(); trainerload_old=1; break; case MENU_TRAINER_temp: // temperature slices HideAllSmoke(); trainerload=2; - ShowAllSlices("TEMPERATURE",NULL); + sliceload_dir = 1; + LoadAllSlicesLabel("temp"); + ShowAllSlices("TEMPERATURE"); trainerload_old=2; break; case MENU_TRAINER_oxy: // oxygen slices HideAllSmoke(); trainerload=3; - ShowAllSlices("OXYGEN","OXYGEN VOLUME FRACTION"); + sliceload_dir = 1; + LoadAllSlicesLabel("X_O2"); + ShowAllSlices("OXYGEN VOLUME FRACTION"); trainerload_old=3; break; case MENU_TRAINER_CLEAR: // unload @@ -1558,7 +1538,6 @@ void DialogMenu(int value){ break; case DIALOG_GEOMETRY_CLOSE: GLUIHideGeometry(); - GLUIUpdateTrainerOutline(); break; case DIALOG_GEOMETRY_OPEN: if(global_scase.fds_filein!=NULL&&updategetobstlabels==1){ @@ -1569,7 +1548,6 @@ void DialogMenu(int value){ } GLUIShowGeometry(); visBlocks=visBLOCKNormal; - GLUIUpdateTrainerOutline(); break; case DIALOG_TERRAIN: GLUIShowTerrain(); @@ -5178,13 +5156,11 @@ void LoadMultiSliceMenu(int value){ } } -/* ------------------ LoadMultiSliceMenu ------------------------ */ +/* ------------------ LoadAllSlices ------------------------ */ -void LoadAllMultiSliceMenu(void){ +void LoadAllSlicesLabel(char *label){ int i; - char *label; - label = slicebounds_cpp[sliceload_boundtype].label; for(i = 0; i < global_scase.slicecoll.nmultisliceinfo; i++){ multislicedata *mslicei; slicedata *slicei; @@ -5205,6 +5181,15 @@ void LoadAllMultiSliceMenu(void){ } } +/* ------------------ LoadAllMultiSliceMenu ------------------------ */ + +void LoadAllMultiSliceMenu(void){ + char *label; + + label = slicebounds_cpp[sliceload_boundtype].label; + LoadAllSlicesLabel(label); +} + /* ------------------ LoadAllMultiVSliceMenu ------------------------ */ void LoadAllMultiVSliceMenu(void){ @@ -6344,7 +6329,6 @@ void BlockageMenu(int value){ case visBLOCKAsInputOutline: case visBLOCKAsInput: visBlocks=value; - GLUIUpdateTrainerOutline(); break; case visBLOCKNormal: case visBLOCKOutline: @@ -6352,7 +6336,6 @@ void BlockageMenu(int value){ case visBLOCKSolidOutline: visBlocks=value; if(value==visBLOCKSolidOutline||visBLOCKold==visBLOCKSolidOutline)global_scase.updatefaces=1; - GLUIUpdateTrainerOutline(); break; case BLOCKlocation_grid: case BLOCKlocation_exact: diff --git a/Source/smokeview/smokeheaders.h b/Source/smokeview/smokeheaders.h index e6bf3324e..d55d5b959 100644 --- a/Source/smokeview/smokeheaders.h +++ b/Source/smokeview/smokeheaders.h @@ -147,7 +147,6 @@ EXTERNCPP void AddDeleteKeyframe(int flag); //*** glui_trainer.cpp headers -EXTERNCPP void GLUIUpdateTrainerOutline(void); EXTERNCPP void GLUIUpdateTrainerMoves(void); EXTERNCPP void GLUISetViewListManual(void); EXTERNCPP void GLUITrainerSetup(int main_window); @@ -446,6 +445,8 @@ EXTERNCPP void UpdateIsoType(void); EXTERNCPP void UpdateIsoTypes(void); EXTERNCPP void UpdateIsoShowLevels(smv_case *scase, meshdata *isomesh); EXTERNCPP void *UpdateTrianglesAll(void *arg); +EXTERNCPP void ResetDefaultMenu(int var); + //*** IOpart.c headers diff --git a/Source/smokeview/smokeviewvars.h b/Source/smokeview/smokeviewvars.h index 9a3c3c5ab..6703cf3bd 100644 --- a/Source/smokeview/smokeviewvars.h +++ b/Source/smokeview/smokeviewvars.h @@ -1258,8 +1258,7 @@ SVEXTERN float p3chopmin[MAXPLOT3DVARS], p3chopmax[MAXPLOT3DVARS]; SVEXTERN int SVDECL(trainer_pause,0), SVDECL(trainee_location,0), SVDECL(trainer_inside,0); SVEXTERN int SVDECL(from_glui_trainer,0); SVEXTERN int SVDECL(trainer_path_old,-3); -SVEXTERN int SVDECL(trainer_outline,1); -SVEXTERN int SVDECL(trainer_viewpoints,-1), SVDECL(ntrainer_viewpoints,0); +SVEXTERN int SVDECL(trainer_viewpoints,-2); SVEXTERN int SVDECL(trainer_realtime,1); SVEXTERN int SVDECL(trainer_path,0); #ifdef INMAIN From 12ce04db3fab173afb0c22e57590081a5a73d923 Mon Sep 17 00:00:00 2001 From: gforney Date: Thu, 7 May 2026 22:01:20 -0400 Subject: [PATCH 2/2] examples: add trainer example --- vistest/trainer/.gitignore | 1 + vistest/trainer/trainer.fds | 86 +++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 vistest/trainer/.gitignore create mode 100644 vistest/trainer/trainer.fds diff --git a/vistest/trainer/.gitignore b/vistest/trainer/.gitignore new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/vistest/trainer/.gitignore @@ -0,0 +1 @@ + diff --git a/vistest/trainer/trainer.fds b/vistest/trainer/trainer.fds new file mode 100644 index 000000000..61ff95422 --- /dev/null +++ b/vistest/trainer/trainer.fds @@ -0,0 +1,86 @@ +&HEAD CHID='trainer',TITLE='Plume whirl case' / + + same as plume5a except there is a blockage in the middle of the scene to block the flow + The purpose of this case is to demonstrate the curved flow (via streak lines) that results. + +&MESH IJK=16,16,32, XB=0.0,1.6,0.0,1.6,0.0,3.2 / + +&MISC IBLANK_SMV=.TRUE. / + +&DUMP NFRAMES=400 DT_PL3D=8.0, DT_SL3D=0.1 / + +&INIT XB=0.2,1.4,0.2,1.4,0.5,2.2 TEMPERATURE=600.0 / + +&TIME T_END=40. / Total simulation time + +&MATL ID = 'FABRIC' + FYI = 'Properties completely fabricated' + SPECIFIC_HEAT = 1.0 + CONDUCTIVITY = 0.1 + DENSITY = 100.0 + N_REACTIONS = 1 + NU_SPEC = 1. + SPEC_ID = 'PROPANE' + REFERENCE_TEMPERATURE = 350. + HEAT_OF_REACTION = 3000. + HEAT_OF_COMBUSTION = 15000. / + +&MATL ID = 'FOAM' + FYI = 'Properties completely fabricated' + SPECIFIC_HEAT = 1.0 + CONDUCTIVITY = 0.05 + DENSITY = 40.0 + N_REACTIONS = 1 + NU_SPEC = 1. + SPEC_ID = 'PROPANE' + REFERENCE_TEMPERATURE = 350. + HEAT_OF_REACTION = 1500. + HEAT_OF_COMBUSTION = 30000. / + +&SURF ID = 'UPHOLSTERY_LOWER' + FYI = 'Properties completely fabricated' + RGB = 151,96,88 + BURN_AWAY = .FALSE. + MATL_ID(1:2,1) = 'FABRIC','FOAM' + THICKNESS(1:2) = 0.002,0.1 +/ + +&SURF ID = 'UPHOLSTERY_UPPER' + FYI = 'Properties completely fabricated' + RGB = 151,96,88 + BURN_AWAY = .FALSE. + TMP_FRONT = 600.0 +/ +&REAC SOOT_YIELD=0.01,FUEL='PROPANE'/ +&SURF ID='BURNER',HRRPUA=600.0,PART_ID='tracers' / Ignition source + +&VENT XB=0.5,1.1,0.5,1.1,0.1,0.1,SURF_ID='BURNER' / fire source on kitchen stove + +&OBST XB=0.5,1.1,0.5,1.1,0.0,0.1 / +&OBST XB=0.3,1.3,0.3,1.3,0.4,0.8 SURF_ID='UPHOLSTERY_LOWER'/ +&HOLE XB=0.6,1.0,0.2,0.8,0.3,0.9 / +&OBST XB=0.3,1.3,0.3,1.3,1.2,1.6 SURF_ID='UPHOLSTERY_UPPER' / + +&VENT MB='XMIN',SURF_ID='OPEN'/ +&VENT MB='XMAX',SURF_ID='OPEN'/ +&VENT MB='YMIN',SURF_ID='OPEN'/ +&VENT MB='YMAX',SURF_ID='OPEN'/ +&VENT MB='ZMAX',SURF_ID='OPEN'/ + +&ISOF QUANTITY='TEMPERATURE',VALUE(1)=100.0 / Show 3D contours of temperature at 100 C +&ISOF QUANTITY='TEMPERATURE',VALUE(1)=200.0 / Show 3D contours of temperature at 200 C +&ISOF QUANTITY='TEMPERATURE',VALUE(1)=620.0 / Show 3D contours of temperature at 620 C +&ISOF QUANTITY='TEMPERATURE',VALUE(1:2)=200.0,400.0 / Show 3D contours of temperature at 200 C +&ISOF QUANTITY='TEMPERATURE' , VALUE(1)=400, QUANTITY2='HRRPUV' / + +&PART ID='tracers',MASSLESS=.TRUE., + QUANTITIES(1:3)='PARTICLE U','PARTICLE V','PARTICLE W' + SAMPLING_FACTOR=10 / Description of massless tracer particles. Apply at a + solid surface with the PART_ID='tracers' + + Y slices + +&SLCF PBY=0.8,QUANTITY='TEMPERATURE' / +&SLCF PBY=0.8,QUANTITY='VOLUME FRACTION' SPEC_ID='OXYGEN' / + +&TAIL /