From c22e8f6ad78f1e4098ce49bd7ffcf54151fabf89 Mon Sep 17 00:00:00 2001 From: Malik Hassanaly Date: Wed, 13 Nov 2024 13:25:01 -0700 Subject: [PATCH] Revert "Update sampleDS" --- .../.vim/.netrwhist | 3 + .../0.orig/CO2.gas | 0 .../0.orig/CO2.liquid | 0 .../0.orig/H2.gas | 0 .../0.orig/H2.liquid | 0 .../0.orig/N2.gas | 0 .../0.orig/T.gas | 0 .../0.orig/T.liquid | 0 .../0.orig/U.gas | 0 .../0.orig/U.liquid | 0 .../0.orig/Ydefault.gas | 0 .../0.orig/Ydefault.liquid | 0 .../0.orig/alpha.gas | 0 .../0.orig/alpha.liquid | 0 .../0.orig/alphat.gas | 0 .../0.orig/alphat.liquid | 0 .../0.orig/epsilon.gas | 0 .../0.orig/epsilon.liquid | 0 .../0.orig/f.gas | 0 .../0.orig/k.gas | 0 .../0.orig/k.liquid | 0 .../0.orig/nut.gas | 0 .../0.orig/nut.liquid | 0 .../0.orig/p | 0 .../0.orig/p_rgh | 0 .../Allclean | 3 + .../computeQOI.sh | 13 + .../constant/dynamicMix_util.H | 0 .../constant/fvModels | 30 +- .../constant/g | 0 .../constant/globalVars | 83 ++ .../constant/globalVars_temp | 3 +- .../constant/momentumTransport.gas | 0 .../constant/momentumTransport.liquid | 0 .../constant/phaseProperties | 75 +- .../constant/phaseProperties_constantd | 261 ++++++ .../constant/phaseProperties_pbe | 45 +- .../constant/thermophysicalProperties.gas | 28 - .../constant/thermophysicalProperties.liquid | 24 - .../get_qoi.py | 183 +++++ .../presteps.sh | 71 ++ .../read_history.py | 239 ++++++ .../run.sh | 5 + .../script | 14 + .../script_post | 10 + .../system/blockMeshDict | 380 +-------- .../system/controlDict | 67 ++ .../system/decomposeParDict | 0 .../system/fvConstraints | 56 ++ .../system/fvSchemes | 1 - .../system/fvSolution | 9 +- .../system/inlets_outlets.json | 0 .../system/mesh.json | 0 .../system/mixers.json | 29 + .../system/setFieldsDict | 37 + .../writeGlobalVars.py | 0 .../.vim/.netrwhist | 3 + .../0.orig/CO2.gas} | 4 +- .../0.orig/CO2.liquid} | 2 +- .../0.orig/H2.gas | 47 ++ .../0.orig/H2.liquid} | 4 +- .../0.orig/N2.gas | 47 ++ .../0.orig/T.gas | 44 ++ .../0.orig/T.liquid | 43 + .../0.orig/U.gas | 47 ++ .../0.orig/U.liquid | 46 ++ .../0.orig/Ydefault.gas | 42 + .../0.orig/Ydefault.liquid | 42 + .../0.orig/alpha.gas | 43 + .../0.orig/alpha.liquid | 40 + .../0.orig/alphat.gas | 46 ++ .../0.orig/alphat.liquid | 44 ++ .../0.orig/epsilon.gas | 48 ++ .../0.orig/epsilon.liquid | 43 + .../0.orig/f.gas | 41 + .../0.orig/k.gas | 43 + .../0.orig/k.liquid | 44 ++ .../0.orig/nut.gas | 48 ++ .../0.orig/nut.liquid | 43 + .../0.orig/p | 39 + .../0.orig/p_rgh | 43 + .../Allclean | 18 + .../computeQOI.sh | 13 + .../constant/dynamicMix_util.H | 37 + .../constant/fvModels | 128 +++ .../constant/g} | 8 +- .../constant/globalVars | 5 +- .../constant/globalVars_temp | 83 ++ .../constant/momentumTransport.gas} | 23 +- .../constant/momentumTransport.liquid} | 20 +- .../constant/phaseProperties} | 75 +- .../constant/phaseProperties_constantd | 261 ++++++ .../constant/phaseProperties_pbe | 295 +++++++ .../constant/thermophysicalProperties.gas | 142 ++++ .../constant/thermophysicalProperties.liquid | 108 +++ .../get_qoi.py | 183 +++++ .../presteps.sh | 71 ++ .../read_history.py | 239 ++++++ .../run.sh | 5 + .../script | 14 + .../script_post | 10 + .../system/blockMeshDict | 746 ++++++++++++++++++ .../system/controlDict | 7 +- .../system/decomposeParDict | 30 + .../system/fvConstraints | 56 ++ .../system/fvSchemes | 70 ++ .../system/fvSolution | 120 +++ .../system/inlets_outlets.json | 28 + .../system/mesh.json | 26 + .../system/mixers.json | 2 +- .../system/setFieldsDict | 0 .../writeGlobalVars.py | 47 ++ .../loop_reactor_reacting/README.md | 15 - .../loop_reactor_reacting/run.sh | 70 -- README.md | 2 +- applications/GA_opt/ga2sim.py | 124 +++ applications/GA_opt/read_qoi.py | 51 ++ applications/GA_opt/runGA.sh | 14 + applications/Random_opt/randsim.py | 100 +++ applications/Random_opt/read_qoi.py | 51 ++ applications/Random_opt/runGA.sh | 14 + applications/convert_dim.py | 43 + applications/read_history.py | 243 ++++++ applications/write_dynMix_fvModels.py | 4 +- .../write_dynMix_fvModels_force_sign.py | 40 + bird/__init__.py | 2 + bird/calibration/param_nn.py | 409 ---------- bird/calibration/scaling.py | 22 - bird/meshing/block_rect_mesh.py | 4 +- .../loop_reactor_3_6L/.vim/.netrwhist | 3 + .../loop_reactor_3_6L/0.orig/CO2.gas | 4 +- .../loop_reactor_3_6L/0.orig/CO2.liquid | 42 + .../loop_reactor_3_6L/0.orig/H2.gas | 47 ++ .../loop_reactor_3_6L/0.orig/H2.liquid | 42 + .../loop_reactor_3_6L/0.orig/N2.gas | 47 ++ .../loop_reactor_3_6L/0.orig/T.gas | 44 ++ .../loop_reactor_3_6L/0.orig/T.liquid | 43 + .../loop_reactor_3_6L/0.orig/U.gas | 47 ++ .../loop_reactor_3_6L/0.orig/U.liquid | 46 ++ .../loop_reactor_3_6L/0.orig/Ydefault.gas | 42 + .../loop_reactor_3_6L/0.orig/Ydefault.liquid | 42 + .../loop_reactor_3_6L/0.orig/alpha.gas | 43 + .../loop_reactor_3_6L/0.orig/alpha.liquid | 40 + .../loop_reactor_3_6L/0.orig/alphat.gas | 46 ++ .../loop_reactor_3_6L/0.orig/alphat.liquid | 44 ++ .../loop_reactor_3_6L/0.orig/epsilon.gas | 48 ++ .../loop_reactor_3_6L/0.orig/epsilon.liquid | 43 + .../loop_reactor_3_6L/0.orig/f.gas | 41 + .../loop_reactor_3_6L/0.orig/k.gas | 43 + .../loop_reactor_3_6L/0.orig/k.liquid | 44 ++ .../loop_reactor_3_6L/0.orig/nut.gas | 48 ++ .../loop_reactor_3_6L/0.orig/nut.liquid | 43 + .../loop_reactor_3_6L/0.orig/p | 39 + .../loop_reactor_3_6L/0.orig/p_rgh | 43 + .../loop_reactor_3_6L/Allclean | 18 + .../loop_reactor_3_6L/computeQOI.sh | 13 + .../constant/dynamicMix_util.H | 37 + .../loop_reactor_3_6L/constant/fvModels | 128 +++ .../loop_reactor_3_6L/constant/g | 21 + .../loop_reactor_3_6L/constant/globalVars | 83 ++ .../constant/globalVars_temp | 83 ++ .../constant/momentumTransport.gas | 26 + .../constant/momentumTransport.liquid | 29 +- .../constant/phaseProperties | 295 +++++++ .../constant/phaseProperties_constantd | 261 ++++++ .../constant/phaseProperties_pbe | 295 +++++++ .../constant/thermophysicalProperties.gas | 142 ++++ .../constant/thermophysicalProperties.liquid | 108 +++ .../loop_reactor_3_6L/get_qoi.py | 183 +++++ .../loop_reactor_3_6L/presteps.sh | 71 ++ .../loop_reactor_3_6L/read_history.py | 239 ++++++ .../data_preprocess/loop_reactor_3_6L/run.sh | 5 + .../data_preprocess/loop_reactor_3_6L/script | 14 + .../loop_reactor_3_6L/script_post | 10 + .../loop_reactor_3_6L/system/blockMeshDict | 746 ++++++++++++++++++ .../loop_reactor_3_6L/system/controlDict | 67 ++ .../loop_reactor_3_6L/system/decomposeParDict | 30 + .../loop_reactor_3_6L/system/fvConstraints | 56 ++ .../loop_reactor_3_6L/system/fvSchemes | 70 ++ .../loop_reactor_3_6L/system/fvSolution | 120 +++ .../system/inlets_outlets.json | 28 + .../loop_reactor_3_6L/system/mesh.json | 26 + .../loop_reactor_3_6L/system/mixers.json | 29 + .../loop_reactor_3_6L/system/setFieldsDict | 37 + .../loop_reactor_3_6L/writeGlobalVars.py | 47 ++ bird/preprocess/dynamic_mixer/io_fvModels.py | 159 +++- bird/preprocess/dynamic_mixer/mixer.py | 12 +- .../dynamic_mixer/mixing_fvModels.py | 13 +- bird/preprocess/json_gen/design_io.py | 85 ++ bird/preprocess/json_gen/generate_designs.py | 344 ++++++++ bird/preprocess/stl_patch/stl_bc.py | 4 +- bird/preprocess/stl_patch/stl_shapes.py | 6 +- bird/utilities/ofio.py | 5 +- bird/version.py | 2 +- papers/tutorial/calibration/README.md | 80 -- .../tutorial/calibration/assets/Loss_surr.png | Bin 56018 -> 0 bytes .../assets/Surr_a_2_b_5_corner.png | Bin 17042 -> 0 bytes .../calibration/assets/Surr_a_2_b_5_prop.png | Bin 53951 -> 0 bytes .../assets/Surr_a_5_b_5_corner.png | Bin 16313 -> 0 bytes .../calibration/assets/Surr_a_5_b_5_prop.png | Bin 50324 -> 0 bytes .../assets/True_a_2_b_5_corner.png | Bin 16837 -> 0 bytes .../calibration/assets/True_a_2_b_5_prop.png | Bin 59605 -> 0 bytes .../assets/True_a_5_b_5_corner.png | Bin 16300 -> 0 bytes .../calibration/assets/True_a_5_b_5_prop.png | Bin 49954 -> 0 bytes .../tutorial/calibration/assets/test_surr.png | Bin 88464 -> 0 bytes papers/tutorial/calibration/post_cal.py | 102 --- papers/tutorial/calibration/requirements.txt | 4 - .../calibration/tut_calibration_all.py | 267 ------- papers/tutorial/calibration/tut_surrogate.py | 138 ---- setup.py | 1 + tests/postprocess/test_cond_mean.py | 8 +- tests/preprocess/test_generate_case.py | 22 + 212 files changed, 10553 insertions(+), 1713 deletions(-) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/.vim/.netrwhist rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/CO2.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/CO2.liquid (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/H2.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/H2.liquid (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/N2.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/T.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/T.liquid (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/U.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/U.liquid (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/Ydefault.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/Ydefault.liquid (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/alpha.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/alpha.liquid (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/alphat.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/alphat.liquid (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/epsilon.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/epsilon.liquid (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/f.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/k.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/k.liquid (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/nut.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/nut.liquid (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/p (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/0.orig/p_rgh (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/Allclean (95%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/computeQOI.sh rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/constant/dynamicMix_util.H (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/constant/fvModels (87%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/constant/g (100%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/globalVars rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/constant/globalVars_temp (99%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/constant/momentumTransport.gas (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/constant/momentumTransport.liquid (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/constant/phaseProperties (76%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/phaseProperties_constantd rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/constant/phaseProperties_pbe (84%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/constant/thermophysicalProperties.gas (84%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/constant/thermophysicalProperties.liquid (86%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/get_qoi.py create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/presteps.sh create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/read_history.py create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/run.sh create mode 100755 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/script create mode 100755 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/script_post rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/system/blockMeshDict (62%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/controlDict rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/system/decomposeParDict (100%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/fvConstraints rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/system/fvSchemes (99%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/system/fvSolution (94%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/system/inlets_outlets.json (100%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/system/mesh.json (100%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/mixers.json create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/setFieldsDict rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch}/writeGlobalVars.py (100%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/.vim/.netrwhist rename OFsolvers/tutorial_cases/{loop_reactor_reacting/0.orig/CH4.gas => loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/CO2.gas} (94%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting/0.orig/CH4.liquid => loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/CO2.liquid} (97%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/H2.gas rename OFsolvers/tutorial_cases/{loop_reactor_reacting/0.orig/water.liquid => loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/H2.liquid} (94%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/N2.gas create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/T.gas create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/T.liquid create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/U.gas create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/U.liquid create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/Ydefault.gas create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/Ydefault.liquid create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alpha.gas create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alpha.liquid create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alphat.gas create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alphat.liquid create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/epsilon.gas create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/epsilon.liquid create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/f.gas create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/k.gas create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/k.liquid create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/nut.gas create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/nut.liquid create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/p create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/p_rgh create mode 100755 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/Allclean create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/computeQOI.sh create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/dynamicMix_util.H create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/fvModels rename OFsolvers/tutorial_cases/{loop_reactor_reacting/constant/combustionProperties.liquid => loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/g} (82%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup}/constant/globalVars (99%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/globalVars_temp rename OFsolvers/tutorial_cases/{loop_reactor_reacting/constant/reactions.liquid => loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/momentumTransport.gas} (65%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting/system/fvConstraints => loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/momentumTransport.liquid} (74%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting/constant/phaseProperties_constantd => loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/phaseProperties} (76%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/phaseProperties_constantd create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/phaseProperties_pbe create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/thermophysicalProperties.gas create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/thermophysicalProperties.liquid create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/get_qoi.py create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/presteps.sh create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/read_history.py create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/run.sh create mode 100755 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/script create mode 100755 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/script_post create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/blockMeshDict rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup}/system/controlDict (95%) create mode 100755 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/decomposeParDict create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/fvConstraints create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/fvSchemes create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/fvSolution create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/inlets_outlets.json create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/mesh.json rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup}/system/mixers.json (91%) rename OFsolvers/tutorial_cases/{loop_reactor_reacting => loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup}/system/setFieldsDict (100%) create mode 100644 OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/writeGlobalVars.py delete mode 100644 OFsolvers/tutorial_cases/loop_reactor_reacting/README.md delete mode 100644 OFsolvers/tutorial_cases/loop_reactor_reacting/run.sh create mode 100644 applications/GA_opt/ga2sim.py create mode 100644 applications/GA_opt/read_qoi.py create mode 100644 applications/GA_opt/runGA.sh create mode 100644 applications/Random_opt/randsim.py create mode 100644 applications/Random_opt/read_qoi.py create mode 100644 applications/Random_opt/runGA.sh create mode 100644 applications/convert_dim.py create mode 100644 applications/read_history.py create mode 100644 applications/write_dynMix_fvModels_force_sign.py delete mode 100644 bird/calibration/param_nn.py delete mode 100644 bird/calibration/scaling.py create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/.vim/.netrwhist rename OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/water.gas => bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/CO2.gas (94%) create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/CO2.liquid create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/H2.gas create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/H2.liquid create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/N2.gas create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/T.gas create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/T.liquid create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/U.gas create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/U.liquid create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/Ydefault.gas create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/Ydefault.liquid create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alpha.gas create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alpha.liquid create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alphat.gas create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alphat.liquid create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/epsilon.gas create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/epsilon.liquid create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/f.gas create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/k.gas create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/k.liquid create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/nut.gas create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/nut.liquid create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/p create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/p_rgh create mode 100755 bird/preprocess/data_preprocess/loop_reactor_3_6L/Allclean create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/computeQOI.sh create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/dynamicMix_util.H create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/fvModels create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/g create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/globalVars create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/globalVars_temp create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/momentumTransport.gas rename OFsolvers/tutorial_cases/loop_reactor_reacting/constant/chemistryProperties.liquid => bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/momentumTransport.liquid (64%) create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/phaseProperties create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/phaseProperties_constantd create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/phaseProperties_pbe create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/thermophysicalProperties.gas create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/thermophysicalProperties.liquid create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/get_qoi.py create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/presteps.sh create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/read_history.py create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/run.sh create mode 100755 bird/preprocess/data_preprocess/loop_reactor_3_6L/script create mode 100755 bird/preprocess/data_preprocess/loop_reactor_3_6L/script_post create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/system/blockMeshDict create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/system/controlDict create mode 100755 bird/preprocess/data_preprocess/loop_reactor_3_6L/system/decomposeParDict create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/system/fvConstraints create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/system/fvSchemes create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/system/fvSolution create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/system/inlets_outlets.json create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/system/mesh.json create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/system/mixers.json create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/system/setFieldsDict create mode 100644 bird/preprocess/data_preprocess/loop_reactor_3_6L/writeGlobalVars.py create mode 100644 bird/preprocess/json_gen/design_io.py create mode 100644 bird/preprocess/json_gen/generate_designs.py delete mode 100644 papers/tutorial/calibration/README.md delete mode 100644 papers/tutorial/calibration/assets/Loss_surr.png delete mode 100644 papers/tutorial/calibration/assets/Surr_a_2_b_5_corner.png delete mode 100644 papers/tutorial/calibration/assets/Surr_a_2_b_5_prop.png delete mode 100644 papers/tutorial/calibration/assets/Surr_a_5_b_5_corner.png delete mode 100644 papers/tutorial/calibration/assets/Surr_a_5_b_5_prop.png delete mode 100644 papers/tutorial/calibration/assets/True_a_2_b_5_corner.png delete mode 100644 papers/tutorial/calibration/assets/True_a_2_b_5_prop.png delete mode 100644 papers/tutorial/calibration/assets/True_a_5_b_5_corner.png delete mode 100644 papers/tutorial/calibration/assets/True_a_5_b_5_prop.png delete mode 100644 papers/tutorial/calibration/assets/test_surr.png delete mode 100644 papers/tutorial/calibration/post_cal.py delete mode 100644 papers/tutorial/calibration/requirements.txt delete mode 100644 papers/tutorial/calibration/tut_calibration_all.py delete mode 100644 papers/tutorial/calibration/tut_surrogate.py create mode 100644 tests/preprocess/test_generate_case.py diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/.vim/.netrwhist b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/.vim/.netrwhist new file mode 100644 index 00000000..b9691c3b --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/.vim/.netrwhist @@ -0,0 +1,3 @@ +let g:netrw_dirhistmax =10 +let g:netrw_dirhistcnt =1 +let g:netrw_dirhist_1='/home/openfoam/postProcessing/patchIntegrate(patch=inlet,field=alpha.gas)/0' diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/CO2.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/CO2.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/CO2.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/CO2.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/CO2.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/CO2.liquid similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/CO2.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/CO2.liquid diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/H2.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/H2.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/H2.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/H2.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/H2.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/H2.liquid similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/H2.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/H2.liquid diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/N2.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/N2.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/N2.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/N2.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/T.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/T.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/T.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/T.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/T.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/T.liquid similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/T.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/T.liquid diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/U.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/U.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/U.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/U.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/U.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/U.liquid similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/U.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/U.liquid diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/Ydefault.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/Ydefault.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/Ydefault.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/Ydefault.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/Ydefault.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/Ydefault.liquid similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/Ydefault.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/Ydefault.liquid diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/alpha.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/alpha.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/alpha.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/alpha.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/alpha.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/alpha.liquid similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/alpha.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/alpha.liquid diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/alphat.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/alphat.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/alphat.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/alphat.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/alphat.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/alphat.liquid similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/alphat.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/alphat.liquid diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/epsilon.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/epsilon.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/epsilon.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/epsilon.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/epsilon.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/epsilon.liquid similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/epsilon.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/epsilon.liquid diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/f.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/f.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/f.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/f.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/k.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/k.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/k.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/k.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/k.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/k.liquid similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/k.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/k.liquid diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/nut.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/nut.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/nut.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/nut.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/nut.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/nut.liquid similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/nut.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/nut.liquid diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/p b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/p similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/p rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/p diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/p_rgh b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/p_rgh similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/p_rgh rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/0.orig/p_rgh diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/Allclean b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/Allclean similarity index 95% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/Allclean rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/Allclean index 4003a12b..f55e0ec9 100755 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/Allclean +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/Allclean @@ -12,4 +12,7 @@ cd ${0%/*} || exit 1 # Run from this directory rm -rf 0 cleanCase +#rm *.obj +#rm *.stl + #------------------------------------------------------------------------------ diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/computeQOI.sh b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/computeQOI.sh new file mode 100644 index 00000000..3756ed7f --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/computeQOI.sh @@ -0,0 +1,13 @@ +if [ ! -f qoi.txt ]; then + # Reconstruct if needed + source /projects/gas2fuels/ofoam_cray_mpich/OpenFOAM-dev/etc/bashrc + reconstructPar -newTimes + module load anaconda3/2023 + conda activate /projects/gas2fuels/conda_env/bird + python read_history.py -cr .. -cn local -df data + python get_qoi.py + conda deactivate +else + echo "WARNING: QOI already computed" +fi + diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/dynamicMix_util.H b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/dynamicMix_util.H similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/dynamicMix_util.H rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/dynamicMix_util.H diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/fvModels b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/fvModels similarity index 87% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/fvModels rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/fvModels index 0ef33092..be989a25 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/fvModels +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/fvModels @@ -12,7 +12,7 @@ codedSource type coded; selectionMode all; field U.liquid; - //name sourceTime; + name sourceTime; codeInclude #{ @@ -36,22 +36,14 @@ codedSource const volVectorField& UL = mesh().lookupObject("U.liquid"); double pi=3.141592654; - double source_pt_x; - double source_pt_y; - double source_pt_z; - double disk_rad; - double disk_area; - double power; - double smear_factor; - double startTime; - source_pt_x=13.807637692813548; - source_pt_y=1.3807637692813548; - source_pt_z=12.426873923532193; - disk_rad=0.9665346384969483; - disk_area=pi*disk_rad*disk_rad; - power=0; - smear_factor=3.0; - startTime = 1; + double source_pt_x=0.25; + double source_pt_y=0.025; + double source_pt_z=0.225; + double disk_rad=0.017499999999999998; + double disk_area=pi*disk_rad*disk_rad; + double power=2.5; + double smear_factor=3.0; + const scalar startTime = 1; if (time.value() > startTime) { // Get V1 @@ -59,7 +51,7 @@ codedSource double V1 = 0; double V2 = 0; double rhoV; - double dist_tol = disk_rad*3; + double dist_tol = disk_rad*5; double dist_n; double upV = 0; @@ -134,5 +126,3 @@ codedSource } #}; }; - - diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/g b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/g similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/g rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/g diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/globalVars b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/globalVars new file mode 100644 index 00000000..21436f69 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/globalVars @@ -0,0 +1,83 @@ +T0 300; //initial T(K) which stays constant +VVM 1.6; +//****water Liquid properties************** +CpMixLiq 4181; +muMixLiq #calc "2.414e-5 * pow(10,247.8/($T0 - 140.0))"; //viscosity (Pa.s) of water as a function of T(K) +kThermLiq 0.62; // W/m-K +rho0MixLiq 1000; // kg/m^3 +sigmaLiq 0.07; //surface tension N/m +//Wilke-Chang params for diffusion coefficient of a given solute in water (solvent) +WC_psi 2.6; +WC_M 18; // kg/kmol +WC_V_O2 25.6e-3; // m3/kmol molar volume at normal boiling temperature (Treybal 1968) +WC_V_H2 14.3e-3; +WC_V_CO2 34e-3; +WC_V_CO 30.7e-3; +WC_V_N2 31.2e-3; +WC_V_CH4 35e-3; // V_b[cm3/mol]=0.285*V_critical^1.048 (Tyn and Calus; ESTIMATING LIQUID MOLAL VOLUME; Processing, Volume 21, Issue 4, Pages 16 - 17) +//****** diffusion coeff *********** +D_H2 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_H2,0.6)"; +D_CO2 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_CO2,0.6)"; +D_CO #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_CO,0.6)"; +D_CH4 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_CH4,0.6)"; +D_N2 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_N2,0.6)"; +//****** Henry coeff *************** +H_O2_298 0.032; +DH_O2 1700; +H_CO2_298 0.83; +DH_CO2 2400; +H_CO_298 0.023; +DH_CO 1300; +H_H2_298 0.019; +DH_H2 500; +H_CH4_298 0.032; +DH_CH4 1900; +H_N2_298 0.015; +DH_N2 1300; +He_H2 #calc "$H_H2_298 * exp($DH_H2 *(1. / $T0 - 1./298.15))"; +He_CO #calc "$H_CO_298 * exp($DH_CO *(1. / $T0 - 1./298.15))"; +He_CO2 #calc "$H_CO2_298 * exp($DH_CO2 *(1. / $T0 - 1./298.15))"; +He_CH4 #calc "$H_CH4_298 * exp($DH_CH4 *(1. / $T0 - 1./298.15))"; +He_N2 #calc "$H_N2_298 * exp($DH_N2 *(1. / $T0 - 1./298.15))"; +//*******inlet gas frac************* +f_H2 0.1; +f_CO2 0.9; +f_N2 0.0; +//*******inlet gas frac************* +inletA 0.0039; +liqVol 0.003625; +alphaGas 1; +alphaLiq 0; +uGasPhase #calc "$liqVol * $VVM / (60 * $inletA * $alphaGas)"; +//********************************* +LeLiqH2 #calc "$kThermLiq / $rho0MixLiq / $D_H2 / $CpMixLiq"; +LeLiqCO #calc "$kThermLiq / $rho0MixLiq / $D_CO / $CpMixLiq"; +LeLiqCO2 #calc "$kThermLiq / $rho0MixLiq / $D_CO2 / $CpMixLiq"; // = 74 +LeLiqCH4 #calc "$kThermLiq / $rho0MixLiq / $D_CH4 / $CpMixLiq"; +LeLiqN2 #calc "$kThermLiq / $rho0MixLiq / $D_N2 / $CpMixLiq"; +LeLiqMix #calc "$f_CO2*$LeLiqCO2+$f_H2*$LeLiqH2"; +PrMixLiq #calc "$CpMixLiq * $muMixLiq / $kThermLiq"; +//********************************* +kH2 #calc "$D_H2*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrH2 #calc "$muMixLiq*$CpMixLiq / $kH2"; + +kCO #calc "$D_CO*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrCO #calc "$muMixLiq*$CpMixLiq / $kCO"; + +kCO2 #calc "$D_CO2*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrCO2 #calc "$muMixLiq*$CpMixLiq / $kCO2"; + +kCH4 #calc "$D_CH4*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrCH4 #calc "$muMixLiq*$CpMixLiq / $kCH4"; + +kN2 #calc "$D_N2*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrN2 #calc "$muMixLiq*$CpMixLiq / $kN2"; +//********************************* +l_scale 0.5; +intensity 0.05; +k_inlet_gas #calc "1.5 * Foam::pow(($uGasPhase), 2) * Foam::pow($intensity, 2)"; +k_inlet_liq #calc "1.5 * Foam::pow(($uGasPhase), 2) * Foam::pow($intensity, 2)"; +eps_inlet_gas #calc "pow(0.09,0.75) * Foam::pow($k_inlet_gas, 1.5) / ($l_scale * 0.07)"; +eps_inlet_liq #calc "pow(0.09,0.75) * Foam::pow($k_inlet_liq, 1.5) / ($l_scale * 0.07)"; +omega_inlet_gas #calc "pow(0.09,-0.25) * pow($k_inlet_gas,0.5) / ($l_scale * 0.07)"; +omega_inlet_liq #calc "pow(0.09,-0.25) * pow($k_inlet_liq,0.5) / ($l_scale * 0.07)"; diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/globalVars_temp b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/globalVars_temp similarity index 99% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/globalVars_temp rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/globalVars_temp index fa630bea..fcb076a7 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/globalVars_temp +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/globalVars_temp @@ -1,5 +1,5 @@ T0 300; //initial T(K) which stays constant -VVM 0.4; +VVM 0.2; //****water Liquid properties************** CpMixLiq 4181; muMixLiq #calc "2.414e-5 * pow(10,247.8/($T0 - 140.0))"; //viscosity (Pa.s) of water as a function of T(K) @@ -42,7 +42,6 @@ He_N2 #calc "$H_N2_298 * exp($DH_N2 *(1. / $T0 - 1./298.15))"; //*******inlet gas frac************* f_H2 0.1; f_CO2 0.9; -f_CH4 0.0; f_N2 0.0; //*******inlet gas frac************* inletA ; diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/momentumTransport.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/momentumTransport.gas similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/momentumTransport.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/momentumTransport.gas diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/momentumTransport.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/momentumTransport.liquid similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/momentumTransport.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/momentumTransport.liquid diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/phaseProperties b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/phaseProperties similarity index 76% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/phaseProperties rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/phaseProperties index 1f6d4671..a3c90f5a 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/phaseProperties +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/phaseProperties @@ -15,34 +15,62 @@ FoamFile #include "$FOAM_CASE/constant/globalVars" -type interfaceCompositionPhaseChangeMultiphaseSystem; +type interfaceCompositionPhaseChangePopulationBalanceMultiphaseSystem; phases (gas liquid); +populationBalances (bubbles); gas { type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel velocityGroup; - diameterModel constant; - - constantCoeffs + velocityGroupCoeffs { - d 3e-3; + populationBalance bubbles; + + shapeModel spherical; + + sizeGroups + ( + f1 {dSph 1.4e-3; value 0.0;} + f2 {dSph 1.8e-3; value 0.0;} + f3 {dSph 2.2e-3; value 0.0;} + f4 {dSph 2.6e-3; value 0.0;} + f5 {dSph 3e-3; value 1.0;} + f6 {dSph 3.4e-3; value 0.0;} + f7 {dSph 3.8e-3; value 0.0;} + f8 {dSph 4.2e-3; value 0.0;} + f9 {dSph 4.6e-3; value 0.0;} + f10 {dSph 5.0e-3; value 0.0;} + ); } + residualAlpha 1e-6; + Sc 0.7; } - liquid { - type reactingPhaseModel; + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + diameterModel constant; + constantCoeffs { d 1e-4; } + Sc #codeStream + { + code + #{ + os << ($LeLiqMix * $CpMixLiq * $muMixLiq / $kThermLiq); + #}; + }; + residualAlpha 1e-6; } @@ -79,16 +107,7 @@ populationBalanceCoeffs ); nucleationModels - ( - reactionDriven - { - nucleationDiameter 3.0e-3; - velocityGroup gas; - reactingPhase liquid; - dmdtf phaseTransfer:dmidtf; - specie CH4; - } - ); + (); } } @@ -141,8 +160,8 @@ drag ( (gas in liquid) { - //type Grace; // Need to install the model available at https://github.com/NREL/BioReactorDesign - type IshiiZuber; + type Grace; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type IshiiZuber; residualRe 1e-3; swarmCorrection { @@ -201,8 +220,8 @@ interfaceComposition.liquid (liquid and gas) { type Henry; - species ( CO2 H2 CH4 ); - k ( $He_CO2 $He_H2 $He_CH4 ); + species ( CO2 H2 ); + k ( $He_CO2 $He_H2 ); Le $LeLiqMix; } ); @@ -214,8 +233,8 @@ diffusiveMassTransfer.liquid ( (gas in liquid) { - //type Higbie; // Need to install the model available at https://github.com/NREL/BioReactorDesign - type Frossling; + type Higbie; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type Frossling; Le $LeLiqMix; } @@ -227,15 +246,7 @@ diffusiveMassTransfer.liquid ); phaseTransfer -( - (gas in liquid) - { - type reactionDriven; - reactingPhase liquid; - targetPhase gas; - species (CH4); - } -); +(); lift ( diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/phaseProperties_constantd b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/phaseProperties_constantd new file mode 100644 index 00000000..e029df99 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/phaseProperties_constantd @@ -0,0 +1,261 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + object phaseProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "$FOAM_CASE/constant/globalVars" + +type interfaceCompositionPhaseChangeMultiphaseSystem; + +phases (gas liquid); + +gas +{ + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel constant; + + constantCoeffs + { + d 3e-3; + } + residualAlpha 1e-6; + Sc 0.7; +} + +liquid +{ + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel constant; + + constantCoeffs + { + d 1e-4; + } + Sc #codeStream + { + code + #{ + os << ($LeLiqMix * $CpMixLiq * $muMixLiq / $kThermLiq); + #}; + }; + + residualAlpha 1e-6; +} + +populationBalanceCoeffs +{ + bubbles + { + continuousPhase liquid; + + coalescenceModels + (); + + binaryBreakupModels + (); + + breakupModels + (); + + driftModels + (); + + nucleationModels + (); + } +} + +blending +{ + default + { + type linear; + minFullyContinuousAlpha.gas 0.7; + minPartlyContinuousAlpha.gas 0.3; + minFullyContinuousAlpha.liquid 0.7; + minPartlyContinuousAlpha.liquid 0.3; + } + heatTransfer + { + type linear; + minFullyContinuousAlpha.gas 1; + minPartlyContinuousAlpha.gas 0; + minFullyContinuousAlpha.liquid 1; + minPartlyContinuousAlpha.liquid 0; + } + massTransfer + { + $heatTransfer; + } +} + +surfaceTension +( + (gas and liquid) + { + type constant; + sigma $sigmaLiq; + } +); + +interfaceCompression +(); + +aspectRatio +( + (gas in liquid) + { + type Wellek; + } +); + + +drag +( + (gas in liquid) + { + type Grace; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type IshiiZuber; + residualRe 1e-3; + swarmCorrection + { + type none; + } + } +); + +virtualMass +( + (gas in liquid) + { + type constantCoefficient; + Cvm 0.5; + } +); + +// heatTransfer +// (); + +heatTransfer.gas +( + (gas in liquid) + { + type spherical; + residualAlpha 1e-4; + } + + (liquid in gas) + { + type RanzMarshall; + residualAlpha 1e-4; + } +); + +heatTransfer.liquid +( + (gas in liquid) + { + type RanzMarshall; + residualAlpha 1e-4; + } + + (liquid in gas) + { + type spherical; + residualAlpha 1e-4; + } +); + +interfaceComposition.gas +(); + +interfaceComposition.liquid +( + (liquid and gas) + { + type Henry; + species ( CO2 H2 ); + k ( $He_CO2 $He_H2 ); + Le $LeLiqMix; + } +); + +diffusiveMassTransfer.gas +(); + +diffusiveMassTransfer.liquid +( + (gas in liquid) + { + type Higbie; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type Frossling; + Le $LeLiqMix; + } + + (liquid in gas) + { + type spherical; + Le 1.0; //not used for spherical + } +); + +phaseTransfer +(); + +lift +( + (gas in liquid) + { + type wallDamped; + + wallDamping + { + type cosine; + Cd 3.0; + } + + lift + { + type Tomiyama; + + swarmCorrection + { + type none; + } + } + } + +); + +wallLubrication +( + (gas in liquid) + { + type Antal; + Cw1 -0.01; + Cw2 0.05; + } +); + +turbulentDispersion +( + (gas in liquid) + { + type Burns; + sigma 0.9; + } +); + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/phaseProperties_pbe b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/phaseProperties_pbe similarity index 84% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/phaseProperties_pbe rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/phaseProperties_pbe index 458ede6d..a3c90f5a 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/phaseProperties_pbe +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/phaseProperties_pbe @@ -55,12 +55,22 @@ gas liquid { - type reactingPhaseModel; + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + diameterModel constant; + constantCoeffs { d 1e-4; } + Sc #codeStream + { + code + #{ + os << ($LeLiqMix * $CpMixLiq * $muMixLiq / $kThermLiq); + #}; + }; + residualAlpha 1e-6; } @@ -97,16 +107,7 @@ populationBalanceCoeffs ); nucleationModels - ( - reactionDriven - { - nucleationDiameter 3.0e-3; - velocityGroup gas; - reactingPhase liquid; - dmdtf phaseTransfer:dmidtf; - specie CH4; - } - ); + (); } } @@ -159,8 +160,8 @@ drag ( (gas in liquid) { - //type Grace; // Need to install the model available at https://github.com/NREL/BioReactorDesign - type IshiiZuber; + type Grace; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type IshiiZuber; residualRe 1e-3; swarmCorrection { @@ -219,8 +220,8 @@ interfaceComposition.liquid (liquid and gas) { type Henry; - species ( CO2 H2 CH4 ); - k ( $He_CO2 $He_H2 $He_CH4 ); + species ( CO2 H2 ); + k ( $He_CO2 $He_H2 ); Le $LeLiqMix; } ); @@ -232,8 +233,8 @@ diffusiveMassTransfer.liquid ( (gas in liquid) { - //type Higbie; // Need to install the model available at https://github.com/NREL/BioReactorDesign - type Frossling; + type Higbie; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type Frossling; Le $LeLiqMix; } @@ -245,15 +246,7 @@ diffusiveMassTransfer.liquid ); phaseTransfer -( - (gas in liquid) - { - type reactionDriven; - reactingPhase liquid; - targetPhase gas; - species (CH4); - } -); +(); lift ( diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/thermophysicalProperties.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/thermophysicalProperties.gas similarity index 84% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/thermophysicalProperties.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/thermophysicalProperties.gas index b26dedb3..11b1c4b9 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/thermophysicalProperties.gas +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/thermophysicalProperties.gas @@ -31,39 +31,11 @@ species ( H2 CO2 - water - CH4 N2 ); defaultSpecie N2; -CH4 -{ - specie - { - molWeight 16.04303; - } - thermodynamics - { - Tlow 200; - Thigh 3500; - Tcommon 1000; - highCpCoeffs ( 0.074851495 0.0133909467 -5.73285809e-06 1.22292535e-09 -1.0181523e-13 -9468.34459 18.437318 ); - lowCpCoeffs ( 5.14987613 -0.0136709788 4.91800599e-05 -4.84743026e-08 1.66693956e-11 -10246.6476 -4.64130376 ); - } - transport - { - As 1.512e-06; - Ts 120; - } - elements - { - C 1; - H 4; - } -} - CO2 { specie diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/thermophysicalProperties.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/thermophysicalProperties.liquid similarity index 86% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/thermophysicalProperties.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/thermophysicalProperties.liquid index c1141906..d324ec51 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/thermophysicalProperties.liquid +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/constant/thermophysicalProperties.liquid @@ -30,7 +30,6 @@ thermoType species ( - CH4 CO2 water H2 @@ -105,28 +104,5 @@ H2 } -CH4 -{ - specie - { - molWeight 16.04; - } - equationOfState - { - rho $rho0MixLiq; - } - thermodynamics - { - Cp $CpMixLiq; - Hf -1.5879e+07;//-9402451; - } - transport - { - mu $muMixLiq; - Pr $PrCH4; - } -} - - // ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/get_qoi.py b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/get_qoi.py new file mode 100644 index 00000000..9562cc65 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/get_qoi.py @@ -0,0 +1,183 @@ +import json +import os +import pickle as pkl + +import matplotlib as mpl +import numpy as np +from prettyPlot.plotting import * +from scipy.optimize import curve_fit + + +def get_sim_folds(path): + folds = os.listdir(path) + sim_folds = [] + for fold in folds: + if fold.startswith("loop"): + sim_folds.append(fold) + return sim_folds + + +def func(t, cstar, kla): + t = t + t0 = 0 + c0 = 0 + return (cstar - c0) * (1 - np.exp(-kla * (t - t0))) + c0 + + +def get_vl(verb=False): + filename = os.path.join("constant", "globalVars") + with open(filename, "r+") as f: + lines = f.readlines() + for line in lines: + if line.startswith("liqVol"): + vol = float(line.split()[-1][:-1]) + break + if verb: + print(f"Read liqVol = {vol}m3") + return vol + + +def get_vvm(verb=False): + filename = os.path.join("constant", "globalVars") + with open(filename, "r+") as f: + lines = f.readlines() + for line in lines: + if line.startswith("VVM"): + vvm = float(line.split()[-1][:-1]) + break + if verb: + print(f"Read VVM = {vvm} [-]") + return vvm + + +def get_As(verb=False): + filename = os.path.join("constant", "globalVars") + with open(filename, "r+") as f: + lines = f.readlines() + for line in lines: + if line.startswith("inletA"): + As = float(line.split()[-1][:-1]) + break + if verb: + print(f"Read As = {As}m2") + return As + + +def get_pmix(verb=False): + with open("system/mixers.json", "r+") as f: + data = json.load(f) + mixer_list = data["mixers"] + pmix = 0 + for mix in mixer_list: + pmix += mix["power"] / 1000 + if verb: + print(f"Read Mixing power = {pmix}kW") + return pmix + + +def get_lh(verb=False): + filename = os.path.join("system", "setFieldsDict") + with open(filename, "r+") as f: + lines = f.readlines() + for line in lines: + if "box (-1.0 -1.0 -1.0)" in line: + height = float(line.split("(")[2].split()[1]) + break + if verb: + print(f"Read Height = {height}m") + return height + + +def get_pinj(vvm, Vl, As, lh): + rhog = 1.25 # kg /m3 + Vg = Vl * vvm / (60 * As * 1) # m/s + Ptank = 101325 # Pa + # Ptank = 0 # Pa + rhoL = 1000 # kg / m3 + Pl = 101325 + rhoL * 9.8 * lh # Pa + # W + P1 = rhog * As * Vg**3 + # W + P2 = (Pl - Ptank) * As * Vg + # kg /s + MF = rhog * Vg * As + # kwh / kg + e_m = (P1 + P2) / (3600 * 1000 * MF) + + # returns kW + return (P1 + P2) * 1e-3 + + +def get_qoi(kla_co2, cs_co2, kla_h2, cs_h2, verb=False): + vvm = get_vvm(verb) + As = get_As(verb) + V_l = get_vl(verb) + liqh = get_lh(verb) + P_inj = get_pinj(vvm, V_l, As, liqh) + P_mix = get_pmix(verb) + + qoi_co2 = kla_co2 * cs_co2 * V_l * 0.04401 / (P_mix / 3600 + P_inj / 3600) + qoi_h2 = kla_h2 * cs_h2 * V_l * 0.002016 / (P_mix / 3600 + P_inj / 3600) + return qoi_co2 * qoi_h2 + + +def get_qoi_uq(kla_co2, cs_co2, kla_h2, cs_h2): + qoi = [] + for i in range(len(kla_co2)): + if i == 0: + verb = True + else: + verb = False + qoi.append(get_qoi(kla_co2[i], cs_co2[i], kla_h2[i], cs_h2[i], verb)) + qoi = np.array(qoi) + return np.mean(qoi), np.std(qoi) + + +os.makedirs("Figures", exist_ok=True) + +dataFolder = "data" +fold = "local" + +nuq = 100 +mean_cstar_co2 = np.random.uniform(12.6, 13.3, nuq) +mean_cstar_h2 = np.random.uniform(0.902, 0.96, nuq) + + +tmp_cs_h2 = [] +tmp_cs_co2 = [] +tmp_kla_h2 = [] +tmp_kla_co2 = [] +cs_co2 = mean_cstar_co2 +cs_h2 = mean_cstar_h2 + +a = np.load(os.path.join(dataFolder, fold, "conv.npz")) +endindex = -1 +if ( + "c_h2" in a + and "c_co2" in a + and len(a["time"][:endindex] > 0) + and (a["time"][:endindex][-1] > 95) +): + for i in range(nuq): + fitparamsH2, _ = curve_fit( + func, + np.array(a["time"][:endindex]), + np.array(a["c_h2"][:endindex]), + bounds=[(cs_h2[i] - 1e-6, 0), (cs_h2[i] + 1e-6, 1)], + ) + fitparamsCO2, _ = curve_fit( + func, + np.array(a["time"][:endindex]), + np.array(a["c_co2"][:endindex]), + bounds=[(cs_co2[i] - 1e-6, 0), (cs_co2[i] + 1e-6, 1)], + ) + tmp_kla_co2.append(fitparamsCO2[1]) + tmp_kla_h2.append(fitparamsH2[1]) + tmp_cs_h2.append(cs_h2[i]) + tmp_cs_co2.append(cs_co2[i]) + +qoi_m, qoi_s = get_qoi_uq(tmp_kla_co2, tmp_cs_co2, tmp_kla_h2, tmp_cs_h2) + + +with open("qoi.txt", "w+") as f: + f.write(f"{qoi_m},{qoi_s}\n") diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/presteps.sh b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/presteps.sh new file mode 100644 index 00000000..899655b8 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/presteps.sh @@ -0,0 +1,71 @@ +# Clean case +module load anaconda3/2023 +conda activate /projects/gas2fuels/conda_env/bird +source /projects/gas2fuels/ofoam_cray_mpich/OpenFOAM-dev/etc/bashrc +./Allclean + +echo PRESTEP 1 +# Generate blockmeshDict +python /projects/gas2fuels/BioReactorDesign/applications/write_block_rect_mesh.py -i system/mesh.json -o system +#python ../../../applications/write_block_rect_mesh.py -i system/mesh.json -o system + +# Generate boundary stl +python /projects/gas2fuels/BioReactorDesign/applications/write_stl_patch.py -i system/inlets_outlets.json +#python ../../../applications/write_stl_patch.py -i system/inlets_outlets.json + +# Generate mixers +python /projects/gas2fuels/BioReactorDesign/applications/write_dynMix_fvModels_force_sign.py -i system/mixers.json -o constant +#python ../../../applications/write_dynMix_fvModels.py -i system/mixers.json -o constant + +echo PRESTEP 2 +# Mesh gen +blockMesh -dict system/blockMeshDict + +# Inlet BC +surfaceToPatch -tol 1e-3 inlets.stl +export newmeshdir=$(foamListTimes -latestTime) +rm -rf constant/polyMesh/ +cp -r $newmeshdir/polyMesh ./constant +rm -rf $newmeshdir +cp constant/polyMesh/boundary /tmp +sed -i -e 's/inlets\.stl/inlet/g' /tmp/boundary +cat /tmp/boundary > constant/polyMesh/boundary + +# Outlet BC +surfaceToPatch -tol 1e-3 outlets.stl +export newmeshdir=$(foamListTimes -latestTime) +rm -rf constant/polyMesh/ +cp -r $newmeshdir/polyMesh ./constant +rm -rf $newmeshdir +cp constant/polyMesh/boundary /tmp +sed -i -e 's/outlets\.stl/outlet/g' /tmp/boundary +cat /tmp/boundary > constant/polyMesh/boundary + + +# Scale +transformPoints "scale=(0.05 0.05 0.05)" + + +# setup IC +cp -r 0.orig 0 +setFields + +# Setup mass flow rate +# Get inlet area +postProcess -func 'patchIntegrate(patch="inlet", field="alpha.gas")' +postProcess -func writeCellVolumes +writeMeshObj + +echo PRESTEP 3 +python writeGlobalVars.py +cp constant/phaseProperties_constantd constant/phaseProperties + + +if [ -f qoi.txt ]; then + rm qoi.txt +fi +if [ -f data/local/conv.npz ]; then + rm data/local/conv.npz +fi + +conda deactivate diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/read_history.py b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/read_history.py new file mode 100644 index 00000000..264711f8 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/read_history.py @@ -0,0 +1,239 @@ +import argparse +import os +import sys + +import numpy as np +from prettyPlot.plotting import plt, pretty_labels + +from bird.utilities.ofio import * + + +def compute_gas_holdup(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + alpha_liq = field_dict["alpha_liq"] + volume = field_dict["volume"] + holdup = np.sum((1 - alpha_liq) * volume) / np.sum(volume) + return holdup, field_dict + + +def co2liq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("co2_liq" in field_dict) or field_dict["co2_liq"] is None: + co2_liq_file = os.path.join(caseFolder, timeFolder, "CO2.liquid") + co2_liq = readOFScal(co2_liq_file, nCells) + # print("computing co2 liq") + field_dict["co2_liq"] = co2_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + if not ("indliq" in field_dict) or field_dict["indliq"] is None: + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.5) + # print("computing indliq") + field_dict["indliq"] = indliq + volume = field_dict["volume"] + indliq = field_dict["indliq"] + alpha_liq = field_dict["alpha_liq"] + co2_liq = field_dict["co2_liq"] + met = np.sum( + alpha_liq[indliq] * co2_liq[indliq] * volume[indliq] + ) / np.sum(volume[indliq]) + return met, field_dict + + +def cliq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("rho_liq" in field_dict) or field_dict["rho_liq"] is None: + rho_liq_file = os.path.join(caseFolder, timeFolder, "rhom") + rho_liq = readOFScal(rho_liq_file, nCells) + field_dict["rho_liq"] = rho_liq + if not ("co2_liq" in field_dict) or field_dict["co2_liq"] is None: + co2_liq_file = os.path.join(caseFolder, timeFolder, "CO2.liquid") + co2_liq = readOFScal(co2_liq_file, nCells) + # print("computing co2 liq") + field_dict["co2_liq"] = co2_liq + if not ("h2_liq" in field_dict) or field_dict["h2_liq"] is None: + h2_liq_file = os.path.join(caseFolder, timeFolder, "H2.liquid") + h2_liq = readOFScal(h2_liq_file, nCells) + # print("computing h2 liq") + field_dict["h2_liq"] = h2_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + if not ("indliq" in field_dict) or field_dict["indliq"] is None: + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.5) + # print("computing indliq") + field_dict["indliq"] = indliq + + volume = field_dict["volume"] + indliq = field_dict["indliq"] + alpha_liq = field_dict["alpha_liq"] + co2_liq = field_dict["co2_liq"] + h2_liq = field_dict["h2_liq"] + rho_liq = field_dict["rho_liq"] + + # c_h2 = rho_liq[indliq] * alpha_liq[indliq] * h2_liq[indliq] / 0.002016 + # c_co2 = rho_liq[indliq] * alpha_liq[indliq] * co2_liq[indliq] / 0.04401 + + c_h2 = 1000 * alpha_liq[indliq] * h2_liq[indliq] / 0.002016 + c_co2 = 1000 * alpha_liq[indliq] * co2_liq[indliq] / 0.04401 + + c_h2 = np.sum(c_h2 * volume[indliq]) / np.sum(volume[indliq]) + c_co2 = np.sum(c_co2 * volume[indliq]) / np.sum(volume[indliq]) + + return c_co2, c_h2, field_dict + + +def h2liq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("h2_liq" in field_dict) or field_dict["h2_liq"] is None: + h2_liq_file = os.path.join(caseFolder, timeFolder, "H2.liquid") + h2_liq = readOFScal(h2_liq_file, nCells) + # print("computing h2 liq") + field_dict["h2_liq"] = h2_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + if not ("indliq" in field_dict) or field_dict["indliq"] is None: + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.5) + # print("computing indliq") + field_dict["indliq"] = indliq + volume = field_dict["volume"] + indliq = field_dict["indliq"] + alpha_liq = field_dict["alpha_liq"] + h2_liq = field_dict["h2_liq"] + met = np.sum(alpha_liq[indliq] * h2_liq[indliq] * volume[indliq]) / np.sum( + volume[indliq] + ) + return met, field_dict + + +def vol_liq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + volume = field_dict["volume"] + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.0) + liqvol = np.sum(alpha_liq[indliq] * volume[indliq]) / np.sum( + volume[indliq] + ) + return liqvol, field_dict + + +parser = argparse.ArgumentParser(description="Convergence of GH") +parser.add_argument( + "-cn", + "--case_name", + type=str, + metavar="", + required=True, + help="Case name", +) +parser.add_argument( + "-df", + "--data_folder", + type=str, + metavar="", + required=False, + help="data folder name", + default="data", +) + +args, unknown = parser.parse_known_args() + + +case_root = "." # "../" +case_name = args.case_name # "12_hole_sparger_snappyRefine_700rpm_opt_coeff" +case_path = "." +dataFolder = args.data_folder + +if os.path.isfile(os.path.join(dataFolder, case_name, "conv.npz")): + sys.exit("WARNING: History already created, Skipping") + +time_float_sorted, time_str_sorted = getCaseTimes(case_path, remove_zero=True) +cellCentres = readMesh(os.path.join(case_path, f"meshCellCentres_0.obj")) +nCells = len(cellCentres) + + +co2_history = np.zeros(len(time_str_sorted)) +c_co2_history = np.zeros(len(time_str_sorted)) +h2_history = np.zeros(len(time_str_sorted)) +c_h2_history = np.zeros(len(time_str_sorted)) +gh_history = np.zeros(len(time_str_sorted)) +liqvol_history = np.zeros(len(time_str_sorted)) +print(f"case_path = {case_path}") +field_dict = {} +for itime, time in enumerate(time_float_sorted): + time_folder = time_str_sorted[itime] + print(f"\tTime : {time_folder}") + if not field_dict == {}: + new_field_dict = {} + if "volume" in field_dict: + new_field_dict["volume"] = field_dict["volume"] + field_dict = new_field_dict + gh_history[itime], field_dict = compute_gas_holdup( + case_path, time_str_sorted[itime], nCells, field_dict + ) + co2_history[itime], field_dict = co2liq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + h2_history[itime], field_dict = h2liq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + liqvol_history[itime], field_dict = vol_liq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + c_co2_history[itime], c_h2_history[itime], field_dict = cliq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + + +os.makedirs(dataFolder, exist_ok=True) +os.makedirs(os.path.join(dataFolder, case_name), exist_ok=True) +np.savez( + os.path.join(dataFolder, case_name, "conv.npz"), + time=np.array(time_float_sorted), + gh=gh_history, + co2=co2_history, + h2=h2_history, + vol_liq=liqvol_history, + c_h2=c_h2_history, + c_co2=c_co2_history, +) diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/run.sh b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/run.sh new file mode 100644 index 00000000..6b7eb516 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/run.sh @@ -0,0 +1,5 @@ +multiphaseEulerFoam + + + + diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/script b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/script new file mode 100755 index 00000000..090e5c05 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/script @@ -0,0 +1,14 @@ +#!/bin/bash +#SBATCH --qos=high +#SBATCH --job-name=val2 +##SBATCH --partition=debug +#SBATCH --nodes=1 +#SBATCH --ntasks-per-node=16 +#SBATCH --time=07:59:00 +#SBATCH --account=co2snow + +bash presteps.sh +source /projects/gas2fuels/ofoam_cray_mpich/OpenFOAM-dev/etc/bashrc +decomposePar -fileHandler collated +srun -n 16 multiphaseEulerFoam -parallel -fileHandler collated +reconstructPar -newTimes diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/script_post b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/script_post new file mode 100755 index 00000000..aabbc33e --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/script_post @@ -0,0 +1,10 @@ +#!/bin/bash +#SBATCH --qos=high +#SBATCH --job-name=val2 +##SBATCH --partition=debug +#SBATCH --nodes=1 +#SBATCH --ntasks-per-node=16 +#SBATCH --time=00:59:00 +#SBATCH --account=co2snow + +bash computeQOI.sh diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/blockMeshDict b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/blockMeshDict similarity index 62% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/system/blockMeshDict rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/blockMeshDict index 0bb60950..1183d262 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/blockMeshDict +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/blockMeshDict @@ -100,50 +100,6 @@ vertices ( 8.0 7.0 0.0) ( 9.0 7.0 0.0) ( 10.0 7.0 0.0) -( 0.0 8.0 0.0) -( 1.0 8.0 0.0) -( 2.0 8.0 0.0) -( 3.0 8.0 0.0) -( 4.0 8.0 0.0) -( 5.0 8.0 0.0) -( 6.0 8.0 0.0) -( 7.0 8.0 0.0) -( 8.0 8.0 0.0) -( 9.0 8.0 0.0) -( 10.0 8.0 0.0) -( 0.0 9.0 0.0) -( 1.0 9.0 0.0) -( 2.0 9.0 0.0) -( 3.0 9.0 0.0) -( 4.0 9.0 0.0) -( 5.0 9.0 0.0) -( 6.0 9.0 0.0) -( 7.0 9.0 0.0) -( 8.0 9.0 0.0) -( 9.0 9.0 0.0) -( 10.0 9.0 0.0) -( 0.0 10.0 0.0) -( 1.0 10.0 0.0) -( 2.0 10.0 0.0) -( 3.0 10.0 0.0) -( 4.0 10.0 0.0) -( 5.0 10.0 0.0) -( 6.0 10.0 0.0) -( 7.0 10.0 0.0) -( 8.0 10.0 0.0) -( 9.0 10.0 0.0) -( 10.0 10.0 0.0) -( 0.0 11.0 0.0) -( 1.0 11.0 0.0) -( 2.0 11.0 0.0) -( 3.0 11.0 0.0) -( 4.0 11.0 0.0) -( 5.0 11.0 0.0) -( 6.0 11.0 0.0) -( 7.0 11.0 0.0) -( 8.0 11.0 0.0) -( 9.0 11.0 0.0) -( 10.0 11.0 0.0) ( 0.0 0.0 1.0) ( 1.0 0.0 1.0) ( 2.0 0.0 1.0) @@ -232,50 +188,6 @@ vertices ( 8.0 7.0 1.0) ( 9.0 7.0 1.0) ( 10.0 7.0 1.0) -( 0.0 8.0 1.0) -( 1.0 8.0 1.0) -( 2.0 8.0 1.0) -( 3.0 8.0 1.0) -( 4.0 8.0 1.0) -( 5.0 8.0 1.0) -( 6.0 8.0 1.0) -( 7.0 8.0 1.0) -( 8.0 8.0 1.0) -( 9.0 8.0 1.0) -( 10.0 8.0 1.0) -( 0.0 9.0 1.0) -( 1.0 9.0 1.0) -( 2.0 9.0 1.0) -( 3.0 9.0 1.0) -( 4.0 9.0 1.0) -( 5.0 9.0 1.0) -( 6.0 9.0 1.0) -( 7.0 9.0 1.0) -( 8.0 9.0 1.0) -( 9.0 9.0 1.0) -( 10.0 9.0 1.0) -( 0.0 10.0 1.0) -( 1.0 10.0 1.0) -( 2.0 10.0 1.0) -( 3.0 10.0 1.0) -( 4.0 10.0 1.0) -( 5.0 10.0 1.0) -( 6.0 10.0 1.0) -( 7.0 10.0 1.0) -( 8.0 10.0 1.0) -( 9.0 10.0 1.0) -( 10.0 10.0 1.0) -( 0.0 11.0 1.0) -( 1.0 11.0 1.0) -( 2.0 11.0 1.0) -( 3.0 11.0 1.0) -( 4.0 11.0 1.0) -( 5.0 11.0 1.0) -( 6.0 11.0 1.0) -( 7.0 11.0 1.0) -( 8.0 11.0 1.0) -( 9.0 11.0 1.0) -( 10.0 11.0 1.0) ( 0.0 0.0 2.0) ( 1.0 0.0 2.0) ( 2.0 0.0 2.0) @@ -364,50 +276,6 @@ vertices ( 8.0 7.0 2.0) ( 9.0 7.0 2.0) ( 10.0 7.0 2.0) -( 0.0 8.0 2.0) -( 1.0 8.0 2.0) -( 2.0 8.0 2.0) -( 3.0 8.0 2.0) -( 4.0 8.0 2.0) -( 5.0 8.0 2.0) -( 6.0 8.0 2.0) -( 7.0 8.0 2.0) -( 8.0 8.0 2.0) -( 9.0 8.0 2.0) -( 10.0 8.0 2.0) -( 0.0 9.0 2.0) -( 1.0 9.0 2.0) -( 2.0 9.0 2.0) -( 3.0 9.0 2.0) -( 4.0 9.0 2.0) -( 5.0 9.0 2.0) -( 6.0 9.0 2.0) -( 7.0 9.0 2.0) -( 8.0 9.0 2.0) -( 9.0 9.0 2.0) -( 10.0 9.0 2.0) -( 0.0 10.0 2.0) -( 1.0 10.0 2.0) -( 2.0 10.0 2.0) -( 3.0 10.0 2.0) -( 4.0 10.0 2.0) -( 5.0 10.0 2.0) -( 6.0 10.0 2.0) -( 7.0 10.0 2.0) -( 8.0 10.0 2.0) -( 9.0 10.0 2.0) -( 10.0 10.0 2.0) -( 0.0 11.0 2.0) -( 1.0 11.0 2.0) -( 2.0 11.0 2.0) -( 3.0 11.0 2.0) -( 4.0 11.0 2.0) -( 5.0 11.0 2.0) -( 6.0 11.0 2.0) -( 7.0 11.0 2.0) -( 8.0 11.0 2.0) -( 9.0 11.0 2.0) -( 10.0 11.0 2.0) ( 0.0 0.0 3.0) ( 1.0 0.0 3.0) ( 2.0 0.0 3.0) @@ -496,50 +364,6 @@ vertices ( 8.0 7.0 3.0) ( 9.0 7.0 3.0) ( 10.0 7.0 3.0) -( 0.0 8.0 3.0) -( 1.0 8.0 3.0) -( 2.0 8.0 3.0) -( 3.0 8.0 3.0) -( 4.0 8.0 3.0) -( 5.0 8.0 3.0) -( 6.0 8.0 3.0) -( 7.0 8.0 3.0) -( 8.0 8.0 3.0) -( 9.0 8.0 3.0) -( 10.0 8.0 3.0) -( 0.0 9.0 3.0) -( 1.0 9.0 3.0) -( 2.0 9.0 3.0) -( 3.0 9.0 3.0) -( 4.0 9.0 3.0) -( 5.0 9.0 3.0) -( 6.0 9.0 3.0) -( 7.0 9.0 3.0) -( 8.0 9.0 3.0) -( 9.0 9.0 3.0) -( 10.0 9.0 3.0) -( 0.0 10.0 3.0) -( 1.0 10.0 3.0) -( 2.0 10.0 3.0) -( 3.0 10.0 3.0) -( 4.0 10.0 3.0) -( 5.0 10.0 3.0) -( 6.0 10.0 3.0) -( 7.0 10.0 3.0) -( 8.0 10.0 3.0) -( 9.0 10.0 3.0) -( 10.0 10.0 3.0) -( 0.0 11.0 3.0) -( 1.0 11.0 3.0) -( 2.0 11.0 3.0) -( 3.0 11.0 3.0) -( 4.0 11.0 3.0) -( 5.0 11.0 3.0) -( 6.0 11.0 3.0) -( 7.0 11.0 3.0) -( 8.0 11.0 3.0) -( 9.0 11.0 3.0) -( 10.0 11.0 3.0) ( 0.0 0.0 4.0) ( 1.0 0.0 4.0) ( 2.0 0.0 4.0) @@ -628,50 +452,6 @@ vertices ( 8.0 7.0 4.0) ( 9.0 7.0 4.0) ( 10.0 7.0 4.0) -( 0.0 8.0 4.0) -( 1.0 8.0 4.0) -( 2.0 8.0 4.0) -( 3.0 8.0 4.0) -( 4.0 8.0 4.0) -( 5.0 8.0 4.0) -( 6.0 8.0 4.0) -( 7.0 8.0 4.0) -( 8.0 8.0 4.0) -( 9.0 8.0 4.0) -( 10.0 8.0 4.0) -( 0.0 9.0 4.0) -( 1.0 9.0 4.0) -( 2.0 9.0 4.0) -( 3.0 9.0 4.0) -( 4.0 9.0 4.0) -( 5.0 9.0 4.0) -( 6.0 9.0 4.0) -( 7.0 9.0 4.0) -( 8.0 9.0 4.0) -( 9.0 9.0 4.0) -( 10.0 9.0 4.0) -( 0.0 10.0 4.0) -( 1.0 10.0 4.0) -( 2.0 10.0 4.0) -( 3.0 10.0 4.0) -( 4.0 10.0 4.0) -( 5.0 10.0 4.0) -( 6.0 10.0 4.0) -( 7.0 10.0 4.0) -( 8.0 10.0 4.0) -( 9.0 10.0 4.0) -( 10.0 10.0 4.0) -( 0.0 11.0 4.0) -( 1.0 11.0 4.0) -( 2.0 11.0 4.0) -( 3.0 11.0 4.0) -( 4.0 11.0 4.0) -( 5.0 11.0 4.0) -( 6.0 11.0 4.0) -( 7.0 11.0 4.0) -( 8.0 11.0 4.0) -( 9.0 11.0 4.0) -( 10.0 11.0 4.0) ( 0.0 0.0 5.0) ( 1.0 0.0 5.0) ( 2.0 0.0 5.0) @@ -760,50 +540,6 @@ vertices ( 8.0 7.0 5.0) ( 9.0 7.0 5.0) ( 10.0 7.0 5.0) -( 0.0 8.0 5.0) -( 1.0 8.0 5.0) -( 2.0 8.0 5.0) -( 3.0 8.0 5.0) -( 4.0 8.0 5.0) -( 5.0 8.0 5.0) -( 6.0 8.0 5.0) -( 7.0 8.0 5.0) -( 8.0 8.0 5.0) -( 9.0 8.0 5.0) -( 10.0 8.0 5.0) -( 0.0 9.0 5.0) -( 1.0 9.0 5.0) -( 2.0 9.0 5.0) -( 3.0 9.0 5.0) -( 4.0 9.0 5.0) -( 5.0 9.0 5.0) -( 6.0 9.0 5.0) -( 7.0 9.0 5.0) -( 8.0 9.0 5.0) -( 9.0 9.0 5.0) -( 10.0 9.0 5.0) -( 0.0 10.0 5.0) -( 1.0 10.0 5.0) -( 2.0 10.0 5.0) -( 3.0 10.0 5.0) -( 4.0 10.0 5.0) -( 5.0 10.0 5.0) -( 6.0 10.0 5.0) -( 7.0 10.0 5.0) -( 8.0 10.0 5.0) -( 9.0 10.0 5.0) -( 10.0 10.0 5.0) -( 0.0 11.0 5.0) -( 1.0 11.0 5.0) -( 2.0 11.0 5.0) -( 3.0 11.0 5.0) -( 4.0 11.0 5.0) -( 5.0 11.0 5.0) -( 6.0 11.0 5.0) -( 7.0 11.0 5.0) -( 8.0 11.0 5.0) -( 9.0 11.0 5.0) -( 10.0 11.0 5.0) ); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -811,232 +547,192 @@ blocks ( //block 0 -hex (0 1 12 11 132 133 144 143 ) +hex (0 1 12 11 88 89 100 99 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 1 -hex (1 2 13 12 133 134 145 144 ) +hex (1 2 13 12 89 90 101 100 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 2 -hex (2 3 14 13 134 135 146 145 ) +hex (2 3 14 13 90 91 102 101 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 3 -hex (3 4 15 14 135 136 147 146 ) +hex (3 4 15 14 91 92 103 102 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 4 -hex (4 5 16 15 136 137 148 147 ) +hex (4 5 16 15 92 93 104 103 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 5 -hex (5 6 17 16 137 138 149 148 ) +hex (5 6 17 16 93 94 105 104 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 6 -hex (6 7 18 17 138 139 150 149 ) +hex (6 7 18 17 94 95 106 105 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 7 -hex (7 8 19 18 139 140 151 150 ) +hex (7 8 19 18 95 96 107 106 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 8 -hex (8 9 20 19 140 141 152 151 ) +hex (8 9 20 19 96 97 108 107 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 9 -hex (9 10 21 20 141 142 153 152 ) +hex (9 10 21 20 97 98 109 108 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 10 -hex (141 142 153 152 273 274 285 284 ) +hex (97 98 109 108 185 186 197 196 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 11 -hex (273 274 285 284 405 406 417 416 ) +hex (185 186 197 196 273 274 285 284 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 12 -hex (405 406 417 416 537 538 549 548 ) +hex (273 274 285 284 361 362 373 372 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 13 -hex (537 538 549 548 669 670 681 680 ) +hex (361 362 373 372 449 450 461 460 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 14 -hex (536 537 548 547 668 669 680 679 ) +hex (360 361 372 371 448 449 460 459 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 15 -hex (535 536 547 546 667 668 679 678 ) +hex (359 360 371 370 447 448 459 458 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 16 -hex (534 535 546 545 666 667 678 677 ) +hex (358 359 370 369 446 447 458 457 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 17 -hex (533 534 545 544 665 666 677 676 ) +hex (357 358 369 368 445 446 457 456 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 18 -hex (532 533 544 543 664 665 676 675 ) +hex (356 357 368 367 444 445 456 455 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 19 -hex (531 532 543 542 663 664 675 674 ) +hex (355 356 367 366 443 444 455 454 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 20 -hex (530 531 542 541 662 663 674 673 ) +hex (354 355 366 365 442 443 454 453 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 21 -hex (529 530 541 540 661 662 673 672 ) +hex (353 354 365 364 441 442 453 452 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 22 -hex (528 529 540 539 660 661 672 671 ) +hex (352 353 364 363 440 441 452 451 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 23 -hex (539 540 551 550 671 672 683 682 ) +hex (363 364 375 374 451 452 463 462 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 24 -hex (550 551 562 561 682 683 694 693 ) +hex (374 375 386 385 462 463 474 473 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 25 -hex (561 562 573 572 693 694 705 704 ) +hex (385 386 397 396 473 474 485 484 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 26 -hex (572 573 584 583 704 705 716 715 ) +hex (396 397 408 407 484 485 496 495 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 27 -hex (583 584 595 594 715 716 727 726 ) +hex (407 408 419 418 495 496 507 506 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 28 -hex (594 595 606 605 726 727 738 737 ) +hex (418 419 430 429 506 507 518 517 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 29 -hex (605 606 617 616 737 738 749 748 ) +hex (308 309 320 319 396 397 408 407 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 30 -hex (616 617 628 627 748 749 760 759 ) +hex (220 221 232 231 308 309 320 319 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 31 -hex (627 628 639 638 759 760 771 770 ) +hex (132 133 144 143 220 221 232 231 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 32 -hex (638 639 650 649 770 771 782 781 ) +hex (44 45 56 55 132 133 144 143 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 33 -hex (440 441 452 451 572 573 584 583 ) +hex (55 56 67 66 143 144 155 154 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 34 -hex (308 309 320 319 440 441 452 451 ) +hex (66 67 78 77 154 155 166 165 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 35 -hex (176 177 188 187 308 309 320 319 ) +hex (33 34 45 44 121 122 133 132 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 36 -hex (44 45 56 55 176 177 188 187 ) +hex (22 23 34 33 110 111 122 121 ) ( 10 10 10 ) SimpleGrading (1 1 1) //block 37 -hex (55 56 67 66 187 188 199 198 ) -( 10 10 10 ) -SimpleGrading (1 1 1) - - //block 38 -hex (66 67 78 77 198 199 210 209 ) -( 10 10 10 ) -SimpleGrading (1 1 1) - - //block 39 -hex (77 78 89 88 209 210 221 220 ) -( 10 10 10 ) -SimpleGrading (1 1 1) - - //block 40 -hex (88 89 100 99 220 221 232 231 ) -( 10 10 10 ) -SimpleGrading (1 1 1) - - //block 41 -hex (99 100 111 110 231 232 243 242 ) -( 10 10 10 ) -SimpleGrading (1 1 1) - - //block 42 -hex (110 111 122 121 242 243 254 253 ) -( 10 10 10 ) -SimpleGrading (1 1 1) - - //block 43 -hex (33 34 45 44 165 166 177 176 ) -( 10 10 10 ) -SimpleGrading (1 1 1) - - //block 44 -hex (22 23 34 33 154 155 166 165 ) -( 10 10 10 ) -SimpleGrading (1 1 1) - - //block 45 -hex (11 12 23 22 143 144 155 154 ) +hex (11 12 23 22 99 100 111 110 ) ( 10 10 10 ) SimpleGrading (1 1 1) ); diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/controlDict b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/controlDict new file mode 100644 index 00000000..7374023a --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/controlDict @@ -0,0 +1,67 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application multiphaseEulerFoam; + +startFrom latestTime;//startTime; + +startTime 0; + +stopAt endTime; + +endTime 100; + +deltaT 0.0001; + +writeControl adjustableRunTime; + +writeInterval 2; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + +adjustTimeStep yes; + +maxCo 0.5; + +maxDeltaT 0.0005; + + +functions +{ + + #includeFunc writeObjects(d.gas) + #includeFunc writeObjects(thermo:rho.gas) + #includeFunc writeObjects(thermo:rho.liquid) +} +//functions +//{ +// #includeFunc fieldAverage(U.air, U.water, alpha.air, p) +//} + + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/decomposeParDict b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/decomposeParDict similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/system/decomposeParDict rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/decomposeParDict diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/fvConstraints b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/fvConstraints new file mode 100644 index 00000000..334f1c8f --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/fvConstraints @@ -0,0 +1,56 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + object fvConstraints; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +limitp +{ + type limitPressure; + + min 1e4; +} +limitUliq +{ + type limitVelocity; + active yes; + U U.liquid; + selectionMode all; + max 1e1; +} +limitUgas +{ + type limitVelocity; + active yes; + U U.gas; + selectionMode all; + max 2e1; +} +limitTgas +{ + type limitTemperature; + selectionMode all; + min 290; + max 310; + phase gas; +} +limitTliq +{ + type limitTemperature; + selectionMode all; + min 290; + max 310; + phase liquid; +} + + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/fvSchemes b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/fvSchemes similarity index 99% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/system/fvSchemes rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/fvSchemes index 7c2385a9..52e6e13a 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/fvSchemes +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/fvSchemes @@ -40,7 +40,6 @@ divSchemes "div\(alphaRhoPhi.*,(K|k|epsilon|omega).*\)" Gauss limitedLinear 1; "div\(alphaPhi.*,f.*\)" Gauss limitedLinear 1; "div\(alphaRhoPhi.*,\(p\|thermo:rho.*\)\)" Gauss limitedLinear 1; - "div\(phim,(k|epsilon)m\)" Gauss upwind; "div\(\(\(\(alpha.*\*thermo:rho.*\)*nuEff.*\)*dev2\(T\(grad\(U.*\)\)\)\)\)" Gauss linear; diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/fvSolution b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/fvSolution similarity index 94% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/system/fvSolution rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/fvSolution index 12592abf..2e69fdfa 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/fvSolution +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/fvSolution @@ -18,8 +18,8 @@ solvers { "alpha.*" { - nAlphaCorr 1; - nAlphaSubCycles 4; + nAlphaCorr 2; + nAlphaSubCycles 5; } bubbles @@ -35,7 +35,7 @@ solvers { solver GAMG; smoother DIC; - tolerance 1e-8; + tolerance 1e-7; relTol 0; } @@ -60,7 +60,8 @@ solvers smoother symGaussSeidel; tolerance 1e-8; relTol 0; - minIter 1; + minIter 0; + maxIter 3; } "f.*" diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/inlets_outlets.json b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/inlets_outlets.json similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/system/inlets_outlets.json rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/inlets_outlets.json diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/mesh.json b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/mesh.json similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/system/mesh.json rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/mesh.json diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/mixers.json b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/mixers.json new file mode 100644 index 00000000..0106f58d --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/mixers.json @@ -0,0 +1,29 @@ +{ + "Meshing": { + "Blockwise": { + "x" : 10, + "y" : 10, + "z" : 10 + } + }, + "Geometry": { + "OverallDomain": { + "x" : {"nblocks": 10, "size_per_block": 1.0, "rescale": 0.05}, + "y" : {"nblocks": 11, "size_per_block": 1.0, "rescale": 0.05}, + "z" : {"nblocks": 5, "size_per_block": 1.0, "rescale": 0.05} + }, + "Fluids": [ + [ [0,0,0], [9,0,0] ], + [ [9,0,0], [9,0,4] ], + [ [9,0,4], [0,0,4] ], + [ [0,1,4], [0,4,4] ], + [ [0,4,4], [0,10,4] ], + [ [0,4,4], [0,4,0] ], + [ [0,4,0], [0,10,0] ], + [ [0,4,0], [0,1,0] ] + ] + }, + "mixers": [ + {"branch_id": 2, "frac_space": 0.5, "start_time": 1, "power": 2.5, "sign": "+"} + ] +} diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/setFieldsDict b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/setFieldsDict new file mode 100644 index 00000000..7faaeb15 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/system/setFieldsDict @@ -0,0 +1,37 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "system"; + object setFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defaultFieldValues +( + volScalarFieldValue alpha.gas 0.99 + volScalarFieldValue alpha.liquid 0.01 +); + +regions +( + boxToCell + { + box (-1.0 -1.0 -1.0) (10 0.2 10.0); + fieldValues + ( + volScalarFieldValue alpha.gas 0.01 + volScalarFieldValue alpha.liquid 0.99 + ); + } +); + + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/writeGlobalVars.py b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/writeGlobalVars.py similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/writeGlobalVars.py rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch/writeGlobalVars.py diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/.vim/.netrwhist b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/.vim/.netrwhist new file mode 100644 index 00000000..b9691c3b --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/.vim/.netrwhist @@ -0,0 +1,3 @@ +let g:netrw_dirhistmax =10 +let g:netrw_dirhistcnt =1 +let g:netrw_dirhist_1='/home/openfoam/postProcessing/patchIntegrate(patch=inlet,field=alpha.gas)/0' diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/CH4.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/CO2.gas similarity index 94% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/CH4.gas rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/CO2.gas index 70655866..e4165b1a 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/CH4.gas +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/CO2.gas @@ -9,7 +9,7 @@ FoamFile { format ascii; class volScalarField; - object CH4.gas; + object CO2.gas; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // dimensions [0 0 0 0 0 0 0]; @@ -26,7 +26,7 @@ boundaryField inlet { type fixedValue; - value uniform $f_CH4; + value uniform $f_CO2; } outlet diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/CH4.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/CO2.liquid similarity index 97% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/CH4.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/CO2.liquid index 9d867e84..4b8ea6a0 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/CH4.liquid +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/CO2.liquid @@ -9,7 +9,7 @@ FoamFile { format ascii; class volScalarField; - object CH4.liquid; + object CO2.liquid; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/H2.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/H2.gas new file mode 100644 index 00000000..9f66b2d2 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/H2.gas @@ -0,0 +1,47 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object H2.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +dimensions [0 0 0 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform 0; + + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform $f_H2; + } + + outlet + { + //type inletOutlet; + //phi phi.gas; + //inletValue $f_H2; + //value $f_H2; + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/water.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/H2.liquid similarity index 94% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/water.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/H2.liquid index 60f35905..65ae8d34 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/water.liquid +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/H2.liquid @@ -9,13 +9,13 @@ FoamFile { format ascii; class volScalarField; - object water.liquid; + object H2.liquid; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // dimensions [0 0 0 0 0 0 0]; -internalField uniform 1.0; +internalField uniform 0.0; boundaryField { diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/N2.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/N2.gas new file mode 100644 index 00000000..c1d7225f --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/N2.gas @@ -0,0 +1,47 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object N2.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +dimensions [0 0 0 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform 1; + + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform $f_N2; + } + + outlet + { + //type inletOutlet; + //phi phi.gas; + //inletValue $f_N2; + //value $f_N2; + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/T.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/T.gas new file mode 100644 index 00000000..bf0199a0 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/T.gas @@ -0,0 +1,44 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object T.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 1 0 0 0]; + +internalField uniform 300; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value $internalField; + } + + outlet + { + type inletOutlet; + phi phi.gas; + inletValue $internalField; + value $internalField; + } + + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/T.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/T.liquid new file mode 100644 index 00000000..7101ea31 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/T.liquid @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object T.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 1 0 0 0]; + +internalField uniform 300; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + outlet + { + type inletOutlet; + phi phi.liquid; + inletValue $internalField; + value $internalField; + } + inlet + { + type fixedValue; + value $internalField; + } + defaultFaces + { + type zeroGradient; + } + +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/U.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/U.gas new file mode 100644 index 00000000..e696566f --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/U.gas @@ -0,0 +1,47 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volVectorField; + object U.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform (0 0.0 0); + +#include "${FOAM_CASE}/constant/globalVars" + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + //type flowRateInletVelocity; + //massFlowRate $mflowRateGas; + //rho thermo:rho.gas; + //value $internalField; + type fixedValue; + value uniform (0 $uGasPhase 0); + } + outlet + { + type pressureInletOutletVelocity; + phi phi.gas; + value $internalField; + } + defaultFaces + { + type slip; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/U.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/U.liquid new file mode 100644 index 00000000..1879e020 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/U.liquid @@ -0,0 +1,46 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volVectorField; + object U.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform (0 0 0); + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + //type flowRateInletVelocity; + //massFlowRate $mflowRateLiq; + //rho thermo:rho.liquid; + //value $internalField; + type fixedValue; + value uniform (0 0 0); + } + outlet + { + type noSlip; + } + defaultFaces + { + type noSlip; + } + +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/Ydefault.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/Ydefault.gas new file mode 100644 index 00000000..fba2945d --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/Ydefault.gas @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object Ydefault.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0.0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform 0.0; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/Ydefault.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/Ydefault.liquid new file mode 100644 index 00000000..a5108564 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/Ydefault.liquid @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object Ydefault.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 1.0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform 1.0; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alpha.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alpha.gas new file mode 100644 index 00000000..1e303fbe --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alpha.gas @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + location "0"; + object alpha.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform $alphaGas; + +boundaryField +{ + inlet + { + type fixedValue; + value uniform $alphaGas; + } + outlet + { + type inletOutlet; + phi phi.gas; + inletValue uniform 1; + value uniform 1; + } + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alpha.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alpha.liquid new file mode 100644 index 00000000..5c92070b --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alpha.liquid @@ -0,0 +1,40 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object alpha.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform 1; + +boundaryField +{ + inlet + { + type fixedValue; + value uniform $alphaLiq; + } + outlet + { + type fixedValue; + value uniform 0; + } + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alphat.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alphat.gas new file mode 100644 index 00000000..b867958f --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alphat.gas @@ -0,0 +1,46 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object alphat.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -1 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type calculated; + value $internalField; + } + + outlet + { + type calculated; + value $internalField; + } + + defaultFaces + { + type calculated; + value $internalField; + //type compressible::alphatWallFunction; + //Prt 0.85; + //value $internalField; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alphat.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alphat.liquid new file mode 100644 index 00000000..2569c3ee --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/alphat.liquid @@ -0,0 +1,44 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object alphat.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -1 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type calculated; + value $internalField; + } + + outlet + { + type calculated; + value $internalField; + } + + defaultFaces + { + type compressible::alphatWallFunction; + Prt 0.85; + value $internalField; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/epsilon.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/epsilon.gas new file mode 100644 index 00000000..707a1cda --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/epsilon.gas @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object epsilon.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -3 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform $eps_inlet_gas; + +boundaryField +{ + inlet + { + type fixedValue; + value uniform $eps_inlet_gas; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + //type epsilonWallFunction; + //value $internalField; + } + + // defaultFaces + // { + // type empty; + // } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/epsilon.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/epsilon.liquid new file mode 100644 index 00000000..0a4236fd --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/epsilon.liquid @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object epsilon.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -3 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform $eps_inlet_liq; + +boundaryField +{ + inlet + { + type fixedValue; + value uniform $eps_inlet_liq; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type epsilonWallFunction; + value $internalField; + } + +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/f.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/f.gas new file mode 100644 index 00000000..76ee77a9 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/f.gas @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object f.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 1.0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform 1.0; //$internalField; // + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/k.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/k.gas new file mode 100644 index 00000000..4a3d44ca --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/k.gas @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object k.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform $k_inlet_gas; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform $k_inlet_gas; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/k.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/k.liquid new file mode 100644 index 00000000..cde8f6c1 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/k.liquid @@ -0,0 +1,44 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object k.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform $k_inlet_liq; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform $k_inlet_liq; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type kqRWallFunction; + value $internalField; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/nut.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/nut.gas new file mode 100644 index 00000000..ba16dd4c --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/nut.gas @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object nut.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -1 0 0 0 0]; + +internalField uniform 1e-8; + +boundaryField +{ + inlet + { + type calculated; + value $internalField; + } + + outlet + { + type calculated; + value $internalField; + } + + defaultFaces + { + //type nutkWallFunction; + //value $internalField; + type calculated; + value $internalField; + } + + // defaultFaces + // { + // type empty; + // } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/nut.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/nut.liquid new file mode 100644 index 00000000..1442e07f --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/nut.liquid @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object nut.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -1 0 0 0 0]; + +internalField uniform 1e-4; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type calculated; + value $internalField; + } + + outlet + { + type calculated; + value $internalField; + } + + defaultFaces + { + type nutkWallFunction; + value $internalField; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/p b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/p new file mode 100644 index 00000000..b3a295fb --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/p @@ -0,0 +1,39 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object p; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -2 0 0 0 0]; + +internalField uniform 101325; + +boundaryField +{ + inlet + { + type calculated; + value $internalField; + } + outlet + { + type calculated; + value $internalField; + } + defaultFaces + { + type calculated; + value $internalField; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/p_rgh b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/p_rgh new file mode 100644 index 00000000..88ee7d80 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/0.orig/p_rgh @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object p_rgh; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -2 0 0 0 0]; + +internalField uniform 101325; + +boundaryField +{ + inlet + { + type fixedFluxPressure; + value $internalField; + } + outlet + { + type prghTotalPressure; + p0 $internalField; + U U.gas; + phi phi.gas; + rho thermo:rho.gas; + value $internalField; + } + defaultFaces + { + type fixedFluxPressure; + value $internalField; + } +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/Allclean b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/Allclean new file mode 100755 index 00000000..f55e0ec9 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/Allclean @@ -0,0 +1,18 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory + +# Source tutorial clean functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +# Remove surface, features and solution +#rm -rf constant/extendedFeatureEdgeMesh > /dev/null 2>&1 +#rm -f constant/triSurface/*.eMesh > /dev/null 2>&1 +#rm -rf constant/polyMesh > /dev/null 2>&1 +#rm -rf processor* > /dev/null 2>&1 +rm -rf 0 +cleanCase + +#rm *.obj +#rm *.stl + +#------------------------------------------------------------------------------ diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/computeQOI.sh b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/computeQOI.sh new file mode 100644 index 00000000..3756ed7f --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/computeQOI.sh @@ -0,0 +1,13 @@ +if [ ! -f qoi.txt ]; then + # Reconstruct if needed + source /projects/gas2fuels/ofoam_cray_mpich/OpenFOAM-dev/etc/bashrc + reconstructPar -newTimes + module load anaconda3/2023 + conda activate /projects/gas2fuels/conda_env/bird + python read_history.py -cr .. -cn local -df data + python get_qoi.py + conda deactivate +else + echo "WARNING: QOI already computed" +fi + diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/dynamicMix_util.H b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/dynamicMix_util.H new file mode 100644 index 00000000..8fa7daf7 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/dynamicMix_util.H @@ -0,0 +1,37 @@ +#include + +double gradfunMix(double V1, double V2){ + return 3.0*V2*V2 + 2.0*V1*V2 - V1*V1; +} + +double funMix(double V1, double V2, double P, double rhoL, double A){ + return V2*V2*V2 + V1*V2*V2 - V2*V1*V1 - V1*V1*V1 - 4.0*P/(rhoL * A); +} + +double findV2(double P, double rhoL, double A, double V1) { + int newton_iter = 100; + double V2 = 2*V1; + double V2_old; + double V2_new; + if (std::abs(V1) < 1e-12) { + V2=std::pow((4.0*P/rhoL/A),0.333333); + V2_new = V2; + V2_old = V2; + } else { + for (int i=0; i("thermo:rho.liquid"); + const volScalarField& alphaL = + mesh().lookupObject("alpha.liquid"); + const volVectorField& UL = + mesh().lookupObject("U.liquid"); + double pi=3.141592654; + double source_pt_x=13.807637692813548; + double source_pt_y=1.3807637692813548; + double source_pt_z=12.426873923532193; + double disk_rad=0.9665346384969483; + double disk_area=pi*disk_rad*disk_rad; + double power=7626.034346240216; + double smear_factor=3.0; + const scalar startTime = 1; + if (time.value() > startTime) + { + // Get V1 + double source_sign_factor = 1.0; + double V1 = 0; + double V2 = 0; + double rhoV; + double dist_tol = disk_rad*5; + + double dist_n; + double upV = 0; + double uprhoV = 0; + double upVvol = 0; + double downV = 0; + double downrhoV = 0; + double downVvol = 0; + double dist2; + forAll(C,i) + { + dist2 = (C[i].x()-source_pt_x)*(C[i].x()-source_pt_x); + dist2 += (C[i].y()-source_pt_y)*(C[i].y()-source_pt_y); + dist2 += (C[i].z()-source_pt_z)*(C[i].z()-source_pt_z); + + dist_n = (C[i].x()-source_pt_x); + + if (dist2 < dist_tol*dist_tol && dist_n < -dist_tol/2) { + upVvol += V[i] * alphaL[i]; + upV += V[i] * alphaL[i] * UL[i][0]; + uprhoV += V[i] * alphaL[i] * rhoL[i]; + } + if (dist2 < dist_tol*dist_tol && dist_n > dist_tol/2) { + downVvol += V[i] * alphaL[i]; + downV += V[i] * alphaL[i] * UL[i][0]; + downrhoV += V[i] * alphaL[i] * rhoL[i]; + } + } + + reduce(uprhoV, sumOp()); + reduce(downrhoV, sumOp()); + reduce(upV, sumOp()); + reduce(downV, sumOp()); + reduce(downVvol, sumOp()); + reduce(upVvol, sumOp()); + + downV /= downVvol; + upV /= upVvol; + downrhoV /= downVvol; + uprhoV /= upVvol; + + if (upV <= 0 && downV <= 0) { + source_sign_factor = -1.0; + V1 = std::abs(upV); + rhoV = uprhoV; + } else if (upV >= 0 && downV >= 0) { + source_sign_factor = 1.0; + V1 = std::abs(downV); + rhoV = downrhoV; + } else { + V1 = 0.0; + source_sign_factor = -1.0; + rhoV = uprhoV; + Foam::Info << "[BIRD:DYNMIX WARN] " << "upV = " << upV << " downV = " << downV << " for source at " << source_pt_x << ", " << source_pt_y << ", " << source_pt_z << endl; + } + Foam::Info << "[BIRD:DYNMIX INFO] V1 = " << V1 << endl; + + // Get V2 + V2 = findV2(power, rhoV, disk_area, V1); + + forAll(C,i) + { + double Thrust=0.5*rhoL[i]*(V2*V2 - V1*V1)*disk_area; + double dist2=(C[i].x()-source_pt_x)*(C[i].x()-source_pt_x); + dist2 += (C[i].y()-source_pt_y)*(C[i].y()-source_pt_y); + dist2 += (C[i].z()-source_pt_z)*(C[i].z()-source_pt_z); + double epsilon=pow(V[i],0.33333)*smear_factor; + double sourceterm=alphaL[i]*(Thrust/pow(pi,1.5)/pow(epsilon,3.0))* + exp(-dist2/(epsilon*epsilon)); + Usource[i][0] -= source_sign_factor*sourceterm*V[i]; + } + } + #}; +}; diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/combustionProperties.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/g similarity index 82% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/combustionProperties.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/g index 93b7615d..770a5619 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/combustionProperties.liquid +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/g @@ -7,15 +7,15 @@ \*---------------------------------------------------------------------------*/ FoamFile { - version 2.0; format ascii; - class dictionary; + class uniformDimensionedVectorField; location "constant"; - object combustionProperties.liquid; + object g; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -combustionModel laminar; +dimensions [0 1 -2 0 0 0 0]; +value (0 -9.81 0); // ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/globalVars b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/globalVars similarity index 99% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/globalVars rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/globalVars index f48bc569..1a0ce724 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/globalVars +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/globalVars @@ -1,5 +1,5 @@ T0 300; //initial T(K) which stays constant -VVM 0.4; +VVM 1.6; //****water Liquid properties************** CpMixLiq 4181; muMixLiq #calc "2.414e-5 * pow(10,247.8/($T0 - 140.0))"; //viscosity (Pa.s) of water as a function of T(K) @@ -42,11 +42,10 @@ He_N2 #calc "$H_N2_298 * exp($DH_N2 *(1. / $T0 - 1./298.15))"; //*******inlet gas frac************* f_H2 0.1; f_CO2 0.9; -f_CH4 0.0; f_N2 0.0; //*******inlet gas frac************* inletA 11.8966; -liqVol 608.198; +liqVol 606.514; alphaGas 1; alphaLiq 0; uGasPhase #calc "$liqVol * $VVM / (60 * $inletA * $alphaGas)"; diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/globalVars_temp b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/globalVars_temp new file mode 100644 index 00000000..fcb076a7 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/globalVars_temp @@ -0,0 +1,83 @@ +T0 300; //initial T(K) which stays constant +VVM 0.2; +//****water Liquid properties************** +CpMixLiq 4181; +muMixLiq #calc "2.414e-5 * pow(10,247.8/($T0 - 140.0))"; //viscosity (Pa.s) of water as a function of T(K) +kThermLiq 0.62; // W/m-K +rho0MixLiq 1000; // kg/m^3 +sigmaLiq 0.07; //surface tension N/m +//Wilke-Chang params for diffusion coefficient of a given solute in water (solvent) +WC_psi 2.6; +WC_M 18; // kg/kmol +WC_V_O2 25.6e-3; // m3/kmol molar volume at normal boiling temperature (Treybal 1968) +WC_V_H2 14.3e-3; +WC_V_CO2 34e-3; +WC_V_CO 30.7e-3; +WC_V_N2 31.2e-3; +WC_V_CH4 35e-3; // V_b[cm3/mol]=0.285*V_critical^1.048 (Tyn and Calus; ESTIMATING LIQUID MOLAL VOLUME; Processing, Volume 21, Issue 4, Pages 16 - 17) +//****** diffusion coeff *********** +D_H2 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_H2,0.6)"; +D_CO2 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_CO2,0.6)"; +D_CO #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_CO,0.6)"; +D_CH4 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_CH4,0.6)"; +D_N2 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_N2,0.6)"; +//****** Henry coeff *************** +H_O2_298 0.032; +DH_O2 1700; +H_CO2_298 0.83; +DH_CO2 2400; +H_CO_298 0.023; +DH_CO 1300; +H_H2_298 0.019; +DH_H2 500; +H_CH4_298 0.032; +DH_CH4 1900; +H_N2_298 0.015; +DH_N2 1300; +He_H2 #calc "$H_H2_298 * exp($DH_H2 *(1. / $T0 - 1./298.15))"; +He_CO #calc "$H_CO_298 * exp($DH_CO *(1. / $T0 - 1./298.15))"; +He_CO2 #calc "$H_CO2_298 * exp($DH_CO2 *(1. / $T0 - 1./298.15))"; +He_CH4 #calc "$H_CH4_298 * exp($DH_CH4 *(1. / $T0 - 1./298.15))"; +He_N2 #calc "$H_N2_298 * exp($DH_N2 *(1. / $T0 - 1./298.15))"; +//*******inlet gas frac************* +f_H2 0.1; +f_CO2 0.9; +f_N2 0.0; +//*******inlet gas frac************* +inletA ; +liqVol ; +alphaGas 1; +alphaLiq 0; +uGasPhase #calc "$liqVol * $VVM / (60 * $inletA * $alphaGas)"; +//********************************* +LeLiqH2 #calc "$kThermLiq / $rho0MixLiq / $D_H2 / $CpMixLiq"; +LeLiqCO #calc "$kThermLiq / $rho0MixLiq / $D_CO / $CpMixLiq"; +LeLiqCO2 #calc "$kThermLiq / $rho0MixLiq / $D_CO2 / $CpMixLiq"; // = 74 +LeLiqCH4 #calc "$kThermLiq / $rho0MixLiq / $D_CH4 / $CpMixLiq"; +LeLiqN2 #calc "$kThermLiq / $rho0MixLiq / $D_N2 / $CpMixLiq"; +LeLiqMix #calc "$f_CO2*$LeLiqCO2+$f_H2*$LeLiqH2"; +PrMixLiq #calc "$CpMixLiq * $muMixLiq / $kThermLiq"; +//********************************* +kH2 #calc "$D_H2*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrH2 #calc "$muMixLiq*$CpMixLiq / $kH2"; + +kCO #calc "$D_CO*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrCO #calc "$muMixLiq*$CpMixLiq / $kCO"; + +kCO2 #calc "$D_CO2*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrCO2 #calc "$muMixLiq*$CpMixLiq / $kCO2"; + +kCH4 #calc "$D_CH4*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrCH4 #calc "$muMixLiq*$CpMixLiq / $kCH4"; + +kN2 #calc "$D_N2*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrN2 #calc "$muMixLiq*$CpMixLiq / $kN2"; +//********************************* +l_scale 0.5; +intensity 0.05; +k_inlet_gas #calc "1.5 * Foam::pow(($uGasPhase), 2) * Foam::pow($intensity, 2)"; +k_inlet_liq #calc "1.5 * Foam::pow(($uGasPhase), 2) * Foam::pow($intensity, 2)"; +eps_inlet_gas #calc "pow(0.09,0.75) * Foam::pow($k_inlet_gas, 1.5) / ($l_scale * 0.07)"; +eps_inlet_liq #calc "pow(0.09,0.75) * Foam::pow($k_inlet_liq, 1.5) / ($l_scale * 0.07)"; +omega_inlet_gas #calc "pow(0.09,-0.25) * pow($k_inlet_gas,0.5) / ($l_scale * 0.07)"; +omega_inlet_liq #calc "pow(0.09,-0.25) * pow($k_inlet_liq,0.5) / ($l_scale * 0.07)"; diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/reactions.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/momentumTransport.gas similarity index 65% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/reactions.liquid rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/momentumTransport.gas index e686faed..ca916714 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/reactions.liquid +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/momentumTransport.gas @@ -4,28 +4,23 @@ \\ / O peration | Website: https://openfoam.org \\ / A nd | Version: dev \\/ M anipulation | -------------------------------------------------------------------------------- - \*---------------------------------------------------------------------------*/ FoamFile { - version 2.0; format ascii; class dictionary; location "constant"; - object reactions.liquid; + object momentumTransport.gas; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -reactions + +//simulationType laminar; +simulationType RAS; +RAS { - methanation - { - type irreversibleArrhenius; - reaction "CO2 + 4H2 = CH4 + 2water"; - - A 2.5e7; - beta 0.0; - Ta 0.0; - } + model mixtureKEpsilon; + turbulence on; + printCoeff on; } + // ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/fvConstraints b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/momentumTransport.liquid similarity index 74% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/system/fvConstraints rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/momentumTransport.liquid index 33a2d6db..2063de0d 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/fvConstraints +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/momentumTransport.liquid @@ -9,23 +9,19 @@ FoamFile { format ascii; class dictionary; - object fvConstraints; + location "constant"; + object momentumTransport.liquid; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -limitp -{ - type limitPressure; +//simulationType laminar; +simulationType RAS; - min 1e4; -} -limitU +RAS { - type limitVelocity; - active yes; - U U.liquid; - selectionMode all; - max 2e1; + model mixtureKEpsilon; + turbulence on; + printCoeffs on; } // ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/phaseProperties_constantd b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/phaseProperties similarity index 76% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/phaseProperties_constantd rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/phaseProperties index 1f6d4671..a3c90f5a 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/phaseProperties_constantd +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/phaseProperties @@ -15,34 +15,62 @@ FoamFile #include "$FOAM_CASE/constant/globalVars" -type interfaceCompositionPhaseChangeMultiphaseSystem; +type interfaceCompositionPhaseChangePopulationBalanceMultiphaseSystem; phases (gas liquid); +populationBalances (bubbles); gas { type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel velocityGroup; - diameterModel constant; - - constantCoeffs + velocityGroupCoeffs { - d 3e-3; + populationBalance bubbles; + + shapeModel spherical; + + sizeGroups + ( + f1 {dSph 1.4e-3; value 0.0;} + f2 {dSph 1.8e-3; value 0.0;} + f3 {dSph 2.2e-3; value 0.0;} + f4 {dSph 2.6e-3; value 0.0;} + f5 {dSph 3e-3; value 1.0;} + f6 {dSph 3.4e-3; value 0.0;} + f7 {dSph 3.8e-3; value 0.0;} + f8 {dSph 4.2e-3; value 0.0;} + f9 {dSph 4.6e-3; value 0.0;} + f10 {dSph 5.0e-3; value 0.0;} + ); } + residualAlpha 1e-6; + Sc 0.7; } - liquid { - type reactingPhaseModel; + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + diameterModel constant; + constantCoeffs { d 1e-4; } + Sc #codeStream + { + code + #{ + os << ($LeLiqMix * $CpMixLiq * $muMixLiq / $kThermLiq); + #}; + }; + residualAlpha 1e-6; } @@ -79,16 +107,7 @@ populationBalanceCoeffs ); nucleationModels - ( - reactionDriven - { - nucleationDiameter 3.0e-3; - velocityGroup gas; - reactingPhase liquid; - dmdtf phaseTransfer:dmidtf; - specie CH4; - } - ); + (); } } @@ -141,8 +160,8 @@ drag ( (gas in liquid) { - //type Grace; // Need to install the model available at https://github.com/NREL/BioReactorDesign - type IshiiZuber; + type Grace; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type IshiiZuber; residualRe 1e-3; swarmCorrection { @@ -201,8 +220,8 @@ interfaceComposition.liquid (liquid and gas) { type Henry; - species ( CO2 H2 CH4 ); - k ( $He_CO2 $He_H2 $He_CH4 ); + species ( CO2 H2 ); + k ( $He_CO2 $He_H2 ); Le $LeLiqMix; } ); @@ -214,8 +233,8 @@ diffusiveMassTransfer.liquid ( (gas in liquid) { - //type Higbie; // Need to install the model available at https://github.com/NREL/BioReactorDesign - type Frossling; + type Higbie; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type Frossling; Le $LeLiqMix; } @@ -227,15 +246,7 @@ diffusiveMassTransfer.liquid ); phaseTransfer -( - (gas in liquid) - { - type reactionDriven; - reactingPhase liquid; - targetPhase gas; - species (CH4); - } -); +(); lift ( diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/phaseProperties_constantd b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/phaseProperties_constantd new file mode 100644 index 00000000..e029df99 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/phaseProperties_constantd @@ -0,0 +1,261 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + object phaseProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "$FOAM_CASE/constant/globalVars" + +type interfaceCompositionPhaseChangeMultiphaseSystem; + +phases (gas liquid); + +gas +{ + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel constant; + + constantCoeffs + { + d 3e-3; + } + residualAlpha 1e-6; + Sc 0.7; +} + +liquid +{ + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel constant; + + constantCoeffs + { + d 1e-4; + } + Sc #codeStream + { + code + #{ + os << ($LeLiqMix * $CpMixLiq * $muMixLiq / $kThermLiq); + #}; + }; + + residualAlpha 1e-6; +} + +populationBalanceCoeffs +{ + bubbles + { + continuousPhase liquid; + + coalescenceModels + (); + + binaryBreakupModels + (); + + breakupModels + (); + + driftModels + (); + + nucleationModels + (); + } +} + +blending +{ + default + { + type linear; + minFullyContinuousAlpha.gas 0.7; + minPartlyContinuousAlpha.gas 0.3; + minFullyContinuousAlpha.liquid 0.7; + minPartlyContinuousAlpha.liquid 0.3; + } + heatTransfer + { + type linear; + minFullyContinuousAlpha.gas 1; + minPartlyContinuousAlpha.gas 0; + minFullyContinuousAlpha.liquid 1; + minPartlyContinuousAlpha.liquid 0; + } + massTransfer + { + $heatTransfer; + } +} + +surfaceTension +( + (gas and liquid) + { + type constant; + sigma $sigmaLiq; + } +); + +interfaceCompression +(); + +aspectRatio +( + (gas in liquid) + { + type Wellek; + } +); + + +drag +( + (gas in liquid) + { + type Grace; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type IshiiZuber; + residualRe 1e-3; + swarmCorrection + { + type none; + } + } +); + +virtualMass +( + (gas in liquid) + { + type constantCoefficient; + Cvm 0.5; + } +); + +// heatTransfer +// (); + +heatTransfer.gas +( + (gas in liquid) + { + type spherical; + residualAlpha 1e-4; + } + + (liquid in gas) + { + type RanzMarshall; + residualAlpha 1e-4; + } +); + +heatTransfer.liquid +( + (gas in liquid) + { + type RanzMarshall; + residualAlpha 1e-4; + } + + (liquid in gas) + { + type spherical; + residualAlpha 1e-4; + } +); + +interfaceComposition.gas +(); + +interfaceComposition.liquid +( + (liquid and gas) + { + type Henry; + species ( CO2 H2 ); + k ( $He_CO2 $He_H2 ); + Le $LeLiqMix; + } +); + +diffusiveMassTransfer.gas +(); + +diffusiveMassTransfer.liquid +( + (gas in liquid) + { + type Higbie; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type Frossling; + Le $LeLiqMix; + } + + (liquid in gas) + { + type spherical; + Le 1.0; //not used for spherical + } +); + +phaseTransfer +(); + +lift +( + (gas in liquid) + { + type wallDamped; + + wallDamping + { + type cosine; + Cd 3.0; + } + + lift + { + type Tomiyama; + + swarmCorrection + { + type none; + } + } + } + +); + +wallLubrication +( + (gas in liquid) + { + type Antal; + Cw1 -0.01; + Cw2 0.05; + } +); + +turbulentDispersion +( + (gas in liquid) + { + type Burns; + sigma 0.9; + } +); + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/phaseProperties_pbe b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/phaseProperties_pbe new file mode 100644 index 00000000..a3c90f5a --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/phaseProperties_pbe @@ -0,0 +1,295 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + object phaseProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "$FOAM_CASE/constant/globalVars" + +type interfaceCompositionPhaseChangePopulationBalanceMultiphaseSystem; + +phases (gas liquid); + +populationBalances (bubbles); + +gas +{ + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel velocityGroup; + + velocityGroupCoeffs + { + populationBalance bubbles; + + shapeModel spherical; + + sizeGroups + ( + f1 {dSph 1.4e-3; value 0.0;} + f2 {dSph 1.8e-3; value 0.0;} + f3 {dSph 2.2e-3; value 0.0;} + f4 {dSph 2.6e-3; value 0.0;} + f5 {dSph 3e-3; value 1.0;} + f6 {dSph 3.4e-3; value 0.0;} + f7 {dSph 3.8e-3; value 0.0;} + f8 {dSph 4.2e-3; value 0.0;} + f9 {dSph 4.6e-3; value 0.0;} + f10 {dSph 5.0e-3; value 0.0;} + ); + } + + residualAlpha 1e-6; + + Sc 0.7; +} + +liquid +{ + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel constant; + + constantCoeffs + { + d 1e-4; + } + Sc #codeStream + { + code + #{ + os << ($LeLiqMix * $CpMixLiq * $muMixLiq / $kThermLiq); + #}; + }; + + residualAlpha 1e-6; +} + +populationBalanceCoeffs +{ + bubbles + { + continuousPhase liquid; + + coalescenceModels + ( + LehrMilliesMewes{ + efficiency 4.695; + uCrit 0.08; + alphaMax 0.6; + } + ); + + binaryBreakupModels + (); + + breakupModels + ( + Laakkonen { + efficiency 13.83; + daughterSizeDistributionModel Laakkonen; + } + + ); + + driftModels + ( + densityChange{} + ); + + nucleationModels + (); + } +} + +blending +{ + default + { + type linear; + minFullyContinuousAlpha.gas 0.7; + minPartlyContinuousAlpha.gas 0.3; + minFullyContinuousAlpha.liquid 0.7; + minPartlyContinuousAlpha.liquid 0.3; + } + heatTransfer + { + type linear; + minFullyContinuousAlpha.gas 1; + minPartlyContinuousAlpha.gas 0; + minFullyContinuousAlpha.liquid 1; + minPartlyContinuousAlpha.liquid 0; + } + massTransfer + { + $heatTransfer; + } +} + +surfaceTension +( + (gas and liquid) + { + type constant; + sigma $sigmaLiq; + } +); + +interfaceCompression +(); + +aspectRatio +( + (gas in liquid) + { + type Wellek; + } +); + + +drag +( + (gas in liquid) + { + type Grace; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type IshiiZuber; + residualRe 1e-3; + swarmCorrection + { + type none; + } + } +); + +virtualMass +( + (gas in liquid) + { + type constantCoefficient; + Cvm 0.5; + } +); + +// heatTransfer +// (); + +heatTransfer.gas +( + (gas in liquid) + { + type spherical; + residualAlpha 1e-4; + } + + (liquid in gas) + { + type RanzMarshall; + residualAlpha 1e-4; + } +); + +heatTransfer.liquid +( + (gas in liquid) + { + type RanzMarshall; + residualAlpha 1e-4; + } + + (liquid in gas) + { + type spherical; + residualAlpha 1e-4; + } +); + +interfaceComposition.gas +(); + +interfaceComposition.liquid +( + (liquid and gas) + { + type Henry; + species ( CO2 H2 ); + k ( $He_CO2 $He_H2 ); + Le $LeLiqMix; + } +); + +diffusiveMassTransfer.gas +(); + +diffusiveMassTransfer.liquid +( + (gas in liquid) + { + type Higbie; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type Frossling; + Le $LeLiqMix; + } + + (liquid in gas) + { + type spherical; + Le 1.0; //not used for spherical + } +); + +phaseTransfer +(); + +lift +( + (gas in liquid) + { + type wallDamped; + + wallDamping + { + type cosine; + Cd 3.0; + } + + lift + { + type Tomiyama; + + swarmCorrection + { + type none; + } + } + } + +); + +wallLubrication +( + (gas in liquid) + { + type Antal; + Cw1 -0.01; + Cw2 0.05; + } +); + +turbulentDispersion +( + (gas in liquid) + { + type Burns; + sigma 0.9; + } +); + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/thermophysicalProperties.gas b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/thermophysicalProperties.gas new file mode 100644 index 00000000..11b1c4b9 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/thermophysicalProperties.gas @@ -0,0 +1,142 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "constant"; + object thermophysicalProperties.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +thermoType +{ + type heRhoThermo; + mixture multiComponentMixture; + transport sutherland; + thermo janaf; + equationOfState perfectGas; + specie specie; + energy sensibleInternalEnergy; + //energy sensibleEnthalpy; +} + + +species +( + H2 + CO2 + N2 +); + +defaultSpecie N2; + +CO2 +{ + specie + { + molWeight 44.00995; + } + thermodynamics + { + Tlow 200; + Thigh 3500; + Tcommon 1000; + highCpCoeffs ( 3.85746029 0.00441437026 -2.21481404e-06 5.23490188e-10 -4.72084164e-14 -48759.166 2.27163806 ); + lowCpCoeffs ( 2.35677352 0.00898459677 -7.12356269e-06 2.45919022e-09 -1.43699548e-13 -48371.9697 9.90105222 ); + } + transport + { + As 1.572e-06; + Ts 240; + } + elements + { + C 1; + O 2; + } +} + +water +{ + specie + { + molWeight 18.01534; + } + thermodynamics + { + Tlow 200; + Thigh 3500; + Tcommon 1000; + highCpCoeffs ( 3.03399249 0.00217691804 -1.64072518e-07 -9.7041987e-11 1.68200992e-14 -30004.2971 4.9667701 ); + lowCpCoeffs ( 4.19864056 -0.0020364341 6.52040211e-06 -5.48797062e-09 1.77197817e-12 -30293.7267 -0.849032208 ); + } + transport + { + As 1.512e-06; + Ts 120; + } + elements + { + H 2; + O 1; + } +} + +N2 +{ + specie + { + molWeight 28.0134; + } + thermodynamics + { + Tlow 250; + Thigh 5000; + Tcommon 1000; + highCpCoeffs ( 2.92664 0.0014879768 -5.68476e-07 1.0097038e-10 -6.753351e-15 -922.7977 5.980528 ); + lowCpCoeffs ( 3.298677 0.0014082404 -3.963222e-06 5.641515e-09 -2.444854e-12 -1020.8999 3.950372 ); + } + transport + { + As 1.512e-06; + Ts 120; + } + elements + { + N 2; + } +} + +H2 +{ + specie + { + molWeight 2.01594; + } + thermodynamics + { + Tlow 200; + Thigh 3500; + Tcommon 1000; + highCpCoeffs ( 3.3372792 -4.94024731e-05 4.99456778e-07 -1.79566394e-10 2.00255376e-14 -950.158922 -3.20502331 ); + lowCpCoeffs ( 2.34433112 0.00798052075 -1.9478151e-05 2.01572094e-08 -7.37611761e-12 -917.935173 0.683010238 ); + } + transport + { + As 6.362e-07; + Ts 72; + } + elements + { + H 2; + } +} + + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/thermophysicalProperties.liquid b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/thermophysicalProperties.liquid new file mode 100644 index 00000000..d324ec51 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/constant/thermophysicalProperties.liquid @@ -0,0 +1,108 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "constant"; + object thermophysicalProperties.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "$FOAM_CASE/constant/globalVars" + +thermoType +{ + type heRhoThermo; + mixture multiComponentMixture; + transport const; + thermo hConst; + equationOfState rhoConst;//rPolynomial; + specie specie; + energy sensibleInternalEnergy; + //energy sensibleEnthalpy; +} + +species +( + CO2 + water + H2 +); + +inertSpecie water; + +water +{ + specie + { + molWeight 18.0153; + } + equationOfState + { + rho $rho0MixLiq; + } + thermodynamics + { + Cp $CpMixLiq; + Hf -1.5879e+07; + } + transport + { + mu $muMixLiq; + Pr $PrMixLiq; + } +} + +CO2 +{ + specie + { + molWeight 44.00995; + } + equationOfState + { + rho $rho0MixLiq; + } + thermodynamics + { + Cp $CpMixLiq; + Hf -1.5879e+07; + } + transport + { + mu $muMixLiq; + Pr $PrCO2; + } +} + +H2 +{ + specie + { + molWeight 2.01594; + } + equationOfState + { + rho $rho0MixLiq; + } + thermodynamics + { + Cp $CpMixLiq; + Hf -1.5879e+07;//-9402451; + } + transport + { + mu $muMixLiq; + Pr $PrH2; + } +} + + + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/get_qoi.py b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/get_qoi.py new file mode 100644 index 00000000..9562cc65 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/get_qoi.py @@ -0,0 +1,183 @@ +import json +import os +import pickle as pkl + +import matplotlib as mpl +import numpy as np +from prettyPlot.plotting import * +from scipy.optimize import curve_fit + + +def get_sim_folds(path): + folds = os.listdir(path) + sim_folds = [] + for fold in folds: + if fold.startswith("loop"): + sim_folds.append(fold) + return sim_folds + + +def func(t, cstar, kla): + t = t + t0 = 0 + c0 = 0 + return (cstar - c0) * (1 - np.exp(-kla * (t - t0))) + c0 + + +def get_vl(verb=False): + filename = os.path.join("constant", "globalVars") + with open(filename, "r+") as f: + lines = f.readlines() + for line in lines: + if line.startswith("liqVol"): + vol = float(line.split()[-1][:-1]) + break + if verb: + print(f"Read liqVol = {vol}m3") + return vol + + +def get_vvm(verb=False): + filename = os.path.join("constant", "globalVars") + with open(filename, "r+") as f: + lines = f.readlines() + for line in lines: + if line.startswith("VVM"): + vvm = float(line.split()[-1][:-1]) + break + if verb: + print(f"Read VVM = {vvm} [-]") + return vvm + + +def get_As(verb=False): + filename = os.path.join("constant", "globalVars") + with open(filename, "r+") as f: + lines = f.readlines() + for line in lines: + if line.startswith("inletA"): + As = float(line.split()[-1][:-1]) + break + if verb: + print(f"Read As = {As}m2") + return As + + +def get_pmix(verb=False): + with open("system/mixers.json", "r+") as f: + data = json.load(f) + mixer_list = data["mixers"] + pmix = 0 + for mix in mixer_list: + pmix += mix["power"] / 1000 + if verb: + print(f"Read Mixing power = {pmix}kW") + return pmix + + +def get_lh(verb=False): + filename = os.path.join("system", "setFieldsDict") + with open(filename, "r+") as f: + lines = f.readlines() + for line in lines: + if "box (-1.0 -1.0 -1.0)" in line: + height = float(line.split("(")[2].split()[1]) + break + if verb: + print(f"Read Height = {height}m") + return height + + +def get_pinj(vvm, Vl, As, lh): + rhog = 1.25 # kg /m3 + Vg = Vl * vvm / (60 * As * 1) # m/s + Ptank = 101325 # Pa + # Ptank = 0 # Pa + rhoL = 1000 # kg / m3 + Pl = 101325 + rhoL * 9.8 * lh # Pa + # W + P1 = rhog * As * Vg**3 + # W + P2 = (Pl - Ptank) * As * Vg + # kg /s + MF = rhog * Vg * As + # kwh / kg + e_m = (P1 + P2) / (3600 * 1000 * MF) + + # returns kW + return (P1 + P2) * 1e-3 + + +def get_qoi(kla_co2, cs_co2, kla_h2, cs_h2, verb=False): + vvm = get_vvm(verb) + As = get_As(verb) + V_l = get_vl(verb) + liqh = get_lh(verb) + P_inj = get_pinj(vvm, V_l, As, liqh) + P_mix = get_pmix(verb) + + qoi_co2 = kla_co2 * cs_co2 * V_l * 0.04401 / (P_mix / 3600 + P_inj / 3600) + qoi_h2 = kla_h2 * cs_h2 * V_l * 0.002016 / (P_mix / 3600 + P_inj / 3600) + return qoi_co2 * qoi_h2 + + +def get_qoi_uq(kla_co2, cs_co2, kla_h2, cs_h2): + qoi = [] + for i in range(len(kla_co2)): + if i == 0: + verb = True + else: + verb = False + qoi.append(get_qoi(kla_co2[i], cs_co2[i], kla_h2[i], cs_h2[i], verb)) + qoi = np.array(qoi) + return np.mean(qoi), np.std(qoi) + + +os.makedirs("Figures", exist_ok=True) + +dataFolder = "data" +fold = "local" + +nuq = 100 +mean_cstar_co2 = np.random.uniform(12.6, 13.3, nuq) +mean_cstar_h2 = np.random.uniform(0.902, 0.96, nuq) + + +tmp_cs_h2 = [] +tmp_cs_co2 = [] +tmp_kla_h2 = [] +tmp_kla_co2 = [] +cs_co2 = mean_cstar_co2 +cs_h2 = mean_cstar_h2 + +a = np.load(os.path.join(dataFolder, fold, "conv.npz")) +endindex = -1 +if ( + "c_h2" in a + and "c_co2" in a + and len(a["time"][:endindex] > 0) + and (a["time"][:endindex][-1] > 95) +): + for i in range(nuq): + fitparamsH2, _ = curve_fit( + func, + np.array(a["time"][:endindex]), + np.array(a["c_h2"][:endindex]), + bounds=[(cs_h2[i] - 1e-6, 0), (cs_h2[i] + 1e-6, 1)], + ) + fitparamsCO2, _ = curve_fit( + func, + np.array(a["time"][:endindex]), + np.array(a["c_co2"][:endindex]), + bounds=[(cs_co2[i] - 1e-6, 0), (cs_co2[i] + 1e-6, 1)], + ) + tmp_kla_co2.append(fitparamsCO2[1]) + tmp_kla_h2.append(fitparamsH2[1]) + tmp_cs_h2.append(cs_h2[i]) + tmp_cs_co2.append(cs_co2[i]) + +qoi_m, qoi_s = get_qoi_uq(tmp_kla_co2, tmp_cs_co2, tmp_kla_h2, tmp_cs_h2) + + +with open("qoi.txt", "w+") as f: + f.write(f"{qoi_m},{qoi_s}\n") diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/presteps.sh b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/presteps.sh new file mode 100644 index 00000000..6d419bf9 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/presteps.sh @@ -0,0 +1,71 @@ +# Clean case +module load anaconda3/2023 +conda activate /projects/gas2fuels/conda_env/bird +source /projects/gas2fuels/ofoam_cray_mpich/OpenFOAM-dev/etc/bashrc +./Allclean + +echo PRESTEP 1 +# Generate blockmeshDict +python /projects/gas2fuels/BioReactorDesign/applications/write_block_rect_mesh.py -i system/mesh.json -o system +#python ../../../applications/write_block_rect_mesh.py -i system/mesh.json -o system + +# Generate boundary stl +python /projects/gas2fuels/BioReactorDesign/applications/write_stl_patch.py -i system/inlets_outlets.json +#python ../../../applications/write_stl_patch.py -i system/inlets_outlets.json + +# Generate mixers +python /projects/gas2fuels/BioReactorDesign/applications/write_dynMix_fvModels_force_sign.py -i system/mixers.json -o constant +#python ../../../applications/write_dynMix_fvModels_force_sign.py -i system/mixers.json -o constant + +echo PRESTEP 2 +# Mesh gen +blockMesh -dict system/blockMeshDict + +# Inlet BC +surfaceToPatch -tol 1e-3 inlets.stl +export newmeshdir=$(foamListTimes -latestTime) +rm -rf constant/polyMesh/ +cp -r $newmeshdir/polyMesh ./constant +rm -rf $newmeshdir +cp constant/polyMesh/boundary /tmp +sed -i -e 's/inlets\.stl/inlet/g' /tmp/boundary +cat /tmp/boundary > constant/polyMesh/boundary + +# Outlet BC +surfaceToPatch -tol 1e-3 outlets.stl +export newmeshdir=$(foamListTimes -latestTime) +rm -rf constant/polyMesh/ +cp -r $newmeshdir/polyMesh ./constant +rm -rf $newmeshdir +cp constant/polyMesh/boundary /tmp +sed -i -e 's/outlets\.stl/outlet/g' /tmp/boundary +cat /tmp/boundary > constant/polyMesh/boundary + + +# Scale +transformPoints "scale=(2.7615275385627096 2.7615275385627096 2.7615275385627096)" + + +# setup IC +cp -r 0.orig 0 +setFields + +# Setup mass flow rate +# Get inlet area +postProcess -func 'patchIntegrate(patch="inlet", field="alpha.gas")' +postProcess -func writeCellVolumes +writeMeshObj + +echo PRESTEP 3 +python writeGlobalVars.py +cp constant/phaseProperties_constantd constant/phaseProperties + +conda deactivate + +if [ -f qoi.txt ]; then + rm qoi.txt +fi +if [ -f data/local/conv.npz ]; then + rm data/local/conv.npz +fi + diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/read_history.py b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/read_history.py new file mode 100644 index 00000000..264711f8 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/read_history.py @@ -0,0 +1,239 @@ +import argparse +import os +import sys + +import numpy as np +from prettyPlot.plotting import plt, pretty_labels + +from bird.utilities.ofio import * + + +def compute_gas_holdup(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + alpha_liq = field_dict["alpha_liq"] + volume = field_dict["volume"] + holdup = np.sum((1 - alpha_liq) * volume) / np.sum(volume) + return holdup, field_dict + + +def co2liq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("co2_liq" in field_dict) or field_dict["co2_liq"] is None: + co2_liq_file = os.path.join(caseFolder, timeFolder, "CO2.liquid") + co2_liq = readOFScal(co2_liq_file, nCells) + # print("computing co2 liq") + field_dict["co2_liq"] = co2_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + if not ("indliq" in field_dict) or field_dict["indliq"] is None: + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.5) + # print("computing indliq") + field_dict["indliq"] = indliq + volume = field_dict["volume"] + indliq = field_dict["indliq"] + alpha_liq = field_dict["alpha_liq"] + co2_liq = field_dict["co2_liq"] + met = np.sum( + alpha_liq[indliq] * co2_liq[indliq] * volume[indliq] + ) / np.sum(volume[indliq]) + return met, field_dict + + +def cliq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("rho_liq" in field_dict) or field_dict["rho_liq"] is None: + rho_liq_file = os.path.join(caseFolder, timeFolder, "rhom") + rho_liq = readOFScal(rho_liq_file, nCells) + field_dict["rho_liq"] = rho_liq + if not ("co2_liq" in field_dict) or field_dict["co2_liq"] is None: + co2_liq_file = os.path.join(caseFolder, timeFolder, "CO2.liquid") + co2_liq = readOFScal(co2_liq_file, nCells) + # print("computing co2 liq") + field_dict["co2_liq"] = co2_liq + if not ("h2_liq" in field_dict) or field_dict["h2_liq"] is None: + h2_liq_file = os.path.join(caseFolder, timeFolder, "H2.liquid") + h2_liq = readOFScal(h2_liq_file, nCells) + # print("computing h2 liq") + field_dict["h2_liq"] = h2_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + if not ("indliq" in field_dict) or field_dict["indliq"] is None: + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.5) + # print("computing indliq") + field_dict["indliq"] = indliq + + volume = field_dict["volume"] + indliq = field_dict["indliq"] + alpha_liq = field_dict["alpha_liq"] + co2_liq = field_dict["co2_liq"] + h2_liq = field_dict["h2_liq"] + rho_liq = field_dict["rho_liq"] + + # c_h2 = rho_liq[indliq] * alpha_liq[indliq] * h2_liq[indliq] / 0.002016 + # c_co2 = rho_liq[indliq] * alpha_liq[indliq] * co2_liq[indliq] / 0.04401 + + c_h2 = 1000 * alpha_liq[indliq] * h2_liq[indliq] / 0.002016 + c_co2 = 1000 * alpha_liq[indliq] * co2_liq[indliq] / 0.04401 + + c_h2 = np.sum(c_h2 * volume[indliq]) / np.sum(volume[indliq]) + c_co2 = np.sum(c_co2 * volume[indliq]) / np.sum(volume[indliq]) + + return c_co2, c_h2, field_dict + + +def h2liq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("h2_liq" in field_dict) or field_dict["h2_liq"] is None: + h2_liq_file = os.path.join(caseFolder, timeFolder, "H2.liquid") + h2_liq = readOFScal(h2_liq_file, nCells) + # print("computing h2 liq") + field_dict["h2_liq"] = h2_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + if not ("indliq" in field_dict) or field_dict["indliq"] is None: + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.5) + # print("computing indliq") + field_dict["indliq"] = indliq + volume = field_dict["volume"] + indliq = field_dict["indliq"] + alpha_liq = field_dict["alpha_liq"] + h2_liq = field_dict["h2_liq"] + met = np.sum(alpha_liq[indliq] * h2_liq[indliq] * volume[indliq]) / np.sum( + volume[indliq] + ) + return met, field_dict + + +def vol_liq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + volume = field_dict["volume"] + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.0) + liqvol = np.sum(alpha_liq[indliq] * volume[indliq]) / np.sum( + volume[indliq] + ) + return liqvol, field_dict + + +parser = argparse.ArgumentParser(description="Convergence of GH") +parser.add_argument( + "-cn", + "--case_name", + type=str, + metavar="", + required=True, + help="Case name", +) +parser.add_argument( + "-df", + "--data_folder", + type=str, + metavar="", + required=False, + help="data folder name", + default="data", +) + +args, unknown = parser.parse_known_args() + + +case_root = "." # "../" +case_name = args.case_name # "12_hole_sparger_snappyRefine_700rpm_opt_coeff" +case_path = "." +dataFolder = args.data_folder + +if os.path.isfile(os.path.join(dataFolder, case_name, "conv.npz")): + sys.exit("WARNING: History already created, Skipping") + +time_float_sorted, time_str_sorted = getCaseTimes(case_path, remove_zero=True) +cellCentres = readMesh(os.path.join(case_path, f"meshCellCentres_0.obj")) +nCells = len(cellCentres) + + +co2_history = np.zeros(len(time_str_sorted)) +c_co2_history = np.zeros(len(time_str_sorted)) +h2_history = np.zeros(len(time_str_sorted)) +c_h2_history = np.zeros(len(time_str_sorted)) +gh_history = np.zeros(len(time_str_sorted)) +liqvol_history = np.zeros(len(time_str_sorted)) +print(f"case_path = {case_path}") +field_dict = {} +for itime, time in enumerate(time_float_sorted): + time_folder = time_str_sorted[itime] + print(f"\tTime : {time_folder}") + if not field_dict == {}: + new_field_dict = {} + if "volume" in field_dict: + new_field_dict["volume"] = field_dict["volume"] + field_dict = new_field_dict + gh_history[itime], field_dict = compute_gas_holdup( + case_path, time_str_sorted[itime], nCells, field_dict + ) + co2_history[itime], field_dict = co2liq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + h2_history[itime], field_dict = h2liq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + liqvol_history[itime], field_dict = vol_liq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + c_co2_history[itime], c_h2_history[itime], field_dict = cliq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + + +os.makedirs(dataFolder, exist_ok=True) +os.makedirs(os.path.join(dataFolder, case_name), exist_ok=True) +np.savez( + os.path.join(dataFolder, case_name, "conv.npz"), + time=np.array(time_float_sorted), + gh=gh_history, + co2=co2_history, + h2=h2_history, + vol_liq=liqvol_history, + c_h2=c_h2_history, + c_co2=c_co2_history, +) diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/run.sh b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/run.sh new file mode 100644 index 00000000..6b7eb516 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/run.sh @@ -0,0 +1,5 @@ +multiphaseEulerFoam + + + + diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/script b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/script new file mode 100755 index 00000000..090e5c05 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/script @@ -0,0 +1,14 @@ +#!/bin/bash +#SBATCH --qos=high +#SBATCH --job-name=val2 +##SBATCH --partition=debug +#SBATCH --nodes=1 +#SBATCH --ntasks-per-node=16 +#SBATCH --time=07:59:00 +#SBATCH --account=co2snow + +bash presteps.sh +source /projects/gas2fuels/ofoam_cray_mpich/OpenFOAM-dev/etc/bashrc +decomposePar -fileHandler collated +srun -n 16 multiphaseEulerFoam -parallel -fileHandler collated +reconstructPar -newTimes diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/script_post b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/script_post new file mode 100755 index 00000000..aabbc33e --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/script_post @@ -0,0 +1,10 @@ +#!/bin/bash +#SBATCH --qos=high +#SBATCH --job-name=val2 +##SBATCH --partition=debug +#SBATCH --nodes=1 +#SBATCH --ntasks-per-node=16 +#SBATCH --time=00:59:00 +#SBATCH --account=co2snow + +bash computeQOI.sh diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/blockMeshDict b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/blockMeshDict new file mode 100644 index 00000000..1183d262 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/blockMeshDict @@ -0,0 +1,746 @@ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} + +convertToMeters 1.0; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +vertices +( +( 0.0 0.0 0.0) +( 1.0 0.0 0.0) +( 2.0 0.0 0.0) +( 3.0 0.0 0.0) +( 4.0 0.0 0.0) +( 5.0 0.0 0.0) +( 6.0 0.0 0.0) +( 7.0 0.0 0.0) +( 8.0 0.0 0.0) +( 9.0 0.0 0.0) +( 10.0 0.0 0.0) +( 0.0 1.0 0.0) +( 1.0 1.0 0.0) +( 2.0 1.0 0.0) +( 3.0 1.0 0.0) +( 4.0 1.0 0.0) +( 5.0 1.0 0.0) +( 6.0 1.0 0.0) +( 7.0 1.0 0.0) +( 8.0 1.0 0.0) +( 9.0 1.0 0.0) +( 10.0 1.0 0.0) +( 0.0 2.0 0.0) +( 1.0 2.0 0.0) +( 2.0 2.0 0.0) +( 3.0 2.0 0.0) +( 4.0 2.0 0.0) +( 5.0 2.0 0.0) +( 6.0 2.0 0.0) +( 7.0 2.0 0.0) +( 8.0 2.0 0.0) +( 9.0 2.0 0.0) +( 10.0 2.0 0.0) +( 0.0 3.0 0.0) +( 1.0 3.0 0.0) +( 2.0 3.0 0.0) +( 3.0 3.0 0.0) +( 4.0 3.0 0.0) +( 5.0 3.0 0.0) +( 6.0 3.0 0.0) +( 7.0 3.0 0.0) +( 8.0 3.0 0.0) +( 9.0 3.0 0.0) +( 10.0 3.0 0.0) +( 0.0 4.0 0.0) +( 1.0 4.0 0.0) +( 2.0 4.0 0.0) +( 3.0 4.0 0.0) +( 4.0 4.0 0.0) +( 5.0 4.0 0.0) +( 6.0 4.0 0.0) +( 7.0 4.0 0.0) +( 8.0 4.0 0.0) +( 9.0 4.0 0.0) +( 10.0 4.0 0.0) +( 0.0 5.0 0.0) +( 1.0 5.0 0.0) +( 2.0 5.0 0.0) +( 3.0 5.0 0.0) +( 4.0 5.0 0.0) +( 5.0 5.0 0.0) +( 6.0 5.0 0.0) +( 7.0 5.0 0.0) +( 8.0 5.0 0.0) +( 9.0 5.0 0.0) +( 10.0 5.0 0.0) +( 0.0 6.0 0.0) +( 1.0 6.0 0.0) +( 2.0 6.0 0.0) +( 3.0 6.0 0.0) +( 4.0 6.0 0.0) +( 5.0 6.0 0.0) +( 6.0 6.0 0.0) +( 7.0 6.0 0.0) +( 8.0 6.0 0.0) +( 9.0 6.0 0.0) +( 10.0 6.0 0.0) +( 0.0 7.0 0.0) +( 1.0 7.0 0.0) +( 2.0 7.0 0.0) +( 3.0 7.0 0.0) +( 4.0 7.0 0.0) +( 5.0 7.0 0.0) +( 6.0 7.0 0.0) +( 7.0 7.0 0.0) +( 8.0 7.0 0.0) +( 9.0 7.0 0.0) +( 10.0 7.0 0.0) +( 0.0 0.0 1.0) +( 1.0 0.0 1.0) +( 2.0 0.0 1.0) +( 3.0 0.0 1.0) +( 4.0 0.0 1.0) +( 5.0 0.0 1.0) +( 6.0 0.0 1.0) +( 7.0 0.0 1.0) +( 8.0 0.0 1.0) +( 9.0 0.0 1.0) +( 10.0 0.0 1.0) +( 0.0 1.0 1.0) +( 1.0 1.0 1.0) +( 2.0 1.0 1.0) +( 3.0 1.0 1.0) +( 4.0 1.0 1.0) +( 5.0 1.0 1.0) +( 6.0 1.0 1.0) +( 7.0 1.0 1.0) +( 8.0 1.0 1.0) +( 9.0 1.0 1.0) +( 10.0 1.0 1.0) +( 0.0 2.0 1.0) +( 1.0 2.0 1.0) +( 2.0 2.0 1.0) +( 3.0 2.0 1.0) +( 4.0 2.0 1.0) +( 5.0 2.0 1.0) +( 6.0 2.0 1.0) +( 7.0 2.0 1.0) +( 8.0 2.0 1.0) +( 9.0 2.0 1.0) +( 10.0 2.0 1.0) +( 0.0 3.0 1.0) +( 1.0 3.0 1.0) +( 2.0 3.0 1.0) +( 3.0 3.0 1.0) +( 4.0 3.0 1.0) +( 5.0 3.0 1.0) +( 6.0 3.0 1.0) +( 7.0 3.0 1.0) +( 8.0 3.0 1.0) +( 9.0 3.0 1.0) +( 10.0 3.0 1.0) +( 0.0 4.0 1.0) +( 1.0 4.0 1.0) +( 2.0 4.0 1.0) +( 3.0 4.0 1.0) +( 4.0 4.0 1.0) +( 5.0 4.0 1.0) +( 6.0 4.0 1.0) +( 7.0 4.0 1.0) +( 8.0 4.0 1.0) +( 9.0 4.0 1.0) +( 10.0 4.0 1.0) +( 0.0 5.0 1.0) +( 1.0 5.0 1.0) +( 2.0 5.0 1.0) +( 3.0 5.0 1.0) +( 4.0 5.0 1.0) +( 5.0 5.0 1.0) +( 6.0 5.0 1.0) +( 7.0 5.0 1.0) +( 8.0 5.0 1.0) +( 9.0 5.0 1.0) +( 10.0 5.0 1.0) +( 0.0 6.0 1.0) +( 1.0 6.0 1.0) +( 2.0 6.0 1.0) +( 3.0 6.0 1.0) +( 4.0 6.0 1.0) +( 5.0 6.0 1.0) +( 6.0 6.0 1.0) +( 7.0 6.0 1.0) +( 8.0 6.0 1.0) +( 9.0 6.0 1.0) +( 10.0 6.0 1.0) +( 0.0 7.0 1.0) +( 1.0 7.0 1.0) +( 2.0 7.0 1.0) +( 3.0 7.0 1.0) +( 4.0 7.0 1.0) +( 5.0 7.0 1.0) +( 6.0 7.0 1.0) +( 7.0 7.0 1.0) +( 8.0 7.0 1.0) +( 9.0 7.0 1.0) +( 10.0 7.0 1.0) +( 0.0 0.0 2.0) +( 1.0 0.0 2.0) +( 2.0 0.0 2.0) +( 3.0 0.0 2.0) +( 4.0 0.0 2.0) +( 5.0 0.0 2.0) +( 6.0 0.0 2.0) +( 7.0 0.0 2.0) +( 8.0 0.0 2.0) +( 9.0 0.0 2.0) +( 10.0 0.0 2.0) +( 0.0 1.0 2.0) +( 1.0 1.0 2.0) +( 2.0 1.0 2.0) +( 3.0 1.0 2.0) +( 4.0 1.0 2.0) +( 5.0 1.0 2.0) +( 6.0 1.0 2.0) +( 7.0 1.0 2.0) +( 8.0 1.0 2.0) +( 9.0 1.0 2.0) +( 10.0 1.0 2.0) +( 0.0 2.0 2.0) +( 1.0 2.0 2.0) +( 2.0 2.0 2.0) +( 3.0 2.0 2.0) +( 4.0 2.0 2.0) +( 5.0 2.0 2.0) +( 6.0 2.0 2.0) +( 7.0 2.0 2.0) +( 8.0 2.0 2.0) +( 9.0 2.0 2.0) +( 10.0 2.0 2.0) +( 0.0 3.0 2.0) +( 1.0 3.0 2.0) +( 2.0 3.0 2.0) +( 3.0 3.0 2.0) +( 4.0 3.0 2.0) +( 5.0 3.0 2.0) +( 6.0 3.0 2.0) +( 7.0 3.0 2.0) +( 8.0 3.0 2.0) +( 9.0 3.0 2.0) +( 10.0 3.0 2.0) +( 0.0 4.0 2.0) +( 1.0 4.0 2.0) +( 2.0 4.0 2.0) +( 3.0 4.0 2.0) +( 4.0 4.0 2.0) +( 5.0 4.0 2.0) +( 6.0 4.0 2.0) +( 7.0 4.0 2.0) +( 8.0 4.0 2.0) +( 9.0 4.0 2.0) +( 10.0 4.0 2.0) +( 0.0 5.0 2.0) +( 1.0 5.0 2.0) +( 2.0 5.0 2.0) +( 3.0 5.0 2.0) +( 4.0 5.0 2.0) +( 5.0 5.0 2.0) +( 6.0 5.0 2.0) +( 7.0 5.0 2.0) +( 8.0 5.0 2.0) +( 9.0 5.0 2.0) +( 10.0 5.0 2.0) +( 0.0 6.0 2.0) +( 1.0 6.0 2.0) +( 2.0 6.0 2.0) +( 3.0 6.0 2.0) +( 4.0 6.0 2.0) +( 5.0 6.0 2.0) +( 6.0 6.0 2.0) +( 7.0 6.0 2.0) +( 8.0 6.0 2.0) +( 9.0 6.0 2.0) +( 10.0 6.0 2.0) +( 0.0 7.0 2.0) +( 1.0 7.0 2.0) +( 2.0 7.0 2.0) +( 3.0 7.0 2.0) +( 4.0 7.0 2.0) +( 5.0 7.0 2.0) +( 6.0 7.0 2.0) +( 7.0 7.0 2.0) +( 8.0 7.0 2.0) +( 9.0 7.0 2.0) +( 10.0 7.0 2.0) +( 0.0 0.0 3.0) +( 1.0 0.0 3.0) +( 2.0 0.0 3.0) +( 3.0 0.0 3.0) +( 4.0 0.0 3.0) +( 5.0 0.0 3.0) +( 6.0 0.0 3.0) +( 7.0 0.0 3.0) +( 8.0 0.0 3.0) +( 9.0 0.0 3.0) +( 10.0 0.0 3.0) +( 0.0 1.0 3.0) +( 1.0 1.0 3.0) +( 2.0 1.0 3.0) +( 3.0 1.0 3.0) +( 4.0 1.0 3.0) +( 5.0 1.0 3.0) +( 6.0 1.0 3.0) +( 7.0 1.0 3.0) +( 8.0 1.0 3.0) +( 9.0 1.0 3.0) +( 10.0 1.0 3.0) +( 0.0 2.0 3.0) +( 1.0 2.0 3.0) +( 2.0 2.0 3.0) +( 3.0 2.0 3.0) +( 4.0 2.0 3.0) +( 5.0 2.0 3.0) +( 6.0 2.0 3.0) +( 7.0 2.0 3.0) +( 8.0 2.0 3.0) +( 9.0 2.0 3.0) +( 10.0 2.0 3.0) +( 0.0 3.0 3.0) +( 1.0 3.0 3.0) +( 2.0 3.0 3.0) +( 3.0 3.0 3.0) +( 4.0 3.0 3.0) +( 5.0 3.0 3.0) +( 6.0 3.0 3.0) +( 7.0 3.0 3.0) +( 8.0 3.0 3.0) +( 9.0 3.0 3.0) +( 10.0 3.0 3.0) +( 0.0 4.0 3.0) +( 1.0 4.0 3.0) +( 2.0 4.0 3.0) +( 3.0 4.0 3.0) +( 4.0 4.0 3.0) +( 5.0 4.0 3.0) +( 6.0 4.0 3.0) +( 7.0 4.0 3.0) +( 8.0 4.0 3.0) +( 9.0 4.0 3.0) +( 10.0 4.0 3.0) +( 0.0 5.0 3.0) +( 1.0 5.0 3.0) +( 2.0 5.0 3.0) +( 3.0 5.0 3.0) +( 4.0 5.0 3.0) +( 5.0 5.0 3.0) +( 6.0 5.0 3.0) +( 7.0 5.0 3.0) +( 8.0 5.0 3.0) +( 9.0 5.0 3.0) +( 10.0 5.0 3.0) +( 0.0 6.0 3.0) +( 1.0 6.0 3.0) +( 2.0 6.0 3.0) +( 3.0 6.0 3.0) +( 4.0 6.0 3.0) +( 5.0 6.0 3.0) +( 6.0 6.0 3.0) +( 7.0 6.0 3.0) +( 8.0 6.0 3.0) +( 9.0 6.0 3.0) +( 10.0 6.0 3.0) +( 0.0 7.0 3.0) +( 1.0 7.0 3.0) +( 2.0 7.0 3.0) +( 3.0 7.0 3.0) +( 4.0 7.0 3.0) +( 5.0 7.0 3.0) +( 6.0 7.0 3.0) +( 7.0 7.0 3.0) +( 8.0 7.0 3.0) +( 9.0 7.0 3.0) +( 10.0 7.0 3.0) +( 0.0 0.0 4.0) +( 1.0 0.0 4.0) +( 2.0 0.0 4.0) +( 3.0 0.0 4.0) +( 4.0 0.0 4.0) +( 5.0 0.0 4.0) +( 6.0 0.0 4.0) +( 7.0 0.0 4.0) +( 8.0 0.0 4.0) +( 9.0 0.0 4.0) +( 10.0 0.0 4.0) +( 0.0 1.0 4.0) +( 1.0 1.0 4.0) +( 2.0 1.0 4.0) +( 3.0 1.0 4.0) +( 4.0 1.0 4.0) +( 5.0 1.0 4.0) +( 6.0 1.0 4.0) +( 7.0 1.0 4.0) +( 8.0 1.0 4.0) +( 9.0 1.0 4.0) +( 10.0 1.0 4.0) +( 0.0 2.0 4.0) +( 1.0 2.0 4.0) +( 2.0 2.0 4.0) +( 3.0 2.0 4.0) +( 4.0 2.0 4.0) +( 5.0 2.0 4.0) +( 6.0 2.0 4.0) +( 7.0 2.0 4.0) +( 8.0 2.0 4.0) +( 9.0 2.0 4.0) +( 10.0 2.0 4.0) +( 0.0 3.0 4.0) +( 1.0 3.0 4.0) +( 2.0 3.0 4.0) +( 3.0 3.0 4.0) +( 4.0 3.0 4.0) +( 5.0 3.0 4.0) +( 6.0 3.0 4.0) +( 7.0 3.0 4.0) +( 8.0 3.0 4.0) +( 9.0 3.0 4.0) +( 10.0 3.0 4.0) +( 0.0 4.0 4.0) +( 1.0 4.0 4.0) +( 2.0 4.0 4.0) +( 3.0 4.0 4.0) +( 4.0 4.0 4.0) +( 5.0 4.0 4.0) +( 6.0 4.0 4.0) +( 7.0 4.0 4.0) +( 8.0 4.0 4.0) +( 9.0 4.0 4.0) +( 10.0 4.0 4.0) +( 0.0 5.0 4.0) +( 1.0 5.0 4.0) +( 2.0 5.0 4.0) +( 3.0 5.0 4.0) +( 4.0 5.0 4.0) +( 5.0 5.0 4.0) +( 6.0 5.0 4.0) +( 7.0 5.0 4.0) +( 8.0 5.0 4.0) +( 9.0 5.0 4.0) +( 10.0 5.0 4.0) +( 0.0 6.0 4.0) +( 1.0 6.0 4.0) +( 2.0 6.0 4.0) +( 3.0 6.0 4.0) +( 4.0 6.0 4.0) +( 5.0 6.0 4.0) +( 6.0 6.0 4.0) +( 7.0 6.0 4.0) +( 8.0 6.0 4.0) +( 9.0 6.0 4.0) +( 10.0 6.0 4.0) +( 0.0 7.0 4.0) +( 1.0 7.0 4.0) +( 2.0 7.0 4.0) +( 3.0 7.0 4.0) +( 4.0 7.0 4.0) +( 5.0 7.0 4.0) +( 6.0 7.0 4.0) +( 7.0 7.0 4.0) +( 8.0 7.0 4.0) +( 9.0 7.0 4.0) +( 10.0 7.0 4.0) +( 0.0 0.0 5.0) +( 1.0 0.0 5.0) +( 2.0 0.0 5.0) +( 3.0 0.0 5.0) +( 4.0 0.0 5.0) +( 5.0 0.0 5.0) +( 6.0 0.0 5.0) +( 7.0 0.0 5.0) +( 8.0 0.0 5.0) +( 9.0 0.0 5.0) +( 10.0 0.0 5.0) +( 0.0 1.0 5.0) +( 1.0 1.0 5.0) +( 2.0 1.0 5.0) +( 3.0 1.0 5.0) +( 4.0 1.0 5.0) +( 5.0 1.0 5.0) +( 6.0 1.0 5.0) +( 7.0 1.0 5.0) +( 8.0 1.0 5.0) +( 9.0 1.0 5.0) +( 10.0 1.0 5.0) +( 0.0 2.0 5.0) +( 1.0 2.0 5.0) +( 2.0 2.0 5.0) +( 3.0 2.0 5.0) +( 4.0 2.0 5.0) +( 5.0 2.0 5.0) +( 6.0 2.0 5.0) +( 7.0 2.0 5.0) +( 8.0 2.0 5.0) +( 9.0 2.0 5.0) +( 10.0 2.0 5.0) +( 0.0 3.0 5.0) +( 1.0 3.0 5.0) +( 2.0 3.0 5.0) +( 3.0 3.0 5.0) +( 4.0 3.0 5.0) +( 5.0 3.0 5.0) +( 6.0 3.0 5.0) +( 7.0 3.0 5.0) +( 8.0 3.0 5.0) +( 9.0 3.0 5.0) +( 10.0 3.0 5.0) +( 0.0 4.0 5.0) +( 1.0 4.0 5.0) +( 2.0 4.0 5.0) +( 3.0 4.0 5.0) +( 4.0 4.0 5.0) +( 5.0 4.0 5.0) +( 6.0 4.0 5.0) +( 7.0 4.0 5.0) +( 8.0 4.0 5.0) +( 9.0 4.0 5.0) +( 10.0 4.0 5.0) +( 0.0 5.0 5.0) +( 1.0 5.0 5.0) +( 2.0 5.0 5.0) +( 3.0 5.0 5.0) +( 4.0 5.0 5.0) +( 5.0 5.0 5.0) +( 6.0 5.0 5.0) +( 7.0 5.0 5.0) +( 8.0 5.0 5.0) +( 9.0 5.0 5.0) +( 10.0 5.0 5.0) +( 0.0 6.0 5.0) +( 1.0 6.0 5.0) +( 2.0 6.0 5.0) +( 3.0 6.0 5.0) +( 4.0 6.0 5.0) +( 5.0 6.0 5.0) +( 6.0 6.0 5.0) +( 7.0 6.0 5.0) +( 8.0 6.0 5.0) +( 9.0 6.0 5.0) +( 10.0 6.0 5.0) +( 0.0 7.0 5.0) +( 1.0 7.0 5.0) +( 2.0 7.0 5.0) +( 3.0 7.0 5.0) +( 4.0 7.0 5.0) +( 5.0 7.0 5.0) +( 6.0 7.0 5.0) +( 7.0 7.0 5.0) +( 8.0 7.0 5.0) +( 9.0 7.0 5.0) +( 10.0 7.0 5.0) +); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +blocks +( + + //block 0 +hex (0 1 12 11 88 89 100 99 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 1 +hex (1 2 13 12 89 90 101 100 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 2 +hex (2 3 14 13 90 91 102 101 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 3 +hex (3 4 15 14 91 92 103 102 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 4 +hex (4 5 16 15 92 93 104 103 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 5 +hex (5 6 17 16 93 94 105 104 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 6 +hex (6 7 18 17 94 95 106 105 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 7 +hex (7 8 19 18 95 96 107 106 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 8 +hex (8 9 20 19 96 97 108 107 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 9 +hex (9 10 21 20 97 98 109 108 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 10 +hex (97 98 109 108 185 186 197 196 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 11 +hex (185 186 197 196 273 274 285 284 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 12 +hex (273 274 285 284 361 362 373 372 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 13 +hex (361 362 373 372 449 450 461 460 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 14 +hex (360 361 372 371 448 449 460 459 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 15 +hex (359 360 371 370 447 448 459 458 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 16 +hex (358 359 370 369 446 447 458 457 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 17 +hex (357 358 369 368 445 446 457 456 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 18 +hex (356 357 368 367 444 445 456 455 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 19 +hex (355 356 367 366 443 444 455 454 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 20 +hex (354 355 366 365 442 443 454 453 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 21 +hex (353 354 365 364 441 442 453 452 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 22 +hex (352 353 364 363 440 441 452 451 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 23 +hex (363 364 375 374 451 452 463 462 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 24 +hex (374 375 386 385 462 463 474 473 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 25 +hex (385 386 397 396 473 474 485 484 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 26 +hex (396 397 408 407 484 485 496 495 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 27 +hex (407 408 419 418 495 496 507 506 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 28 +hex (418 419 430 429 506 507 518 517 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 29 +hex (308 309 320 319 396 397 408 407 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 30 +hex (220 221 232 231 308 309 320 319 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 31 +hex (132 133 144 143 220 221 232 231 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 32 +hex (44 45 56 55 132 133 144 143 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 33 +hex (55 56 67 66 143 144 155 154 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 34 +hex (66 67 78 77 154 155 166 165 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 35 +hex (33 34 45 44 121 122 133 132 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 36 +hex (22 23 34 33 110 111 122 121 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 37 +hex (11 12 23 22 99 100 111 110 ) +( 10 10 10 ) +SimpleGrading (1 1 1) +); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +defaultPatch +{ type wall;} + +patches +( +); diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/controlDict b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/controlDict similarity index 95% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/system/controlDict rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/controlDict index bda655db..7f457c4b 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/controlDict +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/controlDict @@ -22,11 +22,11 @@ startTime 0; stopAt endTime; -endTime 600; +endTime 200; deltaT 0.0001; -writeControl runTime; +writeControl adjustableRunTime; writeInterval 2; @@ -50,9 +50,10 @@ maxCo 0.5; maxDeltaT 0.01; + functions { - + #includeFunc writeObjects(d.gas) #includeFunc writeObjects(thermo:rho.gas) #includeFunc writeObjects(thermo:rho.liquid) diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/decomposeParDict b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/decomposeParDict new file mode 100755 index 00000000..f8397e73 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/decomposeParDict @@ -0,0 +1,30 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 3.0.x | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object decomposeParDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 16; + +method scotch; + +hierarchicalCoeffs +{ + n (4 4 1); + delta 0.001; + order xyz; +} + + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/fvConstraints b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/fvConstraints new file mode 100644 index 00000000..334f1c8f --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/fvConstraints @@ -0,0 +1,56 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + object fvConstraints; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +limitp +{ + type limitPressure; + + min 1e4; +} +limitUliq +{ + type limitVelocity; + active yes; + U U.liquid; + selectionMode all; + max 1e1; +} +limitUgas +{ + type limitVelocity; + active yes; + U U.gas; + selectionMode all; + max 2e1; +} +limitTgas +{ + type limitTemperature; + selectionMode all; + min 290; + max 310; + phase gas; +} +limitTliq +{ + type limitTemperature; + selectionMode all; + min 290; + max 310; + phase liquid; +} + + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/fvSchemes b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/fvSchemes new file mode 100644 index 00000000..52e6e13a --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/fvSchemes @@ -0,0 +1,70 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; + limited cellLimited Gauss linear 1; +} + +divSchemes +{ + default none; + + "div\(phi,alpha.*\)" Gauss vanLeer; + + "div\(phir,alpha.*,alpha.*\)" Gauss vanLeer; + + "div\(alphaRhoPhi.*,U.*\)" Gauss limitedLinearV 1; + "div\(phi.*,U.*\)" Gauss limitedLinearV 1; + "div\(alphaRhoPhi.*,Yi\)" Gauss limitedLinear 1; + "div\(alphaRhoPhi.*,(h|e).*\)" Gauss limitedLinear 1; + "div\(alphaRhoPhi.*,(K|k|epsilon|omega).*\)" Gauss limitedLinear 1; + "div\(alphaPhi.*,f.*\)" Gauss limitedLinear 1; + "div\(alphaRhoPhi.*,\(p\|thermo:rho.*\)\)" Gauss limitedLinear 1; + + "div\(phim,(k|epsilon)m\)" Gauss upwind; + "div\(\(\(\(alpha.*\*thermo:rho.*\)*nuEff.*\)*dev2\(T\(grad\(U.*\)\)\)\)\)" Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default uncorrected; +} + +wallDist +{ + method Poisson; + nRequired true; +} + + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/fvSolution b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/fvSolution new file mode 100644 index 00000000..2e69fdfa --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/fvSolution @@ -0,0 +1,120 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + "alpha.*" + { + nAlphaCorr 2; + nAlphaSubCycles 5; + } + + bubbles + { + nCorr 1; + tolerance 1e-4; + scale true; + solveOnFinalIterOnly true; + sourceUpdateInterval 1; + } + + p_rgh + { + solver GAMG; + smoother DIC; + tolerance 1e-7; + relTol 0; + } + + p_rghFinal + { + $p_rgh; + relTol 0; + } + + "(k|omega).*" + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-7; + relTol 0; + minIter 1; + } + + "(e|h).*" + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-8; + relTol 0; + minIter 0; + maxIter 3; + } + + "f.*" + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-6; + relTol 0; + } + + "Yi.*" + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-12; + relTol 0; + residualAlpha 1e-8; + } + + "U.*" + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-5; + relTol 0; + minIter 1; + } + + yPsi + { + solver PCG; + preconditioner DIC; + tolerance 1e-10; + relTol 0; + } + +} + +PIMPLE +{ + nOuterCorrectors 3; + nCorrectors 1; + nNonOrthogonalCorrectors 0; + +} + +relaxationFactors +{ + equations + { + ".*" 1; + } +} + + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/inlets_outlets.json b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/inlets_outlets.json new file mode 100644 index 00000000..2b53da73 --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/inlets_outlets.json @@ -0,0 +1,28 @@ +{ + "Geometry": { + "OverallDomain": { + "x" : {"nblocks": 10, "size_per_block": 1.0}, + "y" : {"nblocks": 11, "size_per_block": 1.0}, + "z" : {"nblocks": 5, "size_per_block": 1.0} + }, + "Fluids": [ + [ [0,0,0], [9,0,0] ], + [ [9,0,0], [9,0,4] ], + [ [9,0,4], [0,0,4] ], + [ [0,1,4], [0,4,4] ], + [ [0,4,4], [0,10,4] ], + [ [0,4,4], [0,4,0] ], + [ [0,4,0], [0,10,0] ], + [ [0,4,0], [0,1,0] ] + ] + }, + "inlets": [ + {"branch_id": 0, "type": "circle", "frac_space": 0.2222222222222222, "normal_dir": 1, "radius": 0.4, "nelements": 50, "block_pos": "bottom"}, + {"branch_id": 0, "type": "circle", "frac_space": 0.5, "radius": 0.4, "normal_dir": 1,"nelements": 50, "block_pos": "bottom"}, + {"branch_id": 0, "type": "circle", "frac_space": 0.7777777777777778, "radius": 0.4, "normal_dir": 1,"nelements": 50, "block_pos": "bottom"} + ], + "outlets": [ + {"branch_id": 6, "type": "circle", "frac_space": 1, "normal_dir": 1, "radius": 0.4, "nelements": 50, "block_pos": "top"}, + {"branch_id": 4, "type": "circle", "frac_space": 1, "normal_dir": 1, "radius": 0.4, "nelements": 50, "block_pos": "top"} + ] +} diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/mesh.json b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/mesh.json new file mode 100644 index 00000000..29841d7e --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/mesh.json @@ -0,0 +1,26 @@ +{ + "Meshing": { + "Blockwise": { + "x" : 10, + "y" : 10, + "z" : 10 + } + }, + "Geometry": { + "OverallDomain": { + "x" : {"nblocks": 10, "size_per_block": 1.0}, + "y" : {"nblocks": 11, "size_per_block": 1.0}, + "z" : {"nblocks": 5, "size_per_block": 1.0} + }, + "Fluids": [ + [ [0,0,0], [9,0,0] ], + [ [9,0,0], [9,0,4] ], + [ [9,0,4], [0,0,4] ], + [ [0,1,4], [0,4,4] ], + [ [0,4,4], [0,10,4] ], + [ [0,4,4], [0,4,0] ], + [ [0,4,0], [0,10,0] ], + [ [0,4,0], [0,1,0] ] + ] + } +} diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/mixers.json b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/mixers.json similarity index 91% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/system/mixers.json rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/mixers.json index e49c9a7c..b6224fb7 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/mixers.json +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/mixers.json @@ -24,6 +24,6 @@ ] }, "mixers": [ - {"branch_id": 2, "frac_space": 0.5, "start_time": 1, "power": 0, "sign": "+"} + {"branch_id": 2, "frac_space": 0.5, "start_time": 4, "power": 1500, "sign": "+"} ] } diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/system/setFieldsDict b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/setFieldsDict similarity index 100% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/system/setFieldsDict rename to OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/system/setFieldsDict diff --git a/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/writeGlobalVars.py b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/writeGlobalVars.py new file mode 100644 index 00000000..0594eccc --- /dev/null +++ b/OFsolvers/tutorial_cases/loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup/writeGlobalVars.py @@ -0,0 +1,47 @@ +import os + +import numpy as np + +from bird.utilities.ofio import * + + +def writeGvars(inletA, liqVol): + filename_tmp = os.path.join("constant", "globalVars_temp") + with open(filename_tmp, "r+") as f: + lines = f.readlines() + filename = os.path.join("constant", "globalVars") + with open(filename, "w+") as f: + for line in lines: + if line.startswith("inletA"): + f.write(f"inletA\t{inletA:g};\n") + elif line.startswith("liqVol"): + f.write(f"liqVol\t{liqVol:g};\n") + else: + f.write(line) + + +def readInletArea(): + filename = os.path.join( + "postProcessing", + "patchIntegrate(patch=inlet,field=alpha.gas)", + "0", + "surfaceFieldValue.dat", + ) + with open(filename, "r+") as f: + lines = f.readlines() + return float(lines[4].split()[-1]) + + +def getLiqVol(): + cellCentres = readMesh(os.path.join(".", f"meshCellCentres_0.obj")) + volume_field = readOFScal(os.path.join("0", "V"), len(cellCentres)) + alpha_field = readOFScal( + os.path.join("0", "alpha.liquid"), len(cellCentres) + ) + return np.sum(volume_field * alpha_field) + + +if __name__ == "__main__": + A = readInletArea() + V = getLiqVol() + writeGvars(A, V) diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/README.md b/OFsolvers/tutorial_cases/loop_reactor_reacting/README.md deleted file mode 100644 index dc65411c..00000000 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/README.md +++ /dev/null @@ -1,15 +0,0 @@ -* Scaled up loop reactor with 608m3 of liq -* Reaction kinetics transforming CO2 to CH4 -* No mixers enabled (power = 0 in the fvModels) -* Setup with constant diameter but can use PBE by changing the line -`cp constant/phaseProperties_constantd constant/phaseProperties` -into -`cp constant/phaseProperties_pbe constant/phaseProperties` -* writeGlobalVars.py writes `constant/globalVars` from `constant/globalVars_tmp` - - -## Running the case - -bash run.sh - - diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/run.sh b/OFsolvers/tutorial_cases/loop_reactor_reacting/run.sh deleted file mode 100644 index af2b90bd..00000000 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/run.sh +++ /dev/null @@ -1,70 +0,0 @@ -if ! type "python" &> /dev/null; then - echo " could not be found" - echo "Skipping Mesh generation" -else - # Generate blockmeshDict - python ../../../applications/write_block_rect_mesh.py -i system/mesh.json -o system - - # Generate boundary stl - python ../../../applications/write_stl_patch.py -i system/inlets_outlets.json - - # Generate mixers - #python ../../../applications/write_dynMix_fvModels.py -i system/mixers.json -o constant - -fi - - -if ! type "blockMesh" &> /dev/null; then - echo " could not be found" - echo "OpenFoam is likely not installed, skipping run" -else - # Clean case - ./Allclean - - # Mesh gen - blockMesh -dict system/blockMeshDict - - # Inlet BC - surfaceToPatch -tol 1e-3 inlets.stl - export newmeshdir=$(foamListTimes -latestTime) - rm -rf constant/polyMesh/ - cp -r $newmeshdir/polyMesh ./constant - rm -rf $newmeshdir - cp constant/polyMesh/boundary /tmp - sed -i -e 's/inlets\.stl/inlet/g' /tmp/boundary - cat /tmp/boundary > constant/polyMesh/boundary - - # Outlet BC - surfaceToPatch -tol 1e-3 outlets.stl - export newmeshdir=$(foamListTimes -latestTime) - rm -rf constant/polyMesh/ - cp -r $newmeshdir/polyMesh ./constant - rm -rf $newmeshdir - cp constant/polyMesh/boundary /tmp - sed -i -e 's/outlets\.stl/outlet/g' /tmp/boundary - cat /tmp/boundary > constant/polyMesh/boundary - - # Scale - transformPoints "scale=(2.7615275385627096 2.7615275385627096 2.7615275385627096)" - - # setup IC - cp -r 0.orig 0 - setFields - - # Setup mass flow rate - # Get inlet area - postProcess -func 'patchIntegrate(patch="inlet", field="alpha.gas")' - postProcess -func writeCellVolumes - writeMeshObj - - echo PRESTEP 3 - python writeGlobalVars.py - cp constant/phaseProperties_constantd constant/phaseProperties - - # Run - multiphaseEulerFoam -fi - - - - diff --git a/README.md b/README.md index effc2fb7..2f114366 100644 --- a/README.md +++ b/README.md @@ -341,7 +341,7 @@ To cite BioReactorDesign use these articles on [CO2 interphase mass transfer (op and on [butanediol synthesis](https://www.sciencedirect.com/science/article/pii/S0263876223004689) ``` @article{hassanaly2024inverse, - title={Bayesian calibration of bubble size dynamics applied to \ce{CO2} gas fermenters}, + title={Inverse modeling of bubble size dynamics for interphase mass transfer and gas holdup in CO2 bubble column reactors}, author={Hassanaly, Malik and Parra-Alvarez, John M. and Rahimi, Mohammad J. and Sitaraman, Hariswaran}, journal={Under Review}, year={2024}, diff --git a/applications/GA_opt/ga2sim.py b/applications/GA_opt/ga2sim.py new file mode 100644 index 00000000..a5526bff --- /dev/null +++ b/applications/GA_opt/ga2sim.py @@ -0,0 +1,124 @@ +import os +import pickle +import shutil + +import numpy as np + +from bird import BIRD_CASE_DIR +from bird.preprocess.json_gen.design_io import * +from bird.preprocess.json_gen.generate_designs import * + + +def optimization_setup(): + # spots on the branches where we can place sparger or mixers + branchcom_spots = {} + branchcom_spots[0] = np.linspace(0.2, 0.8, 4) + branchcom_spots[1] = np.linspace(0.2, 0.8, 3) + branchcom_spots[2] = np.linspace(0.2, 0.8, 4) + # branches where the sparger and mixers are placed + branches_com = [0, 1, 2] + return branchcom_spots, branches_com + + +def check_ga_samples(ga_samples): + # we expect ga_samples of dimension (N, 11), where N is the number of samples in the batch + assert len(ga_samples.shape) == 2 + assert ga_samples.shape[1] == 11 + assert np.amax(ga_samples) <= 2 + assert np.amin(ga_samples) >= 0 + + +def ga2sim(ga_samples): + branchcom_spots, branches_com = optimization_setup() + check_ga_samples(ga_samples) + config_dict = {} + # Split ga_samples across the 3 branches + split_ga_samples = np.split(ga_samples, [4, 7], axis=1) + n_batch = ga_samples.shape[0] + for i_batch in range(n_batch): + config = {} + for branch in branches_com: + config[branch] = split_ga_samples[branch][i_batch, :] + config_dict[i_batch] = config + + return config_dict + + +def setup_sim_batch( + ga_samples, vvm_v=0.4, pow_v=6000, study_folder="GA_batch" +): + # GA_batch + check_ga_samples(ga_samples) + n_batch = ga_samples.shape[0] + branchcom_spots, branches_com = optimization_setup() + + # Generate cases + config_dict = ga2sim(ga_samples) + generate_scaledup_reactor_cases( + config_dict, + branchcom_spots=branchcom_spots, + vvm=vvm_v, + power=pow_v, + constantD=True, + study_folder=study_folder, + ) + write_script_start(f"{study_folder}/many_scripts_start", n_batch) + write_script_post(f"{study_folder}/many_scripts_post", n_batch) + write_prep(f"{study_folder}/prep.sh", n_batch) + save_config_dict(f"{study_folder}/configs.pkl", config_dict) + save_config_dict(f"{study_folder}/branchcom_spots.pkl", branchcom_spots) + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser(description="GA setup") + parser.add_argument( + "-bf", + "--batch_folder", + type=str, + metavar="", + required=False, + help="Folder that contains the batch of sims", + default="GAbatch_0.4vvm_6kW", + ) + parser.add_argument( + "-vvm", + "--vvm", + type=float, + metavar="", + required=False, + help="Volume flow rate", + default=0.4, + ) + parser.add_argument( + "-pow", + "--power", + type=float, + metavar="", + required=False, + help="mixer power", + default=6000, + ) + parser.add_argument( + "-gas", + "--ga_sample_file", + type=str, + metavar="", + required=False, + help="file containing the ga samples to execute", + default=None, + ) + args, unknown = parser.parse_known_args() + + if args.ga_sample_file is None: + n_batch = 3 + ga_samples = np.random.choice([0, 1, 2], size=(n_batch, 11)) + else: + ga_samples = np.load(args.ga_sample_file) + vvm_v = args.vvm + pow_v = args.power + study_folder = args.batch_folder + setup_sim_batch( + ga_samples, vvm_v=vvm_v, pow_v=pow_v, study_folder=study_folder + ) diff --git a/applications/GA_opt/read_qoi.py b/applications/GA_opt/read_qoi.py new file mode 100644 index 00000000..e1924121 --- /dev/null +++ b/applications/GA_opt/read_qoi.py @@ -0,0 +1,51 @@ +import argparse +import os + +import numpy as np + + +def count_sim(dirlist): + count = 0 + for entry in dirlist: + if entry.startswith("Sim"): + count += 1 + return count + + +def read_qoi(case_folder): + filen = os.path.join(case_folder, "qoi.txt") + if os.path.isfile(filen): + with open(filen, "r+") as f: + try: + line = f.readline() + qois = line.split(",") + except: + qois = [np.nan, np.nan] + return float(qois[0]), float(qois[1]) + else: + return np.nan, np.nan + + +parser = argparse.ArgumentParser(description="QOI reader") +parser.add_argument( + "-bf", + "--batch_folder", + type=str, + metavar="", + required=True, + help="Folder that contains the batch of sims", +) +args, unknown = parser.parse_known_args() + + +dir_list = os.listdir(args.batch_folder) +n_sim = count_sim(dir_list) +qoi = np.zeros(n_sim) +qoi_err = np.zeros(n_sim) +for isim in range(n_sim): + case_folder = os.path.join(args.batch_folder, f"Sim_{isim}") + qoi[isim], qoi_err[isim] = read_qoi(case_folder) + +np.savez( + os.path.join(args.batch_folder, "results.npz"), qoi=qoi, qoi_err=qoi_err +) diff --git a/applications/GA_opt/runGA.sh b/applications/GA_opt/runGA.sh new file mode 100644 index 00000000..210010fc --- /dev/null +++ b/applications/GA_opt/runGA.sh @@ -0,0 +1,14 @@ +for ga_iter in NiterGA: + 1) decide next batch of GA samples + 2) save samples as 'samples_batch${ga_iter}.npy' + 3) setup the next batch of CFD runs + python ga2sim.py -bf GAbatch${ga_iter}_0.4vvm_6kW -vvm 0.4 -pow 6000 --ga_sample_file samples_batch${ga_iter}.npy + 4) run the CFD sim + cd GAbatch${ga_iter}_0.4vvm_6kW + bash many_scripts_start + 5) waituntil done + 6) compute QOI + cd GAbatch${ga_iter}_0.4vvm_6kW + bash many_scripts_post + 7) Store qoi of batch in numpy array + python read_qoi.py -bf GAbatch${ga_iter}_0.4vvm_6kW diff --git a/applications/Random_opt/randsim.py b/applications/Random_opt/randsim.py new file mode 100644 index 00000000..a3b49d53 --- /dev/null +++ b/applications/Random_opt/randsim.py @@ -0,0 +1,100 @@ +import os +import pickle +import shutil + +import numpy as np + +from bird import BIRD_CASE_DIR +from bird.preprocess.json_gen.design_io import * +from bird.preprocess.json_gen.generate_designs import * + + +def optimization_setup(): + # spots on the branches where we can place sparger or mixers + branchcom_spots = {} + branchcom_spots[0] = np.linspace(0.2, 0.8, 4) + branchcom_spots[1] = np.linspace(0.2, 0.8, 3) + branchcom_spots[2] = np.linspace(0.2, 0.8, 4) + # branches where the sparger and mixers are placed + branches_com = [0, 1, 2] + return branchcom_spots, branches_com + + +def random_sample(branches_com, branchcom_spots, config_dict={}): + config = {} + # choices = ["mix", "sparger", "none"] + choices_com = [0, 1, 2] + for branch in branches_com: + config[branch] = np.random.choice( + choices_com, size=len(branchcom_spots[branch]) + ) + + existing = False + new_config_key = 0 + for old_key_conf in config_dict: + if compare_config(config_dict[old_key_conf], config): + existing = True + print("FOUND SAME CONFIG") + return config_dict + new_config_key = old_key_conf + 1 + + if check_config(config): + config_dict[new_config_key] = config + + return config_dict + + +if __name__ == "__main__": + branchcom_spots, branches_com = optimization_setup() + n_sim = 4 + config_dict = {} + for i in range(n_sim): + config_dict = random_sample( + branches_com, branchcom_spots, config_dict=config_dict + ) + + vvm_l = [0.4] + pow_l = [2] + + for vvm_v in vvm_l: + vvm_str = str(vvm_v).replace(".", "_") + for pow_v in pow_l: + study_folder = f"study_{vvm_str}vvm_{pow_v}W" + generate_small_reactor_cases( + config_dict, + branchcom_spots, + vvm=vvm_v, + power=pow_v, + constantD=True, + study_folder=study_folder, + ) + write_script_start(f"{study_folder}/many_scripts_start", n_sim) + write_script_post(f"{study_folder}/many_scripts_post", n_sim) + write_prep(f"{study_folder}/prep.sh", n_sim) + save_config_dict(f"{study_folder}/configs.pkl", config_dict) + save_config_dict( + f"{study_folder}/branchcom_spots.pkl", branchcom_spots + ) + + vvm_l = [0.1, 0.4] + pow_l = [6000] + + for vvm_v in vvm_l: + vvm_str = str(vvm_v).replace(".", "_") + for pow_v in pow_l: + study_folder = f"study_scaleup_{vvm_str}vvm_{pow_v}W" + generate_scaledup_reactor_cases( + config_dict, + branchcom_spots, + vvm=vvm_v, + power=pow_v, + constantD=True, + study_folder=study_folder, + ) + write_script_start(f"{study_folder}/many_scripts_start", n_sim) + write_script_post(f"{study_folder}/many_scripts_post", n_sim) + write_prep(f"{study_folder}/prep.sh", n_sim) + save_config_dict(f"{study_folder}/configs.pkl", config_dict) + save_config_dict( + f"{study_folder}/branchcom_spots.pkl", branchcom_spots + ) diff --git a/applications/Random_opt/read_qoi.py b/applications/Random_opt/read_qoi.py new file mode 100644 index 00000000..e1924121 --- /dev/null +++ b/applications/Random_opt/read_qoi.py @@ -0,0 +1,51 @@ +import argparse +import os + +import numpy as np + + +def count_sim(dirlist): + count = 0 + for entry in dirlist: + if entry.startswith("Sim"): + count += 1 + return count + + +def read_qoi(case_folder): + filen = os.path.join(case_folder, "qoi.txt") + if os.path.isfile(filen): + with open(filen, "r+") as f: + try: + line = f.readline() + qois = line.split(",") + except: + qois = [np.nan, np.nan] + return float(qois[0]), float(qois[1]) + else: + return np.nan, np.nan + + +parser = argparse.ArgumentParser(description="QOI reader") +parser.add_argument( + "-bf", + "--batch_folder", + type=str, + metavar="", + required=True, + help="Folder that contains the batch of sims", +) +args, unknown = parser.parse_known_args() + + +dir_list = os.listdir(args.batch_folder) +n_sim = count_sim(dir_list) +qoi = np.zeros(n_sim) +qoi_err = np.zeros(n_sim) +for isim in range(n_sim): + case_folder = os.path.join(args.batch_folder, f"Sim_{isim}") + qoi[isim], qoi_err[isim] = read_qoi(case_folder) + +np.savez( + os.path.join(args.batch_folder, "results.npz"), qoi=qoi, qoi_err=qoi_err +) diff --git a/applications/Random_opt/runGA.sh b/applications/Random_opt/runGA.sh new file mode 100644 index 00000000..210010fc --- /dev/null +++ b/applications/Random_opt/runGA.sh @@ -0,0 +1,14 @@ +for ga_iter in NiterGA: + 1) decide next batch of GA samples + 2) save samples as 'samples_batch${ga_iter}.npy' + 3) setup the next batch of CFD runs + python ga2sim.py -bf GAbatch${ga_iter}_0.4vvm_6kW -vvm 0.4 -pow 6000 --ga_sample_file samples_batch${ga_iter}.npy + 4) run the CFD sim + cd GAbatch${ga_iter}_0.4vvm_6kW + bash many_scripts_start + 5) waituntil done + 6) compute QOI + cd GAbatch${ga_iter}_0.4vvm_6kW + bash many_scripts_post + 7) Store qoi of batch in numpy array + python read_qoi.py -bf GAbatch${ga_iter}_0.4vvm_6kW diff --git a/applications/convert_dim.py b/applications/convert_dim.py new file mode 100644 index 00000000..c739e1dc --- /dev/null +++ b/applications/convert_dim.py @@ -0,0 +1,43 @@ +import argparse +import os +import shutil +import sys + +from bird.preprocess.json_gen.generate_designs import ( + convert_case_dim, + replace_str_in_file, +) + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Modify case dim") + parser.add_argument( + "-i", + "--input_folder", + type=str, + metavar="", + required=False, + help="case folder input", + default=None, + ) + parser.add_argument( + "-o", + "--output_folder", + type=str, + metavar="", + required=False, + help="case folder output", + default=None, + ) + parser.add_argument( + "-f", + "--dim_factor", + type=float, + metavar="", + required=False, + help="scaling factor", + default=None, + ) + + args, unknown = parser.parse_known_args() + + convert_case_dim(args.input_folder, args.output_folder, args.dim_factor) diff --git a/applications/read_history.py b/applications/read_history.py new file mode 100644 index 00000000..d287f020 --- /dev/null +++ b/applications/read_history.py @@ -0,0 +1,243 @@ +import argparse +import os +import sys + +import numpy as np +from prettyPlot.plotting import plt, pretty_labels + +from bird.utilities.ofio import * + + +def compute_gas_holdup(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + alpha_liq = field_dict["alpha_liq"] + volume = field_dict["volume"] + holdup = np.sum((1 - alpha_liq) * volume) / np.sum(volume) + return holdup, field_dict + + +def co2liq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("co2_liq" in field_dict) or field_dict["co2_liq"] is None: + co2_liq_file = os.path.join(caseFolder, timeFolder, "CO2.liquid") + co2_liq = readOFScal(co2_liq_file, nCells) + # print("computing co2 liq") + field_dict["co2_liq"] = co2_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + if not ("indliq" in field_dict) or field_dict["indliq"] is None: + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.5) + # print("computing indliq") + field_dict["indliq"] = indliq + volume = field_dict["volume"] + indliq = field_dict["indliq"] + alpha_liq = field_dict["alpha_liq"] + co2_liq = field_dict["co2_liq"] + met = np.sum( + alpha_liq[indliq] * co2_liq[indliq] * volume[indliq] + ) / np.sum(volume[indliq]) + return met, field_dict + + +def cliq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("rho_liq" in field_dict) or field_dict["rho_liq"] is None: + rho_liq_file = os.path.join(caseFolder, timeFolder, "rhom") + rho_liq = readOFScal(rho_liq_file, nCells) + field_dict["rho_liq"] = rho_liq + if not ("co2_liq" in field_dict) or field_dict["co2_liq"] is None: + co2_liq_file = os.path.join(caseFolder, timeFolder, "CO2.liquid") + co2_liq = readOFScal(co2_liq_file, nCells) + # print("computing co2 liq") + field_dict["co2_liq"] = co2_liq + if not ("h2_liq" in field_dict) or field_dict["h2_liq"] is None: + h2_liq_file = os.path.join(caseFolder, timeFolder, "H2.liquid") + h2_liq = readOFScal(h2_liq_file, nCells) + # print("computing h2 liq") + field_dict["h2_liq"] = h2_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + if not ("indliq" in field_dict) or field_dict["indliq"] is None: + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.5) + # print("computing indliq") + field_dict["indliq"] = indliq + + volume = field_dict["volume"] + indliq = field_dict["indliq"] + alpha_liq = field_dict["alpha_liq"] + co2_liq = field_dict["co2_liq"] + h2_liq = field_dict["h2_liq"] + rho_liq = field_dict["rho_liq"] + + # c_h2 = rho_liq[indliq] * alpha_liq[indliq] * h2_liq[indliq] / 0.002016 + # c_co2 = rho_liq[indliq] * alpha_liq[indliq] * co2_liq[indliq] / 0.04401 + + c_h2 = 1000 * alpha_liq[indliq] * h2_liq[indliq] / 0.002016 + c_co2 = 1000 * alpha_liq[indliq] * co2_liq[indliq] / 0.04401 + + c_h2 = np.sum(c_h2 * volume[indliq]) / np.sum(volume[indliq]) + c_co2 = np.sum(c_co2 * volume[indliq]) / np.sum(volume[indliq]) + + return c_co2, c_h2, field_dict + + +def h2liq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("h2_liq" in field_dict) or field_dict["h2_liq"] is None: + h2_liq_file = os.path.join(caseFolder, timeFolder, "H2.liquid") + h2_liq = readOFScal(h2_liq_file, nCells) + # print("computing h2 liq") + field_dict["h2_liq"] = h2_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + if not ("indliq" in field_dict) or field_dict["indliq"] is None: + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.5) + # print("computing indliq") + field_dict["indliq"] = indliq + volume = field_dict["volume"] + indliq = field_dict["indliq"] + alpha_liq = field_dict["alpha_liq"] + h2_liq = field_dict["h2_liq"] + met = np.sum(alpha_liq[indliq] * h2_liq[indliq] * volume[indliq]) / np.sum( + volume[indliq] + ) + return met, field_dict + + +def vol_liq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + volume = field_dict["volume"] + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.0) + liqvol = np.sum(alpha_liq[indliq] * volume[indliq]) / np.sum( + volume[indliq] + ) + return liqvol, field_dict + + +parser = argparse.ArgumentParser(description="Convergence of GH") +parser.add_argument( + "-cr", + "--case_root", + type=str, + metavar="", + required=True, + help="Case root", +) +parser.add_argument( + "-cn", + "--case_name", + type=str, + metavar="", + required=True, + help="Case name", +) +parser.add_argument( + "-df", + "--data_folder", + type=str, + metavar="", + required=False, + help="data folder name", + default="data", +) + +args, unknown = parser.parse_known_args() + + +case_root = args.case_root # "../" +case_name = args.case_name # "12_hole_sparger_snappyRefine_700rpm_opt_coeff" +case_path = os.path.join(case_root, case_name) +time_float_sorted, time_str_sorted = getCaseTimes(case_path, remove_zero=True) +cellCentres = readMesh(os.path.join(case_path, f"meshCellCentres_0.obj")) +nCells = len(cellCentres) + + +co2_history = np.zeros(len(time_str_sorted)) +c_co2_history = np.zeros(len(time_str_sorted)) +h2_history = np.zeros(len(time_str_sorted)) +c_h2_history = np.zeros(len(time_str_sorted)) +gh_history = np.zeros(len(time_str_sorted)) +liqvol_history = np.zeros(len(time_str_sorted)) +print(f"case_path = {case_path}") +field_dict = {} +for itime, time in enumerate(time_float_sorted): + time_folder = time_str_sorted[itime] + print(f"\tTime : {time_folder}") + if not field_dict == {}: + new_field_dict = {} + if "volume" in field_dict: + new_field_dict["volume"] = field_dict["volume"] + field_dict = new_field_dict + gh_history[itime], field_dict = compute_gas_holdup( + case_path, time_str_sorted[itime], nCells, field_dict + ) + co2_history[itime], field_dict = co2liq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + h2_history[itime], field_dict = h2liq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + liqvol_history[itime], field_dict = vol_liq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + c_co2_history[itime], c_h2_history[itime], field_dict = cliq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + + +dataFolder = args.data_folder +os.makedirs(dataFolder, exist_ok=True) +os.makedirs(os.path.join(dataFolder, case_name), exist_ok=True) +np.savez( + os.path.join(dataFolder, case_name, "conv.npz"), + time=np.array(time_float_sorted), + gh=gh_history, + co2=co2_history, + h2=h2_history, + vol_liq=liqvol_history, + c_h2=c_h2_history, + c_co2=c_co2_history, +) diff --git a/applications/write_dynMix_fvModels.py b/applications/write_dynMix_fvModels.py index e2a5278b..bf1665ca 100644 --- a/applications/write_dynMix_fvModels.py +++ b/applications/write_dynMix_fvModels.py @@ -35,4 +35,6 @@ ) args = parser.parse_args() dynMix_dict = parseJsonFile(args.input) - write_fvModel(dynMix_dict, output_folder=args.output_folder) + write_fvModel( + dynMix_dict, output_folder=args.output_folder, force_sign=True + ) diff --git a/applications/write_dynMix_fvModels_force_sign.py b/applications/write_dynMix_fvModels_force_sign.py new file mode 100644 index 00000000..bf1665ca --- /dev/null +++ b/applications/write_dynMix_fvModels_force_sign.py @@ -0,0 +1,40 @@ +import os + +import numpy as np +import stl + +from bird import BIRD_PRE_DYNMIX_TEMP_DIR +from bird.meshing._mesh_tools import parseJsonFile +from bird.preprocess.dynamic_mixer.mixing_fvModels import * + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser( + description="Generate dynamic mixer fvModels" + ) + parser.add_argument( + "-i", + "--input", + type=str, + metavar="", + required=False, + help="Mixers Json input", + default=os.path.join( + BIRD_PRE_DYNMIX_TEMP_DIR, "expl_list", "mixers.json" + ), + ) + parser.add_argument( + "-o", + "--output_folder", + type=str, + metavar="", + required=False, + help="fvModels folder output", + default=".", + ) + args = parser.parse_args() + dynMix_dict = parseJsonFile(args.input) + write_fvModel( + dynMix_dict, output_folder=args.output_folder, force_sign=True + ) diff --git a/bird/__init__.py b/bird/__init__.py index 3365eb11..b8aa816c 100644 --- a/bird/__init__.py +++ b/bird/__init__.py @@ -5,6 +5,7 @@ from bird.version import __version__ BIRD_DIR = os.path.dirname(os.path.realpath(__file__)) +BIRD_CASE_DIR = os.path.join(BIRD_DIR, "../OFsolvers/tutorial_cases") BIRD_MESH_DIR = os.path.join(BIRD_DIR, "meshing") BIRD_POST_DIR = os.path.join(BIRD_DIR, "postprocess") BIRD_PRE_DIR = os.path.join(BIRD_DIR, "preprocess") @@ -32,5 +33,6 @@ BIRD_PRE_DYNMIX_TEMP_DIR = os.path.join( BIRD_PRE_DIR, "dynamic_mixer", "mixing_template" ) +BIRD_PRE_DATA_DIR = os.path.join(BIRD_PRE_DIR, "data_preprocess") BIRD_EARLY_PRED_DATA_DIR = os.path.join(BIRD_POST_DIR, "data_early") BIRD_INV_DIR = os.path.join(BIRD_DIR, "inverse_modeling") diff --git a/bird/calibration/param_nn.py b/bird/calibration/param_nn.py deleted file mode 100644 index 11436ab8..00000000 --- a/bird/calibration/param_nn.py +++ /dev/null @@ -1,409 +0,0 @@ -import argparse -import os -import sys -import time - -import joblib -import numpy as np -import tensorflow as tf -import tensorflow.keras as keras -from prettyPlot.progressBar import print_progress_bar -from sklearn.model_selection import train_test_split -from sklearn.pipeline import make_pipeline -from sklearn.preprocessing import MinMaxScaler, StandardScaler -from tensorflow.keras import initializers, layers, optimizers, regularizers - - -def flexible_activation(x, activation): - if activation is None: - out = x - elif activation.lower() == "swish": - out = layers.Activation(swish_activation)(x) - elif activation.lower() == "sigmoid": - out = layers.Activation(activation="sigmoid")(x) - elif activation.lower() == "softplus": - out = layers.Activation(activation="softplus")(x) - elif activation.lower() == "tanh": - out = layers.Activation(activation="tanh")(x) - elif activation.lower() == "elu": - out = layers.Activation(activation="elu")(x) - elif activation.lower() == "selu": - out = layers.Activation(activation="selu")(x) - elif activation.lower() == "gelu": - out = layers.Activation(activation="gelu")(x) - elif activation.lower() == "relu": - out = layers.Activation(activation="relu")(x) - elif activation.lower() == "leakyrelu": - out = layers.LeakyReLU()(x) - else: - sys.exit(f"ERROR: unknown activation {activation}") - return out - - -def singleLayer(x, n_units, activation): - out = layers.Dense(n_units)(x) - out = flexible_activation(out, activation) - return out - - -def makeModel(input_dim_par, output_dim, units, activation, final_activation): - # inputs - input_z = layers.Input(shape=(1,), name="input_z") - input_par = layers.Input(shape=(input_dim_par,), name="input_par") - input_z_par = layers.concatenate([input_z, input_par], name="input_z_par") - x = input_z_par - for unit in units: - x = singleLayer(x, unit, activation) - output = layers.Dense(output_dim)(x) - output = flexible_activation(output, final_activation) - model = keras.Model([input_z, input_par], output) - return model - - -class Param_NN(keras.Model): - def __init__( - self, - input_dim=None, - output_dim=None, - units=None, - activation=None, - final_activation=None, - batch_size=None, - nEpochs=None, - weight_file=None, - model_folder="Model", - log_loss_folder="Log", - np_data_file=None, - **kwargs, - ): - super().__init__(**kwargs) - - self.np_data_file = np_data_file - if input_dim is None or output_dim is None: - input_dim, output_dim = self.get_dim_from_data(np_data_file) - self.input_dim = input_dim - self.output_dim = output_dim - self.input_dim_par = self.input_dim - 1 - - self.model = makeModel( - self.input_dim_par, - self.output_dim, - units, - activation, - final_activation, - ) - if weight_file is not None: - self.load(weight_file) - - self.batch_size = batch_size - self.nEpochs = nEpochs - - self.model_folder = model_folder - self.log_loss_folder = log_loss_folder - - def get_dim_from_data(self, data_file): - tmp_dat = np.load(data_file) - if len(tmp_dat["x"].shape) == 1: - input_dim = 1 - else: - input_dim = tmp_dat["x"].shape[1] - if len(tmp_dat["y"].shape) == 1: - output_dim = 1 - else: - output_dim = tmp_dat["y"].shape[1] - return input_dim, output_dim - - def make_data(self, np_file=None, scaler_folder="."): - # Raw data - if np_file is None: - np_file = self.np_data_file - - tmp = np.load(np_file) - z_dat = np.float32(np.reshape(tmp["x"][:, 0], (-1, 1))) - par_dat = np.float32(tmp["x"][:, 1:]) - y_dat = np.float32(np.reshape(tmp["y"], (-1, 1))) - - # Scaler - scaler_z = MinMaxScaler() - scaler_par = MinMaxScaler() - scaler_y = StandardScaler() - scaler_z.fit(z_dat) - scaler_par.fit(par_dat) - scaler_y.fit(y_dat) - joblib.dump(scaler_z, os.path.join(scaler_folder, "scaler_z.mod")) - joblib.dump(scaler_par, os.path.join(scaler_folder, "scaler_par.mod")) - joblib.dump(scaler_y, os.path.join(scaler_folder, "scaler_y.mod")) - - # Split and shuffle - ( - z_train, - z_test, - par_train, - par_test, - y_train, - y_test, - ) = train_test_split( - scaler_z.transform(z_dat), - scaler_par.transform(par_dat), - scaler_y.transform(y_dat), - test_size=0.1, - random_state=42, - ) - - return { - "z_train": z_train, - "par_train": par_train, - "y_train": y_train, - "z_test": z_test, - "par_test": par_test, - "y_test": y_test, - } - - @tf.function - def train_step(self, input_z=None, input_par=None, output_true=None): - with tf.GradientTape() as tape: - loss = self.calc_loss(input_z, input_par, output_true) - grads = tape.gradient(loss, self.trainable_weights) - self.optimizer.apply_gradients(zip(grads, self.trainable_weights)) - return { - "loss": loss, - } - - def calc_loss(self, input_z=None, input_par=None, output_true=None): - output_predicted = self.model([input_z, input_par]) - loss = tf.math.reduce_sum( - tf.math.square(output_predicted - output_true) - ) - return loss - - def train( - self, - learningRateModel, - batch_size=None, - nEpochs=None, - data_file=None, - gradient_threshold=None, - ): - if gradient_threshold is not None: - print(f"INFO: clipping gradients at {gradient_threshold:.2g}") - # Make sure the control file for learning rate is consistent with main.py, at least at first - self.prepareLog() - bestLoss = None - - if batch_size is None: - batch_size = self.batch_size - if nEpochs is None: - nEpochs = self.nEpochs - - # Make dataset - if data_file is None: - data_file = self.np_data_file - - input_dim_data, output_dim_data = self.get_dim_from_data(data_file) - assert input_dim_data == self.input_dim - assert output_dim_data == self.output_dim - - dataset = self.make_data( - scaler_folder=self.model_folder, np_file=data_file - ) - self.n_batch = dataset["z_train"].shape[0] // batch_size - self.freq = self.n_batch * 10 - # self.freq = 1 - - train_dataset = tf.data.Dataset.from_tensor_slices( - ( - dataset["z_train"], - dataset["par_train"], - dataset["y_train"], - ) - ).batch(batch_size) - test_dataset = tf.data.Dataset.from_tensor_slices( - ( - dataset["z_test"], - dataset["par_test"], - dataset["y_test"], - ) - ).batch(100000) - - # Prepare LR - lr_m = learningRateModel - self.optimizer = optimizers.Adam(learning_rate=lr_m) - - # Train - print_progress_bar( - 0, - nEpochs, - prefix="Loss=%s Epoch= %d / %d " % ("?", 0, nEpochs), - suffix="Complete", - length=20, - ) - - for epoch in range(nEpochs): - train_loss = 0 - time_per_step = 0 - for step, batch in enumerate(train_dataset): - self.total_step = step + epoch * self.n_batch - time_s = time.time() - loss_info = self.train_step( - input_z=batch[0], input_par=batch[1], output_true=batch[2] - ) - loss_val = loss_info["loss"] - time_e = time.time() - train_loss = ( - (step) * train_loss + tf.reduce_sum(loss_val) - ) / (step + 1) - time_per_step = ( - (step) * (time_per_step) + (time_e - time_s) - ) / (step + 1) - test_loss = 0 - for val_step, val_batch in enumerate(test_dataset): - val_loss = self.calc_loss( - val_batch[0], val_batch[1], val_batch[2] - ) - test_loss = ( - (val_step) * test_loss + tf.reduce_sum(val_loss) - ) / (val_step + 1) - - print_progress_bar( - epoch + 1, - nEpochs, - prefix=f"train_l={train_loss:.2f}, test_l={test_loss:.2f}, t/step={1e3*time_per_step:.2f} ms, Epoch= {epoch + 1} / {nEpochs} ", - suffix="Complete", - length=20, - ) - bestLoss = self.logTraining( - epoch, - loss=train_loss, - val_loss=test_loss, - bestLoss=bestLoss, - ) - self.model.save_weights( - os.path.join(self.model_folder, "last.weights.h5"), - overwrite=True, - ) - - def pred(self, z, par, rescaled=False): - if len(z.shape) == 1: - z = np.reshape(z, (-1, 1)) - if len(par.shape) == 1: - par = np.reshape(par, (-1, 1)) - scaler_z = joblib.load(os.path.join(self.model_folder, "scaler_z.mod")) - scaler_par = joblib.load( - os.path.join(self.model_folder, "scaler_par.mod") - ) - scaler_y = joblib.load(os.path.join(self.model_folder, "scaler_y.mod")) - z = np.float32(z) - par = np.float32(par) - if not rescaled: - z_in = scaler_z.transform(z) - par_in = scaler_par.transform(par) - y_out = self.model([z_in, par_in]) - y = scaler_y.inverse_transform(y_out) - return y - - def load(self, weight_file): - self.model.load_weights(weight_file) - - def prepareLog(self): - os.makedirs(self.model_folder, exist_ok=True) - os.makedirs(self.log_loss_folder, exist_ok=True) - try: - os.remove(os.path.join(self.log_loss_folder, "log.csv")) - except: - pass - # Make log headers - f = open(os.path.join(self.log_loss_folder, "log.csv"), "a+") - f.write("epoch;step;loss;recons_w_loss;recons_chi_loss\n") - f.close() - - def logTraining(self, epoch, loss, val_loss, bestLoss): - f = open(os.path.join(self.log_loss_folder, "log.csv"), "a+") - f.write( - str(int(epoch)) - + ";" - + str(int(epoch * self.n_batch)) - + ";" - + str(loss.numpy()) - + ";" - + str(val_loss.numpy()) - + ";" - + "\n" - ) - f.close() - if bestLoss is None or loss < bestLoss: - bestLoss = loss - self.model.save_weights( - os.path.join(self.model_folder, "best.weights.h5"), - overwrite=True, - ) - return bestLoss - - def get_loss_dat(self): - lossData = np.genfromtxt( - os.path.join(self.log_loss_folder, "log.csv"), - delimiter=";", - skip_header=1, - ) - return { - "epoch": lossData[:, 0], - "step": lossData[:, 1], - "train_loss": lossData[:, 2], - "val_loss": lossData[:, 3], - } - - -if __name__ == "__main__": - myNN = BCR_NN( - input_dim=4, - output_dim=1, - units=[10, 20, 10, 5], - activation="tanh", - model_folder="Modeltmp", - # weight_file='Modeltmp.save/last.weights.h5', - log_loss_folder="Logtmp", - ) - - myNN.train( - learningRateModel=1e-3, - batch_size=32, - nEpochs=1000, - data_file="train_data_gh_17_raw.npz", - ) - - from plotsUtil import * - - nz = 32 - nz_true = 32 - A = np.load("train_data_gh_17_raw.npz") - dat_par = np.repeat(np.reshape(A["x"][0, 1:], (1, -1)), nz, axis=0) - dat_z = np.reshape(np.linspace(0, 4, nz), (-1, 1)) - pred = myNN.pred(dat_z, dat_par) - - fig = plt.figure() - plt.plot(pred[:, 0], dat_z[:, 0], "o", label="pred") - plt.plot(A["y"][:nz_true], A["x"][:nz_true, 0], "x", label="true") - prettyLabels("gh", "z", 14) - plotLegend() - - loss_dat = myNN.get_loss_dat() - fig = plt.figure() - plt.plot( - loss_dat["epoch"], - loss_dat["train_loss"], - color="k", - linewidth=3, - label="train", - ) - plt.plot( - loss_dat["epoch"], - loss_dat["val_loss"], - color="b", - linewidth=3, - label="test", - ) - prettyLabels("epoch", "loss", 14) - ax = plt.gca() - ax.set_yscale("log") - plotLegend() - - plt.show() diff --git a/bird/calibration/scaling.py b/bird/calibration/scaling.py deleted file mode 100644 index 0d04060c..00000000 --- a/bird/calibration/scaling.py +++ /dev/null @@ -1,22 +0,0 @@ -def scale_x(inp, min_, max_): - return (inp - min_) / (max_ - min_) - - -def scale_par(inp, min_, max_): - return scale_x(inp, min_, max_) - - -def scale_y(inp, mean_, scale_): - return (inp - mean_) / (max_ - min_) - - -def unscale_x(inp, min_, max_): - return inp * (max_ - min_) + min_ - - -def unscale_par(inp, min_, max_): - return unscale_x(inp, min_, max_) - - -def unscale_y(inp, mean_, scale_): - return inp * scale_ + mean_ diff --git a/bird/meshing/block_rect_mesh.py b/bird/meshing/block_rect_mesh.py index 22a31f16..2b9d335e 100644 --- a/bird/meshing/block_rect_mesh.py +++ b/bird/meshing/block_rect_mesh.py @@ -240,9 +240,9 @@ def from_block_rect_to_seg(input_geom_dict, rescale=True): segments[iseg]["normal_dir"] = int(np.nonzero(vec_conn)[0][0]) if segments[iseg]["normal_dir"] == 0: segments[iseg]["max_rad"] = (blocksize_y + blocksize_z) / 4 - if segments[iseg]["normal_dir"] == 1: + elif segments[iseg]["normal_dir"] == 1: segments[iseg]["max_rad"] = (blocksize_x + blocksize_z) / 4 - if segments[iseg]["normal_dir"] == 2: + elif segments[iseg]["normal_dir"] == 2: segments[iseg]["max_rad"] = (blocksize_x + blocksize_y) / 4 return { diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/.vim/.netrwhist b/bird/preprocess/data_preprocess/loop_reactor_3_6L/.vim/.netrwhist new file mode 100644 index 00000000..b9691c3b --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/.vim/.netrwhist @@ -0,0 +1,3 @@ +let g:netrw_dirhistmax =10 +let g:netrw_dirhistcnt =1 +let g:netrw_dirhist_1='/home/openfoam/postProcessing/patchIntegrate(patch=inlet,field=alpha.gas)/0' diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/water.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/CO2.gas similarity index 94% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/water.gas rename to bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/CO2.gas index 9193636d..e4165b1a 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/0.orig/water.gas +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/CO2.gas @@ -9,7 +9,7 @@ FoamFile { format ascii; class volScalarField; - object water.gas; + object CO2.gas; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // dimensions [0 0 0 0 0 0 0]; @@ -26,7 +26,7 @@ boundaryField inlet { type fixedValue; - value uniform 0; + value uniform $f_CO2; } outlet diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/CO2.liquid b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/CO2.liquid new file mode 100644 index 00000000..4b8ea6a0 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/CO2.liquid @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object CO2.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0.0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type zeroGradient; + //type fixedValue; + //value uniform 0.0; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/H2.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/H2.gas new file mode 100644 index 00000000..9f66b2d2 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/H2.gas @@ -0,0 +1,47 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object H2.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +dimensions [0 0 0 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform 0; + + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform $f_H2; + } + + outlet + { + //type inletOutlet; + //phi phi.gas; + //inletValue $f_H2; + //value $f_H2; + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/H2.liquid b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/H2.liquid new file mode 100644 index 00000000..65ae8d34 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/H2.liquid @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object H2.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0.0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type zeroGradient; + //type fixedValue; + //value uniform 0.0; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/N2.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/N2.gas new file mode 100644 index 00000000..c1d7225f --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/N2.gas @@ -0,0 +1,47 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object N2.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +dimensions [0 0 0 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform 1; + + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform $f_N2; + } + + outlet + { + //type inletOutlet; + //phi phi.gas; + //inletValue $f_N2; + //value $f_N2; + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/T.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/T.gas new file mode 100644 index 00000000..bf0199a0 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/T.gas @@ -0,0 +1,44 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object T.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 1 0 0 0]; + +internalField uniform 300; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value $internalField; + } + + outlet + { + type inletOutlet; + phi phi.gas; + inletValue $internalField; + value $internalField; + } + + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/T.liquid b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/T.liquid new file mode 100644 index 00000000..7101ea31 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/T.liquid @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object T.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 1 0 0 0]; + +internalField uniform 300; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + outlet + { + type inletOutlet; + phi phi.liquid; + inletValue $internalField; + value $internalField; + } + inlet + { + type fixedValue; + value $internalField; + } + defaultFaces + { + type zeroGradient; + } + +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/U.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/U.gas new file mode 100644 index 00000000..e696566f --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/U.gas @@ -0,0 +1,47 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volVectorField; + object U.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform (0 0.0 0); + +#include "${FOAM_CASE}/constant/globalVars" + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + //type flowRateInletVelocity; + //massFlowRate $mflowRateGas; + //rho thermo:rho.gas; + //value $internalField; + type fixedValue; + value uniform (0 $uGasPhase 0); + } + outlet + { + type pressureInletOutletVelocity; + phi phi.gas; + value $internalField; + } + defaultFaces + { + type slip; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/U.liquid b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/U.liquid new file mode 100644 index 00000000..1879e020 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/U.liquid @@ -0,0 +1,46 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volVectorField; + object U.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform (0 0 0); + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + //type flowRateInletVelocity; + //massFlowRate $mflowRateLiq; + //rho thermo:rho.liquid; + //value $internalField; + type fixedValue; + value uniform (0 0 0); + } + outlet + { + type noSlip; + } + defaultFaces + { + type noSlip; + } + +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/Ydefault.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/Ydefault.gas new file mode 100644 index 00000000..fba2945d --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/Ydefault.gas @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object Ydefault.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0.0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform 0.0; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/Ydefault.liquid b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/Ydefault.liquid new file mode 100644 index 00000000..a5108564 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/Ydefault.liquid @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object Ydefault.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 1.0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform 1.0; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alpha.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alpha.gas new file mode 100644 index 00000000..1e303fbe --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alpha.gas @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + location "0"; + object alpha.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform $alphaGas; + +boundaryField +{ + inlet + { + type fixedValue; + value uniform $alphaGas; + } + outlet + { + type inletOutlet; + phi phi.gas; + inletValue uniform 1; + value uniform 1; + } + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alpha.liquid b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alpha.liquid new file mode 100644 index 00000000..5c92070b --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alpha.liquid @@ -0,0 +1,40 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object alpha.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform 1; + +boundaryField +{ + inlet + { + type fixedValue; + value uniform $alphaLiq; + } + outlet + { + type fixedValue; + value uniform 0; + } + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alphat.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alphat.gas new file mode 100644 index 00000000..b867958f --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alphat.gas @@ -0,0 +1,46 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object alphat.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -1 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type calculated; + value $internalField; + } + + outlet + { + type calculated; + value $internalField; + } + + defaultFaces + { + type calculated; + value $internalField; + //type compressible::alphatWallFunction; + //Prt 0.85; + //value $internalField; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alphat.liquid b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alphat.liquid new file mode 100644 index 00000000..2569c3ee --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/alphat.liquid @@ -0,0 +1,44 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object alphat.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -1 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type calculated; + value $internalField; + } + + outlet + { + type calculated; + value $internalField; + } + + defaultFaces + { + type compressible::alphatWallFunction; + Prt 0.85; + value $internalField; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/epsilon.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/epsilon.gas new file mode 100644 index 00000000..707a1cda --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/epsilon.gas @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object epsilon.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -3 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform $eps_inlet_gas; + +boundaryField +{ + inlet + { + type fixedValue; + value uniform $eps_inlet_gas; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + //type epsilonWallFunction; + //value $internalField; + } + + // defaultFaces + // { + // type empty; + // } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/epsilon.liquid b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/epsilon.liquid new file mode 100644 index 00000000..0a4236fd --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/epsilon.liquid @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object epsilon.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -3 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform $eps_inlet_liq; + +boundaryField +{ + inlet + { + type fixedValue; + value uniform $eps_inlet_liq; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type epsilonWallFunction; + value $internalField; + } + +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/f.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/f.gas new file mode 100644 index 00000000..76ee77a9 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/f.gas @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object f.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 1.0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform 1.0; //$internalField; // + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/k.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/k.gas new file mode 100644 index 00000000..4a3d44ca --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/k.gas @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object k.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform $k_inlet_gas; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform $k_inlet_gas; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/k.liquid b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/k.liquid new file mode 100644 index 00000000..cde8f6c1 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/k.liquid @@ -0,0 +1,44 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object k.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +#include "${FOAM_CASE}/constant/globalVars" + +internalField uniform $k_inlet_liq; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value uniform $k_inlet_liq; + } + + outlet + { + type zeroGradient; + } + + defaultFaces + { + type kqRWallFunction; + value $internalField; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/nut.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/nut.gas new file mode 100644 index 00000000..ba16dd4c --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/nut.gas @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object nut.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -1 0 0 0 0]; + +internalField uniform 1e-8; + +boundaryField +{ + inlet + { + type calculated; + value $internalField; + } + + outlet + { + type calculated; + value $internalField; + } + + defaultFaces + { + //type nutkWallFunction; + //value $internalField; + type calculated; + value $internalField; + } + + // defaultFaces + // { + // type empty; + // } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/nut.liquid b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/nut.liquid new file mode 100644 index 00000000..1442e07f --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/nut.liquid @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object nut.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -1 0 0 0 0]; + +internalField uniform 1e-4; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type calculated; + value $internalField; + } + + outlet + { + type calculated; + value $internalField; + } + + defaultFaces + { + type nutkWallFunction; + value $internalField; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/p b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/p new file mode 100644 index 00000000..b3a295fb --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/p @@ -0,0 +1,39 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object p; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -2 0 0 0 0]; + +internalField uniform 101325; + +boundaryField +{ + inlet + { + type calculated; + value $internalField; + } + outlet + { + type calculated; + value $internalField; + } + defaultFaces + { + type calculated; + value $internalField; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/p_rgh b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/p_rgh new file mode 100644 index 00000000..88ee7d80 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/0.orig/p_rgh @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class volScalarField; + object p_rgh; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -2 0 0 0 0]; + +internalField uniform 101325; + +boundaryField +{ + inlet + { + type fixedFluxPressure; + value $internalField; + } + outlet + { + type prghTotalPressure; + p0 $internalField; + U U.gas; + phi phi.gas; + rho thermo:rho.gas; + value $internalField; + } + defaultFaces + { + type fixedFluxPressure; + value $internalField; + } +} + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/Allclean b/bird/preprocess/data_preprocess/loop_reactor_3_6L/Allclean new file mode 100755 index 00000000..f55e0ec9 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/Allclean @@ -0,0 +1,18 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory + +# Source tutorial clean functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +# Remove surface, features and solution +#rm -rf constant/extendedFeatureEdgeMesh > /dev/null 2>&1 +#rm -f constant/triSurface/*.eMesh > /dev/null 2>&1 +#rm -rf constant/polyMesh > /dev/null 2>&1 +#rm -rf processor* > /dev/null 2>&1 +rm -rf 0 +cleanCase + +#rm *.obj +#rm *.stl + +#------------------------------------------------------------------------------ diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/computeQOI.sh b/bird/preprocess/data_preprocess/loop_reactor_3_6L/computeQOI.sh new file mode 100644 index 00000000..3756ed7f --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/computeQOI.sh @@ -0,0 +1,13 @@ +if [ ! -f qoi.txt ]; then + # Reconstruct if needed + source /projects/gas2fuels/ofoam_cray_mpich/OpenFOAM-dev/etc/bashrc + reconstructPar -newTimes + module load anaconda3/2023 + conda activate /projects/gas2fuels/conda_env/bird + python read_history.py -cr .. -cn local -df data + python get_qoi.py + conda deactivate +else + echo "WARNING: QOI already computed" +fi + diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/dynamicMix_util.H b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/dynamicMix_util.H new file mode 100644 index 00000000..8fa7daf7 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/dynamicMix_util.H @@ -0,0 +1,37 @@ +#include + +double gradfunMix(double V1, double V2){ + return 3.0*V2*V2 + 2.0*V1*V2 - V1*V1; +} + +double funMix(double V1, double V2, double P, double rhoL, double A){ + return V2*V2*V2 + V1*V2*V2 - V2*V1*V1 - V1*V1*V1 - 4.0*P/(rhoL * A); +} + +double findV2(double P, double rhoL, double A, double V1) { + int newton_iter = 100; + double V2 = 2*V1; + double V2_old; + double V2_new; + if (std::abs(V1) < 1e-12) { + V2=std::pow((4.0*P/rhoL/A),0.333333); + V2_new = V2; + V2_old = V2; + } else { + for (int i=0; i("thermo:rho.liquid"); + const volScalarField& alphaL = + mesh().lookupObject("alpha.liquid"); + const volVectorField& UL = + mesh().lookupObject("U.liquid"); + double pi=3.141592654; + double source_pt_x=0.25; + double source_pt_y=0.025; + double source_pt_z=0.225; + double disk_rad=0.017499999999999998; + double disk_area=pi*disk_rad*disk_rad; + double power=2.5; + double smear_factor=3.0; + const scalar startTime = 1; + if (time.value() > startTime) + { + // Get V1 + double source_sign_factor = 1.0; + double V1 = 0; + double V2 = 0; + double rhoV; + double dist_tol = disk_rad*5; + + double dist_n; + double upV = 0; + double uprhoV = 0; + double upVvol = 0; + double downV = 0; + double downrhoV = 0; + double downVvol = 0; + double dist2; + forAll(C,i) + { + dist2 = (C[i].x()-source_pt_x)*(C[i].x()-source_pt_x); + dist2 += (C[i].y()-source_pt_y)*(C[i].y()-source_pt_y); + dist2 += (C[i].z()-source_pt_z)*(C[i].z()-source_pt_z); + + dist_n = (C[i].x()-source_pt_x); + + if (dist2 < dist_tol*dist_tol && dist_n < -dist_tol/2) { + upVvol += V[i] * alphaL[i]; + upV += V[i] * alphaL[i] * UL[i][0]; + uprhoV += V[i] * alphaL[i] * rhoL[i]; + } + if (dist2 < dist_tol*dist_tol && dist_n > dist_tol/2) { + downVvol += V[i] * alphaL[i]; + downV += V[i] * alphaL[i] * UL[i][0]; + downrhoV += V[i] * alphaL[i] * rhoL[i]; + } + } + + reduce(uprhoV, sumOp()); + reduce(downrhoV, sumOp()); + reduce(upV, sumOp()); + reduce(downV, sumOp()); + reduce(downVvol, sumOp()); + reduce(upVvol, sumOp()); + + downV /= downVvol; + upV /= upVvol; + downrhoV /= downVvol; + uprhoV /= upVvol; + + if (upV <= 0 && downV <= 0) { + source_sign_factor = -1.0; + V1 = std::abs(upV); + rhoV = uprhoV; + } else if (upV >= 0 && downV >= 0) { + source_sign_factor = 1.0; + V1 = std::abs(downV); + rhoV = downrhoV; + } else { + V1 = 0.0; + source_sign_factor = -1.0; + rhoV = uprhoV; + Foam::Info << "[BIRD:DYNMIX WARN] " << "upV = " << upV << " downV = " << downV << " for source at " << source_pt_x << ", " << source_pt_y << ", " << source_pt_z << endl; + } + Foam::Info << "[BIRD:DYNMIX INFO] V1 = " << V1 << endl; + + // Get V2 + V2 = findV2(power, rhoV, disk_area, V1); + + forAll(C,i) + { + double Thrust=0.5*rhoL[i]*(V2*V2 - V1*V1)*disk_area; + double dist2=(C[i].x()-source_pt_x)*(C[i].x()-source_pt_x); + dist2 += (C[i].y()-source_pt_y)*(C[i].y()-source_pt_y); + dist2 += (C[i].z()-source_pt_z)*(C[i].z()-source_pt_z); + double epsilon=pow(V[i],0.33333)*smear_factor; + double sourceterm=alphaL[i]*(Thrust/pow(pi,1.5)/pow(epsilon,3.0))* + exp(-dist2/(epsilon*epsilon)); + Usource[i][0] -= source_sign_factor*sourceterm*V[i]; + } + } + #}; +}; diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/g b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/g new file mode 100644 index 00000000..770a5619 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/g @@ -0,0 +1,21 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class uniformDimensionedVectorField; + location "constant"; + object g; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -2 0 0 0 0]; +value (0 -9.81 0); + + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/globalVars b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/globalVars new file mode 100644 index 00000000..21436f69 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/globalVars @@ -0,0 +1,83 @@ +T0 300; //initial T(K) which stays constant +VVM 1.6; +//****water Liquid properties************** +CpMixLiq 4181; +muMixLiq #calc "2.414e-5 * pow(10,247.8/($T0 - 140.0))"; //viscosity (Pa.s) of water as a function of T(K) +kThermLiq 0.62; // W/m-K +rho0MixLiq 1000; // kg/m^3 +sigmaLiq 0.07; //surface tension N/m +//Wilke-Chang params for diffusion coefficient of a given solute in water (solvent) +WC_psi 2.6; +WC_M 18; // kg/kmol +WC_V_O2 25.6e-3; // m3/kmol molar volume at normal boiling temperature (Treybal 1968) +WC_V_H2 14.3e-3; +WC_V_CO2 34e-3; +WC_V_CO 30.7e-3; +WC_V_N2 31.2e-3; +WC_V_CH4 35e-3; // V_b[cm3/mol]=0.285*V_critical^1.048 (Tyn and Calus; ESTIMATING LIQUID MOLAL VOLUME; Processing, Volume 21, Issue 4, Pages 16 - 17) +//****** diffusion coeff *********** +D_H2 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_H2,0.6)"; +D_CO2 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_CO2,0.6)"; +D_CO #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_CO,0.6)"; +D_CH4 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_CH4,0.6)"; +D_N2 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_N2,0.6)"; +//****** Henry coeff *************** +H_O2_298 0.032; +DH_O2 1700; +H_CO2_298 0.83; +DH_CO2 2400; +H_CO_298 0.023; +DH_CO 1300; +H_H2_298 0.019; +DH_H2 500; +H_CH4_298 0.032; +DH_CH4 1900; +H_N2_298 0.015; +DH_N2 1300; +He_H2 #calc "$H_H2_298 * exp($DH_H2 *(1. / $T0 - 1./298.15))"; +He_CO #calc "$H_CO_298 * exp($DH_CO *(1. / $T0 - 1./298.15))"; +He_CO2 #calc "$H_CO2_298 * exp($DH_CO2 *(1. / $T0 - 1./298.15))"; +He_CH4 #calc "$H_CH4_298 * exp($DH_CH4 *(1. / $T0 - 1./298.15))"; +He_N2 #calc "$H_N2_298 * exp($DH_N2 *(1. / $T0 - 1./298.15))"; +//*******inlet gas frac************* +f_H2 0.1; +f_CO2 0.9; +f_N2 0.0; +//*******inlet gas frac************* +inletA 0.0039; +liqVol 0.003625; +alphaGas 1; +alphaLiq 0; +uGasPhase #calc "$liqVol * $VVM / (60 * $inletA * $alphaGas)"; +//********************************* +LeLiqH2 #calc "$kThermLiq / $rho0MixLiq / $D_H2 / $CpMixLiq"; +LeLiqCO #calc "$kThermLiq / $rho0MixLiq / $D_CO / $CpMixLiq"; +LeLiqCO2 #calc "$kThermLiq / $rho0MixLiq / $D_CO2 / $CpMixLiq"; // = 74 +LeLiqCH4 #calc "$kThermLiq / $rho0MixLiq / $D_CH4 / $CpMixLiq"; +LeLiqN2 #calc "$kThermLiq / $rho0MixLiq / $D_N2 / $CpMixLiq"; +LeLiqMix #calc "$f_CO2*$LeLiqCO2+$f_H2*$LeLiqH2"; +PrMixLiq #calc "$CpMixLiq * $muMixLiq / $kThermLiq"; +//********************************* +kH2 #calc "$D_H2*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrH2 #calc "$muMixLiq*$CpMixLiq / $kH2"; + +kCO #calc "$D_CO*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrCO #calc "$muMixLiq*$CpMixLiq / $kCO"; + +kCO2 #calc "$D_CO2*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrCO2 #calc "$muMixLiq*$CpMixLiq / $kCO2"; + +kCH4 #calc "$D_CH4*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrCH4 #calc "$muMixLiq*$CpMixLiq / $kCH4"; + +kN2 #calc "$D_N2*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrN2 #calc "$muMixLiq*$CpMixLiq / $kN2"; +//********************************* +l_scale 0.5; +intensity 0.05; +k_inlet_gas #calc "1.5 * Foam::pow(($uGasPhase), 2) * Foam::pow($intensity, 2)"; +k_inlet_liq #calc "1.5 * Foam::pow(($uGasPhase), 2) * Foam::pow($intensity, 2)"; +eps_inlet_gas #calc "pow(0.09,0.75) * Foam::pow($k_inlet_gas, 1.5) / ($l_scale * 0.07)"; +eps_inlet_liq #calc "pow(0.09,0.75) * Foam::pow($k_inlet_liq, 1.5) / ($l_scale * 0.07)"; +omega_inlet_gas #calc "pow(0.09,-0.25) * pow($k_inlet_gas,0.5) / ($l_scale * 0.07)"; +omega_inlet_liq #calc "pow(0.09,-0.25) * pow($k_inlet_liq,0.5) / ($l_scale * 0.07)"; diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/globalVars_temp b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/globalVars_temp new file mode 100644 index 00000000..fcb076a7 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/globalVars_temp @@ -0,0 +1,83 @@ +T0 300; //initial T(K) which stays constant +VVM 0.2; +//****water Liquid properties************** +CpMixLiq 4181; +muMixLiq #calc "2.414e-5 * pow(10,247.8/($T0 - 140.0))"; //viscosity (Pa.s) of water as a function of T(K) +kThermLiq 0.62; // W/m-K +rho0MixLiq 1000; // kg/m^3 +sigmaLiq 0.07; //surface tension N/m +//Wilke-Chang params for diffusion coefficient of a given solute in water (solvent) +WC_psi 2.6; +WC_M 18; // kg/kmol +WC_V_O2 25.6e-3; // m3/kmol molar volume at normal boiling temperature (Treybal 1968) +WC_V_H2 14.3e-3; +WC_V_CO2 34e-3; +WC_V_CO 30.7e-3; +WC_V_N2 31.2e-3; +WC_V_CH4 35e-3; // V_b[cm3/mol]=0.285*V_critical^1.048 (Tyn and Calus; ESTIMATING LIQUID MOLAL VOLUME; Processing, Volume 21, Issue 4, Pages 16 - 17) +//****** diffusion coeff *********** +D_H2 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_H2,0.6)"; +D_CO2 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_CO2,0.6)"; +D_CO #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_CO,0.6)"; +D_CH4 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_CH4,0.6)"; +D_N2 #calc "1.173e-16 * pow($WC_psi * $WC_M,0.5) * $T0 / $muMixLiq / pow($WC_V_N2,0.6)"; +//****** Henry coeff *************** +H_O2_298 0.032; +DH_O2 1700; +H_CO2_298 0.83; +DH_CO2 2400; +H_CO_298 0.023; +DH_CO 1300; +H_H2_298 0.019; +DH_H2 500; +H_CH4_298 0.032; +DH_CH4 1900; +H_N2_298 0.015; +DH_N2 1300; +He_H2 #calc "$H_H2_298 * exp($DH_H2 *(1. / $T0 - 1./298.15))"; +He_CO #calc "$H_CO_298 * exp($DH_CO *(1. / $T0 - 1./298.15))"; +He_CO2 #calc "$H_CO2_298 * exp($DH_CO2 *(1. / $T0 - 1./298.15))"; +He_CH4 #calc "$H_CH4_298 * exp($DH_CH4 *(1. / $T0 - 1./298.15))"; +He_N2 #calc "$H_N2_298 * exp($DH_N2 *(1. / $T0 - 1./298.15))"; +//*******inlet gas frac************* +f_H2 0.1; +f_CO2 0.9; +f_N2 0.0; +//*******inlet gas frac************* +inletA ; +liqVol ; +alphaGas 1; +alphaLiq 0; +uGasPhase #calc "$liqVol * $VVM / (60 * $inletA * $alphaGas)"; +//********************************* +LeLiqH2 #calc "$kThermLiq / $rho0MixLiq / $D_H2 / $CpMixLiq"; +LeLiqCO #calc "$kThermLiq / $rho0MixLiq / $D_CO / $CpMixLiq"; +LeLiqCO2 #calc "$kThermLiq / $rho0MixLiq / $D_CO2 / $CpMixLiq"; // = 74 +LeLiqCH4 #calc "$kThermLiq / $rho0MixLiq / $D_CH4 / $CpMixLiq"; +LeLiqN2 #calc "$kThermLiq / $rho0MixLiq / $D_N2 / $CpMixLiq"; +LeLiqMix #calc "$f_CO2*$LeLiqCO2+$f_H2*$LeLiqH2"; +PrMixLiq #calc "$CpMixLiq * $muMixLiq / $kThermLiq"; +//********************************* +kH2 #calc "$D_H2*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrH2 #calc "$muMixLiq*$CpMixLiq / $kH2"; + +kCO #calc "$D_CO*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrCO #calc "$muMixLiq*$CpMixLiq / $kCO"; + +kCO2 #calc "$D_CO2*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrCO2 #calc "$muMixLiq*$CpMixLiq / $kCO2"; + +kCH4 #calc "$D_CH4*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrCH4 #calc "$muMixLiq*$CpMixLiq / $kCH4"; + +kN2 #calc "$D_N2*$rho0MixLiq*$CpMixLiq*$LeLiqMix"; +PrN2 #calc "$muMixLiq*$CpMixLiq / $kN2"; +//********************************* +l_scale 0.5; +intensity 0.05; +k_inlet_gas #calc "1.5 * Foam::pow(($uGasPhase), 2) * Foam::pow($intensity, 2)"; +k_inlet_liq #calc "1.5 * Foam::pow(($uGasPhase), 2) * Foam::pow($intensity, 2)"; +eps_inlet_gas #calc "pow(0.09,0.75) * Foam::pow($k_inlet_gas, 1.5) / ($l_scale * 0.07)"; +eps_inlet_liq #calc "pow(0.09,0.75) * Foam::pow($k_inlet_liq, 1.5) / ($l_scale * 0.07)"; +omega_inlet_gas #calc "pow(0.09,-0.25) * pow($k_inlet_gas,0.5) / ($l_scale * 0.07)"; +omega_inlet_liq #calc "pow(0.09,-0.25) * pow($k_inlet_liq,0.5) / ($l_scale * 0.07)"; diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/momentumTransport.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/momentumTransport.gas new file mode 100644 index 00000000..ca916714 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/momentumTransport.gas @@ -0,0 +1,26 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "constant"; + object momentumTransport.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +//simulationType laminar; +simulationType RAS; +RAS +{ + model mixtureKEpsilon; + turbulence on; + printCoeff on; +} + +// ************************************************************************* // diff --git a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/chemistryProperties.liquid b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/momentumTransport.liquid similarity index 64% rename from OFsolvers/tutorial_cases/loop_reactor_reacting/constant/chemistryProperties.liquid rename to bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/momentumTransport.liquid index 3f5a0e1d..2063de0d 100644 --- a/OFsolvers/tutorial_cases/loop_reactor_reacting/constant/chemistryProperties.liquid +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/momentumTransport.liquid @@ -7,36 +7,21 @@ \*---------------------------------------------------------------------------*/ FoamFile { - version 2.0; format ascii; class dictionary; location "constant"; - object chemistryProperties.liquid; + object momentumTransport.liquid; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -chemistryType -{ - solver EulerImplicit; -} - -chemistry on; - -initialChemicalTimeStep 1e-07; +//simulationType laminar; +simulationType RAS; -EulerImplicitCoeffs +RAS { - cTauChem 1; - equilibriumRateLimiter off; + model mixtureKEpsilon; + turbulence on; + printCoeffs on; } -odeCoeffs -{ - solver Rosenbrock43; - absTol 1e-8; - relTol 0.01; -} - -#include "reactions.liquid" - // ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/phaseProperties b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/phaseProperties new file mode 100644 index 00000000..a3c90f5a --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/phaseProperties @@ -0,0 +1,295 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + object phaseProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "$FOAM_CASE/constant/globalVars" + +type interfaceCompositionPhaseChangePopulationBalanceMultiphaseSystem; + +phases (gas liquid); + +populationBalances (bubbles); + +gas +{ + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel velocityGroup; + + velocityGroupCoeffs + { + populationBalance bubbles; + + shapeModel spherical; + + sizeGroups + ( + f1 {dSph 1.4e-3; value 0.0;} + f2 {dSph 1.8e-3; value 0.0;} + f3 {dSph 2.2e-3; value 0.0;} + f4 {dSph 2.6e-3; value 0.0;} + f5 {dSph 3e-3; value 1.0;} + f6 {dSph 3.4e-3; value 0.0;} + f7 {dSph 3.8e-3; value 0.0;} + f8 {dSph 4.2e-3; value 0.0;} + f9 {dSph 4.6e-3; value 0.0;} + f10 {dSph 5.0e-3; value 0.0;} + ); + } + + residualAlpha 1e-6; + + Sc 0.7; +} + +liquid +{ + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel constant; + + constantCoeffs + { + d 1e-4; + } + Sc #codeStream + { + code + #{ + os << ($LeLiqMix * $CpMixLiq * $muMixLiq / $kThermLiq); + #}; + }; + + residualAlpha 1e-6; +} + +populationBalanceCoeffs +{ + bubbles + { + continuousPhase liquid; + + coalescenceModels + ( + LehrMilliesMewes{ + efficiency 4.695; + uCrit 0.08; + alphaMax 0.6; + } + ); + + binaryBreakupModels + (); + + breakupModels + ( + Laakkonen { + efficiency 13.83; + daughterSizeDistributionModel Laakkonen; + } + + ); + + driftModels + ( + densityChange{} + ); + + nucleationModels + (); + } +} + +blending +{ + default + { + type linear; + minFullyContinuousAlpha.gas 0.7; + minPartlyContinuousAlpha.gas 0.3; + minFullyContinuousAlpha.liquid 0.7; + minPartlyContinuousAlpha.liquid 0.3; + } + heatTransfer + { + type linear; + minFullyContinuousAlpha.gas 1; + minPartlyContinuousAlpha.gas 0; + minFullyContinuousAlpha.liquid 1; + minPartlyContinuousAlpha.liquid 0; + } + massTransfer + { + $heatTransfer; + } +} + +surfaceTension +( + (gas and liquid) + { + type constant; + sigma $sigmaLiq; + } +); + +interfaceCompression +(); + +aspectRatio +( + (gas in liquid) + { + type Wellek; + } +); + + +drag +( + (gas in liquid) + { + type Grace; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type IshiiZuber; + residualRe 1e-3; + swarmCorrection + { + type none; + } + } +); + +virtualMass +( + (gas in liquid) + { + type constantCoefficient; + Cvm 0.5; + } +); + +// heatTransfer +// (); + +heatTransfer.gas +( + (gas in liquid) + { + type spherical; + residualAlpha 1e-4; + } + + (liquid in gas) + { + type RanzMarshall; + residualAlpha 1e-4; + } +); + +heatTransfer.liquid +( + (gas in liquid) + { + type RanzMarshall; + residualAlpha 1e-4; + } + + (liquid in gas) + { + type spherical; + residualAlpha 1e-4; + } +); + +interfaceComposition.gas +(); + +interfaceComposition.liquid +( + (liquid and gas) + { + type Henry; + species ( CO2 H2 ); + k ( $He_CO2 $He_H2 ); + Le $LeLiqMix; + } +); + +diffusiveMassTransfer.gas +(); + +diffusiveMassTransfer.liquid +( + (gas in liquid) + { + type Higbie; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type Frossling; + Le $LeLiqMix; + } + + (liquid in gas) + { + type spherical; + Le 1.0; //not used for spherical + } +); + +phaseTransfer +(); + +lift +( + (gas in liquid) + { + type wallDamped; + + wallDamping + { + type cosine; + Cd 3.0; + } + + lift + { + type Tomiyama; + + swarmCorrection + { + type none; + } + } + } + +); + +wallLubrication +( + (gas in liquid) + { + type Antal; + Cw1 -0.01; + Cw2 0.05; + } +); + +turbulentDispersion +( + (gas in liquid) + { + type Burns; + sigma 0.9; + } +); + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/phaseProperties_constantd b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/phaseProperties_constantd new file mode 100644 index 00000000..e029df99 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/phaseProperties_constantd @@ -0,0 +1,261 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + object phaseProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "$FOAM_CASE/constant/globalVars" + +type interfaceCompositionPhaseChangeMultiphaseSystem; + +phases (gas liquid); + +gas +{ + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel constant; + + constantCoeffs + { + d 3e-3; + } + residualAlpha 1e-6; + Sc 0.7; +} + +liquid +{ + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel constant; + + constantCoeffs + { + d 1e-4; + } + Sc #codeStream + { + code + #{ + os << ($LeLiqMix * $CpMixLiq * $muMixLiq / $kThermLiq); + #}; + }; + + residualAlpha 1e-6; +} + +populationBalanceCoeffs +{ + bubbles + { + continuousPhase liquid; + + coalescenceModels + (); + + binaryBreakupModels + (); + + breakupModels + (); + + driftModels + (); + + nucleationModels + (); + } +} + +blending +{ + default + { + type linear; + minFullyContinuousAlpha.gas 0.7; + minPartlyContinuousAlpha.gas 0.3; + minFullyContinuousAlpha.liquid 0.7; + minPartlyContinuousAlpha.liquid 0.3; + } + heatTransfer + { + type linear; + minFullyContinuousAlpha.gas 1; + minPartlyContinuousAlpha.gas 0; + minFullyContinuousAlpha.liquid 1; + minPartlyContinuousAlpha.liquid 0; + } + massTransfer + { + $heatTransfer; + } +} + +surfaceTension +( + (gas and liquid) + { + type constant; + sigma $sigmaLiq; + } +); + +interfaceCompression +(); + +aspectRatio +( + (gas in liquid) + { + type Wellek; + } +); + + +drag +( + (gas in liquid) + { + type Grace; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type IshiiZuber; + residualRe 1e-3; + swarmCorrection + { + type none; + } + } +); + +virtualMass +( + (gas in liquid) + { + type constantCoefficient; + Cvm 0.5; + } +); + +// heatTransfer +// (); + +heatTransfer.gas +( + (gas in liquid) + { + type spherical; + residualAlpha 1e-4; + } + + (liquid in gas) + { + type RanzMarshall; + residualAlpha 1e-4; + } +); + +heatTransfer.liquid +( + (gas in liquid) + { + type RanzMarshall; + residualAlpha 1e-4; + } + + (liquid in gas) + { + type spherical; + residualAlpha 1e-4; + } +); + +interfaceComposition.gas +(); + +interfaceComposition.liquid +( + (liquid and gas) + { + type Henry; + species ( CO2 H2 ); + k ( $He_CO2 $He_H2 ); + Le $LeLiqMix; + } +); + +diffusiveMassTransfer.gas +(); + +diffusiveMassTransfer.liquid +( + (gas in liquid) + { + type Higbie; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type Frossling; + Le $LeLiqMix; + } + + (liquid in gas) + { + type spherical; + Le 1.0; //not used for spherical + } +); + +phaseTransfer +(); + +lift +( + (gas in liquid) + { + type wallDamped; + + wallDamping + { + type cosine; + Cd 3.0; + } + + lift + { + type Tomiyama; + + swarmCorrection + { + type none; + } + } + } + +); + +wallLubrication +( + (gas in liquid) + { + type Antal; + Cw1 -0.01; + Cw2 0.05; + } +); + +turbulentDispersion +( + (gas in liquid) + { + type Burns; + sigma 0.9; + } +); + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/phaseProperties_pbe b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/phaseProperties_pbe new file mode 100644 index 00000000..a3c90f5a --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/phaseProperties_pbe @@ -0,0 +1,295 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: 9 + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + object phaseProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "$FOAM_CASE/constant/globalVars" + +type interfaceCompositionPhaseChangePopulationBalanceMultiphaseSystem; + +phases (gas liquid); + +populationBalances (bubbles); + +gas +{ + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel velocityGroup; + + velocityGroupCoeffs + { + populationBalance bubbles; + + shapeModel spherical; + + sizeGroups + ( + f1 {dSph 1.4e-3; value 0.0;} + f2 {dSph 1.8e-3; value 0.0;} + f3 {dSph 2.2e-3; value 0.0;} + f4 {dSph 2.6e-3; value 0.0;} + f5 {dSph 3e-3; value 1.0;} + f6 {dSph 3.4e-3; value 0.0;} + f7 {dSph 3.8e-3; value 0.0;} + f8 {dSph 4.2e-3; value 0.0;} + f9 {dSph 4.6e-3; value 0.0;} + f10 {dSph 5.0e-3; value 0.0;} + ); + } + + residualAlpha 1e-6; + + Sc 0.7; +} + +liquid +{ + type multiComponentPhaseModel;//pureIsothermalPhaseModel; + + diameterModel constant; + + constantCoeffs + { + d 1e-4; + } + Sc #codeStream + { + code + #{ + os << ($LeLiqMix * $CpMixLiq * $muMixLiq / $kThermLiq); + #}; + }; + + residualAlpha 1e-6; +} + +populationBalanceCoeffs +{ + bubbles + { + continuousPhase liquid; + + coalescenceModels + ( + LehrMilliesMewes{ + efficiency 4.695; + uCrit 0.08; + alphaMax 0.6; + } + ); + + binaryBreakupModels + (); + + breakupModels + ( + Laakkonen { + efficiency 13.83; + daughterSizeDistributionModel Laakkonen; + } + + ); + + driftModels + ( + densityChange{} + ); + + nucleationModels + (); + } +} + +blending +{ + default + { + type linear; + minFullyContinuousAlpha.gas 0.7; + minPartlyContinuousAlpha.gas 0.3; + minFullyContinuousAlpha.liquid 0.7; + minPartlyContinuousAlpha.liquid 0.3; + } + heatTransfer + { + type linear; + minFullyContinuousAlpha.gas 1; + minPartlyContinuousAlpha.gas 0; + minFullyContinuousAlpha.liquid 1; + minPartlyContinuousAlpha.liquid 0; + } + massTransfer + { + $heatTransfer; + } +} + +surfaceTension +( + (gas and liquid) + { + type constant; + sigma $sigmaLiq; + } +); + +interfaceCompression +(); + +aspectRatio +( + (gas in liquid) + { + type Wellek; + } +); + + +drag +( + (gas in liquid) + { + type Grace; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type IshiiZuber; + residualRe 1e-3; + swarmCorrection + { + type none; + } + } +); + +virtualMass +( + (gas in liquid) + { + type constantCoefficient; + Cvm 0.5; + } +); + +// heatTransfer +// (); + +heatTransfer.gas +( + (gas in liquid) + { + type spherical; + residualAlpha 1e-4; + } + + (liquid in gas) + { + type RanzMarshall; + residualAlpha 1e-4; + } +); + +heatTransfer.liquid +( + (gas in liquid) + { + type RanzMarshall; + residualAlpha 1e-4; + } + + (liquid in gas) + { + type spherical; + residualAlpha 1e-4; + } +); + +interfaceComposition.gas +(); + +interfaceComposition.liquid +( + (liquid and gas) + { + type Henry; + species ( CO2 H2 ); + k ( $He_CO2 $He_H2 ); + Le $LeLiqMix; + } +); + +diffusiveMassTransfer.gas +(); + +diffusiveMassTransfer.liquid +( + (gas in liquid) + { + type Higbie; // Need to install the model available at https://github.com/NREL/BioReactorDesign + //type Frossling; + Le $LeLiqMix; + } + + (liquid in gas) + { + type spherical; + Le 1.0; //not used for spherical + } +); + +phaseTransfer +(); + +lift +( + (gas in liquid) + { + type wallDamped; + + wallDamping + { + type cosine; + Cd 3.0; + } + + lift + { + type Tomiyama; + + swarmCorrection + { + type none; + } + } + } + +); + +wallLubrication +( + (gas in liquid) + { + type Antal; + Cw1 -0.01; + Cw2 0.05; + } +); + +turbulentDispersion +( + (gas in liquid) + { + type Burns; + sigma 0.9; + } +); + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/thermophysicalProperties.gas b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/thermophysicalProperties.gas new file mode 100644 index 00000000..11b1c4b9 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/thermophysicalProperties.gas @@ -0,0 +1,142 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "constant"; + object thermophysicalProperties.gas; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +thermoType +{ + type heRhoThermo; + mixture multiComponentMixture; + transport sutherland; + thermo janaf; + equationOfState perfectGas; + specie specie; + energy sensibleInternalEnergy; + //energy sensibleEnthalpy; +} + + +species +( + H2 + CO2 + N2 +); + +defaultSpecie N2; + +CO2 +{ + specie + { + molWeight 44.00995; + } + thermodynamics + { + Tlow 200; + Thigh 3500; + Tcommon 1000; + highCpCoeffs ( 3.85746029 0.00441437026 -2.21481404e-06 5.23490188e-10 -4.72084164e-14 -48759.166 2.27163806 ); + lowCpCoeffs ( 2.35677352 0.00898459677 -7.12356269e-06 2.45919022e-09 -1.43699548e-13 -48371.9697 9.90105222 ); + } + transport + { + As 1.572e-06; + Ts 240; + } + elements + { + C 1; + O 2; + } +} + +water +{ + specie + { + molWeight 18.01534; + } + thermodynamics + { + Tlow 200; + Thigh 3500; + Tcommon 1000; + highCpCoeffs ( 3.03399249 0.00217691804 -1.64072518e-07 -9.7041987e-11 1.68200992e-14 -30004.2971 4.9667701 ); + lowCpCoeffs ( 4.19864056 -0.0020364341 6.52040211e-06 -5.48797062e-09 1.77197817e-12 -30293.7267 -0.849032208 ); + } + transport + { + As 1.512e-06; + Ts 120; + } + elements + { + H 2; + O 1; + } +} + +N2 +{ + specie + { + molWeight 28.0134; + } + thermodynamics + { + Tlow 250; + Thigh 5000; + Tcommon 1000; + highCpCoeffs ( 2.92664 0.0014879768 -5.68476e-07 1.0097038e-10 -6.753351e-15 -922.7977 5.980528 ); + lowCpCoeffs ( 3.298677 0.0014082404 -3.963222e-06 5.641515e-09 -2.444854e-12 -1020.8999 3.950372 ); + } + transport + { + As 1.512e-06; + Ts 120; + } + elements + { + N 2; + } +} + +H2 +{ + specie + { + molWeight 2.01594; + } + thermodynamics + { + Tlow 200; + Thigh 3500; + Tcommon 1000; + highCpCoeffs ( 3.3372792 -4.94024731e-05 4.99456778e-07 -1.79566394e-10 2.00255376e-14 -950.158922 -3.20502331 ); + lowCpCoeffs ( 2.34433112 0.00798052075 -1.9478151e-05 2.01572094e-08 -7.37611761e-12 -917.935173 0.683010238 ); + } + transport + { + As 6.362e-07; + Ts 72; + } + elements + { + H 2; + } +} + + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/thermophysicalProperties.liquid b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/thermophysicalProperties.liquid new file mode 100644 index 00000000..d324ec51 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/constant/thermophysicalProperties.liquid @@ -0,0 +1,108 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "constant"; + object thermophysicalProperties.liquid; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "$FOAM_CASE/constant/globalVars" + +thermoType +{ + type heRhoThermo; + mixture multiComponentMixture; + transport const; + thermo hConst; + equationOfState rhoConst;//rPolynomial; + specie specie; + energy sensibleInternalEnergy; + //energy sensibleEnthalpy; +} + +species +( + CO2 + water + H2 +); + +inertSpecie water; + +water +{ + specie + { + molWeight 18.0153; + } + equationOfState + { + rho $rho0MixLiq; + } + thermodynamics + { + Cp $CpMixLiq; + Hf -1.5879e+07; + } + transport + { + mu $muMixLiq; + Pr $PrMixLiq; + } +} + +CO2 +{ + specie + { + molWeight 44.00995; + } + equationOfState + { + rho $rho0MixLiq; + } + thermodynamics + { + Cp $CpMixLiq; + Hf -1.5879e+07; + } + transport + { + mu $muMixLiq; + Pr $PrCO2; + } +} + +H2 +{ + specie + { + molWeight 2.01594; + } + equationOfState + { + rho $rho0MixLiq; + } + thermodynamics + { + Cp $CpMixLiq; + Hf -1.5879e+07;//-9402451; + } + transport + { + mu $muMixLiq; + Pr $PrH2; + } +} + + + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/get_qoi.py b/bird/preprocess/data_preprocess/loop_reactor_3_6L/get_qoi.py new file mode 100644 index 00000000..9562cc65 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/get_qoi.py @@ -0,0 +1,183 @@ +import json +import os +import pickle as pkl + +import matplotlib as mpl +import numpy as np +from prettyPlot.plotting import * +from scipy.optimize import curve_fit + + +def get_sim_folds(path): + folds = os.listdir(path) + sim_folds = [] + for fold in folds: + if fold.startswith("loop"): + sim_folds.append(fold) + return sim_folds + + +def func(t, cstar, kla): + t = t + t0 = 0 + c0 = 0 + return (cstar - c0) * (1 - np.exp(-kla * (t - t0))) + c0 + + +def get_vl(verb=False): + filename = os.path.join("constant", "globalVars") + with open(filename, "r+") as f: + lines = f.readlines() + for line in lines: + if line.startswith("liqVol"): + vol = float(line.split()[-1][:-1]) + break + if verb: + print(f"Read liqVol = {vol}m3") + return vol + + +def get_vvm(verb=False): + filename = os.path.join("constant", "globalVars") + with open(filename, "r+") as f: + lines = f.readlines() + for line in lines: + if line.startswith("VVM"): + vvm = float(line.split()[-1][:-1]) + break + if verb: + print(f"Read VVM = {vvm} [-]") + return vvm + + +def get_As(verb=False): + filename = os.path.join("constant", "globalVars") + with open(filename, "r+") as f: + lines = f.readlines() + for line in lines: + if line.startswith("inletA"): + As = float(line.split()[-1][:-1]) + break + if verb: + print(f"Read As = {As}m2") + return As + + +def get_pmix(verb=False): + with open("system/mixers.json", "r+") as f: + data = json.load(f) + mixer_list = data["mixers"] + pmix = 0 + for mix in mixer_list: + pmix += mix["power"] / 1000 + if verb: + print(f"Read Mixing power = {pmix}kW") + return pmix + + +def get_lh(verb=False): + filename = os.path.join("system", "setFieldsDict") + with open(filename, "r+") as f: + lines = f.readlines() + for line in lines: + if "box (-1.0 -1.0 -1.0)" in line: + height = float(line.split("(")[2].split()[1]) + break + if verb: + print(f"Read Height = {height}m") + return height + + +def get_pinj(vvm, Vl, As, lh): + rhog = 1.25 # kg /m3 + Vg = Vl * vvm / (60 * As * 1) # m/s + Ptank = 101325 # Pa + # Ptank = 0 # Pa + rhoL = 1000 # kg / m3 + Pl = 101325 + rhoL * 9.8 * lh # Pa + # W + P1 = rhog * As * Vg**3 + # W + P2 = (Pl - Ptank) * As * Vg + # kg /s + MF = rhog * Vg * As + # kwh / kg + e_m = (P1 + P2) / (3600 * 1000 * MF) + + # returns kW + return (P1 + P2) * 1e-3 + + +def get_qoi(kla_co2, cs_co2, kla_h2, cs_h2, verb=False): + vvm = get_vvm(verb) + As = get_As(verb) + V_l = get_vl(verb) + liqh = get_lh(verb) + P_inj = get_pinj(vvm, V_l, As, liqh) + P_mix = get_pmix(verb) + + qoi_co2 = kla_co2 * cs_co2 * V_l * 0.04401 / (P_mix / 3600 + P_inj / 3600) + qoi_h2 = kla_h2 * cs_h2 * V_l * 0.002016 / (P_mix / 3600 + P_inj / 3600) + return qoi_co2 * qoi_h2 + + +def get_qoi_uq(kla_co2, cs_co2, kla_h2, cs_h2): + qoi = [] + for i in range(len(kla_co2)): + if i == 0: + verb = True + else: + verb = False + qoi.append(get_qoi(kla_co2[i], cs_co2[i], kla_h2[i], cs_h2[i], verb)) + qoi = np.array(qoi) + return np.mean(qoi), np.std(qoi) + + +os.makedirs("Figures", exist_ok=True) + +dataFolder = "data" +fold = "local" + +nuq = 100 +mean_cstar_co2 = np.random.uniform(12.6, 13.3, nuq) +mean_cstar_h2 = np.random.uniform(0.902, 0.96, nuq) + + +tmp_cs_h2 = [] +tmp_cs_co2 = [] +tmp_kla_h2 = [] +tmp_kla_co2 = [] +cs_co2 = mean_cstar_co2 +cs_h2 = mean_cstar_h2 + +a = np.load(os.path.join(dataFolder, fold, "conv.npz")) +endindex = -1 +if ( + "c_h2" in a + and "c_co2" in a + and len(a["time"][:endindex] > 0) + and (a["time"][:endindex][-1] > 95) +): + for i in range(nuq): + fitparamsH2, _ = curve_fit( + func, + np.array(a["time"][:endindex]), + np.array(a["c_h2"][:endindex]), + bounds=[(cs_h2[i] - 1e-6, 0), (cs_h2[i] + 1e-6, 1)], + ) + fitparamsCO2, _ = curve_fit( + func, + np.array(a["time"][:endindex]), + np.array(a["c_co2"][:endindex]), + bounds=[(cs_co2[i] - 1e-6, 0), (cs_co2[i] + 1e-6, 1)], + ) + tmp_kla_co2.append(fitparamsCO2[1]) + tmp_kla_h2.append(fitparamsH2[1]) + tmp_cs_h2.append(cs_h2[i]) + tmp_cs_co2.append(cs_co2[i]) + +qoi_m, qoi_s = get_qoi_uq(tmp_kla_co2, tmp_cs_co2, tmp_kla_h2, tmp_cs_h2) + + +with open("qoi.txt", "w+") as f: + f.write(f"{qoi_m},{qoi_s}\n") diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/presteps.sh b/bird/preprocess/data_preprocess/loop_reactor_3_6L/presteps.sh new file mode 100644 index 00000000..899655b8 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/presteps.sh @@ -0,0 +1,71 @@ +# Clean case +module load anaconda3/2023 +conda activate /projects/gas2fuels/conda_env/bird +source /projects/gas2fuels/ofoam_cray_mpich/OpenFOAM-dev/etc/bashrc +./Allclean + +echo PRESTEP 1 +# Generate blockmeshDict +python /projects/gas2fuels/BioReactorDesign/applications/write_block_rect_mesh.py -i system/mesh.json -o system +#python ../../../applications/write_block_rect_mesh.py -i system/mesh.json -o system + +# Generate boundary stl +python /projects/gas2fuels/BioReactorDesign/applications/write_stl_patch.py -i system/inlets_outlets.json +#python ../../../applications/write_stl_patch.py -i system/inlets_outlets.json + +# Generate mixers +python /projects/gas2fuels/BioReactorDesign/applications/write_dynMix_fvModels_force_sign.py -i system/mixers.json -o constant +#python ../../../applications/write_dynMix_fvModels.py -i system/mixers.json -o constant + +echo PRESTEP 2 +# Mesh gen +blockMesh -dict system/blockMeshDict + +# Inlet BC +surfaceToPatch -tol 1e-3 inlets.stl +export newmeshdir=$(foamListTimes -latestTime) +rm -rf constant/polyMesh/ +cp -r $newmeshdir/polyMesh ./constant +rm -rf $newmeshdir +cp constant/polyMesh/boundary /tmp +sed -i -e 's/inlets\.stl/inlet/g' /tmp/boundary +cat /tmp/boundary > constant/polyMesh/boundary + +# Outlet BC +surfaceToPatch -tol 1e-3 outlets.stl +export newmeshdir=$(foamListTimes -latestTime) +rm -rf constant/polyMesh/ +cp -r $newmeshdir/polyMesh ./constant +rm -rf $newmeshdir +cp constant/polyMesh/boundary /tmp +sed -i -e 's/outlets\.stl/outlet/g' /tmp/boundary +cat /tmp/boundary > constant/polyMesh/boundary + + +# Scale +transformPoints "scale=(0.05 0.05 0.05)" + + +# setup IC +cp -r 0.orig 0 +setFields + +# Setup mass flow rate +# Get inlet area +postProcess -func 'patchIntegrate(patch="inlet", field="alpha.gas")' +postProcess -func writeCellVolumes +writeMeshObj + +echo PRESTEP 3 +python writeGlobalVars.py +cp constant/phaseProperties_constantd constant/phaseProperties + + +if [ -f qoi.txt ]; then + rm qoi.txt +fi +if [ -f data/local/conv.npz ]; then + rm data/local/conv.npz +fi + +conda deactivate diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/read_history.py b/bird/preprocess/data_preprocess/loop_reactor_3_6L/read_history.py new file mode 100644 index 00000000..264711f8 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/read_history.py @@ -0,0 +1,239 @@ +import argparse +import os +import sys + +import numpy as np +from prettyPlot.plotting import plt, pretty_labels + +from bird.utilities.ofio import * + + +def compute_gas_holdup(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + alpha_liq = field_dict["alpha_liq"] + volume = field_dict["volume"] + holdup = np.sum((1 - alpha_liq) * volume) / np.sum(volume) + return holdup, field_dict + + +def co2liq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("co2_liq" in field_dict) or field_dict["co2_liq"] is None: + co2_liq_file = os.path.join(caseFolder, timeFolder, "CO2.liquid") + co2_liq = readOFScal(co2_liq_file, nCells) + # print("computing co2 liq") + field_dict["co2_liq"] = co2_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + if not ("indliq" in field_dict) or field_dict["indliq"] is None: + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.5) + # print("computing indliq") + field_dict["indliq"] = indliq + volume = field_dict["volume"] + indliq = field_dict["indliq"] + alpha_liq = field_dict["alpha_liq"] + co2_liq = field_dict["co2_liq"] + met = np.sum( + alpha_liq[indliq] * co2_liq[indliq] * volume[indliq] + ) / np.sum(volume[indliq]) + return met, field_dict + + +def cliq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("rho_liq" in field_dict) or field_dict["rho_liq"] is None: + rho_liq_file = os.path.join(caseFolder, timeFolder, "rhom") + rho_liq = readOFScal(rho_liq_file, nCells) + field_dict["rho_liq"] = rho_liq + if not ("co2_liq" in field_dict) or field_dict["co2_liq"] is None: + co2_liq_file = os.path.join(caseFolder, timeFolder, "CO2.liquid") + co2_liq = readOFScal(co2_liq_file, nCells) + # print("computing co2 liq") + field_dict["co2_liq"] = co2_liq + if not ("h2_liq" in field_dict) or field_dict["h2_liq"] is None: + h2_liq_file = os.path.join(caseFolder, timeFolder, "H2.liquid") + h2_liq = readOFScal(h2_liq_file, nCells) + # print("computing h2 liq") + field_dict["h2_liq"] = h2_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + if not ("indliq" in field_dict) or field_dict["indliq"] is None: + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.5) + # print("computing indliq") + field_dict["indliq"] = indliq + + volume = field_dict["volume"] + indliq = field_dict["indliq"] + alpha_liq = field_dict["alpha_liq"] + co2_liq = field_dict["co2_liq"] + h2_liq = field_dict["h2_liq"] + rho_liq = field_dict["rho_liq"] + + # c_h2 = rho_liq[indliq] * alpha_liq[indliq] * h2_liq[indliq] / 0.002016 + # c_co2 = rho_liq[indliq] * alpha_liq[indliq] * co2_liq[indliq] / 0.04401 + + c_h2 = 1000 * alpha_liq[indliq] * h2_liq[indliq] / 0.002016 + c_co2 = 1000 * alpha_liq[indliq] * co2_liq[indliq] / 0.04401 + + c_h2 = np.sum(c_h2 * volume[indliq]) / np.sum(volume[indliq]) + c_co2 = np.sum(c_co2 * volume[indliq]) / np.sum(volume[indliq]) + + return c_co2, c_h2, field_dict + + +def h2liq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("h2_liq" in field_dict) or field_dict["h2_liq"] is None: + h2_liq_file = os.path.join(caseFolder, timeFolder, "H2.liquid") + h2_liq = readOFScal(h2_liq_file, nCells) + # print("computing h2 liq") + field_dict["h2_liq"] = h2_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + if not ("indliq" in field_dict) or field_dict["indliq"] is None: + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.5) + # print("computing indliq") + field_dict["indliq"] = indliq + volume = field_dict["volume"] + indliq = field_dict["indliq"] + alpha_liq = field_dict["alpha_liq"] + h2_liq = field_dict["h2_liq"] + met = np.sum(alpha_liq[indliq] * h2_liq[indliq] * volume[indliq]) / np.sum( + volume[indliq] + ) + return met, field_dict + + +def vol_liq(caseFolder, timeFolder, nCells, field_dict={}): + if not ("alpha_liq" in field_dict) or field_dict["alpha_liq"] is None: + alpha_liq_file = os.path.join(caseFolder, timeFolder, "alpha.liquid") + alpha_liq = readOFScal(alpha_liq_file, nCells) + # print("reading alpha_liq") + field_dict["alpha_liq"] = alpha_liq + if not ("volume" in field_dict) or field_dict["volume"] is None: + volume_file = os.path.join(caseFolder, "0", "V") + volume = readOFScal(volume_file, nCells) + # print("reading Volume") + field_dict["volume"] = volume + volume = field_dict["volume"] + alpha_liq = field_dict["alpha_liq"] + indliq = np.argwhere(alpha_liq > 0.0) + liqvol = np.sum(alpha_liq[indliq] * volume[indliq]) / np.sum( + volume[indliq] + ) + return liqvol, field_dict + + +parser = argparse.ArgumentParser(description="Convergence of GH") +parser.add_argument( + "-cn", + "--case_name", + type=str, + metavar="", + required=True, + help="Case name", +) +parser.add_argument( + "-df", + "--data_folder", + type=str, + metavar="", + required=False, + help="data folder name", + default="data", +) + +args, unknown = parser.parse_known_args() + + +case_root = "." # "../" +case_name = args.case_name # "12_hole_sparger_snappyRefine_700rpm_opt_coeff" +case_path = "." +dataFolder = args.data_folder + +if os.path.isfile(os.path.join(dataFolder, case_name, "conv.npz")): + sys.exit("WARNING: History already created, Skipping") + +time_float_sorted, time_str_sorted = getCaseTimes(case_path, remove_zero=True) +cellCentres = readMesh(os.path.join(case_path, f"meshCellCentres_0.obj")) +nCells = len(cellCentres) + + +co2_history = np.zeros(len(time_str_sorted)) +c_co2_history = np.zeros(len(time_str_sorted)) +h2_history = np.zeros(len(time_str_sorted)) +c_h2_history = np.zeros(len(time_str_sorted)) +gh_history = np.zeros(len(time_str_sorted)) +liqvol_history = np.zeros(len(time_str_sorted)) +print(f"case_path = {case_path}") +field_dict = {} +for itime, time in enumerate(time_float_sorted): + time_folder = time_str_sorted[itime] + print(f"\tTime : {time_folder}") + if not field_dict == {}: + new_field_dict = {} + if "volume" in field_dict: + new_field_dict["volume"] = field_dict["volume"] + field_dict = new_field_dict + gh_history[itime], field_dict = compute_gas_holdup( + case_path, time_str_sorted[itime], nCells, field_dict + ) + co2_history[itime], field_dict = co2liq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + h2_history[itime], field_dict = h2liq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + liqvol_history[itime], field_dict = vol_liq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + c_co2_history[itime], c_h2_history[itime], field_dict = cliq( + case_path, time_str_sorted[itime], nCells, field_dict + ) + + +os.makedirs(dataFolder, exist_ok=True) +os.makedirs(os.path.join(dataFolder, case_name), exist_ok=True) +np.savez( + os.path.join(dataFolder, case_name, "conv.npz"), + time=np.array(time_float_sorted), + gh=gh_history, + co2=co2_history, + h2=h2_history, + vol_liq=liqvol_history, + c_h2=c_h2_history, + c_co2=c_co2_history, +) diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/run.sh b/bird/preprocess/data_preprocess/loop_reactor_3_6L/run.sh new file mode 100644 index 00000000..6b7eb516 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/run.sh @@ -0,0 +1,5 @@ +multiphaseEulerFoam + + + + diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/script b/bird/preprocess/data_preprocess/loop_reactor_3_6L/script new file mode 100755 index 00000000..090e5c05 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/script @@ -0,0 +1,14 @@ +#!/bin/bash +#SBATCH --qos=high +#SBATCH --job-name=val2 +##SBATCH --partition=debug +#SBATCH --nodes=1 +#SBATCH --ntasks-per-node=16 +#SBATCH --time=07:59:00 +#SBATCH --account=co2snow + +bash presteps.sh +source /projects/gas2fuels/ofoam_cray_mpich/OpenFOAM-dev/etc/bashrc +decomposePar -fileHandler collated +srun -n 16 multiphaseEulerFoam -parallel -fileHandler collated +reconstructPar -newTimes diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/script_post b/bird/preprocess/data_preprocess/loop_reactor_3_6L/script_post new file mode 100755 index 00000000..aabbc33e --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/script_post @@ -0,0 +1,10 @@ +#!/bin/bash +#SBATCH --qos=high +#SBATCH --job-name=val2 +##SBATCH --partition=debug +#SBATCH --nodes=1 +#SBATCH --ntasks-per-node=16 +#SBATCH --time=00:59:00 +#SBATCH --account=co2snow + +bash computeQOI.sh diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/blockMeshDict b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/blockMeshDict new file mode 100644 index 00000000..1183d262 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/blockMeshDict @@ -0,0 +1,746 @@ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} + +convertToMeters 1.0; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +vertices +( +( 0.0 0.0 0.0) +( 1.0 0.0 0.0) +( 2.0 0.0 0.0) +( 3.0 0.0 0.0) +( 4.0 0.0 0.0) +( 5.0 0.0 0.0) +( 6.0 0.0 0.0) +( 7.0 0.0 0.0) +( 8.0 0.0 0.0) +( 9.0 0.0 0.0) +( 10.0 0.0 0.0) +( 0.0 1.0 0.0) +( 1.0 1.0 0.0) +( 2.0 1.0 0.0) +( 3.0 1.0 0.0) +( 4.0 1.0 0.0) +( 5.0 1.0 0.0) +( 6.0 1.0 0.0) +( 7.0 1.0 0.0) +( 8.0 1.0 0.0) +( 9.0 1.0 0.0) +( 10.0 1.0 0.0) +( 0.0 2.0 0.0) +( 1.0 2.0 0.0) +( 2.0 2.0 0.0) +( 3.0 2.0 0.0) +( 4.0 2.0 0.0) +( 5.0 2.0 0.0) +( 6.0 2.0 0.0) +( 7.0 2.0 0.0) +( 8.0 2.0 0.0) +( 9.0 2.0 0.0) +( 10.0 2.0 0.0) +( 0.0 3.0 0.0) +( 1.0 3.0 0.0) +( 2.0 3.0 0.0) +( 3.0 3.0 0.0) +( 4.0 3.0 0.0) +( 5.0 3.0 0.0) +( 6.0 3.0 0.0) +( 7.0 3.0 0.0) +( 8.0 3.0 0.0) +( 9.0 3.0 0.0) +( 10.0 3.0 0.0) +( 0.0 4.0 0.0) +( 1.0 4.0 0.0) +( 2.0 4.0 0.0) +( 3.0 4.0 0.0) +( 4.0 4.0 0.0) +( 5.0 4.0 0.0) +( 6.0 4.0 0.0) +( 7.0 4.0 0.0) +( 8.0 4.0 0.0) +( 9.0 4.0 0.0) +( 10.0 4.0 0.0) +( 0.0 5.0 0.0) +( 1.0 5.0 0.0) +( 2.0 5.0 0.0) +( 3.0 5.0 0.0) +( 4.0 5.0 0.0) +( 5.0 5.0 0.0) +( 6.0 5.0 0.0) +( 7.0 5.0 0.0) +( 8.0 5.0 0.0) +( 9.0 5.0 0.0) +( 10.0 5.0 0.0) +( 0.0 6.0 0.0) +( 1.0 6.0 0.0) +( 2.0 6.0 0.0) +( 3.0 6.0 0.0) +( 4.0 6.0 0.0) +( 5.0 6.0 0.0) +( 6.0 6.0 0.0) +( 7.0 6.0 0.0) +( 8.0 6.0 0.0) +( 9.0 6.0 0.0) +( 10.0 6.0 0.0) +( 0.0 7.0 0.0) +( 1.0 7.0 0.0) +( 2.0 7.0 0.0) +( 3.0 7.0 0.0) +( 4.0 7.0 0.0) +( 5.0 7.0 0.0) +( 6.0 7.0 0.0) +( 7.0 7.0 0.0) +( 8.0 7.0 0.0) +( 9.0 7.0 0.0) +( 10.0 7.0 0.0) +( 0.0 0.0 1.0) +( 1.0 0.0 1.0) +( 2.0 0.0 1.0) +( 3.0 0.0 1.0) +( 4.0 0.0 1.0) +( 5.0 0.0 1.0) +( 6.0 0.0 1.0) +( 7.0 0.0 1.0) +( 8.0 0.0 1.0) +( 9.0 0.0 1.0) +( 10.0 0.0 1.0) +( 0.0 1.0 1.0) +( 1.0 1.0 1.0) +( 2.0 1.0 1.0) +( 3.0 1.0 1.0) +( 4.0 1.0 1.0) +( 5.0 1.0 1.0) +( 6.0 1.0 1.0) +( 7.0 1.0 1.0) +( 8.0 1.0 1.0) +( 9.0 1.0 1.0) +( 10.0 1.0 1.0) +( 0.0 2.0 1.0) +( 1.0 2.0 1.0) +( 2.0 2.0 1.0) +( 3.0 2.0 1.0) +( 4.0 2.0 1.0) +( 5.0 2.0 1.0) +( 6.0 2.0 1.0) +( 7.0 2.0 1.0) +( 8.0 2.0 1.0) +( 9.0 2.0 1.0) +( 10.0 2.0 1.0) +( 0.0 3.0 1.0) +( 1.0 3.0 1.0) +( 2.0 3.0 1.0) +( 3.0 3.0 1.0) +( 4.0 3.0 1.0) +( 5.0 3.0 1.0) +( 6.0 3.0 1.0) +( 7.0 3.0 1.0) +( 8.0 3.0 1.0) +( 9.0 3.0 1.0) +( 10.0 3.0 1.0) +( 0.0 4.0 1.0) +( 1.0 4.0 1.0) +( 2.0 4.0 1.0) +( 3.0 4.0 1.0) +( 4.0 4.0 1.0) +( 5.0 4.0 1.0) +( 6.0 4.0 1.0) +( 7.0 4.0 1.0) +( 8.0 4.0 1.0) +( 9.0 4.0 1.0) +( 10.0 4.0 1.0) +( 0.0 5.0 1.0) +( 1.0 5.0 1.0) +( 2.0 5.0 1.0) +( 3.0 5.0 1.0) +( 4.0 5.0 1.0) +( 5.0 5.0 1.0) +( 6.0 5.0 1.0) +( 7.0 5.0 1.0) +( 8.0 5.0 1.0) +( 9.0 5.0 1.0) +( 10.0 5.0 1.0) +( 0.0 6.0 1.0) +( 1.0 6.0 1.0) +( 2.0 6.0 1.0) +( 3.0 6.0 1.0) +( 4.0 6.0 1.0) +( 5.0 6.0 1.0) +( 6.0 6.0 1.0) +( 7.0 6.0 1.0) +( 8.0 6.0 1.0) +( 9.0 6.0 1.0) +( 10.0 6.0 1.0) +( 0.0 7.0 1.0) +( 1.0 7.0 1.0) +( 2.0 7.0 1.0) +( 3.0 7.0 1.0) +( 4.0 7.0 1.0) +( 5.0 7.0 1.0) +( 6.0 7.0 1.0) +( 7.0 7.0 1.0) +( 8.0 7.0 1.0) +( 9.0 7.0 1.0) +( 10.0 7.0 1.0) +( 0.0 0.0 2.0) +( 1.0 0.0 2.0) +( 2.0 0.0 2.0) +( 3.0 0.0 2.0) +( 4.0 0.0 2.0) +( 5.0 0.0 2.0) +( 6.0 0.0 2.0) +( 7.0 0.0 2.0) +( 8.0 0.0 2.0) +( 9.0 0.0 2.0) +( 10.0 0.0 2.0) +( 0.0 1.0 2.0) +( 1.0 1.0 2.0) +( 2.0 1.0 2.0) +( 3.0 1.0 2.0) +( 4.0 1.0 2.0) +( 5.0 1.0 2.0) +( 6.0 1.0 2.0) +( 7.0 1.0 2.0) +( 8.0 1.0 2.0) +( 9.0 1.0 2.0) +( 10.0 1.0 2.0) +( 0.0 2.0 2.0) +( 1.0 2.0 2.0) +( 2.0 2.0 2.0) +( 3.0 2.0 2.0) +( 4.0 2.0 2.0) +( 5.0 2.0 2.0) +( 6.0 2.0 2.0) +( 7.0 2.0 2.0) +( 8.0 2.0 2.0) +( 9.0 2.0 2.0) +( 10.0 2.0 2.0) +( 0.0 3.0 2.0) +( 1.0 3.0 2.0) +( 2.0 3.0 2.0) +( 3.0 3.0 2.0) +( 4.0 3.0 2.0) +( 5.0 3.0 2.0) +( 6.0 3.0 2.0) +( 7.0 3.0 2.0) +( 8.0 3.0 2.0) +( 9.0 3.0 2.0) +( 10.0 3.0 2.0) +( 0.0 4.0 2.0) +( 1.0 4.0 2.0) +( 2.0 4.0 2.0) +( 3.0 4.0 2.0) +( 4.0 4.0 2.0) +( 5.0 4.0 2.0) +( 6.0 4.0 2.0) +( 7.0 4.0 2.0) +( 8.0 4.0 2.0) +( 9.0 4.0 2.0) +( 10.0 4.0 2.0) +( 0.0 5.0 2.0) +( 1.0 5.0 2.0) +( 2.0 5.0 2.0) +( 3.0 5.0 2.0) +( 4.0 5.0 2.0) +( 5.0 5.0 2.0) +( 6.0 5.0 2.0) +( 7.0 5.0 2.0) +( 8.0 5.0 2.0) +( 9.0 5.0 2.0) +( 10.0 5.0 2.0) +( 0.0 6.0 2.0) +( 1.0 6.0 2.0) +( 2.0 6.0 2.0) +( 3.0 6.0 2.0) +( 4.0 6.0 2.0) +( 5.0 6.0 2.0) +( 6.0 6.0 2.0) +( 7.0 6.0 2.0) +( 8.0 6.0 2.0) +( 9.0 6.0 2.0) +( 10.0 6.0 2.0) +( 0.0 7.0 2.0) +( 1.0 7.0 2.0) +( 2.0 7.0 2.0) +( 3.0 7.0 2.0) +( 4.0 7.0 2.0) +( 5.0 7.0 2.0) +( 6.0 7.0 2.0) +( 7.0 7.0 2.0) +( 8.0 7.0 2.0) +( 9.0 7.0 2.0) +( 10.0 7.0 2.0) +( 0.0 0.0 3.0) +( 1.0 0.0 3.0) +( 2.0 0.0 3.0) +( 3.0 0.0 3.0) +( 4.0 0.0 3.0) +( 5.0 0.0 3.0) +( 6.0 0.0 3.0) +( 7.0 0.0 3.0) +( 8.0 0.0 3.0) +( 9.0 0.0 3.0) +( 10.0 0.0 3.0) +( 0.0 1.0 3.0) +( 1.0 1.0 3.0) +( 2.0 1.0 3.0) +( 3.0 1.0 3.0) +( 4.0 1.0 3.0) +( 5.0 1.0 3.0) +( 6.0 1.0 3.0) +( 7.0 1.0 3.0) +( 8.0 1.0 3.0) +( 9.0 1.0 3.0) +( 10.0 1.0 3.0) +( 0.0 2.0 3.0) +( 1.0 2.0 3.0) +( 2.0 2.0 3.0) +( 3.0 2.0 3.0) +( 4.0 2.0 3.0) +( 5.0 2.0 3.0) +( 6.0 2.0 3.0) +( 7.0 2.0 3.0) +( 8.0 2.0 3.0) +( 9.0 2.0 3.0) +( 10.0 2.0 3.0) +( 0.0 3.0 3.0) +( 1.0 3.0 3.0) +( 2.0 3.0 3.0) +( 3.0 3.0 3.0) +( 4.0 3.0 3.0) +( 5.0 3.0 3.0) +( 6.0 3.0 3.0) +( 7.0 3.0 3.0) +( 8.0 3.0 3.0) +( 9.0 3.0 3.0) +( 10.0 3.0 3.0) +( 0.0 4.0 3.0) +( 1.0 4.0 3.0) +( 2.0 4.0 3.0) +( 3.0 4.0 3.0) +( 4.0 4.0 3.0) +( 5.0 4.0 3.0) +( 6.0 4.0 3.0) +( 7.0 4.0 3.0) +( 8.0 4.0 3.0) +( 9.0 4.0 3.0) +( 10.0 4.0 3.0) +( 0.0 5.0 3.0) +( 1.0 5.0 3.0) +( 2.0 5.0 3.0) +( 3.0 5.0 3.0) +( 4.0 5.0 3.0) +( 5.0 5.0 3.0) +( 6.0 5.0 3.0) +( 7.0 5.0 3.0) +( 8.0 5.0 3.0) +( 9.0 5.0 3.0) +( 10.0 5.0 3.0) +( 0.0 6.0 3.0) +( 1.0 6.0 3.0) +( 2.0 6.0 3.0) +( 3.0 6.0 3.0) +( 4.0 6.0 3.0) +( 5.0 6.0 3.0) +( 6.0 6.0 3.0) +( 7.0 6.0 3.0) +( 8.0 6.0 3.0) +( 9.0 6.0 3.0) +( 10.0 6.0 3.0) +( 0.0 7.0 3.0) +( 1.0 7.0 3.0) +( 2.0 7.0 3.0) +( 3.0 7.0 3.0) +( 4.0 7.0 3.0) +( 5.0 7.0 3.0) +( 6.0 7.0 3.0) +( 7.0 7.0 3.0) +( 8.0 7.0 3.0) +( 9.0 7.0 3.0) +( 10.0 7.0 3.0) +( 0.0 0.0 4.0) +( 1.0 0.0 4.0) +( 2.0 0.0 4.0) +( 3.0 0.0 4.0) +( 4.0 0.0 4.0) +( 5.0 0.0 4.0) +( 6.0 0.0 4.0) +( 7.0 0.0 4.0) +( 8.0 0.0 4.0) +( 9.0 0.0 4.0) +( 10.0 0.0 4.0) +( 0.0 1.0 4.0) +( 1.0 1.0 4.0) +( 2.0 1.0 4.0) +( 3.0 1.0 4.0) +( 4.0 1.0 4.0) +( 5.0 1.0 4.0) +( 6.0 1.0 4.0) +( 7.0 1.0 4.0) +( 8.0 1.0 4.0) +( 9.0 1.0 4.0) +( 10.0 1.0 4.0) +( 0.0 2.0 4.0) +( 1.0 2.0 4.0) +( 2.0 2.0 4.0) +( 3.0 2.0 4.0) +( 4.0 2.0 4.0) +( 5.0 2.0 4.0) +( 6.0 2.0 4.0) +( 7.0 2.0 4.0) +( 8.0 2.0 4.0) +( 9.0 2.0 4.0) +( 10.0 2.0 4.0) +( 0.0 3.0 4.0) +( 1.0 3.0 4.0) +( 2.0 3.0 4.0) +( 3.0 3.0 4.0) +( 4.0 3.0 4.0) +( 5.0 3.0 4.0) +( 6.0 3.0 4.0) +( 7.0 3.0 4.0) +( 8.0 3.0 4.0) +( 9.0 3.0 4.0) +( 10.0 3.0 4.0) +( 0.0 4.0 4.0) +( 1.0 4.0 4.0) +( 2.0 4.0 4.0) +( 3.0 4.0 4.0) +( 4.0 4.0 4.0) +( 5.0 4.0 4.0) +( 6.0 4.0 4.0) +( 7.0 4.0 4.0) +( 8.0 4.0 4.0) +( 9.0 4.0 4.0) +( 10.0 4.0 4.0) +( 0.0 5.0 4.0) +( 1.0 5.0 4.0) +( 2.0 5.0 4.0) +( 3.0 5.0 4.0) +( 4.0 5.0 4.0) +( 5.0 5.0 4.0) +( 6.0 5.0 4.0) +( 7.0 5.0 4.0) +( 8.0 5.0 4.0) +( 9.0 5.0 4.0) +( 10.0 5.0 4.0) +( 0.0 6.0 4.0) +( 1.0 6.0 4.0) +( 2.0 6.0 4.0) +( 3.0 6.0 4.0) +( 4.0 6.0 4.0) +( 5.0 6.0 4.0) +( 6.0 6.0 4.0) +( 7.0 6.0 4.0) +( 8.0 6.0 4.0) +( 9.0 6.0 4.0) +( 10.0 6.0 4.0) +( 0.0 7.0 4.0) +( 1.0 7.0 4.0) +( 2.0 7.0 4.0) +( 3.0 7.0 4.0) +( 4.0 7.0 4.0) +( 5.0 7.0 4.0) +( 6.0 7.0 4.0) +( 7.0 7.0 4.0) +( 8.0 7.0 4.0) +( 9.0 7.0 4.0) +( 10.0 7.0 4.0) +( 0.0 0.0 5.0) +( 1.0 0.0 5.0) +( 2.0 0.0 5.0) +( 3.0 0.0 5.0) +( 4.0 0.0 5.0) +( 5.0 0.0 5.0) +( 6.0 0.0 5.0) +( 7.0 0.0 5.0) +( 8.0 0.0 5.0) +( 9.0 0.0 5.0) +( 10.0 0.0 5.0) +( 0.0 1.0 5.0) +( 1.0 1.0 5.0) +( 2.0 1.0 5.0) +( 3.0 1.0 5.0) +( 4.0 1.0 5.0) +( 5.0 1.0 5.0) +( 6.0 1.0 5.0) +( 7.0 1.0 5.0) +( 8.0 1.0 5.0) +( 9.0 1.0 5.0) +( 10.0 1.0 5.0) +( 0.0 2.0 5.0) +( 1.0 2.0 5.0) +( 2.0 2.0 5.0) +( 3.0 2.0 5.0) +( 4.0 2.0 5.0) +( 5.0 2.0 5.0) +( 6.0 2.0 5.0) +( 7.0 2.0 5.0) +( 8.0 2.0 5.0) +( 9.0 2.0 5.0) +( 10.0 2.0 5.0) +( 0.0 3.0 5.0) +( 1.0 3.0 5.0) +( 2.0 3.0 5.0) +( 3.0 3.0 5.0) +( 4.0 3.0 5.0) +( 5.0 3.0 5.0) +( 6.0 3.0 5.0) +( 7.0 3.0 5.0) +( 8.0 3.0 5.0) +( 9.0 3.0 5.0) +( 10.0 3.0 5.0) +( 0.0 4.0 5.0) +( 1.0 4.0 5.0) +( 2.0 4.0 5.0) +( 3.0 4.0 5.0) +( 4.0 4.0 5.0) +( 5.0 4.0 5.0) +( 6.0 4.0 5.0) +( 7.0 4.0 5.0) +( 8.0 4.0 5.0) +( 9.0 4.0 5.0) +( 10.0 4.0 5.0) +( 0.0 5.0 5.0) +( 1.0 5.0 5.0) +( 2.0 5.0 5.0) +( 3.0 5.0 5.0) +( 4.0 5.0 5.0) +( 5.0 5.0 5.0) +( 6.0 5.0 5.0) +( 7.0 5.0 5.0) +( 8.0 5.0 5.0) +( 9.0 5.0 5.0) +( 10.0 5.0 5.0) +( 0.0 6.0 5.0) +( 1.0 6.0 5.0) +( 2.0 6.0 5.0) +( 3.0 6.0 5.0) +( 4.0 6.0 5.0) +( 5.0 6.0 5.0) +( 6.0 6.0 5.0) +( 7.0 6.0 5.0) +( 8.0 6.0 5.0) +( 9.0 6.0 5.0) +( 10.0 6.0 5.0) +( 0.0 7.0 5.0) +( 1.0 7.0 5.0) +( 2.0 7.0 5.0) +( 3.0 7.0 5.0) +( 4.0 7.0 5.0) +( 5.0 7.0 5.0) +( 6.0 7.0 5.0) +( 7.0 7.0 5.0) +( 8.0 7.0 5.0) +( 9.0 7.0 5.0) +( 10.0 7.0 5.0) +); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +blocks +( + + //block 0 +hex (0 1 12 11 88 89 100 99 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 1 +hex (1 2 13 12 89 90 101 100 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 2 +hex (2 3 14 13 90 91 102 101 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 3 +hex (3 4 15 14 91 92 103 102 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 4 +hex (4 5 16 15 92 93 104 103 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 5 +hex (5 6 17 16 93 94 105 104 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 6 +hex (6 7 18 17 94 95 106 105 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 7 +hex (7 8 19 18 95 96 107 106 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 8 +hex (8 9 20 19 96 97 108 107 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 9 +hex (9 10 21 20 97 98 109 108 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 10 +hex (97 98 109 108 185 186 197 196 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 11 +hex (185 186 197 196 273 274 285 284 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 12 +hex (273 274 285 284 361 362 373 372 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 13 +hex (361 362 373 372 449 450 461 460 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 14 +hex (360 361 372 371 448 449 460 459 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 15 +hex (359 360 371 370 447 448 459 458 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 16 +hex (358 359 370 369 446 447 458 457 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 17 +hex (357 358 369 368 445 446 457 456 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 18 +hex (356 357 368 367 444 445 456 455 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 19 +hex (355 356 367 366 443 444 455 454 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 20 +hex (354 355 366 365 442 443 454 453 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 21 +hex (353 354 365 364 441 442 453 452 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 22 +hex (352 353 364 363 440 441 452 451 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 23 +hex (363 364 375 374 451 452 463 462 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 24 +hex (374 375 386 385 462 463 474 473 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 25 +hex (385 386 397 396 473 474 485 484 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 26 +hex (396 397 408 407 484 485 496 495 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 27 +hex (407 408 419 418 495 496 507 506 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 28 +hex (418 419 430 429 506 507 518 517 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 29 +hex (308 309 320 319 396 397 408 407 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 30 +hex (220 221 232 231 308 309 320 319 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 31 +hex (132 133 144 143 220 221 232 231 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 32 +hex (44 45 56 55 132 133 144 143 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 33 +hex (55 56 67 66 143 144 155 154 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 34 +hex (66 67 78 77 154 155 166 165 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 35 +hex (33 34 45 44 121 122 133 132 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 36 +hex (22 23 34 33 110 111 122 121 ) +( 10 10 10 ) +SimpleGrading (1 1 1) + + //block 37 +hex (11 12 23 22 99 100 111 110 ) +( 10 10 10 ) +SimpleGrading (1 1 1) +); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +defaultPatch +{ type wall;} + +patches +( +); diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/controlDict b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/controlDict new file mode 100644 index 00000000..7374023a --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/controlDict @@ -0,0 +1,67 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application multiphaseEulerFoam; + +startFrom latestTime;//startTime; + +startTime 0; + +stopAt endTime; + +endTime 100; + +deltaT 0.0001; + +writeControl adjustableRunTime; + +writeInterval 2; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + +adjustTimeStep yes; + +maxCo 0.5; + +maxDeltaT 0.0005; + + +functions +{ + + #includeFunc writeObjects(d.gas) + #includeFunc writeObjects(thermo:rho.gas) + #includeFunc writeObjects(thermo:rho.liquid) +} +//functions +//{ +// #includeFunc fieldAverage(U.air, U.water, alpha.air, p) +//} + + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/decomposeParDict b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/decomposeParDict new file mode 100755 index 00000000..f8397e73 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/decomposeParDict @@ -0,0 +1,30 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 3.0.x | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object decomposeParDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 16; + +method scotch; + +hierarchicalCoeffs +{ + n (4 4 1); + delta 0.001; + order xyz; +} + + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/fvConstraints b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/fvConstraints new file mode 100644 index 00000000..334f1c8f --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/fvConstraints @@ -0,0 +1,56 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + object fvConstraints; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +limitp +{ + type limitPressure; + + min 1e4; +} +limitUliq +{ + type limitVelocity; + active yes; + U U.liquid; + selectionMode all; + max 1e1; +} +limitUgas +{ + type limitVelocity; + active yes; + U U.gas; + selectionMode all; + max 2e1; +} +limitTgas +{ + type limitTemperature; + selectionMode all; + min 290; + max 310; + phase gas; +} +limitTliq +{ + type limitTemperature; + selectionMode all; + min 290; + max 310; + phase liquid; +} + + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/fvSchemes b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/fvSchemes new file mode 100644 index 00000000..52e6e13a --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/fvSchemes @@ -0,0 +1,70 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; + limited cellLimited Gauss linear 1; +} + +divSchemes +{ + default none; + + "div\(phi,alpha.*\)" Gauss vanLeer; + + "div\(phir,alpha.*,alpha.*\)" Gauss vanLeer; + + "div\(alphaRhoPhi.*,U.*\)" Gauss limitedLinearV 1; + "div\(phi.*,U.*\)" Gauss limitedLinearV 1; + "div\(alphaRhoPhi.*,Yi\)" Gauss limitedLinear 1; + "div\(alphaRhoPhi.*,(h|e).*\)" Gauss limitedLinear 1; + "div\(alphaRhoPhi.*,(K|k|epsilon|omega).*\)" Gauss limitedLinear 1; + "div\(alphaPhi.*,f.*\)" Gauss limitedLinear 1; + "div\(alphaRhoPhi.*,\(p\|thermo:rho.*\)\)" Gauss limitedLinear 1; + + "div\(phim,(k|epsilon)m\)" Gauss upwind; + "div\(\(\(\(alpha.*\*thermo:rho.*\)*nuEff.*\)*dev2\(T\(grad\(U.*\)\)\)\)\)" Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default uncorrected; +} + +wallDist +{ + method Poisson; + nRequired true; +} + + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/fvSolution b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/fvSolution new file mode 100644 index 00000000..2e69fdfa --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/fvSolution @@ -0,0 +1,120 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + "alpha.*" + { + nAlphaCorr 2; + nAlphaSubCycles 5; + } + + bubbles + { + nCorr 1; + tolerance 1e-4; + scale true; + solveOnFinalIterOnly true; + sourceUpdateInterval 1; + } + + p_rgh + { + solver GAMG; + smoother DIC; + tolerance 1e-7; + relTol 0; + } + + p_rghFinal + { + $p_rgh; + relTol 0; + } + + "(k|omega).*" + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-7; + relTol 0; + minIter 1; + } + + "(e|h).*" + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-8; + relTol 0; + minIter 0; + maxIter 3; + } + + "f.*" + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-6; + relTol 0; + } + + "Yi.*" + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-12; + relTol 0; + residualAlpha 1e-8; + } + + "U.*" + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-5; + relTol 0; + minIter 1; + } + + yPsi + { + solver PCG; + preconditioner DIC; + tolerance 1e-10; + relTol 0; + } + +} + +PIMPLE +{ + nOuterCorrectors 3; + nCorrectors 1; + nNonOrthogonalCorrectors 0; + +} + +relaxationFactors +{ + equations + { + ".*" 1; + } +} + + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/inlets_outlets.json b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/inlets_outlets.json new file mode 100644 index 00000000..2b53da73 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/inlets_outlets.json @@ -0,0 +1,28 @@ +{ + "Geometry": { + "OverallDomain": { + "x" : {"nblocks": 10, "size_per_block": 1.0}, + "y" : {"nblocks": 11, "size_per_block": 1.0}, + "z" : {"nblocks": 5, "size_per_block": 1.0} + }, + "Fluids": [ + [ [0,0,0], [9,0,0] ], + [ [9,0,0], [9,0,4] ], + [ [9,0,4], [0,0,4] ], + [ [0,1,4], [0,4,4] ], + [ [0,4,4], [0,10,4] ], + [ [0,4,4], [0,4,0] ], + [ [0,4,0], [0,10,0] ], + [ [0,4,0], [0,1,0] ] + ] + }, + "inlets": [ + {"branch_id": 0, "type": "circle", "frac_space": 0.2222222222222222, "normal_dir": 1, "radius": 0.4, "nelements": 50, "block_pos": "bottom"}, + {"branch_id": 0, "type": "circle", "frac_space": 0.5, "radius": 0.4, "normal_dir": 1,"nelements": 50, "block_pos": "bottom"}, + {"branch_id": 0, "type": "circle", "frac_space": 0.7777777777777778, "radius": 0.4, "normal_dir": 1,"nelements": 50, "block_pos": "bottom"} + ], + "outlets": [ + {"branch_id": 6, "type": "circle", "frac_space": 1, "normal_dir": 1, "radius": 0.4, "nelements": 50, "block_pos": "top"}, + {"branch_id": 4, "type": "circle", "frac_space": 1, "normal_dir": 1, "radius": 0.4, "nelements": 50, "block_pos": "top"} + ] +} diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/mesh.json b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/mesh.json new file mode 100644 index 00000000..29841d7e --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/mesh.json @@ -0,0 +1,26 @@ +{ + "Meshing": { + "Blockwise": { + "x" : 10, + "y" : 10, + "z" : 10 + } + }, + "Geometry": { + "OverallDomain": { + "x" : {"nblocks": 10, "size_per_block": 1.0}, + "y" : {"nblocks": 11, "size_per_block": 1.0}, + "z" : {"nblocks": 5, "size_per_block": 1.0} + }, + "Fluids": [ + [ [0,0,0], [9,0,0] ], + [ [9,0,0], [9,0,4] ], + [ [9,0,4], [0,0,4] ], + [ [0,1,4], [0,4,4] ], + [ [0,4,4], [0,10,4] ], + [ [0,4,4], [0,4,0] ], + [ [0,4,0], [0,10,0] ], + [ [0,4,0], [0,1,0] ] + ] + } +} diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/mixers.json b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/mixers.json new file mode 100644 index 00000000..10fdbd99 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/mixers.json @@ -0,0 +1,29 @@ +{ + "Meshing": { + "Blockwise": { + "x" : 10, + "y" : 10, + "z" : 10 + } + }, + "Geometry": { + "OverallDomain": { + "x" : {"nblocks": 10, "size_per_block": 1.0, "rescale": 0.05}, + "y" : {"nblocks": 11, "size_per_block": 1.0, "rescale": 0.05}, + "z" : {"nblocks": 5, "size_per_block": 1.0, "rescale": 0.05} + }, + "Fluids": [ + [ [0,0,0], [9,0,0] ], + [ [9,0,0], [9,0,4] ], + [ [9,0,4], [0,0,4] ], + [ [0,1,4], [0,4,4] ], + [ [0,4,4], [0,10,4] ], + [ [0,4,4], [0,4,0] ], + [ [0,4,0], [0,10,0] ], + [ [0,4,0], [0,1,0] ] + ] + }, + "mixers": [ + {"branch_id": 2, "frac_space": 0.5, "start_time": 1, "power": 1, "sign": "+"} + ] +} diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/setFieldsDict b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/setFieldsDict new file mode 100644 index 00000000..7faaeb15 --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/system/setFieldsDict @@ -0,0 +1,37 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + format ascii; + class dictionary; + location "system"; + object setFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defaultFieldValues +( + volScalarFieldValue alpha.gas 0.99 + volScalarFieldValue alpha.liquid 0.01 +); + +regions +( + boxToCell + { + box (-1.0 -1.0 -1.0) (10 0.2 10.0); + fieldValues + ( + volScalarFieldValue alpha.gas 0.01 + volScalarFieldValue alpha.liquid 0.99 + ); + } +); + + +// ************************************************************************* // diff --git a/bird/preprocess/data_preprocess/loop_reactor_3_6L/writeGlobalVars.py b/bird/preprocess/data_preprocess/loop_reactor_3_6L/writeGlobalVars.py new file mode 100644 index 00000000..0594eccc --- /dev/null +++ b/bird/preprocess/data_preprocess/loop_reactor_3_6L/writeGlobalVars.py @@ -0,0 +1,47 @@ +import os + +import numpy as np + +from bird.utilities.ofio import * + + +def writeGvars(inletA, liqVol): + filename_tmp = os.path.join("constant", "globalVars_temp") + with open(filename_tmp, "r+") as f: + lines = f.readlines() + filename = os.path.join("constant", "globalVars") + with open(filename, "w+") as f: + for line in lines: + if line.startswith("inletA"): + f.write(f"inletA\t{inletA:g};\n") + elif line.startswith("liqVol"): + f.write(f"liqVol\t{liqVol:g};\n") + else: + f.write(line) + + +def readInletArea(): + filename = os.path.join( + "postProcessing", + "patchIntegrate(patch=inlet,field=alpha.gas)", + "0", + "surfaceFieldValue.dat", + ) + with open(filename, "r+") as f: + lines = f.readlines() + return float(lines[4].split()[-1]) + + +def getLiqVol(): + cellCentres = readMesh(os.path.join(".", f"meshCellCentres_0.obj")) + volume_field = readOFScal(os.path.join("0", "V"), len(cellCentres)) + alpha_field = readOFScal( + os.path.join("0", "alpha.liquid"), len(cellCentres) + ) + return np.sum(volume_field * alpha_field) + + +if __name__ == "__main__": + A = readInletArea() + V = getLiqVol() + writeGvars(A, V) diff --git a/bird/preprocess/dynamic_mixer/io_fvModels.py b/bird/preprocess/dynamic_mixer/io_fvModels.py index 46092969..6d405984 100644 --- a/bird/preprocess/dynamic_mixer/io_fvModels.py +++ b/bird/preprocess/dynamic_mixer/io_fvModels.py @@ -42,18 +42,26 @@ def write_preamble(output_folder): f.write("\t\tconst volVectorField& UL =\n") f.write('\t\t\tmesh().lookupObject("U.liquid");\n') f.write("\t\tdouble pi=3.141592654;\n") + f.write(f"\t\tdouble source_pt_x;\n") + f.write(f"\t\tdouble source_pt_y;\n") + f.write(f"\t\tdouble source_pt_z;\n") + f.write(f"\t\tdouble disk_rad;\n") + f.write("\t\tdouble disk_area;\n") + f.write(f"\t\tdouble power;\n") + f.write(f"\t\tdouble smear_factor;\n") + f.write(f"\t\tdouble startTime;\n") def write_mixer(mixer, output_folder): with open(os.path.join(output_folder, "fvModels"), "a+") as f: - f.write(f"\t\tdouble source_pt_x={mixer.x};\n") - f.write(f"\t\tdouble source_pt_y={mixer.y};\n") - f.write(f"\t\tdouble source_pt_z={mixer.z};\n") - f.write(f"\t\tdouble disk_rad={mixer.rad};\n") - f.write("\t\tdouble disk_area=pi*disk_rad*disk_rad;\n") - f.write(f"\t\tdouble power={mixer.power};\n") - f.write(f"\t\tdouble smear_factor={float(mixer.smear)};\n") - f.write(f"\t\tconst scalar startTime = {mixer.start_time};\n") + f.write(f"\t\tsource_pt_x={mixer.x};\n") + f.write(f"\t\tsource_pt_y={mixer.y};\n") + f.write(f"\t\tsource_pt_z={mixer.z};\n") + f.write(f"\t\tdisk_rad={mixer.rad};\n") + f.write("\t\tdisk_area=pi*disk_rad*disk_rad;\n") + f.write(f"\t\tpower={mixer.power};\n") + f.write(f"\t\tsmear_factor={float(mixer.smear)};\n") + f.write(f"\t\tstartTime = {mixer.start_time};\n") f.write("\t\tif (time.value() > startTime)\n") f.write("\t\t{\n") f.write("\t\t\t// Get V1\n") @@ -61,7 +69,7 @@ def write_mixer(mixer, output_folder): f.write("\t\t\tdouble V1 = 0;\n") f.write("\t\t\tdouble V2 = 0;\n") f.write("\t\t\tdouble rhoV;\n") - f.write("\t\t\tdouble dist_tol = disk_rad*5;\n") + f.write("\t\t\tdouble dist_tol = disk_rad*3;\n") f.write("\n") f.write("\t\t\tdouble dist_n;\n") f.write("\t\t\tdouble upV = 0;\n") @@ -184,6 +192,139 @@ def write_mixer(mixer, output_folder): f.write("\t\t}\n") +def write_mixer_force_sign(mixer, output_folder): + with open(os.path.join(output_folder, "fvModels"), "a+") as f: + f.write(f"\t\tsource_pt_x={mixer.x};\n") + f.write(f"\t\tsource_pt_y={mixer.y};\n") + f.write(f"\t\tsource_pt_z={mixer.z};\n") + f.write(f"\t\tdisk_rad={mixer.rad};\n") + f.write("\t\tdisk_area=pi*disk_rad*disk_rad;\n") + f.write(f"\t\tpower={mixer.power};\n") + f.write(f"\t\tsmear_factor={float(mixer.smear)};\n") + f.write(f"\t\tstartTime = {mixer.start_time};\n") + f.write("\t\tif (time.value() > startTime)\n") + f.write("\t\t{\n") + f.write("\t\t\t// Get V1\n") + f.write("\t\t\tdouble source_sign_factor = 1.0;\n") + f.write("\t\t\tdouble V1 = 0;\n") + f.write("\t\t\tdouble V2 = 0;\n") + f.write("\t\t\tdouble rhoV;\n") + f.write("\t\t\tdouble dist_tol = disk_rad*3;\n") + f.write("\n") + f.write("\t\t\tdouble dist_n;\n") + f.write("\t\t\tdouble upV = 0;\n") + f.write("\t\t\tdouble uprhoV = 0;\n") + f.write("\t\t\tdouble upVvol = 0;\n") + f.write("\t\t\tdouble downV = 0;\n") + f.write("\t\t\tdouble downrhoV = 0;\n") + f.write("\t\t\tdouble downVvol = 0;\n") + f.write("\t\t\tdouble dist2;\n") + + f.write("\t\t\tforAll(C,i)\n") + f.write("\t\t\t{\n") + f.write( + "\t\t\t\tdist2 = (C[i].x()-source_pt_x)*(C[i].x()-source_pt_x);\n" + ) + f.write( + "\t\t\t\tdist2 += (C[i].y()-source_pt_y)*(C[i].y()-source_pt_y);\n" + ) + f.write( + "\t\t\t\tdist2 += (C[i].z()-source_pt_z)*(C[i].z()-source_pt_z);\n" + ) + f.write("\n") + if mixer.normal_dir == 0: + f.write("\t\t\t\tdist_n = (C[i].x()-source_pt_x);\n") + elif mixer.normal_dir == 1: + f.write("\t\t\t\tdist_n = (C[i].y()-source_pt_y);\n") + elif mixer.normal_dir == 2: + f.write("\t\t\t\tdist_n = (C[i].z()-source_pt_z);\n") + f.write("\n") + + f.write( + "\t\t\t\tif (dist2 < dist_tol*dist_tol && dist_n < -dist_tol/2) {\n" + ) + f.write("\t\t\t\t\tupVvol += V[i] * alphaL[i];\n") + f.write( + f"\t\t\t\t\tupV += V[i] * alphaL[i] * UL[i][{int(mixer.normal_dir)}];\n" + ) + f.write("\t\t\t\t\tuprhoV += V[i] * alphaL[i] * rhoL[i];\n") + f.write("\t\t\t\t}\n") + f.write( + "\t\t\t\tif (dist2 < dist_tol*dist_tol && dist_n > dist_tol/2) {\n" + ) + f.write("\t\t\t\t\tdownVvol += V[i] * alphaL[i];\n") + f.write( + f"\t\t\t\t\tdownV += V[i] * alphaL[i] * UL[i][{int(mixer.normal_dir)}];\n" + ) + f.write("\t\t\t\t\tdownrhoV += V[i] * alphaL[i] * rhoL[i];\n") + f.write("\t\t\t\t}\n") + f.write("\t\t\t}\n") + f.write("\n") + f.write("\t\t\treduce(uprhoV, sumOp());\n") + f.write("\t\t\treduce(downrhoV, sumOp());\n") + f.write("\t\t\treduce(upV, sumOp());\n") + f.write("\t\t\treduce(downV, sumOp());\n") + f.write("\t\t\treduce(downVvol, sumOp());\n") + f.write("\t\t\treduce(upVvol, sumOp());\n") + f.write("\n") + f.write("\t\t\tdownV /= downVvol;\n") + f.write("\t\t\tupV /= upVvol;\n") + f.write("\t\t\tdownrhoV /= downVvol;\n") + f.write("\t\t\tuprhoV /= upVvol;\n") + f.write("\n") + if mixer.sign == "+": + f.write("\t\t\tsource_sign_factor = -1.0;\n") + f.write("\t\t\tif (upV >= 0){\n") + f.write("\t\t\t\tV1 = 0.0;\n") + f.write("\t\t\t} else {\n") + f.write("\t\t\t\tV1 = std::abs(upV);\n") + f.write("\t\t\t}\n") + f.write("\t\t\trhoV = uprhoV;\n") + elif mixer.sign == "-": + f.write("\t\t\tsource_sign_factor = 1.0;\n") + f.write("\t\t\tif (downV <= 0){\n") + f.write("\t\t\t\tV1 = 0.0;\n") + f.write("\t\t\t} else {\n") + f.write("\t\t\t\tV1 = std::abs(downV);\n") + f.write("\t\t\t}\n") + f.write("\t\t\trhoV = downrhoV;\n") + # f.write("\t\t\t}\n") + f.write( + '\t\t\tFoam::Info << "[BIRD:DYNMIX INFO] V1 = " << V1 << endl;\n' + ) + f.write("\t\t\t\n") + f.write("\t\t\t// Get V2\n") + f.write("\t\t\tV2 = findV2(power, rhoV, disk_area, V1);\n") + f.write("\n") + f.write("\t\t\tforAll(C,i)\n") + f.write("\t\t\t{\n") + f.write( + "\t\t\t\tdouble Thrust=0.5*rhoL[i]*(V2*V2 - V1*V1)*disk_area;\n" + ) + f.write( + "\t\t\t\tdouble dist2=(C[i].x()-source_pt_x)*(C[i].x()-source_pt_x);\n" + ) + f.write( + "\t\t\t\tdist2 += (C[i].y()-source_pt_y)*(C[i].y()-source_pt_y);\n" + ) + f.write( + "\t\t\t\tdist2 += (C[i].z()-source_pt_z)*(C[i].z()-source_pt_z);\n" + ) + + f.write("\t\t\t\tdouble epsilon=pow(V[i],0.33333)*smear_factor;\n") + f.write( + "\t\t\t\tdouble sourceterm=alphaL[i]*(Thrust/pow(pi,1.5)/pow(epsilon,3.0))*\n" + ) + f.write("\t\t\t\t\texp(-dist2/(epsilon*epsilon));\n") + + f.write( + f"\t\t\t\tUsource[i][{int(mixer.normal_dir)}] -= source_sign_factor*sourceterm*V[i];\n" + ) + + f.write("\t\t\t}\n") + f.write("\t\t}\n") + + def write_end(output_folder): with open(os.path.join(output_folder, "fvModels"), "a+") as f: f.write("\t#};\n") diff --git a/bird/preprocess/dynamic_mixer/mixer.py b/bird/preprocess/dynamic_mixer/mixer.py index 1cc9b8b5..d3068427 100644 --- a/bird/preprocess/dynamic_mixer/mixer.py +++ b/bird/preprocess/dynamic_mixer/mixer.py @@ -15,6 +15,7 @@ def __init__(self): self.ready = False def update_from_expl_dict(self, mixer_dict): + print("\nMaking dynamic mixer with explicit input") if "x" in mixer_dict: self.x = mixer_dict["x"] if "y" in mixer_dict: @@ -36,6 +37,7 @@ def update_from_expl_dict(self, mixer_dict): self.check_status() def update_from_loop_dict(self, mixer_dict, geom_dict, mesh_dict=None): + print("\nMaking dynamic mixer from loop specific input") segment = geom_dict["segments"][mixer_dict["branch_id"]] pos = segment["start"] + mixer_dict["frac_space"] * segment["conn"] self.x = pos[0] @@ -81,13 +83,13 @@ def check_status(self, blocks=None): self.ready = False else: print( - f"\n\tpos({self.x:.2g}, {self.y:.2g}, {self.z:.2g})" + f"\tpos({self.x:.2g}, {self.y:.2g}, {self.z:.2g})m" + f"\n\tnormal_dir {self.normal_dir}" - + f"\n\trad {self.rad:.2g}" - + f"\n\tpower {self.power:.2g}" + + f"\n\trad {self.rad:.2g}m" + + f"\n\tpower {self.power:.2g}W" + f"\n\tsign {self.sign}" - + f"\n\tsmear {self.smear}" - + f"\n\tstart_time {self.start_time:.2g}" + + f"\n\tsmear {self.smear} grid points" + + f"\n\tstart_time {self.start_time:.2g}s" ) if blocks is not None: print(f"\tbranch = {blocks}") diff --git a/bird/preprocess/dynamic_mixer/mixing_fvModels.py b/bird/preprocess/dynamic_mixer/mixing_fvModels.py index 95eb04f6..c5db71a7 100644 --- a/bird/preprocess/dynamic_mixer/mixing_fvModels.py +++ b/bird/preprocess/dynamic_mixer/mixing_fvModels.py @@ -10,6 +10,7 @@ def check_input(input_dict): assert isinstance(input_dict, dict) mix_type = [] for mix in input_dict["mixers"]: + if "x" in mix: mix_type.append("expl") else: @@ -28,7 +29,7 @@ def check_input(input_dict): return mix_type -def write_fvModel(input_dict, output_folder="."): +def write_fvModel(input_dict, output_folder=".", force_sign=False): mix_type = check_input(input_dict) write_preamble(output_folder) if "loop" in mix_type: @@ -39,13 +40,19 @@ def write_fvModel(input_dict, output_folder="."): if mtype == "expl": mixer.update_from_expl_dict(input_dict["mixers"][imix]) if mixer.ready: - write_mixer(mixer, output_folder) + if force_sign: + write_mixer_force_sign(mixer, output_folder) + else: + write_mixer(mixer, output_folder) elif mtype == "loop": mixer.update_from_loop_dict( input_dict["mixers"][imix], geom_dict, mesh_dict ) if mixer.ready: - write_mixer(mixer, output_folder) + if force_sign: + write_mixer_force_sign(mixer, output_folder) + else: + write_mixer(mixer, output_folder) write_end(output_folder) diff --git a/bird/preprocess/json_gen/design_io.py b/bird/preprocess/json_gen/design_io.py new file mode 100644 index 00000000..d6ed2c72 --- /dev/null +++ b/bird/preprocess/json_gen/design_io.py @@ -0,0 +1,85 @@ +import json + + +def generate_stl_patch(filename, bc_dict, geom_dict): + final_dict = {} + final_dict["Geometry"] = geom_dict["Geometry"] + for patch in bc_dict: + final_dict[patch] = bc_dict[patch] + with open(filename, "w+") as f: + json.dump(final_dict, f, indent=2) + + +def generate_dynamic_mixer(filename, mixers_list, geom_dict): + final_dict = {} + final_dict["Meshing"] = geom_dict["Meshing"] + final_dict["Geometry"] = geom_dict["Geometry"] + final_dict["mixers"] = mixers_list + with open(filename, "w+") as f: + json.dump(final_dict, f, indent=2) + + +def make_default_geom_dict_from_file(filename, rescale=2.7615275385627096): + with open(filename, "r+") as f: + geom_dict = json.load(f) + if "rescale" not in geom_dict["Geometry"]["OverallDomain"]["x"]: + geom_dict["Geometry"]["OverallDomain"]["x"]["rescale"] = rescale + geom_dict["Geometry"]["OverallDomain"]["y"]["rescale"] = rescale + geom_dict["Geometry"]["OverallDomain"]["z"]["rescale"] = rescale + assert "Meshing" in geom_dict + assert "Geometry" in geom_dict + return geom_dict + + +if __name__ == "__main__": + bc_dict = {} + bc_dict["inlets"] = [] + bc_dict["outlets"] = [] + tmp_dict = {} + tmp_dict["type"] = "circle" + tmp_dict["centx"] = 5.0 + tmp_dict["centy"] = 0.0 + tmp_dict["centz"] = 0.5 + tmp_dict["radius"] = 0.4 + tmp_dict["normal_dir"] = 1 + tmp_dict["nelements"] = 50 + bc_dict["inlets"].append(tmp_dict) + tmp_dict = {} + tmp_dict["type"] = "circle" + tmp_dict["centx"] = 2.5 + tmp_dict["centy"] = 0.0 + tmp_dict["centz"] = 0.5 + tmp_dict["radius"] = 0.4 + tmp_dict["normal_dir"] = 1 + tmp_dict["nelements"] = 50 + bc_dict["inlets"].append(tmp_dict) + tmp_dict = {} + tmp_dict["type"] = "circle" + tmp_dict["centx"] = 7.5 + tmp_dict["centy"] = 0.0 + tmp_dict["centz"] = 0.5 + tmp_dict["radius"] = 0.4 + tmp_dict["normal_dir"] = 1 + tmp_dict["nelements"] = 50 + bc_dict["inlets"].append(tmp_dict) + + tmp_dict = {} + tmp_dict["type"] = "circle" + tmp_dict["centx"] = 0.5 + tmp_dict["centy"] = 5.0 + tmp_dict["centz"] = 0.5 + tmp_dict["radius"] = 0.4 + tmp_dict["normal_dir"] = 1 + tmp_dict["nelements"] = 50 + bc_dict["outlets"].append(tmp_dict) + tmp_dict = {} + tmp_dict["type"] = "circle" + tmp_dict["centx"] = 0.5 + tmp_dict["centy"] = 5.0 + tmp_dict["centz"] = 0.5 + tmp_dict["radius"] = 0.4 + tmp_dict["normal_dir"] = 1 + tmp_dict["nelements"] = 50 + bc_dict["outlets"].append(tmp_dict) + + generate_stl_patch("test.json", bc_dict) diff --git a/bird/preprocess/json_gen/generate_designs.py b/bird/preprocess/json_gen/generate_designs.py new file mode 100644 index 00000000..f6c9c265 --- /dev/null +++ b/bird/preprocess/json_gen/generate_designs.py @@ -0,0 +1,344 @@ +import os +import pickle +import shutil + +import numpy as np + +from bird import BIRD_CASE_DIR +from bird.preprocess.json_gen.design_io import * + + +def compare_config(config1, config2): + same = True + for key in config1: + if np.linalg.norm(config1[key] - config2[key]) > 1e-6: + same = False + return same + return same + + +def check_config(config): + success = False + inlet_exist = False + for key in config: + if len(np.argwhere(config[key] == 1)) > 0: + inlet_exist = True + break + if inlet_exist: + success = True + else: + success = False + return success + + +def save_config_dict(filename, config_dict): + with open(filename, "wb") as f: + pickle.dump(config_dict, f) + + +def load_config_dict(filename): + with open(filename, "rb") as f: + config_dict = pickle.load(f) + return config_dict + + +def write_script_start(filename, n): + with open(filename, "w+") as f: + for i in range(n): + f.write(f"cd Sim_{i}\n") + f.write(f"sbatch script\n") + f.write(f"cd ..\n") + + +def write_script_post(filename, n): + with open(filename, "w+") as f: + for i in range(n): + f.write(f"cd Sim_{i}\n") + f.write(f"sbatch script_post\n") + f.write(f"cd ..\n") + + +def write_prep(filename, n): + with open(filename, "w+") as f: + f.write("prep () {\n") + f.write(f"\tcd $1\n") + f.write(f"\treconstructPar -newTimes\n") + f.write(f"\tcd ..\n") + f.write("}\n") + f.write(f"\n") + f.write( + f"source /projects/gas2fuels/ofoam_cray_mpich/OpenFOAM-dev/etc/bashrc\n" + ) + for i in range(n): + f.write(f"prep Sim_{i}\n") + + +def overwrite_vvm(case_folder, vvm): + list_dir = os.listdir(case_folder) + if not "constant" in list_dir: + sys.exit( + f"ERROR: {case_folder} is likely not a case folder, could not find constant/" + ) + else: + filename = os.path.join(case_folder, "constant", "globalVars_temp") + filename_write = os.path.join( + case_folder, "constant", "globalVars_temp2" + ) + with open(filename, "r+") as f: + lines = f.readlines() + with open(filename_write, "w+") as f: + for line in lines: + if line.startswith("VVM"): + f.write(f"VVM\t{vvm};\n") + else: + f.write(line) + shutil.copy( + os.path.join(case_folder, "constant", "globalVars_temp2"), + os.path.join(case_folder, "constant", "globalVars_temp"), + ) + os.remove(os.path.join(case_folder, "constant", "globalVars_temp2")) + + +def overwrite_bubble_size_model(case_folder, constantD=False): + list_dir = os.listdir(case_folder) + if not "constant" in list_dir: + sys.exit( + f"ERROR: {case_folder} is likely not a case folder, could not find constant/" + ) + else: + filename = os.path.join(case_folder, "presteps.sh") + filename_write = os.path.join(case_folder, "presteps2.sh") + with open(filename, "r+") as f: + lines = f.readlines() + with open(filename_write, "w+") as f: + for line in lines: + if line.startswith("cp constant/phaseProperties"): + if constantD: + f.write( + "cp constant/phaseProperties_constantd constant/phaseProperties\n" + ) + else: + f.write( + "cp constant/phaseProperties_pbe constant/phaseProperties\n" + ) + else: + f.write(line) + shutil.copy( + os.path.join(case_folder, "presteps2.sh"), + os.path.join(case_folder, "presteps.sh"), + ) + os.remove(os.path.join(case_folder, "presteps2.sh")) + + +def generate_small_reactor_cases( + config_dict, branchcom_spots, vvm, power, constantD, study_folder +): + templateFolder = "loop_reactor_pbe_dynmix_nonstat_headbranch" + + geom_dict = make_default_geom_dict_from_file( + f"{BIRD_CASE_DIR}/{templateFolder}/system/mesh.json", + rescale=0.05, + ) + try: + shutil.rmtree(study_folder) + except: + pass + os.makedirs(study_folder) + for simid in config_dict: + shutil.copytree( + f"{BIRD_CASE_DIR}/{templateFolder}", + f"{study_folder}/Sim_{simid}", + ) + bc_dict = {} + bc_dict["inlets"] = [] + bc_dict["outlets"] = [] + bc_dict["outlets"].append( + { + "branch_id": 6, + "type": "circle", + "frac_space": 1, + "normal_dir": 1, + "radius": 0.4, + "nelements": 50, + "block_pos": "top", + } + ) + bc_dict["outlets"].append( + { + "branch_id": 4, + "type": "circle", + "frac_space": 1, + "normal_dir": 1, + "radius": 0.4, + "nelements": 50, + "block_pos": "top", + } + ) + for branch in config_dict: + if branch in [0, 1, 2]: + ind = np.argwhere(config_dict[simid][branch] == 1) + if len(ind) > 0: + ind = list(ind[:, 0]) + for iind in ind: + bc_dict["inlets"].append( + { + "branch_id": branch, + "type": "circle", + "frac_space": branchcom_spots[branch][iind], + "normal_dir": 1, + "radius": 0.4, + "nelements": 50, + "block_pos": "bottom", + } + ) + generate_stl_patch( + os.path.join( + study_folder, f"Sim_{simid}", "system", "inlets_outlets.json" + ), + bc_dict, + geom_dict, + ) + + mix_list = [] + for branch in config_dict: + if branch in [0, 1, 2]: + ind = np.argwhere(config_dict[simid][branch] == 0) + if len(ind) > 0: + ind = list(ind[:, 0]) + for iind in ind: + if branch == 0: + sign = "+" + else: + sign = "-" + mix_list.append( + { + "branch_id": branch, + "frac_space": branchcom_spots[branch][iind], + "start_time": 1, + "power": power, + "sign": sign, + } + ) + generate_dynamic_mixer( + os.path.join( + study_folder, f"Sim_{simid}", "system", "mixers.json" + ), + mix_list, + geom_dict, + ) + overwrite_vvm( + case_folder=os.path.join(study_folder, f"Sim_{simid}"), vvm=vvm + ) + overwrite_bubble_size_model( + case_folder=os.path.join(study_folder, f"Sim_{simid}"), + constantD=constantD, + ) + + geom_dict = make_default_geom_dict_from_file( + f"{BIRD_CASE_DIR}/{templateFolder}/system/mesh.json", + rescale=0.05, + ) + + +def generate_scaledup_reactor_cases( + config_dict, branchcom_spots, vvm, power, constantD, study_folder +): + + templateFolder = "loop_reactor_pbe_dynmix_nonstat_headbranch_scaleup" + geom_dict = make_default_geom_dict_from_file( + f"{BIRD_CASE_DIR}/{templateFolder}/system/mesh.json" + ) + try: + shutil.rmtree(study_folder) + except: + pass + os.makedirs(study_folder) + for simid in config_dict: + shutil.copytree( + f"{BIRD_CASE_DIR}/{templateFolder}", + f"{study_folder}/Sim_{simid}", + ) + bc_dict = {} + bc_dict["inlets"] = [] + bc_dict["outlets"] = [] + bc_dict["outlets"].append( + { + "branch_id": 6, + "type": "circle", + "frac_space": 1, + "normal_dir": 1, + "radius": 0.4, + "nelements": 50, + "block_pos": "top", + } + ) + bc_dict["outlets"].append( + { + "branch_id": 4, + "type": "circle", + "frac_space": 1, + "normal_dir": 1, + "radius": 0.4, + "nelements": 50, + "block_pos": "top", + } + ) + for branch in config_dict: + if branch in [0, 1, 2]: + ind = np.argwhere(config_dict[simid][branch] == 1) + if len(ind) > 0: + ind = list(ind[:, 0]) + for iind in ind: + bc_dict["inlets"].append( + { + "branch_id": branch, + "type": "circle", + "frac_space": branchcom_spots[branch][iind], + "normal_dir": 1, + "radius": 0.4, + "nelements": 50, + "block_pos": "bottom", + } + ) + generate_stl_patch( + os.path.join( + study_folder, f"Sim_{simid}", "system", "inlets_outlets.json" + ), + bc_dict, + geom_dict, + ) + + mix_list = [] + for branch in config_dict: + if branch in [0, 1, 2]: + ind = np.argwhere(config_dict[simid][branch] == 0) + if len(ind) > 0: + ind = list(ind[:, 0]) + for iind in ind: + if branch == 0: + sign = "+" + else: + sign = "-" + mix_list.append( + { + "branch_id": branch, + "frac_space": branchcom_spots[branch][iind], + "start_time": 3, + "power": power, + "sign": sign, + } + ) + generate_dynamic_mixer( + os.path.join( + study_folder, f"Sim_{simid}", "system", "mixers.json" + ), + mix_list, + geom_dict, + ) + overwrite_vvm( + case_folder=os.path.join(study_folder, f"Sim_{simid}"), vvm=vvm + ) + overwrite_bubble_size_model( + case_folder=os.path.join(study_folder, f"Sim_{simid}"), + constantD=constantD, + ) diff --git a/bird/preprocess/stl_patch/stl_bc.py b/bird/preprocess/stl_patch/stl_bc.py index 29a96c4c..032f5316 100644 --- a/bird/preprocess/stl_patch/stl_bc.py +++ b/bird/preprocess/stl_patch/stl_bc.py @@ -12,7 +12,7 @@ def check_input(input_dict): assert isinstance(input_dict, dict) need_geom = False for bound in input_dict: - if not bound == "Geometry": + if not bound == "Geometry" and not bound == "Meshing": assert isinstance(input_dict[bound], list) for patch in input_dict[bound]: assert isinstance(patch, dict) @@ -41,7 +41,7 @@ def write_boundaries(input_dict): check_input(input_dict) for boundary_name in input_dict.keys(): if not boundary_name == "Geometry": - print(f"Making {boundary_name}") + print(f"\nMaking {boundary_name}") boundary_mesh = get_all_vert_faces(input_dict, boundary_name) print(f"\tArea {boundary_mesh.area} m2") boundary_mesh.save(f"{boundary_name}.stl") diff --git a/bird/preprocess/stl_patch/stl_shapes.py b/bird/preprocess/stl_patch/stl_shapes.py index e9cc1fec..bb5a9ab6 100644 --- a/bird/preprocess/stl_patch/stl_shapes.py +++ b/bird/preprocess/stl_patch/stl_shapes.py @@ -9,7 +9,7 @@ def make_polygon(rad, nvert, center, normal_dir): print( - f"\tMaking polygon at ({center[0]:.4g}, {center[1]:.4g}, {center[2]:.4g})" + f"\tMaking polygon at ({center[0]:.4g}, {center[1]:.4g}, {center[2]:.4g})m" ) theta = 2 * np.pi / nvert vertices = np.zeros((nvert, 3)) @@ -27,7 +27,7 @@ def make_polygon(rad, nvert, center, normal_dir): def make_rectangle(w, h, center, normal_dir): print( - f"\tMaking rectangle at ({center[0]:.4g}, {center[1]:.4g}, {center[2]:.4g})" + f"\tMaking rectangle at ({center[0]:.4g}, {center[1]:.4g}, {center[2]:.4g})m" ) # Define vertices t1dir = (normal_dir + 1) % 3 @@ -50,7 +50,7 @@ def make_rectangle(w, h, center, normal_dir): def make_circle(radius, center, normal_dir, npts=3): print( - f"\tMaking circle at ({center[0]:.4g}, {center[1]:.4g}, {center[2]:.4g})" + f"\tMaking circle at ({center[0]:.4g}, {center[1]:.4g}, {center[2]:.4g})m" ) vertices = np.zeros((npts + 1, 3)) t1dir = (normal_dir + 1) % 3 diff --git a/bird/utilities/ofio.py b/bird/utilities/ofio.py index 6a0877b4..8f9d8f41 100644 --- a/bird/utilities/ofio.py +++ b/bird/utilities/ofio.py @@ -127,13 +127,16 @@ def readSizeGroups(file): return sizeGroup, binGroup -def getCaseTimes(casePath): +def getCaseTimes(casePath, remove_zero=False): # Read Time times_tmp = os.listdir(casePath) # remove non floats for i, entry in reversed(list(enumerate(times_tmp))): try: a = float(entry) + if remove_zero: + if abs(a) < 1e-12: + _ = times_tmp.pop(i) except ValueError: a = times_tmp.pop(i) # print('removed ', a) diff --git a/bird/version.py b/bird/version.py index 2ed1d089..4b814da6 100644 --- a/bird/version.py +++ b/bird/version.py @@ -1,3 +1,3 @@ """Bio reactor design version""" -__version__ = "0.0.14" +__version__ = "0.0.15" diff --git a/papers/tutorial/calibration/README.md b/papers/tutorial/calibration/README.md deleted file mode 100644 index ab186d5f..00000000 --- a/papers/tutorial/calibration/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# Calibration tutorial - -This tutorial demonstrates how to conduct the calibration with and without a surrogate forward model - -## Running the tutorial -We assume that bird is installed within an environment called `bird` (see installation instruction at the root of the repo) -You will need to install additional dependencies -``` -conda activate bird -cd ${BIRD_DIR}/../papers/tutorial/calibration -pip install -r requirememts.txt -``` -Note that `${BIRD_DIR}` is not an environment variable, and should be replaced by the path to the root of the repo. - -## Calibration Objective - -The PDF of a Beta(alpha,beta) distribution is observed. -Within the context of bioreactors, one can consider this PDF to be a measured bubble size distribution (BSD) - -A separate dummy numerical model is available and predicts BSD as normal distributions N(mu, sigma). The input parameter of the numerical models are mu and sigma. The objective of the modeler is to find mu and sigma such that the predicted BSD matches the observed BSD - -We assume that the numerical model is expensive and instead of using the expensive numerical model for the forward model used in the calibration, one would like to use a cheaper surrogate model. Here the surrogate model is a neural network. - - -## Building the surrogate - -The class `Param_NN` available in BiRD allows to create a parametric surrogate. Here, the input of the surrogate are the parameters `mu` and `sigma`, and the variable `x` that parameterize the PDF. - -Constructing such a surrogate is not computationally useful here since the forward simulation is cheap. This is only for illustrative purposes! - -Generate dataset and train neural net surrogate with `python tut_surrogate.py`. -The following plots should be generated. The first one shows the training and testing loss convergence. The second one shows examples of the surrogate accuracy on unseen data. - -

- - -

- - -## Calibration - -For the calibration, we can use the true function or the surrogate model. The objective PDF is assumed to be noiseless. Even though the observation is noiseless, an uncertainty is computed to account for the missing physics. - -Calibrate without a surrogate for `alpha=5, beta=5`: `python tut_calibration_all.py --alpha 5 --beta 5` - -

- - -

- - -Calibrate without a surrogate for `alpha=2, beta=5`: `python tut_calibration_all.py --alpha 2 --beta 5` - - -

- - -

- -Clearly, the amount of missing physics vary depending on the observations. - -Then the same exercise can be done when using a neural net surrogate. Note that this step will not run if the `Building the surrogate` step was not done first - -Calibrate with a surrogate for `alpha=5, beta=5`: `python tut_calibration_all.py --useNN --alpha 5 --beta 5` - -

- - -

- - -Calibrate with a surrogate for `alpha=2, beta=5`: `python tut_calibration_all.py --useNN --alpha 2 --beta 5` - - -

- - -

- -Using surrogate gives similar predictions as when not using a surrogate. But the surrogate was constructed with 200 forward simulations. diff --git a/papers/tutorial/calibration/assets/Loss_surr.png b/papers/tutorial/calibration/assets/Loss_surr.png deleted file mode 100644 index cee6cf5fac328cb70492083b13d97ed9620ec726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56018 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 diff --git a/papers/tutorial/calibration/assets/Surr_a_2_b_5_corner.png b/papers/tutorial/calibration/assets/Surr_a_2_b_5_corner.png deleted file mode 100644 index 3f0373cc6e863814484de2770d719332b26e6146..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17042 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 E0&@tmyZ`_I diff --git a/papers/tutorial/calibration/assets/Surr_a_2_b_5_prop.png b/papers/tutorial/calibration/assets/Surr_a_2_b_5_prop.png deleted file mode 100644 index 177bef848d0af04fa65e839d31c51f449915c8ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53951 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 ATmS$7 diff --git a/papers/tutorial/calibration/assets/Surr_a_5_b_5_corner.png b/papers/tutorial/calibration/assets/Surr_a_5_b_5_corner.png deleted file mode 100644 index 8a5aab20f29c9c03116908280e816c168fd51c78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16313 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 diff --git a/papers/tutorial/calibration/assets/Surr_a_5_b_5_prop.png b/papers/tutorial/calibration/assets/Surr_a_5_b_5_prop.png deleted file mode 100644 index 7a84104d44c4f87802b5367d8c41e7bc84419b6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50324 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 IZQ%Al0EGv4aR2}S diff --git a/papers/tutorial/calibration/assets/True_a_2_b_5_prop.png b/papers/tutorial/calibration/assets/True_a_2_b_5_prop.png deleted file mode 100644 index f15de0ce795484a99d277762435903f19a6194e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59605 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≫zR{=1|9z2%8(P}w7(r%MEbRE z?VyT&dJinv`&dPnoSd4KHrHJ88AuD>jBsJACe$QdpoPWMtzCbc0PDzr-hZwoS6z%} z@$MshV+s>xp-m3((s;1zOv72I?)l13*&MWbM=6JpgP6FudXBTo3hE|gNzauxS?yRt zp8XGaKc}eZT*I%42@&@-L~|veAy*kWcI?<73ZZ}k04r(DPm0TOawOF?G}vEbsZ6aB zCV045E0B7)=FqBABlArEMCHvXbN@!^9V-5J08*mJPagZ- zQWx)((O?+UK(~VC^v&POD=tY>o)OQUJ%BLQFkM?C0uc&-<+$KFOp18C7)ZDr5#96ZiZ&}d)ya~cz5b=wQE;N5WIo_V!$hgV zS*tMRSVEPtreSAea~lPreYvQOWxeM#21I<&grP1xnr&Xb#e4VJS5uzOtACwfKSbXK z8QhltFnj-%7=tZKTqox1gk%j|x;i}ZE&31Aq~3cH>Ig__L-sf!n}cwm$3Eq1IDi%SlO|n0N;ub*pD+<*yty65o1f(34uM#JRFZuGO%M_;n8R@ z%$P@Lr4mO1LA7sHT4g{n4%#)(V>zcS$l7%M{goM?g};M|0FiHy@j`L zFa3MAkQM}FWetFb@6-|hTU2Wx9 zD2);6cF>kogqjA-<6QKRnbB5Zc+)zw%t9e&c-PUfqu*!M$v@Ge2g@FBWZ_RD-AJJ* zFHe(o#j+30KK&eyt%8oYa7?UvS;q<|S4> z{*j4sg#WF*vS0K4iYfn>sj?#HGG0GC_gs}Kx_}sy{AaHrx|HmS6)h&C_Kfq}6TSb& z@98Ig`&1Mmv)(12^HqW>nXzv6AZ-#!_bP}QSr5TndoGtvXsQpsMBO5_W=g~oqHiNa z%i!-~854|sz~}e8oX+Asl!S*5rYgy3GHY*G>m2>L%5BHh`bM0?ud&4xHh#kpMI`XTLWW+S`^-fK-`g;+Zr_g7p6CNQ-phoF^xvCtXX7m% zIR)-}9kka3Jc&CRc<0WR4W_+9LWIVdpaMiTN}t0@N0~!KN|3)s&KIdUg8J)aqYJk2 zef4LF=SP_O|53T=W@b9kc3|tngKpTPK!DIcakf}I>E%2;B*>#R^f_0qMo4!E?^PG- zE^?y(PZ2u?kojxI6&-m(${GDiyi&YL23s}b7F26Bu@*jeL26Th;u%b}I9Z37ZntqH zB1t0Cl4x*IRPERIsMGFW9I)ALk4(eFFFUezv3FRna+BtL8Hu6x$Vh5lQDO<%%tTwe z+YWXbeD*{ME4}oFsEka$$_TT;ot2#_F`aVJ{5-PG165vsHoMS1AFaR$QU-ya_4%+a zAN}#;9ip*nDmFJf3r7mEnk_uZVll>w$VL@;%s2NqE`ji%%fPvWBiS&UyA&!!nqP|` zDrZg}xg0j{&8Tz%yV9k%>^T)v)%b7&pBBt@R_#1UU!lOvddlt;h+2U-`)Bk2Afc%H zmMm_nAgnN53g=$vs8}tMgV}yC9kd^p8#gY2A883Piik&nM{8&Rxr*Yw2M^ADV^D++ zGD1j3ChFVw@4nMD#7~P<#-UO(5GMXzTY!abw%mONknY~S$4A&_FbnARojI ziHHZ}VlVYx&Ck1{QV^>bVhjBSl2zd*g`{2(9f=2H1#F#Et;>VKJo>Yje?4R0ai6T6 zA4>lWqg++Vmv(T^4^Xs-6*Jj8zR0+3+i}bSsk+WQtH_Qhrl%)CuzeR@2Ynl~1*_E` zh{#Q7zvpJ`wPTftvso{<_e=4<`E~O>Z*Z^i;B#T3TrCg|zWkQI&&{xL~AuC-o+ zeS`qWPyzMG5K5 zJ5d4_sA=mE#TdW6!_&hfSIVX?2QCJq1z$nbmBU=9u(_PdX~C$>T`Iq@u({zooY3Wf z3wOdXG2s9j3W8H>R^gbO9KH%N<(cpySY#(nEn2@;B%-}1n5Hp^tp5dYZR{O7g}DSF4kGxnem xsjX-I{_S%$bJcDBe|7)=n}!JgZ$4((_oa4Fn`-UODH8rUaqN_Oma1jI{{pefLgWAd diff --git a/papers/tutorial/calibration/assets/True_a_5_b_5_corner.png b/papers/tutorial/calibration/assets/True_a_5_b_5_corner.png deleted file mode 100644 index 5c210c7dee8ee530ac5f50cbb8d152afd32afaf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16300 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 0 or np.amin(true_p95 - max_real) < 0: - print( - f" Increase STD {np.amax(true_m95 - min_real)} - {np.amin(true_p95 - max_real)}" - ) - return False, results - else: - return True, results - - -min_sigma = 1e-4 -max_sigma = 1 -guess_sigma = 0.07 -sigma = guess_sigma - -for iteration_sigma in range(10): - print(f"Doing sigma = {sigma:.3g}") - reduce_sigma, results = mcmc_iter(y_err=sigma, mcmc_method="hmc") - if reduce_sigma: - max_sigma = sigma - sigma = sigma - (sigma - min_sigma) / 2 - else: - min_sigma = sigma - sigma = sigma + (max_sigma - sigma) / 2 - -if not reduce_sigma: - reduce_sigma, results = mcmc_iter(y_err=max_sigma, mcmc_method="hmc") - -np_mcmc_samples = results["samples"] -labels_np = results["labels_np"] -labels = results["labels"] -nparams = len(labels) -np.savez( - os.path.join("samp.npz"), - samples=np_mcmc_samples, - labels_np=labels_np, - labels=labels, -) - -post_process_cal( - labels_np, - labels, - np_mcmc_samples, - rangex, - forward_range, - data_x, - data_y, - sigma, -) diff --git a/papers/tutorial/calibration/tut_surrogate.py b/papers/tutorial/calibration/tut_surrogate.py deleted file mode 100644 index 54dd6d3d..00000000 --- a/papers/tutorial/calibration/tut_surrogate.py +++ /dev/null @@ -1,138 +0,0 @@ -import os - -import numpy as np -import tensorflow as tf -from prettyPlot.plotting import * - -from bird.calibration.param_nn import Param_NN - - -def simulation(mu, sigma, x): - return (1 / np.sqrt(2 * np.pi * sigma**2)) * np.exp( - -((x - mu) ** 2) / (2 * sigma**2) - ) - - -def concat_np_dat(x, mu, sigma): - assert len(mu.shape) == 1 - assert mu.shape == sigma.shape - assert len(x.shape) == 1 - n_dat_var = len(x) - n_sim = len(mu) - x_ind = 0 - mu_ind = 1 - sigma_ind = 2 - n_data = n_sim * n_dat_var - dim = 3 - dataset_x = np.zeros((n_data, dim)) - dataset_y = np.zeros((n_data,)) - for i_sim in range(n_sim): - beg = i_sim * n_dat_var - end = (i_sim + 1) * n_dat_var - dataset_x[beg:end, x_ind] = x - dataset_x[beg:end, mu_ind] = mu[i_sim] - dataset_x[beg:end, sigma_ind] = sigma[i_sim] - dataset_y[beg:end] = simulation(mu[i_sim], sigma[i_sim], x) - - return dataset_x, dataset_y - - -def make_dataset(n_sim, n_dat_var=32): - parameter_names = ["mu", "sigma"] - variable_names = ["x"] - - input_names = variable_names + parameter_names - - dim = len(input_names) - dim_var = len(variable_names) - dim_par = len(parameter_names) - - mu = np.random.uniform(0.01, 0.9, n_sim) - sigma = np.random.uniform(0.01, 0.9, n_sim) - x = np.linspace(1e-6, 1 - 1e-6, n_dat_var) - - return concat_np_dat(x, mu, sigma) - - -def plot_loss(loss_dict): - fig = plt.figure() - plt.plot( - loss_dict["epoch"], - loss_dict["train_loss"], - color="k", - linewidth=3, - label="train", - ) - plt.plot( - loss_dict["epoch"], - loss_dict["val_loss"], - color="b", - linewidth=3, - label="test", - ) - pretty_labels("Epoch", "Loss", 16) - pretty_legend() - ax = plt.gca() - ax.set_yscale("log") - plt.tight_layout() - - -def plot_test(nn, n_sim_test=5): - # test - mu = np.random.uniform(0.01, 0.9, n_sim_test) - sigma = np.random.uniform(0.01, 0.9, n_sim_test) - n_dat_var = 64 - x = np.linspace(1e-6, 1 - 1e-6, n_dat_var) - - data_test_x, data_test_y = concat_np_dat(x, mu, sigma) - y_pred = nn.pred(data_test_x[:, 0], data_test_x[:, 1:]) - - fig, axs = plt.subplots(1, n_sim_test, figsize=(4 * n_sim_test, 4)) - for i_sim_test in range(n_sim_test): - beg = i_sim_test * n_dat_var - end = (i_sim_test + 1) * n_dat_var - axs[i_sim_test].plot(x, data_test_y[beg:end], label="true") - axs[i_sim_test].plot(x, y_pred[beg:end], label="pred") - pretty_labels( - "", - "", - 16, - ax=axs[i_sim_test], - title=rf"$\mu = {mu[i_sim_test]:.2f}$ $\sigma = {sigma[i_sim_test]:.2f}$", - grid=False, - ) - if i_sim_test == n_sim_test - 1: - pretty_legend(ax=axs[i_sim_test]) - - -if __name__ == "__main__": - n_par = 2 - n_var = 1 - np.random.seed(0) - tf.random.set_seed(0) - x, y = make_dataset(200, 64) - np.savez("data_raw.npz", x=x.astype("float32"), y=y.astype("float32")) - - nn = Param_NN( - input_dim=n_var + n_par, - output_dim=1, - units=[10, 10, 10, 5], - activation="tanh", - final_activation="elu", - model_folder="Modeltmp", - log_loss_folder="Logtmp", - ) - - nn.train( - learningRateModel=1e-3, - batch_size=128, - nEpochs=2000, - data_file="data_raw.npz", - ) - - # Plot loss - plot_loss(nn.get_loss_dat()) - - # Plot test - plot_test(nn, n_sim_test=5) - plt.show() diff --git a/setup.py b/setup.py index 28cdc688..877ee8a1 100644 --- a/setup.py +++ b/setup.py @@ -39,6 +39,7 @@ "*.yaml", "*.csv", "data_conditional_mean", + "data_preprocess", ] }, include_package_data=True, diff --git a/tests/postprocess/test_cond_mean.py b/tests/postprocess/test_cond_mean.py index c453b99a..2367367d 100644 --- a/tests/postprocess/test_cond_mean.py +++ b/tests/postprocess/test_cond_mean.py @@ -2,6 +2,7 @@ from prettyPlot.plotting import plt, pretty_labels +from bird import BIRD_POST_DIR from bird.postprocess.conditional_mean import ( compute_cond_mean, save_cond, @@ -10,7 +11,12 @@ def test_compute_cond(): - caseFolder = os.path.join("bird", "postprocess", "data_conditional_mean") + if os.path.exists(os.path.join(BIRD_POST_DIR, "data_conditional_mean")): + caseFolder = os.path.join(BIRD_POST_DIR, "data_conditional_mean") + else: + caseFolder = os.path.join( + "bird", "postprocess", "data_conditional_mean" + ) fields_list = [ "CO.gas", "CO.liquid", diff --git a/tests/preprocess/test_generate_case.py b/tests/preprocess/test_generate_case.py new file mode 100644 index 00000000..d0e2536e --- /dev/null +++ b/tests/preprocess/test_generate_case.py @@ -0,0 +1,22 @@ +import os + +import pytest + +from bird import BIRD_PRE_DATA_DIR +from bird.preprocess.json_gen.generate_designs import ( + convert_case_dim, + replace_str_in_file, +) + + +@pytest.mark.parametrize( + "dim_factor", + [2, 4, 8], +) +def test_scale_dim(dim_factor): + input_folder = os.path.join(BIRD_PRE_DATA_DIR, "loop_reactor_3_6L") + convert_case_dim(input_folder, "dummy_loop", dim_factor) + + +if __name__ == "__main__": + test_scale_dim(2)