From 420866cfa652fe3ebacadd43edb63e2b01a9dda6 Mon Sep 17 00:00:00 2001 From: Will Bainbridge Date: Mon, 9 May 2022 14:36:17 +0100 Subject: [PATCH] Non-Conformal Coupled (NCC): Conversion of tutorials from AMI to NCC The following examples in the tutorials ($FOAM_TUTORIALS) directory have been converted from using AMI to the new NCC system: + compressible/rhoPimpleFoam/RAS/annularThermalMixer + incompressible/pimpleFoam/RAS/propeller + lagrangian/particleFoam/mixerVessel2D (formerly mixerVesselAMI2D) + multiphase/interFoam/RAS/mixerVessel + multiphase/interFoam/RAS/propeller + multiphase/multiphaseEulerFoam/laminar/mixerVessel2D (formerly mixerVesselAMI2D) The following tutorial has been converted from using ACMI: + incompressible/pimpleFoam/RAS/oscillatingInlet The following tutorial has been converted from using Repeat AMI: + incompressible/pimpleFoam/RAS/impeller The following tutorial has been added to demonstrate NCC's ability to create a sufficiently conservative solution in a closed domain to maintain phase fraction boundedness: + multiphase/interFoam/laminar/mixerVessel2D The following tutorials have been added to demonstrate NCC's ability to simulate partially overlapping couples on curved surfaces: + incompressible/pimpleFoam/RAS/ballValve + multiphase/compressibleInterFoam/RAS/ballValve The following tutorial has been added to provide a simple comparison of the conservation behaviour of AMI and NCC: + incompressible/pimpleFoam/laminar/nonConformalChannel The following tutorial has been removed, as there were sufficiently many examples involving this geometry: + incompressible/pimpleFoam/laminar/mixerVesselAMI2D --- .../rhoPimpleFoam/RAS/annularThermalMixer/0/T | 8 +- .../rhoPimpleFoam/RAS/annularThermalMixer/0/U | 7 +- .../RAS/annularThermalMixer/0/alphat | 13 +- .../RAS/annularThermalMixer/0/epsilon | 12 +- .../rhoPimpleFoam/RAS/annularThermalMixer/0/k | 7 +- .../RAS/annularThermalMixer/0/nut | 7 +- .../rhoPimpleFoam/RAS/annularThermalMixer/0/p | 7 +- .../RAS/annularThermalMixer/Allrun | 1 + .../constant/dynamicMeshDict | 2 +- .../constant/geometry/{AMI.obj => couple.obj} | 0 .../annularThermalMixer/system/controlDict | 2 +- .../system/createBafflesDict | 14 +- .../RAS/annularThermalMixer/system/fvSchemes | 1 + .../RAS/annularThermalMixer/system/fvSolution | 16 +- .../system/snappyHexMeshDict | 12 +- .../system/surfaceFeaturesDict | 2 +- .../pimpleFoam/RAS/ballValve/0/U | 46 ++ .../0/epsilon | 43 +- .../pimpleFoam/RAS/ballValve/0/k | 51 +++ .../pimpleFoam/RAS/ballValve/0/nut} | 37 +- .../pimpleFoam/RAS/ballValve/0/omega | 51 +++ .../pimpleFoam/RAS/ballValve/0/p | 46 ++ .../pimpleFoam/RAS/ballValve/0/s | 49 +++ .../pimpleFoam/RAS/ballValve/Allclean | 7 + .../pimpleFoam/RAS/ballValve/Allrun | 31 ++ .../RAS/ballValve}/constant/dynamicMeshDict | 8 +- .../RAS/ballValve/constant/momentumTransport | 29 ++ .../ballValve}/constant/physicalProperties | 0 .../pimpleFoam/RAS/ballValve/createGraphs | 30 ++ .../ballValve}/system/controlDict | 44 +- .../RAS/ballValve/system/decomposeParDict | 28 ++ .../pimpleFoam/RAS/ballValve/system/fvSchemes | 64 +++ .../ballValve}/system/fvSolution | 32 +- .../RAS/ballValve/system/setFieldsDict | 37 ++ .../ballValve}/system/topoSetDict | 20 +- .../RAS/ballValve/system/wallsSurface | 31 ++ .../pimpleFoam/RAS/impeller/0/U | 10 +- .../pimpleFoam/RAS/impeller/0/epsilon | 5 + .../pimpleFoam/RAS/impeller/0/k | 5 + .../pimpleFoam/RAS/impeller/0/nut | 6 + .../pimpleFoam/RAS/impeller/0/p | 7 +- .../pimpleFoam/RAS/impeller/Allclean | 7 + .../pimpleFoam/RAS/impeller/Allrun | 6 +- .../constant/geometry/surface0.stl.gz | Bin 10660 -> 0 bytes .../constant/geometry/surface1.stl.gz | Bin 2235 -> 0 bytes .../RAS/impeller/system/blockMeshDict | 64 ++- .../RAS/impeller/system/controlDict | 21 +- .../system/createNonConformalCouplesDict | 69 +++ .../pimpleFoam/RAS/impeller/system/fvSolution | 6 +- .../0/U | 33 +- .../oscillatingInlet}/0/epsilon | 43 +- .../0/k | 26 +- .../oscillatingInlet}/0/nut | 43 +- .../pimpleFoam/RAS/oscillatingInlet/0/omega | 52 +++ .../oscillatingInlet}/0/p | 35 +- .../pimpleFoam/RAS/oscillatingInlet/Allrun | 11 + .../constant/dynamicMeshDict | 0 .../constant/momentumTransport | 2 +- .../constant/physicalProperties | 0 .../system/blockMeshDict | 20 +- .../system/controlDict | 6 + .../system/decomposeParDict | 0 .../system/fvSchemes | 6 +- .../system/fvSolution | 21 +- .../pimpleFoam/RAS/oscillatingInletACMI2D/0/p | 69 --- .../RAS/oscillatingInletACMI2D/Allmesh | 14 - .../RAS/oscillatingInletACMI2D/Allrun | 9 - .../oscillatingInletACMI2D/Allrun-parallel | 13 - .../RAS/oscillatingInletACMI2D/README | 131 ------ .../system/createBafflesDict | 106 ----- .../oscillatingInletACMI2D/system/topoSetDict | 70 --- .../pimpleFoam/RAS/propeller/0/U | 13 +- .../pimpleFoam/RAS/propeller/0/epsilon | 6 +- .../pimpleFoam/RAS/propeller/0/k | 6 +- .../pimpleFoam/RAS/propeller/0/nut | 13 +- .../pimpleFoam/RAS/propeller/0/p | 8 +- .../pimpleFoam/RAS/propeller/Allclean | 3 + .../pimpleFoam/RAS/propeller/Allmesh | 18 +- .../pimpleFoam/RAS/propeller/Allrun | 10 +- .../RAS/propeller/system/createBafflesDict | 14 +- .../RAS/propeller/system/decomposeParDict | 4 +- .../pimpleFoam/RAS/propeller/system/fvSchemes | 6 +- .../RAS/propeller/system/fvSolution | 22 +- .../laminar/mixerVesselAMI2D/Allrun | 19 - .../laminar/nonConformalChannel/0/U | 47 ++ .../laminar/nonConformalChannel/0/p | 47 ++ .../laminar/nonConformalChannel/Allclean | 7 + .../laminar/nonConformalChannel/Allrun | 46 ++ .../constant/momentumTransport | 19 + .../constant/physicalProperties | 21 + .../system/blockMeshDict.AMI | 44 ++ .../system/blockMeshDict.boundary | 34 ++ .../system/blockMeshDict.internal | 47 ++ .../system/blockMeshDict.nonConformalCyclic | 44 ++ .../nonConformalChannel/system/controlDict | 58 +++ .../system/fvSchemes | 7 +- .../nonConformalChannel/system/fvSolution | 56 +++ .../{mixerVesselAMI2D => mixerVessel2D}/0/U | 24 +- .../Allrun | 7 +- .../constant/cloudPositions | 0 .../constant/cloudProperties | 0 .../constant/dynamicMeshDict | 34 +- .../constant/g | 0 .../mixerVessel2D}/constant/momentumTransport | 0 .../constant/physicalProperties | 0 .../system/controlDict | 2 +- .../mixerVessel2D}/system/createBafflesDict | 16 +- .../mixerVessel2D/system/decomposeParDict | 27 ++ .../system/fvSchemes | 0 .../system/fvSolution | 0 .../compressibleInterFoam/RAS/ballValve/0/Phi | 46 ++ .../compressibleInterFoam/RAS/ballValve/0/T | 49 +++ .../compressibleInterFoam/RAS/ballValve/0/U | 46 ++ .../RAS/ballValve/0/alpha.water | 49 +++ .../RAS/ballValve/0/epsilon | 51 +++ .../compressibleInterFoam/RAS/ballValve/0/k | 51 +++ .../compressibleInterFoam/RAS/ballValve/0/nut | 48 +++ .../compressibleInterFoam/RAS/ballValve/0/p | 47 ++ .../RAS/ballValve/0/p_rgh | 49 +++ .../RAS/ballValve/Allclean | 7 + .../RAS/ballValve/Allrun | 26 ++ .../RAS/ballValve/constant/dynamicMeshDict | 52 +++ .../RAS/ballValve}/constant/g | 0 .../RAS/ballValve/constant/momentumTransport | 29 ++ .../ballValve/constant/phaseChangeProperties | 29 ++ .../RAS/ballValve/constant/phaseProperties | 28 ++ .../constant/physicalProperties.vapour | 50 +++ .../constant/physicalProperties.water | 31 ++ .../RAS/ballValve/system/controlDict | 72 ++++ .../RAS/ballValve}/system/decomposeParDict | 10 +- .../RAS/ballValve/system/fvSchemes | 59 +++ .../RAS/ballValve/system/fvSolution | 100 +++++ .../RAS/ballValve/system/wallsSurface | 31 ++ .../RAS/{mixerVesselAMI => mixerVessel}/0/U | 39 +- .../0/alpha.oil.orig | 39 +- .../interFoam/RAS/mixerVessel/0/epsilon | 51 +++ .../interFoam/RAS/mixerVessel}/0/k | 44 +- .../interFoam/RAS/mixerVessel}/0/nut | 32 +- .../RAS/mixerVessel}/0/p_rgh | 36 +- .../{mixerVesselAMI => mixerVessel}/Allclean | 0 .../{mixerVesselAMI => mixerVessel}/Allmesh | 14 +- .../{mixerVesselAMI => mixerVessel}/Allrun | 15 +- .../constant/dynamicMeshDict | 0 .../constant/g | 0 .../constant/geometry/rotating.stl | 0 .../constant/momentumTransport | 0 .../constant/phaseProperties | 0 .../constant/physicalProperties.oil | 0 .../constant/physicalProperties.water | 0 .../system/blockMeshDict | 0 .../system/controlDict | 0 .../system/createBafflesDict | 20 +- .../system/decomposeParDict | 2 +- .../system/fvSchemes | 1 + .../system/fvSolution | 14 +- .../system/setFieldsDict | 0 .../system/snappyHexMeshDict | 0 .../system/surfaceFeaturesDict | 0 .../interFoam/RAS/mixerVesselAMI/0/epsilon | 76 ---- .../interFoam/RAS/mixerVesselAMI/0/k | 76 ---- .../interFoam/RAS/mixerVesselAMI/0/nut | 76 ---- .../interFoam/RAS/mixerVesselAMI/0/p_rgh | 82 ---- .../multiphase/interFoam/RAS/propeller/0/U | 13 +- .../interFoam/RAS/propeller/0/alpha.water | 6 +- .../interFoam/RAS/propeller/0/epsilon | 6 +- .../multiphase/interFoam/RAS/propeller/0/k | 6 +- .../multiphase/interFoam/RAS/propeller/0/nut | 13 +- .../interFoam/RAS/propeller/0/p_rgh | 6 +- .../interFoam/RAS/propeller/Allmesh | 17 +- .../multiphase/interFoam/RAS/propeller/Allrun | 8 +- .../RAS/propeller/system/createBafflesDict | 14 +- .../RAS/propeller/system/decomposeParDict | 4 +- .../interFoam/RAS/propeller/system/fvSchemes | 2 - .../interFoam/RAS/propeller/system/fvSolution | 31 +- .../interFoam/laminar/mixerVessel2D}/0/U | 24 +- .../laminar/mixerVessel2D/0/alpha.water.orig | 40 ++ .../interFoam/laminar/mixerVessel2D/0/p_rgh | 40 ++ .../interFoam/laminar/mixerVessel2D/Allrun | 16 + .../mixerVessel2D/constant/dynamicMeshDict | 56 +++ .../laminar/mixerVessel2D/constant/g | 20 + .../mixerVessel2D}/constant/momentumTransport | 0 .../mixerVessel2D/constant/phaseProperties | 22 + .../constant/physicalProperties.air | 24 ++ .../constant/physicalProperties.water | 24 ++ .../laminar/mixerVessel2D/system/controlDict | 53 +++ .../mixerVessel2D}/system/createBafflesDict | 16 +- .../laminar/mixerVessel2D/system/fvSchemes | 51 +++ .../laminar/mixerVessel2D/system/fvSolution | 83 ++++ .../mixerVessel2D/system/setFieldsDict | 35 ++ .../0/T.air | 26 +- .../0/T.mercury | 26 +- .../0/T.oil | 26 +- .../0/T.water | 26 +- .../0/U.air | 25 +- .../0/U.mercury | 25 +- .../0/U.oil | 25 +- .../0/U.water | 25 +- .../0/alpha.air | 24 +- .../0/alpha.mercury | 24 +- .../0/alpha.oil | 24 +- .../0/alpha.water | 24 +- .../laminar/mixerVessel2D/0/p | 44 ++ .../laminar/mixerVessel2D/0/p_rgh | 44 ++ .../Allrun | 1 + .../mixerVessel2D}/constant/dynamicMeshDict | 0 .../laminar/mixerVessel2D/constant/g | 21 + .../constant/momentumTransport.air | 0 .../constant/momentumTransport.mercury | 0 .../constant/momentumTransport.oil | 0 .../constant/momentumTransport.water | 0 .../constant/phaseProperties | 15 + .../constant/physicalProperties.air | 0 .../constant/physicalProperties.mercury | 0 .../constant/physicalProperties.oil | 0 .../constant/physicalProperties.water | 0 .../system/controlDict | 0 .../mixerVessel2D}/system/createBafflesDict | 16 +- .../system/fvSchemes | 0 .../system/fvSolution | 1 + .../laminar/mixerVesselAMI2D/0/alpha.map | 54 --- tutorials/resources/blockMesh/ballValve | 404 ++++++++++++++++++ .../resources/geometry/ballValve-torus.obj.gz | Bin 0 -> 41426 bytes 222 files changed, 3857 insertions(+), 1690 deletions(-) rename tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/constant/geometry/{AMI.obj => couple.obj} (100%) create mode 100644 tutorials/incompressible/pimpleFoam/RAS/ballValve/0/U rename tutorials/incompressible/pimpleFoam/RAS/{oscillatingInletACMI2D => ballValve}/0/epsilon (63%) create mode 100644 tutorials/incompressible/pimpleFoam/RAS/ballValve/0/k rename tutorials/{multiphase/multiphaseEulerFoam/laminar/mixerVesselAMI2D/0/p => incompressible/pimpleFoam/RAS/ballValve/0/nut} (68%) create mode 100644 tutorials/incompressible/pimpleFoam/RAS/ballValve/0/omega create mode 100644 tutorials/incompressible/pimpleFoam/RAS/ballValve/0/p create mode 100644 tutorials/incompressible/pimpleFoam/RAS/ballValve/0/s create mode 100755 tutorials/incompressible/pimpleFoam/RAS/ballValve/Allclean create mode 100755 tutorials/incompressible/pimpleFoam/RAS/ballValve/Allrun rename tutorials/{multiphase/multiphaseEulerFoam/laminar/mixerVesselAMI2D => incompressible/pimpleFoam/RAS/ballValve}/constant/dynamicMeshDict (85%) create mode 100644 tutorials/incompressible/pimpleFoam/RAS/ballValve/constant/momentumTransport rename tutorials/incompressible/pimpleFoam/{laminar/mixerVesselAMI2D => RAS/ballValve}/constant/physicalProperties (100%) create mode 100755 tutorials/incompressible/pimpleFoam/RAS/ballValve/createGraphs rename tutorials/incompressible/pimpleFoam/{laminar/mixerVesselAMI2D => RAS/ballValve}/system/controlDict (58%) create mode 100644 tutorials/incompressible/pimpleFoam/RAS/ballValve/system/decomposeParDict create mode 100644 tutorials/incompressible/pimpleFoam/RAS/ballValve/system/fvSchemes rename tutorials/incompressible/pimpleFoam/{laminar/mixerVesselAMI2D => RAS/ballValve}/system/fvSolution (71%) create mode 100644 tutorials/incompressible/pimpleFoam/RAS/ballValve/system/setFieldsDict rename tutorials/incompressible/pimpleFoam/{laminar/mixerVesselAMI2D => RAS/ballValve}/system/topoSetDict (73%) create mode 100644 tutorials/incompressible/pimpleFoam/RAS/ballValve/system/wallsSurface create mode 100755 tutorials/incompressible/pimpleFoam/RAS/impeller/Allclean delete mode 100644 tutorials/incompressible/pimpleFoam/RAS/impeller/constant/geometry/surface0.stl.gz delete mode 100644 tutorials/incompressible/pimpleFoam/RAS/impeller/constant/geometry/surface1.stl.gz create mode 100644 tutorials/incompressible/pimpleFoam/RAS/impeller/system/createNonConformalCouplesDict rename tutorials/incompressible/pimpleFoam/RAS/{oscillatingInletACMI2D => oscillatingInlet}/0/U (66%) rename tutorials/incompressible/pimpleFoam/{laminar/mixerVesselAMI2D => RAS/oscillatingInlet}/0/epsilon (80%) rename tutorials/incompressible/pimpleFoam/RAS/{oscillatingInletACMI2D => oscillatingInlet}/0/k (74%) rename tutorials/incompressible/pimpleFoam/{laminar/mixerVesselAMI2D => RAS/oscillatingInlet}/0/nut (76%) create mode 100644 tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/omega rename tutorials/incompressible/pimpleFoam/{laminar/mixerVesselAMI2D => RAS/oscillatingInlet}/0/p (74%) create mode 100755 tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/Allrun rename tutorials/incompressible/pimpleFoam/RAS/{oscillatingInletACMI2D => oscillatingInlet}/constant/dynamicMeshDict (100%) rename tutorials/incompressible/pimpleFoam/RAS/{oscillatingInletACMI2D => oscillatingInlet}/constant/momentumTransport (95%) rename tutorials/incompressible/pimpleFoam/RAS/{oscillatingInletACMI2D => oscillatingInlet}/constant/physicalProperties (100%) rename tutorials/incompressible/pimpleFoam/RAS/{oscillatingInletACMI2D => oscillatingInlet}/system/blockMeshDict (89%) rename tutorials/incompressible/pimpleFoam/RAS/{oscillatingInletACMI2D => oscillatingInlet}/system/controlDict (87%) rename tutorials/incompressible/pimpleFoam/RAS/{oscillatingInletACMI2D => oscillatingInlet}/system/decomposeParDict (100%) rename tutorials/incompressible/pimpleFoam/RAS/{oscillatingInletACMI2D => oscillatingInlet}/system/fvSchemes (89%) rename tutorials/incompressible/pimpleFoam/RAS/{oscillatingInletACMI2D => oscillatingInlet}/system/fvSolution (82%) delete mode 100644 tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/p delete mode 100755 tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/Allmesh delete mode 100755 tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/Allrun delete mode 100755 tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/Allrun-parallel delete mode 100644 tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/README delete mode 100644 tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/createBafflesDict delete mode 100644 tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/topoSetDict delete mode 100755 tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/Allrun create mode 100644 tutorials/incompressible/pimpleFoam/laminar/nonConformalChannel/0/U create mode 100644 tutorials/incompressible/pimpleFoam/laminar/nonConformalChannel/0/p create mode 100755 tutorials/incompressible/pimpleFoam/laminar/nonConformalChannel/Allclean create mode 100755 tutorials/incompressible/pimpleFoam/laminar/nonConformalChannel/Allrun create mode 100644 tutorials/incompressible/pimpleFoam/laminar/nonConformalChannel/constant/momentumTransport create mode 100644 tutorials/incompressible/pimpleFoam/laminar/nonConformalChannel/constant/physicalProperties create mode 100644 tutorials/incompressible/pimpleFoam/laminar/nonConformalChannel/system/blockMeshDict.AMI create mode 100644 tutorials/incompressible/pimpleFoam/laminar/nonConformalChannel/system/blockMeshDict.boundary create mode 100644 tutorials/incompressible/pimpleFoam/laminar/nonConformalChannel/system/blockMeshDict.internal create mode 100644 tutorials/incompressible/pimpleFoam/laminar/nonConformalChannel/system/blockMeshDict.nonConformalCyclic create mode 100644 tutorials/incompressible/pimpleFoam/laminar/nonConformalChannel/system/controlDict rename tutorials/incompressible/pimpleFoam/laminar/{mixerVesselAMI2D => nonConformalChannel}/system/fvSchemes (85%) create mode 100644 tutorials/incompressible/pimpleFoam/laminar/nonConformalChannel/system/fvSolution rename tutorials/lagrangian/particleFoam/{mixerVesselAMI2D => mixerVessel2D}/0/U (76%) rename tutorials/lagrangian/particleFoam/{mixerVesselAMI2D => mixerVessel2D}/Allrun (61%) rename tutorials/lagrangian/particleFoam/{mixerVesselAMI2D => mixerVessel2D}/constant/cloudPositions (100%) rename tutorials/lagrangian/particleFoam/{mixerVesselAMI2D => mixerVessel2D}/constant/cloudProperties (100%) rename tutorials/lagrangian/particleFoam/{mixerVesselAMI2D => mixerVessel2D}/constant/dynamicMeshDict (67%) rename tutorials/lagrangian/particleFoam/{mixerVesselAMI2D => mixerVessel2D}/constant/g (100%) rename tutorials/{incompressible/pimpleFoam/laminar/mixerVesselAMI2D => lagrangian/particleFoam/mixerVessel2D}/constant/momentumTransport (100%) rename tutorials/lagrangian/particleFoam/{mixerVesselAMI2D => mixerVessel2D}/constant/physicalProperties (100%) rename tutorials/lagrangian/particleFoam/{mixerVesselAMI2D => mixerVessel2D}/system/controlDict (97%) rename tutorials/{multiphase/multiphaseEulerFoam/laminar/mixerVesselAMI2D => lagrangian/particleFoam/mixerVessel2D}/system/createBafflesDict (76%) create mode 100644 tutorials/lagrangian/particleFoam/mixerVessel2D/system/decomposeParDict rename tutorials/lagrangian/particleFoam/{mixerVesselAMI2D => mixerVessel2D}/system/fvSchemes (100%) rename tutorials/lagrangian/particleFoam/{mixerVesselAMI2D => mixerVessel2D}/system/fvSolution (100%) create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/0/Phi create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/0/T create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/0/U create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/0/alpha.water create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/0/epsilon create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/0/k create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/0/nut create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/0/p create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/0/p_rgh create mode 100755 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/Allclean create mode 100755 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/Allrun create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/constant/dynamicMeshDict rename tutorials/multiphase/{multiphaseEulerFoam/laminar/mixerVesselAMI2D => compressibleInterFoam/RAS/ballValve}/constant/g (100%) create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/constant/momentumTransport create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/constant/phaseChangeProperties create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/constant/phaseProperties create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/constant/physicalProperties.vapour create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/constant/physicalProperties.water create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/system/controlDict rename tutorials/{incompressible/pimpleFoam/laminar/mixerVesselAMI2D => multiphase/compressibleInterFoam/RAS/ballValve}/system/decomposeParDict (78%) create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/system/fvSchemes create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/system/fvSolution create mode 100644 tutorials/multiphase/compressibleInterFoam/RAS/ballValve/system/wallsSurface rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/0/U (69%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/0/alpha.oil.orig (65%) create mode 100644 tutorials/multiphase/interFoam/RAS/mixerVessel/0/epsilon rename tutorials/{incompressible/pimpleFoam/laminar/mixerVesselAMI2D => multiphase/interFoam/RAS/mixerVessel}/0/k (71%) rename tutorials/{incompressible/pimpleFoam/RAS/oscillatingInletACMI2D => multiphase/interFoam/RAS/mixerVessel}/0/nut (70%) rename tutorials/multiphase/{multiphaseEulerFoam/laminar/mixerVesselAMI2D => interFoam/RAS/mixerVessel}/0/p_rgh (80%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/Allclean (100%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/Allmesh (57%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/Allrun (54%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/constant/dynamicMeshDict (100%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/constant/g (100%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/constant/geometry/rotating.stl (100%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/constant/momentumTransport (100%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/constant/phaseProperties (100%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/constant/physicalProperties.oil (100%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/constant/physicalProperties.water (100%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/system/blockMeshDict (100%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/system/controlDict (100%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/system/createBafflesDict (61%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/system/decomposeParDict (96%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/system/fvSchemes (99%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/system/fvSolution (89%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/system/setFieldsDict (100%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/system/snappyHexMeshDict (100%) rename tutorials/multiphase/interFoam/RAS/{mixerVesselAMI => mixerVessel}/system/surfaceFeaturesDict (100%) delete mode 100644 tutorials/multiphase/interFoam/RAS/mixerVesselAMI/0/epsilon delete mode 100644 tutorials/multiphase/interFoam/RAS/mixerVesselAMI/0/k delete mode 100644 tutorials/multiphase/interFoam/RAS/mixerVesselAMI/0/nut delete mode 100644 tutorials/multiphase/interFoam/RAS/mixerVesselAMI/0/p_rgh rename tutorials/{incompressible/pimpleFoam/laminar/mixerVesselAMI2D => multiphase/interFoam/laminar/mixerVessel2D}/0/U (76%) create mode 100644 tutorials/multiphase/interFoam/laminar/mixerVessel2D/0/alpha.water.orig create mode 100644 tutorials/multiphase/interFoam/laminar/mixerVessel2D/0/p_rgh create mode 100755 tutorials/multiphase/interFoam/laminar/mixerVessel2D/Allrun create mode 100644 tutorials/multiphase/interFoam/laminar/mixerVessel2D/constant/dynamicMeshDict create mode 100644 tutorials/multiphase/interFoam/laminar/mixerVessel2D/constant/g rename tutorials/{lagrangian/particleFoam/mixerVesselAMI2D => multiphase/interFoam/laminar/mixerVessel2D}/constant/momentumTransport (100%) create mode 100644 tutorials/multiphase/interFoam/laminar/mixerVessel2D/constant/phaseProperties create mode 100644 tutorials/multiphase/interFoam/laminar/mixerVessel2D/constant/physicalProperties.air create mode 100644 tutorials/multiphase/interFoam/laminar/mixerVessel2D/constant/physicalProperties.water create mode 100644 tutorials/multiphase/interFoam/laminar/mixerVessel2D/system/controlDict rename tutorials/{lagrangian/particleFoam/mixerVesselAMI2D => multiphase/interFoam/laminar/mixerVessel2D}/system/createBafflesDict (76%) create mode 100644 tutorials/multiphase/interFoam/laminar/mixerVessel2D/system/fvSchemes create mode 100644 tutorials/multiphase/interFoam/laminar/mixerVessel2D/system/fvSolution create mode 100644 tutorials/multiphase/interFoam/laminar/mixerVessel2D/system/setFieldsDict rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/0/T.air (70%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/0/T.mercury (70%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/0/T.oil (70%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/0/T.water (70%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/0/U.air (79%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/0/U.mercury (79%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/0/U.oil (79%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/0/U.water (79%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/0/alpha.air (75%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/0/alpha.mercury (75%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/0/alpha.oil (75%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/0/alpha.water (75%) create mode 100644 tutorials/multiphase/multiphaseEulerFoam/laminar/mixerVessel2D/0/p create mode 100644 tutorials/multiphase/multiphaseEulerFoam/laminar/mixerVessel2D/0/p_rgh rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/Allrun (85%) rename tutorials/{incompressible/pimpleFoam/laminar/mixerVesselAMI2D => multiphase/multiphaseEulerFoam/laminar/mixerVessel2D}/constant/dynamicMeshDict (100%) create mode 100644 tutorials/multiphase/multiphaseEulerFoam/laminar/mixerVessel2D/constant/g rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/constant/momentumTransport.air (100%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/constant/momentumTransport.mercury (100%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/constant/momentumTransport.oil (100%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/constant/momentumTransport.water (100%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/constant/phaseProperties (97%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/constant/physicalProperties.air (100%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/constant/physicalProperties.mercury (100%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/constant/physicalProperties.oil (100%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/constant/physicalProperties.water (100%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/system/controlDict (100%) rename tutorials/{incompressible/pimpleFoam/laminar/mixerVesselAMI2D => multiphase/multiphaseEulerFoam/laminar/mixerVessel2D}/system/createBafflesDict (76%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/system/fvSchemes (100%) rename tutorials/multiphase/multiphaseEulerFoam/laminar/{mixerVesselAMI2D => mixerVessel2D}/system/fvSolution (98%) delete mode 100644 tutorials/multiphase/multiphaseEulerFoam/laminar/mixerVesselAMI2D/0/alpha.map create mode 100644 tutorials/resources/blockMesh/ballValve create mode 100644 tutorials/resources/geometry/ballValve-torus.obj.gz diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/T b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/T index 0215e69c3b..26781ef257 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/T +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/T @@ -9,6 +9,7 @@ FoamFile { format ascii; class volScalarField; + location "0"; object T; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -21,6 +22,8 @@ internalField uniform $!outerInlet/T; boundaryField { + #includeEtc "caseDicts/setConstraintTypes" + innerInlet { type fixedValue; @@ -48,7 +51,10 @@ boundaryField $staticWalls; } - #includeEtc "caseDicts/setConstraintTypes" + nonCouple + { + type zeroGradient; + } } // ************************************************************************* // diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/U b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/U index daf48a665a..4f3af25eb7 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/U +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/U @@ -22,6 +22,8 @@ internalField uniform (0 0 0); boundaryField { + #includeEtc "caseDicts/setConstraintTypes" + innerInlet { type fixedValue; @@ -49,7 +51,10 @@ boundaryField $!movingWall/U; } - #includeEtc "caseDicts/setConstraintTypes" + nonCouple + { + type zeroGradient; + } } // ************************************************************************* // diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/alphat b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/alphat index ed7abc84d4..23f800d57b 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/alphat +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/alphat @@ -22,6 +22,8 @@ internalField uniform 0; boundaryField { + #includeEtc "caseDicts/setConstraintTypes" + inlet { $!calculated/alphat; @@ -42,8 +44,15 @@ boundaryField $movingWalls; } - #includeEtc "caseDicts/setConstraintTypes" + nonCouple + { + type zeroGradient; + } + + nonCouple + { + type zeroGradient; + } } - // ************************************************************************* // diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/epsilon b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/epsilon index f62502f5cb..d522d7b251 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/epsilon +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/epsilon @@ -22,6 +22,8 @@ internalField uniform $!innerInlet/epsilon; boundaryField { + #includeEtc "caseDicts/setConstraintTypes" + innerInlet { type fixedValue; @@ -49,7 +51,15 @@ boundaryField $staticWalls; } - #includeEtc "caseDicts/setConstraintTypes" + nonCouple + { + type zeroGradient; + } + + nonCouple + { + type zeroGradient; + } } // ************************************************************************* // diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/k b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/k index cbd47dad66..15dd3f1e9a 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/k +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/k @@ -22,6 +22,8 @@ internalField uniform $!innerInlet/k; boundaryField { + #includeEtc "caseDicts/setConstraintTypes" + innerInlet { type fixedValue; @@ -49,7 +51,10 @@ boundaryField $staticWalls; } - #includeEtc "caseDicts/setConstraintTypes" + nonCouple + { + type zeroGradient; + } } // ************************************************************************* // diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/nut b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/nut index 755a05d327..e8e504f1c0 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/nut +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/nut @@ -22,6 +22,8 @@ internalField uniform 0; boundaryField { + #includeEtc "caseDicts/setConstraintTypes" + inlet { $!calculated/nut; @@ -42,7 +44,10 @@ boundaryField $movingWalls; } - #includeEtc "caseDicts/setConstraintTypes" + nonCouple + { + type zeroGradient; + } } // ************************************************************************* // diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/p b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/p index 159b8f64ee..25c1d3dec8 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/p +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/0/p @@ -22,6 +22,8 @@ internalField uniform 1e5; boundaryField { + #includeEtc "caseDicts/setConstraintTypes" + inlet { $!inlet/p; @@ -42,7 +44,10 @@ boundaryField $staticWalls; } - #includeEtc "caseDicts/setConstraintTypes" + nonCouple + { + type zeroGradient; + } } // ************************************************************************* // diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/Allrun b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/Allrun index 30f4d7df62..040468022c 100755 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/Allrun +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/Allrun @@ -11,6 +11,7 @@ runApplication snappyHexMesh -overwrite runApplication createBaffles -overwrite runApplication splitBaffles -overwrite +runApplication createNonConformalCouples -overwrite nonCouple1 nonCouple2 runApplication $(getApplication) diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/constant/dynamicMeshDict b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/constant/dynamicMeshDict index 79791d5595..7e62f382c4 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/constant/dynamicMeshDict +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/constant/dynamicMeshDict @@ -24,7 +24,7 @@ mover motionSolver solidBody; - cellZone rotatingZone; + cellZone rotating; solidBodyMotionFunction rotatingMotion; diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/constant/geometry/AMI.obj b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/constant/geometry/couple.obj similarity index 100% rename from tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/constant/geometry/AMI.obj rename to tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/constant/geometry/couple.obj diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/controlDict b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/controlDict index f177029b14..b9a558a0c5 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/controlDict +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/controlDict @@ -32,7 +32,7 @@ writeInterval 0.02; purgeWrite 0; -writeFormat ascii; +writeFormat binary; writePrecision 6; diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/createBafflesDict b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/createBafflesDict index cd29dfdef8..4a498e8f3c 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/createBafflesDict +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/createBafflesDict @@ -20,21 +20,21 @@ baffles baffleFaces { type faceZone; - zoneName rotatingZone; + zoneName couple; patches { master { - name AMI1; - type cyclicAMI; - neighbourPatch AMI2; + name nonCouple1; + type patch; + inGroups (nonCouple); } slave { - $master; - name AMI2; - neighbourPatch AMI1; + name nonCouple2; + type patch; + inGroups (nonCouple); } } } diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/fvSchemes b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/fvSchemes index 121507cf69..1bccff2ed1 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/fvSchemes +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/fvSchemes @@ -52,4 +52,5 @@ snGradSchemes default corrected; } + // ************************************************************************* // diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/fvSolution b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/fvSolution index 5093580cd2..afdc3068f4 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/fvSolution +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/fvSolution @@ -18,10 +18,8 @@ solvers { p { - solver GAMG; - - smoother GaussSeidel; - + solver GAMG; + smoother GaussSeidel; tolerance 1e-6; relTol 0.01; } @@ -39,6 +37,14 @@ solvers relTol 0; } + MeshPhi + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-2; + relTol 0; + } + "(rho|U|h|k|epsilon|omega)" { solver smoothSolver; @@ -52,13 +58,13 @@ solvers $U; relTol 0; } - } PIMPLE { momentumPredictor yes; transonic no; + correctMeshPhi yes; nOuterCorrectors 3; nCorrectors 1; nNonOrthogonalCorrectors 0; diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/snappyHexMeshDict b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/snappyHexMeshDict index bfd050785c..67f2d3f374 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/snappyHexMeshDict +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/snappyHexMeshDict @@ -19,10 +19,10 @@ addLayers false; geometry { - AMI + couple { type triSurfaceMesh; - file "AMI.obj"; + file "couple.obj"; } innerInlet @@ -85,7 +85,7 @@ castellatedMeshControls features ( { - file "AMI.eMesh"; + file "couple.eMesh"; level 2; } { @@ -108,11 +108,11 @@ castellatedMeshControls refinementSurfaces { - AMI + couple { level (2 2); - faceZone rotatingZone; - cellZone rotatingZone; + faceZone couple; + cellZone rotating; mode inside; } diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/surfaceFeaturesDict b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/surfaceFeaturesDict index 54c832b79e..8ffc8fc170 100644 --- a/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/surfaceFeaturesDict +++ b/tutorials/compressible/rhoPimpleFoam/RAS/annularThermalMixer/system/surfaceFeaturesDict @@ -15,7 +15,7 @@ FoamFile surfaces ( - "AMI.obj" + "couple.obj" "shaft.obj" "wall.obj" "statorBlades.obj" diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/U b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/U new file mode 100644 index 0000000000..fe9f947f8e --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/U @@ -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; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type pressureInletOutletVelocity; + value $internalField; + } + lowerOutlet + { + type pressureInletOutletVelocity; + value $internalField; + } + upperOutlet + { + type pressureInletOutletVelocity; + value $internalField; + } + wall + { + type movingWallVelocity; + value uniform (0 0 0); + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/epsilon b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/epsilon similarity index 63% rename from tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/epsilon rename to tutorials/incompressible/pimpleFoam/RAS/ballValve/0/epsilon index 56cb3d5955..2c429b5677 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/epsilon +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/epsilon @@ -20,46 +20,31 @@ internalField uniform 1.8e-3; boundaryField { + #includeEtc "caseDicts/setConstraintTypes" + inlet { - type fixedValue; + type turbulentMixingLengthDissipationRateInlet; + mixingLength 0.1; value $internalField; } - outlet + lowerOutlet { - type inletOutlet; - inletValue $internalField; + type turbulentMixingLengthDissipationRateInlet; + mixingLength 0.1; value $internalField; } - walls + upperOutlet + { + type turbulentMixingLengthDissipationRateInlet; + mixingLength 0.1; + value $internalField; + } + wall { type epsilonWallFunction; value $internalField; } - defaultFaces - { - type empty; - } - ACMI1_blockage - { - type epsilonWallFunction; - value $internalField; - } - ACMI1_couple - { - type cyclicACMI; - value $internalField; - } - ACMI2_blockage - { - type epsilonWallFunction; - value $internalField; - } - ACMI2_couple - { - type cyclicACMI; - value $internalField; - } } diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/k b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/k new file mode 100644 index 0000000000..57e8614d51 --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/k @@ -0,0 +1,51 @@ +/*--------------------------------*- 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 k; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform 3.75e-3; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type turbulentIntensityKineticEnergyInlet; + intensity 0.05; + value $internalField; + } + lowerOutlet + { + type turbulentIntensityKineticEnergyInlet; + intensity 0.05; + value $internalField; + } + upperOutlet + { + type turbulentIntensityKineticEnergyInlet; + intensity 0.05; + value $internalField; + } + wall + { + type kqRWallFunction; + value $internalField; + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/multiphaseEulerFoam/laminar/mixerVesselAMI2D/0/p b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/nut similarity index 68% rename from tutorials/multiphase/multiphaseEulerFoam/laminar/mixerVesselAMI2D/0/p rename to tutorials/incompressible/pimpleFoam/RAS/ballValve/0/nut index a85a80ca47..1a0806e8ef 100644 --- a/tutorials/multiphase/multiphaseEulerFoam/laminar/mixerVesselAMI2D/0/p +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/nut @@ -9,49 +9,40 @@ FoamFile { format ascii; class volScalarField; - object p; + location "0"; + object nut; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -dimensions [1 -1 -2 0 0 0 0]; +dimensions [0 2 -1 0 0 0 0]; -internalField uniform 1e5; +internalField uniform 0; boundaryField { - rotor + #includeEtc "caseDicts/setConstraintTypes" + + inlet { type calculated; value $internalField; } - - stator + lowerOutlet { type calculated; value $internalField; } - - front + upperOutlet { - type empty; - } - - back - { - type empty; - } - - AMI1 - { - type cyclicAMI; + type calculated; value $internalField; } - - AMI2 + wall { - type cyclicAMI; + type nutkWallFunction; value $internalField; } } -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/omega b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/omega new file mode 100644 index 0000000000..b021874aa1 --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/omega @@ -0,0 +1,51 @@ +/*--------------------------------*- 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 omega; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 -1 0 0 0 0]; + +internalField uniform 5.33333; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type turbulentMixingLengthFrequencyInlet; + mixingLength 0.1; + value $internalField; + } + lowerOutlet + { + type turbulentMixingLengthFrequencyInlet; + mixingLength 0.1; + value $internalField; + } + upperOutlet + { + type turbulentMixingLengthFrequencyInlet; + mixingLength 0.1; + value $internalField; + } + wall + { + type omegaWallFunction; + value $internalField; + } +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/p b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/p new file mode 100644 index 0000000000..beef039a60 --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/p @@ -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 volScalarField; + location "0"; + object p; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type totalPressure; + p0 uniform 10; + } + lowerOutlet + { + type entrainmentPressure; + p0 uniform 0; + } + upperOutlet + { + type entrainmentPressure; + p0 uniform 0; + } + wall + { + type fixedFluxPressure; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/s b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/s new file mode 100644 index 0000000000..3a0790a836 --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/0/s @@ -0,0 +1,49 @@ +/*--------------------------------*- 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 s; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value $internalField; + } + lowerOutlet + { + type inletOutlet; + inletValue $internalField; + value $internalField; + } + upperOutlet + { + type inletOutlet; + inletValue $internalField; + value $internalField; + } + wall + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/Allclean b/tutorials/incompressible/pimpleFoam/RAS/ballValve/Allclean new file mode 100755 index 0000000000..316abcf486 --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/Allclean @@ -0,0 +1,7 @@ +#!/bin/sh + +cd "${0%/*}" || exit 1 + +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +cleanCase && rm -rf 0/reconstruct\(phi\) constant/geometry flowRate.eps error.eps diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/Allrun b/tutorials/incompressible/pimpleFoam/RAS/ballValve/Allrun new file mode 100755 index 0000000000..5f7adb4126 --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/Allrun @@ -0,0 +1,31 @@ +#!/bin/sh + +cd ${0%/*} || exit 1 + +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Copy torus surface from resources directory +mkdir constant/geometry && cp $FOAM_TUTORIALS/resources/geometry/ballValve-torus.obj.gz constant/geometry + +# Mesh +runApplication blockMesh -dict $FOAM_TUTORIALS/resources/blockMesh/ballValve +runApplication topoSet +runApplication transformPoints -pointSet ball "Rz=-45" + +# Create couples +runApplication createNonConformalCouples -overwrite pipeNonCouple ballNonCouple + +# Decompose +runApplication decomposePar -cellDist + +# Set the value of the scalar transport field +runParallel setFields + +# Run +runParallel $(getApplication); + +# Reconstruct +runApplication reconstructPar -newTimes + +# Plot the flow rates +./createGraphs diff --git a/tutorials/multiphase/multiphaseEulerFoam/laminar/mixerVesselAMI2D/constant/dynamicMeshDict b/tutorials/incompressible/pimpleFoam/RAS/ballValve/constant/dynamicMeshDict similarity index 85% rename from tutorials/multiphase/multiphaseEulerFoam/laminar/mixerVesselAMI2D/constant/dynamicMeshDict rename to tutorials/incompressible/pimpleFoam/RAS/ballValve/constant/dynamicMeshDict index 14d80b3ad7..9763737761 100644 --- a/tutorials/multiphase/multiphaseEulerFoam/laminar/mixerVesselAMI2D/constant/dynamicMeshDict +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/constant/dynamicMeshDict @@ -22,13 +22,13 @@ mover motionSolver solidBody; - cellZone rotor; + cellZone ball; - solidBodyMotionFunction rotatingMotion; + solidBodyMotionFunction oscillatingRotatingMotion; origin (0 0 0); - axis (0 0 1); - omega 6.2832; // rad/s + amplitude (0 0 45); + omega 6.283185307179586; } diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/constant/momentumTransport b/tutorials/incompressible/pimpleFoam/RAS/ballValve/constant/momentumTransport new file mode 100644 index 0000000000..7e7c11df67 --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/constant/momentumTransport @@ -0,0 +1,29 @@ +/*--------------------------------*- 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; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType RAS; + +RAS +{ + model kOmegaSST; //kEpsilon; + + turbulence on; + + printCoeffs on; +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/constant/physicalProperties b/tutorials/incompressible/pimpleFoam/RAS/ballValve/constant/physicalProperties similarity index 100% rename from tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/constant/physicalProperties rename to tutorials/incompressible/pimpleFoam/RAS/ballValve/constant/physicalProperties diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/createGraphs b/tutorials/incompressible/pimpleFoam/RAS/ballValve/createGraphs new file mode 100755 index 0000000000..57e466f77e --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/createGraphs @@ -0,0 +1,30 @@ +#!/bin/sh + +cd ${0%/*} || exit 1 + +inletFlowRate=postProcessing/inletFlowRate/0/surfaceFieldValue.dat +lowerOutletFlowRate=postProcessing/lowerOutletFlowRate/0/surfaceFieldValue.dat +upperOutletFlowRate=postProcessing/upperOutletFlowRate/0/surfaceFieldValue.dat + +gnuplot << EOF +set terminal postscript eps color enhanced +set output "flowRate.eps" +set xlabel "Time (s)" +set ylabel "Flow Rate (m^3/s)" +plot \ + "$inletFlowRate" us 1:(-\$2) every 10 w p t "Inlet", \ + "$lowerOutletFlowRate" us 1:2 w l t "Lower Outlet", \ + "$upperOutletFlowRate" us 1:2 w l t "Upper Outlet", \ + "< paste $lowerOutletFlowRate $upperOutletFlowRate" \ + us 1:(\$2+\$4) w l t "Total Outlet" +EOF + +gnuplot << EOF +set terminal postscript eps color enhanced +set output "error.eps" +set xlabel "Time (s)" +set ylabel "Inlet-Outlet Conservation Error (%)" +plot \ + "< paste $inletFlowRate $lowerOutletFlowRate $upperOutletFlowRate" \ + us 1:(100*(\$2+\$4+\$6)/\$2) w l t '' +EOF diff --git a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/system/controlDict b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/controlDict similarity index 58% rename from tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/system/controlDict rename to tutorials/incompressible/pimpleFoam/RAS/ballValve/system/controlDict index 6f30a4739e..37bce42a23 100644 --- a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/system/controlDict +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/controlDict @@ -16,19 +16,19 @@ FoamFile application pimpleFoam; -startFrom startTime; +startFrom latestTime; startTime 0; stopAt endTime; -endTime 5; +endTime 1; deltaT 1e-3; writeControl adjustableRunTime; -writeInterval 0.05; +writeInterval 0.01; purgeWrite 0; @@ -50,37 +50,13 @@ maxCo 0.5; functions { - cartesianToCylindrical - { - type cylindrical; - libs ("libfieldFunctionObjects.so"); - - origin (0 0 0); - axis (0 0 1); - - field U; - - writeControl outputTime; - writeInterval 1; - } - - #includeFunc fieldAverage(cylindrical(U)) - - cylindricalToCartesian - { - type cylindrical; - libs ("libfieldFunctionObjects.so"); - - origin (0 0 0); - axis (0 0 1); - - field cylindrical(U)Mean; - toCartesian true; - result UMean; - - writeControl outputTime; - writeInterval 1; - } + #includeFunc patchFlowRate(funcName=inletFlowRate, patch=inlet) + #includeFunc patchFlowRate(funcName=lowerOutletFlowRate, patch=lowerOutlet) + #includeFunc patchFlowRate(funcName=upperOutletFlowRate, patch=upperOutlet) + #includeFunc scalarTransport(s) + #includeFunc reconstruct(phi) + #includeFunc streamlinesPatch(patch=inlet, nPoints=100, U=reconstruct(phi)) + #includeFunc wallsSurface } diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/decomposeParDict b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/decomposeParDict new file mode 100644 index 0000000000..c3a1be773f --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/decomposeParDict @@ -0,0 +1,28 @@ +/*--------------------------------*- 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 decomposeParDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 8; + +method scotch; + +hierarchicalCoeffs +{ + n (2 2 2); + order xyz; +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/fvSchemes b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/fvSchemes new file mode 100644 index 0000000000..49598fccce --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/fvSchemes @@ -0,0 +1,64 @@ +/*--------------------------------*- 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; + grad(U) cellLimited Gauss linear 1; + grad(k) cellLimited Gauss linear 1; + grad(epsilon) cellLimited Gauss linear 1; + grad(omega) cellLimited Gauss linear 1; +} + +divSchemes +{ + default none; + div(phi,U) Gauss linearUpwind grad(U); + div(phi,k) Gauss limitedLinear 1; + div(phi,epsilon) Gauss limitedLinear 1; + div(phi,omega) Gauss limitedLinear 1; + div(phi,s) Gauss limitedLinear 1; + div((nuEff*dev2(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +wallDist +{ + method meshWave; + correctWalls false; +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/system/fvSolution b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/fvSolution similarity index 71% rename from tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/system/fvSolution rename to tutorials/incompressible/pimpleFoam/RAS/ballValve/system/fvSolution index c7d5465608..eaacf82519 100644 --- a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/system/fvSolution +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/fvSolution @@ -20,46 +20,34 @@ solvers { solver GAMG; smoother GaussSeidel; - cacheAgglomeration no; - - tolerance 0.02; - relTol 0; + tolerance 0.02; + relTol 0; } p { $pcorr; - tolerance 1e-06; + tolerance 1e-6; relTol 0.01; } pFinal { $p; - tolerance 1e-06; relTol 0; } - U + "(U|k|epsilon|omega|s)" { - solver smoothSolver; - smoother GaussSeidel; - tolerance 1e-05; + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-5; relTol 0.01; } - UFinal + "(U|k|epsilon|omega|s)Final" { $U; - tolerance 1e-06; - relTol 0; - } - - cellMotionUx - { - solver PCG; - preconditioner DIC; - tolerance 1e-08; relTol 0; } } @@ -67,12 +55,10 @@ solvers PIMPLE { correctPhi yes; + correctMeshPhi no; nOuterCorrectors 2; nCorrectors 1; nNonOrthogonalCorrectors 0; - - pRefCell 0; - pRefValue 0; } relaxationFactors diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/setFieldsDict b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/setFieldsDict new file mode 100644 index 0000000000..3b211e627c --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/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; + object setFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defaultFieldValues +( + volScalarFieldValue s 0 +); + +regions +( + cylinderToFace + { + point1 (-0.51 0 0); + point2 (-0.49 0 0); + radius 0.05; + + fieldValues + ( + volScalarFieldValue s 1 + ); + } +); + + +// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/system/topoSetDict b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/topoSetDict similarity index 73% rename from tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/system/topoSetDict rename to tutorials/incompressible/pimpleFoam/RAS/ballValve/system/topoSetDict index 5f0ea3a548..9ddbf129af 100644 --- a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/system/topoSetDict +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/topoSetDict @@ -15,16 +15,20 @@ FoamFile actions ( - // Get both sides of ami - // ~~~~~~~~~~~~~~~~~~~~~ - - // Get all faces in cellSet { - name AMI; - type faceSet; action new; - source patchToFace; - patch "AMI.*"; + type cellSet; + name ball; + source zoneToCell; + zone ball; + } + { + action new; + type pointSet; + name ball; + source cellToPoint; + set ball; + option all; } ); diff --git a/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/wallsSurface b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/wallsSurface new file mode 100644 index 0000000000..3b8600cfef --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/ballValve/system/wallsSurface @@ -0,0 +1,31 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +\*---------------------------------------------------------------------------*/ + +type surfaces; +libs ("libsampling.so"); + +writeControl writeTime; + +surfaceFormat vtk; + +interpolationScheme cell; +interpolate false; + +fields (); + +surfaces +( + walls + { + type patch; + interpolate $interpolate; + patches (pipeWalls pipeNonCouple ballWalls ballNonCouple); + } +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/impeller/0/U b/tutorials/incompressible/pimpleFoam/RAS/impeller/0/U index 2404cb10fd..ef97a303a0 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/impeller/0/U +++ b/tutorials/incompressible/pimpleFoam/RAS/impeller/0/U @@ -28,16 +28,22 @@ boundaryField value $internalField; } - stationaryWalls + "(statorDuct|nonCoupleIn1|nonCoupleOut2)" { type noSlip; } - movingWalls + "(rotorDuct|rotorBlades|nonCoupleIn2|nonCoupleOut1)" { type movingWallVelocity; value $internalField; } + + nonCouple + { + type movingWallSlipVelocity; + value $internalField; + } } diff --git a/tutorials/incompressible/pimpleFoam/RAS/impeller/0/epsilon b/tutorials/incompressible/pimpleFoam/RAS/impeller/0/epsilon index a45586ced8..ed05d86506 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/impeller/0/epsilon +++ b/tutorials/incompressible/pimpleFoam/RAS/impeller/0/epsilon @@ -34,6 +34,11 @@ boundaryField type epsilonWallFunction; value $internalField; } + + nonCouple + { + type zeroGradient; + } } diff --git a/tutorials/incompressible/pimpleFoam/RAS/impeller/0/k b/tutorials/incompressible/pimpleFoam/RAS/impeller/0/k index b078a848cd..d80320fcc8 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/impeller/0/k +++ b/tutorials/incompressible/pimpleFoam/RAS/impeller/0/k @@ -34,6 +34,11 @@ boundaryField type kqRWallFunction; value $internalField; } + + nonCouple + { + type zeroGradient; + } } diff --git a/tutorials/incompressible/pimpleFoam/RAS/impeller/0/nut b/tutorials/incompressible/pimpleFoam/RAS/impeller/0/nut index d4ff852fe9..7f223b5ac7 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/impeller/0/nut +++ b/tutorials/incompressible/pimpleFoam/RAS/impeller/0/nut @@ -33,6 +33,12 @@ boundaryField type nutkWallFunction; value uniform 0; } + + nonCouple + { + type calculated; + value uniform 0; + } } diff --git a/tutorials/incompressible/pimpleFoam/RAS/impeller/0/p b/tutorials/incompressible/pimpleFoam/RAS/impeller/0/p index 22a2d8eb33..d2f5947789 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/impeller/0/p +++ b/tutorials/incompressible/pimpleFoam/RAS/impeller/0/p @@ -24,7 +24,7 @@ boundaryField "(inlet|outlet)" { - type totalPressure; + type entrainmentPressure; p0 $internalField; value $internalField; } @@ -33,6 +33,11 @@ boundaryField { type fixedFluxPressure; } + + nonCouple + { + type fixedFluxPressure; + } } diff --git a/tutorials/incompressible/pimpleFoam/RAS/impeller/Allclean b/tutorials/incompressible/pimpleFoam/RAS/impeller/Allclean new file mode 100755 index 0000000000..361fdab19b --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/impeller/Allclean @@ -0,0 +1,7 @@ +#!/bin/sh + +cd "${0%/*}" || exit 1 + +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +cleanCase && rm -f 0/cylindrical\(U\) diff --git a/tutorials/incompressible/pimpleFoam/RAS/impeller/Allrun b/tutorials/incompressible/pimpleFoam/RAS/impeller/Allrun index 0fdbeb9e0f..dea9347dc0 100755 --- a/tutorials/incompressible/pimpleFoam/RAS/impeller/Allrun +++ b/tutorials/incompressible/pimpleFoam/RAS/impeller/Allrun @@ -6,8 +6,6 @@ cd "${0%/*}" || exit 1 runApplication blockMesh -runApplication decomposePar +runApplication createNonConformalCouples -overwrite -runParallel $(getApplication) - -runApplication reconstructPar +runApplication $(getApplication) diff --git a/tutorials/incompressible/pimpleFoam/RAS/impeller/constant/geometry/surface0.stl.gz b/tutorials/incompressible/pimpleFoam/RAS/impeller/constant/geometry/surface0.stl.gz deleted file mode 100644 index 2e17a4d6f859556bdca32ff057c61ef6532c1c8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10660 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 JI~NPG008l0R*C=s diff --git a/tutorials/incompressible/pimpleFoam/RAS/impeller/system/blockMeshDict b/tutorials/incompressible/pimpleFoam/RAS/impeller/system/blockMeshDict index 02ae269b1d..fb02c3b0f9 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/impeller/system/blockMeshDict +++ b/tutorials/incompressible/pimpleFoam/RAS/impeller/system/blockMeshDict @@ -83,15 +83,9 @@ edges arc 15 31 (2 $r4 0) ); -defaultPatch -{ - name movingWalls; - type wall; -} - boundary ( - stationaryWalls + statorDuct { type wall; faces @@ -103,6 +97,34 @@ boundary ); } + rotorDuct + { + type wall; + faces + ( + (0 1 17 16) + (1 2 18 17) + (0 5 21 16) + (5 10 26 21) + (6 7 23 22) + (6 11 27 22) + ); + } + + rotorBlades + { + type wall; + faces + ( + (0 1 6 5) + (1 2 7 6) + (5 6 11 10) + (16 17 22 21) + (17 18 23 22) + (21 22 27 26) + ); + } + inlet { type patch; @@ -141,22 +163,20 @@ boundary ); } - cyclicRepeatAMIIn1 + nonCoupleIn1 { - type cyclicRepeatAMI; - neighbourPatch cyclicRepeatAMIIn2; - transformPatch cyclicIn1; + type patch; + inGroups (nonCouple); faces ( (3 8 24 19) ); } - cyclicRepeatAMIIn2 + nonCoupleIn2 { - type cyclicRepeatAMI; - neighbourPatch cyclicRepeatAMIIn1; - transformPatch cyclicIn1; + type patch; + inGroups (nonCouple); faces ( (2 7 23 18) @@ -183,22 +203,20 @@ boundary ); } - cyclicRepeatAMIOut1 + nonCoupleOut1 { - type cyclicRepeatAMI; - neighbourPatch cyclicRepeatAMIOut2; - transformPatch cyclicIn1; + type patch; + inGroups (nonCouple); faces ( (10 11 27 26) ); } - cyclicRepeatAMIOut2 + nonCoupleOut2 { - type cyclicRepeatAMI; - neighbourPatch cyclicRepeatAMIOut1; - transformPatch cyclicIn1; + type patch; + inGroups (nonCouple); faces ( (12 13 29 28) diff --git a/tutorials/incompressible/pimpleFoam/RAS/impeller/system/controlDict b/tutorials/incompressible/pimpleFoam/RAS/impeller/system/controlDict index 78e9e4ee52..31e61a541c 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/impeller/system/controlDict +++ b/tutorials/incompressible/pimpleFoam/RAS/impeller/system/controlDict @@ -50,10 +50,23 @@ maxCo 1.0; functions { - #includeFunc patchFlowRate(patch=inlet) - #includeFunc patchFlowRate(patch=outlet) - #includeFunc triSurfaceVolumetricFlowRate(name=surface0.stl) - #includeFunc triSurfaceVolumetricFlowRate(name=surface1.stl) + #includeFunc patchFlowRate(patch=inlet, funcName=inletFlowRate) + #includeFunc patchFlowRate(patch=outlet, funcName=outletFlowRate) + + cartesianToCylindrical + { + type cylindrical; + libs ("libfieldFunctionObjects.so"); + + origin (0 0 0); + axis (1 0 0); + + field U; + + writeControl outputTime; + writeInterval 1; + } } + // ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/impeller/system/createNonConformalCouplesDict b/tutorials/incompressible/pimpleFoam/RAS/impeller/system/createNonConformalCouplesDict new file mode 100644 index 0000000000..5859c6113e --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/impeller/system/createNonConformalCouplesDict @@ -0,0 +1,69 @@ +/*--------------------------------*- 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 createNonConformalCouplesDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +nonConformalCoupleIn0 +{ + patches (nonCoupleIn1 nonCoupleIn2); + transform none; +} + +nonConformalCoupleIn30 +{ + $nonConformalCoupleIn0; + transform rotational; + rotationAxis (-1 0 0); + rotationCentre (0 0 0); + rotationAngle 30; +} + +nonConformalCoupleIn60 { $nonConformalCoupleIn30; rotationAngle 60; } +nonConformalCoupleIn90 { $nonConformalCoupleIn30; rotationAngle 90; } +nonConformalCoupleIn120 { $nonConformalCoupleIn30; rotationAngle 120; } +nonConformalCoupleIn150 { $nonConformalCoupleIn30; rotationAngle 150; } +nonConformalCoupleIn180 { $nonConformalCoupleIn30; rotationAngle 180; } +nonConformalCoupleIn210 { $nonConformalCoupleIn30; rotationAngle 210; } +nonConformalCoupleIn240 { $nonConformalCoupleIn30; rotationAngle 240; } +nonConformalCoupleIn270 { $nonConformalCoupleIn30; rotationAngle 270; } +nonConformalCoupleIn300 { $nonConformalCoupleIn30; rotationAngle 300; } +nonConformalCoupleIn330 { $nonConformalCoupleIn30; rotationAngle 330; } + +nonConformalCoupleOut0 +{ + patches (nonCoupleOut1 nonCoupleOut2); + transform none; +} + +nonConformalCoupleOut30 +{ + patches (nonCoupleOut1 nonCoupleOut2); + transform rotational; + rotationAxis (-1 0 0); + rotationCentre (0 0 0); + rotationAngle -30; +} + +nonConformalCoupleOut60 { $nonConformalCoupleOut30; rotationAngle -60; } +nonConformalCoupleOut90 { $nonConformalCoupleOut30; rotationAngle -90; } +nonConformalCoupleOut120 { $nonConformalCoupleOut30; rotationAngle -120; } +nonConformalCoupleOut150 { $nonConformalCoupleOut30; rotationAngle -150; } +nonConformalCoupleOut180 { $nonConformalCoupleOut30; rotationAngle -180; } +nonConformalCoupleOut210 { $nonConformalCoupleOut30; rotationAngle -210; } +nonConformalCoupleOut240 { $nonConformalCoupleOut30; rotationAngle -240; } +nonConformalCoupleOut270 { $nonConformalCoupleOut30; rotationAngle -270; } +nonConformalCoupleOut300 { $nonConformalCoupleOut30; rotationAngle -300; } +nonConformalCoupleOut330 { $nonConformalCoupleOut30; rotationAngle -330; } + +// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/impeller/system/fvSolution b/tutorials/incompressible/pimpleFoam/RAS/impeller/system/fvSolution index bac6b40244..3131ee0b0b 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/impeller/system/fvSolution +++ b/tutorials/incompressible/pimpleFoam/RAS/impeller/system/fvSolution @@ -54,13 +54,11 @@ solvers PIMPLE { - correctPhi yes; + correctPhi no; + correctMeshPhi no; nOuterCorrectors 2; nCorrectors 1; nNonOrthogonalCorrectors 0; - - pRefCell 0; - pRefValue 0; } relaxationFactors diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/U b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/U similarity index 66% rename from tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/U rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/U index f22db80116..61086c3665 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/U +++ b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/U @@ -20,43 +20,30 @@ internalField uniform (0 0 0); boundaryField { + #includeEtc "caseDicts/setConstraintTypes" + inlet { type fixedValue; value uniform (1 0 0); } + outlet { type pressureInletOutletVelocity; - value uniform (0 0 0); + value $internalField; } + walls { -// type fixedValue; type movingWallVelocity; - value uniform (0 0 0); + value $internalField; } - defaultFaces + + "nonCouple.*" { - type empty; - } - ACMI1_blockage - { - type noSlip; - } - ACMI1_couple - { - type cyclicACMI; - value uniform (0 0 0); - } - ACMI2_blockage - { - type noSlip; - } - ACMI2_couple - { - type cyclicACMI; - value uniform (0 0 0); + type movingWallVelocity; + value $internalField; } } diff --git a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/0/epsilon b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/epsilon similarity index 80% rename from tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/0/epsilon rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/epsilon index 50d96ad9c4..600b8dfce2 100644 --- a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/0/epsilon +++ b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/epsilon @@ -16,43 +16,36 @@ FoamFile dimensions [0 2 -3 0 0 0 0]; -internalField uniform 20; +internalField uniform 1.8e-3; boundaryField { - rotor + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value $internalField; + } + + outlet + { + type inletOutlet; + inletValue $internalField; + value $internalField; + } + + walls { type epsilonWallFunction; value $internalField; } - stator + "nonCouple.*" { type epsilonWallFunction; value $internalField; } - - front - { - type empty; - } - - back - { - type empty; - } - - AMI1 - { - type cyclicAMI; - value $internalField; - } - - AMI2 - { - type cyclicAMI; - value $internalField; - } } diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/k b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/k similarity index 74% rename from tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/k rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/k index 50158c23ff..cf6817cdbc 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/k +++ b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/k @@ -20,46 +20,32 @@ internalField uniform 3.75e-3; boundaryField { + #includeEtc "caseDicts/setConstraintTypes" + inlet { type fixedValue; value $internalField; } + outlet { type inletOutlet; inletValue $internalField; value $internalField; } + walls { type kqRWallFunction; value $internalField; } - defaultFaces - { - type empty; - } - ACMI1_blockage + + "nonCouple.*" { type kqRWallFunction; value $internalField; } - ACMI1_couple - { - type cyclicACMI; - value $internalField; - } - ACMI2_blockage - { - type kqRWallFunction; - value $internalField; - } - ACMI2_couple - { - type cyclicACMI; - value $internalField; - } } diff --git a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/0/nut b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/nut similarity index 76% rename from tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/0/nut rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/nut index bd1ef5caff..a2340603c0 100644 --- a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/0/nut +++ b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/nut @@ -20,37 +20,30 @@ internalField uniform 0; boundaryField { - rotor - { - type nutkWallFunction; - value uniform 0; - } + #includeEtc "caseDicts/setConstraintTypes" - stator + inlet { - type nutkWallFunction; - value uniform 0; - } - - front - { - type empty; - } - - back - { - type empty; - } - - AMI1 - { - type cyclicAMI; + type fixedValue; value $internalField; } - AMI2 + outlet { - type cyclicAMI; + type inletOutlet; + inletValue $internalField; + value $internalField; + } + + walls + { + type nutkWallFunction; + value $internalField; + } + + "nonCouple.*" + { + type nutkWallFunction; value $internalField; } } diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/omega b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/omega new file mode 100644 index 0000000000..5557cd033c --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/omega @@ -0,0 +1,52 @@ +/*--------------------------------*- 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 omega; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 -1 0 0 0 0]; + +internalField uniform 5.33333; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type fixedValue; + value $internalField; + } + + outlet + { + type inletOutlet; + inletValue $internalField; + value $internalField; + } + + walls + { + type omegaWallFunction; + value $internalField; + } + + "nonCouple.*" + { + type omegaWallFunction; + value $internalField; + } +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/0/p b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/p similarity index 74% rename from tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/0/p rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/p index 7bc6d72418..52a3d60db4 100644 --- a/tutorials/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/0/p +++ b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/0/p @@ -9,6 +9,7 @@ FoamFile { format ascii; class volScalarField; + location "0"; object p; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -19,37 +20,29 @@ internalField uniform 0; boundaryField { - rotor + #includeEtc "caseDicts/setConstraintTypes" + + inlet { type zeroGradient; } - stator + outlet + { + type fixedValue; + value uniform 0; + } + + walls { type zeroGradient; } - front + "nonCouple.*" { - type empty; - } - - back - { - type empty; - } - - AMI1 - { - type cyclicAMI; - value $internalField; - } - - AMI2 - { - type cyclicAMI; - value $internalField; + type zeroGradient; } } + // ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/Allrun b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/Allrun new file mode 100755 index 0000000000..2a202110b6 --- /dev/null +++ b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/Allrun @@ -0,0 +1,11 @@ +#!/bin/sh + +cd ${0%/*} || exit 1 + +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication blockMesh + +runApplication createNonConformalCouples -overwrite nonCouple1 nonCouple2 + +runApplication $(getApplication) diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/constant/dynamicMeshDict b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/constant/dynamicMeshDict similarity index 100% rename from tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/constant/dynamicMeshDict rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/constant/dynamicMeshDict diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/constant/momentumTransport b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/constant/momentumTransport similarity index 95% rename from tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/constant/momentumTransport rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/constant/momentumTransport index 4c5d358a4a..f04dd45e24 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/constant/momentumTransport +++ b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/constant/momentumTransport @@ -18,7 +18,7 @@ simulationType RAS; RAS { - model kEpsilon; + model realizableKE; turbulence on; diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/constant/physicalProperties b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/constant/physicalProperties similarity index 100% rename from tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/constant/physicalProperties rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/constant/physicalProperties diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/blockMeshDict b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/blockMeshDict similarity index 89% rename from tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/blockMeshDict rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/blockMeshDict index 67befdb3ab..00f4647859 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/blockMeshDict +++ b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/blockMeshDict @@ -38,14 +38,13 @@ vertices blocks ( - hex (0 1 2 3 4 5 6 7) (80 40 1) simpleGrading (1 1 1) + hex (0 1 2 3 4 5 6 7) inletChannel (80 40 1) simpleGrading (1 1 1) hex (8 9 10 11 12 13 14 15) (80 96 1) simpleGrading (1 1 1) ); -defaultPatch -{ - type empty; -} +edges +( +); boundary ( @@ -76,17 +75,17 @@ boundary (9 13 12 8) ); } - couple1 + nonCouple1 { - type patch; + type wall; faces ( (2 6 5 1) ); } - couple2 + nonCouple2 { - type patch; + type wall; faces ( (8 12 15 11) @@ -94,5 +93,8 @@ boundary } ); +mergePatchPairs +( +); // ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/controlDict b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/controlDict similarity index 87% rename from tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/controlDict rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/controlDict index 98506e6a6d..dc9e22a34d 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/controlDict +++ b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/controlDict @@ -48,5 +48,11 @@ adjustTimeStep true; maxCo 0.5; +functions +{ + #includeFunc patchFlowRate(patch=inlet, funcName=inletFlowRate) + #includeFunc patchFlowRate(patch=outlet, funcName=outletFlowRate) +} + // ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/decomposeParDict b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/decomposeParDict similarity index 100% rename from tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/decomposeParDict rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/decomposeParDict diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/fvSchemes b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/fvSchemes similarity index 89% rename from tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/fvSchemes rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/fvSchemes index cbee64c130..68e866b933 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/fvSchemes +++ b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/fvSchemes @@ -29,16 +29,16 @@ gradSchemes divSchemes { default none; -// div(phi,U) Gauss upwind; div(phi,U) Gauss linearUpwind grad(U); div(phi,k) Gauss upwind; div(phi,epsilon) Gauss upwind; + div(phi,omega) Gauss upwind; div((nuEff*dev2(T(grad(U))))) Gauss linear; } laplacianSchemes { - default Gauss linear limited corrected 0.33; + default Gauss linear corrected; } interpolationSchemes @@ -48,7 +48,7 @@ interpolationSchemes snGradSchemes { - default limited corrected 0.33; + default corrected; } diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/fvSolution b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/fvSolution similarity index 82% rename from tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/fvSolution rename to tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/fvSolution index 49f1354149..6030a5b72c 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/system/fvSolution +++ b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInlet/system/fvSolution @@ -18,39 +18,35 @@ solvers "pcorr.*" { solver GAMG; + smoother GaussSeidel; tolerance 1e-2; relTol 0; - smoother GaussSeidel; - cacheAgglomeration no; - maxIter 50; } p { $pcorr; - tolerance 1e-5; + tolerance 1e-6; relTol 0.01; } pFinal { $p; - tolerance 1e-6; relTol 0; } - "(U|k|epsilon)" + "(U|k|epsilon|omega)" { - solver smoothSolver; - smoother symGaussSeidel; + solver PBiCGStab; + preconditioner DILU; tolerance 1e-6; relTol 0.1; } - "(U|k|epsilon)Final" + "(U|k|epsilon|omega)Final" { $U; - tolerance 1e-6; relTol 0; } } @@ -58,15 +54,14 @@ solvers PIMPLE { correctPhi no; + correctMeshPhi no; nOuterCorrectors 1; nCorrectors 2; nNonOrthogonalCorrectors 0; } relaxationFactors -{ -// "(U|k|epsilon).*" 1; -} +{} cache { diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/p b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/p deleted file mode 100644 index db63b6f5b8..0000000000 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/0/p +++ /dev/null @@ -1,69 +0,0 @@ -/*--------------------------------*- 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 p; -} -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -dimensions [0 2 -2 0 0 0 0]; - -internalField uniform 0; - -boundaryField -{ - inlet - { - type zeroGradient; - } - outlet - { - type fixedValue; - value uniform 0; - } - walls - { - type zeroGradient; - } - couple1 - { - type zeroGradient; - } - couple2 - { - type zeroGradient; - } - defaultFaces - { - type empty; - } - ACMI1_blockage - { - type zeroGradient; - } - ACMI1_couple - { - type cyclicACMI; - value uniform 0; - } - ACMI2_blockage - { - type zeroGradient; - } - ACMI2_couple - { - type cyclicACMI; - value uniform 0; - } -} - - -// ************************************************************************* // diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/Allmesh b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/Allmesh deleted file mode 100755 index 22c5c016de..0000000000 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/Allmesh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -cd ${0%/*} || exit 1 # Run from this directory - -# Source tutorial run functions -. $WM_PROJECT_DIR/bin/tools/RunFunctions - -runApplication blockMesh - -runApplication topoSet -constant - -# Split the mesh to generate the ACMI coupled patches -runApplication createBaffles -overwrite - -#------------------------------------------------------------------------------ diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/Allrun b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/Allrun deleted file mode 100755 index e6a19278ee..0000000000 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/Allrun +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -cd ${0%/*} || exit 1 # Run from this directory - -# Source tutorial run functions -. $WM_PROJECT_DIR/bin/tools/RunFunctions - -./Allmesh - -runApplication $(getApplication) diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/Allrun-parallel b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/Allrun-parallel deleted file mode 100755 index 851eaa6c43..0000000000 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/Allrun-parallel +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -cd ${0%/*} || exit 1 # Run from this directory - -# Source tutorial run functions -. $WM_PROJECT_DIR/bin/tools/RunFunctions - -./Allmesh - -runApplication decomposePar - -runParallel $(getApplication) - -runApplication reconstructPar diff --git a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/README b/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/README deleted file mode 100644 index 5d92207159..0000000000 --- a/tutorials/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D/README +++ /dev/null @@ -1,131 +0,0 @@ -oscillatingInletACMI2D - -This tutorial case gives an example of the Arbitrarily Coupled Mesh Interface -(ACMI) usage. The mesh is composed of two mesh regions: an inlet channel which -oscillates in the +/- Y-direction, and a fixed mesh region. - -Each ACMI patch requires the specification of a 'non-overlapping' patch. In -this example, the non-overlapping patches are described as walls, e.g. taken -from the constant/polyMesh/boundary file: - - 1. First ACMI patch pair applied to the inlet channel outlet - - ACMI1_couple - { - type cyclicACMI; - nFaces 40; - startFace 43720; - matchTolerance 0.0001; - neighbourPatch ACMI2_couple; - nonOverlapPatch ACMI1_blockage; - } - ACMI1_blockage - { - type wall; - nFaces 40; - startFace 43680; - } - - - 1. Second ACMI patch pair applied to the fixed mesh region inlet - - ACMI2_couple - { - type cyclicACMI; - nFaces 96; - startFace 43856; - matchTolerance 0.0001; - neighbourPatch ACMI1_couple; - nonOverlapPatch ACMI2_blockage; - } - ACMI2_blockage - { - type wall; - nFaces 96; - startFace 43760; - } - - -In the above, the ACMI1_blockage and ACMI1_couple patches occupy the same space, -with duplicate points, edges and faces. The ACMI2_blockage and ACMI2_couple -patches are created similarly. - -The duplicate patches are initially created using the createBaffles utility. -Firstly, the original (non-duplicated) patch faces are collected into zones -using the topoSet utility. - -Note: when specifying the ACMI patch-pairs, the coupled patch must be specified -before its associated non-overlapping patch. - -Each ACMI/non-overlapping patch pair is specified using a master-slave approach. -However, since we are generating boundary patches (which are always master -patches) the slave patches are simply defined using 'dummy' entries, e.g.: - - type faceZone; - zoneName couple1Faces; - - patches - { - // create cyclic ACMI patch - master - { - //- Master side patch - name ACMI1_couple; - type cyclicACMI; - matchTolerance 0.0001; - neighbourPatch ACMI2_couple; - nonOverlapPatch ACMI1_blockage; - } - slave // dummy entries only - { - //- Slave side patch - name ACMI1_couple; - type patch; - } - // create blockage patch - master2 - { - //- Master side patch - name ACMI1_blockage; - type wall; - } - slave12 // dummy entries only - { - //- Slave side patch - name ACMI1_blockage; - type wall; - } - - } - -Boundary conditions must then be applied to all geometric patches in the usual, -manner, and the cases can be executed in parallel (as shown when running the -Allrun-parallel script) without any special treatment, i.e. the case set-up is -the same as when operating in serial mode. - - -checkMesh ---------- -checkMesh will see the 'duplicate' boundary faces but does not know about -the area factors so will complain: - - ***Boundary openness (-0.0103092 2.3845e-17 3.80774e-17) possible hole in boundary description. - ***Open cells found, max cell openness: 0.333333, number of open cells 136 - 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 ZuNn`w%afs=_vPzf;UMXLY5bmD{|D-^Gok