From 94933964b65bf518cf71c872ef7b7373600203d3 Mon Sep 17 00:00:00 2001 From: Christian Zehetner Date: Sun, 28 Jan 2024 08:18:52 +0100 Subject: [PATCH] cfd: second test case added (motorbike) --- tests/cfd/README.md | 18 +- tests/cfd/{ => example_cavity}/0/U | 0 tests/cfd/{ => example_cavity}/0/p | 0 tests/cfd/example_cavity/README.md | 9 + .../constant/transportProperties | 0 .../system/PDRblockMeshDict | 0 .../{ => example_cavity}/system/blockMeshDict | 0 .../{ => example_cavity}/system/controlDict | 0 .../system/decomposeParDict | 0 .../cfd/{ => example_cavity}/system/fvSchemes | 0 .../{ => example_cavity}/system/fvSolution | 0 tests/cfd/example_motorbike/0.orig/U | 51 +++ .../0.orig/include/fixedInlet | 15 + .../0.orig/include/frontBackUpperPatches | 19 + .../0.orig/include/initialConditions | 14 + tests/cfd/example_motorbike/0.orig/k | 53 +++ tests/cfd/example_motorbike/0.orig/nut | 63 ++++ tests/cfd/example_motorbike/0.orig/omega | 52 +++ tests/cfd/example_motorbike/0.orig/p | 52 +++ tests/cfd/example_motorbike/Allclean | 12 + tests/cfd/example_motorbike/Allrun | 54 +++ tests/cfd/example_motorbike/README.md | 13 + .../constant/transportProperties | 22 ++ .../constant/turbulenceProperties | 29 ++ ...ls-incompressible-simpleFoam-motorBike.zip | Bin 0 -> 29134 bytes .../example_motorbike/system/blockMeshDict | 86 +++++ .../cfd/example_motorbike/system/controlDict | 57 +++ .../cfd/example_motorbike/system/cuttingPlane | 33 ++ .../system/decomposeParDict-random | 22 ++ .../system/decomposeParDict.6 | 27 ++ .../cfd/example_motorbike/system/ensightWrite | 23 ++ .../example_motorbike/system/faMeshDefinition | 30 ++ tests/cfd/example_motorbike/system/faSchemes | 32 ++ tests/cfd/example_motorbike/system/faSolution | 19 + .../cfd/example_motorbike/system/forceCoeffs | 54 +++ tests/cfd/example_motorbike/system/fvSchemes | 62 ++++ tests/cfd/example_motorbike/system/fvSolution | 87 +++++ .../example_motorbike/system/meshQualityDict | 24 ++ tests/cfd/example_motorbike/system/profiling | 9 + .../system/snappyHexMeshDict | 326 ++++++++++++++++++ .../cfd/example_motorbike/system/streamLines | 55 +++ .../system/surfaceFeatureExtractDict | 45 +++ .../cfd/example_motorbike/system/topoSetDict | 31 ++ .../system/wallBoundedStreamLines | 95 +++++ 44 files changed, 1588 insertions(+), 5 deletions(-) rename tests/cfd/{ => example_cavity}/0/U (100%) rename tests/cfd/{ => example_cavity}/0/p (100%) create mode 100644 tests/cfd/example_cavity/README.md rename tests/cfd/{ => example_cavity}/constant/transportProperties (100%) rename tests/cfd/{ => example_cavity}/system/PDRblockMeshDict (100%) rename tests/cfd/{ => example_cavity}/system/blockMeshDict (100%) rename tests/cfd/{ => example_cavity}/system/controlDict (100%) rename tests/cfd/{ => example_cavity}/system/decomposeParDict (100%) rename tests/cfd/{ => example_cavity}/system/fvSchemes (100%) rename tests/cfd/{ => example_cavity}/system/fvSolution (100%) create mode 100644 tests/cfd/example_motorbike/0.orig/U create mode 100644 tests/cfd/example_motorbike/0.orig/include/fixedInlet create mode 100644 tests/cfd/example_motorbike/0.orig/include/frontBackUpperPatches create mode 100644 tests/cfd/example_motorbike/0.orig/include/initialConditions create mode 100644 tests/cfd/example_motorbike/0.orig/k create mode 100644 tests/cfd/example_motorbike/0.orig/nut create mode 100644 tests/cfd/example_motorbike/0.orig/omega create mode 100644 tests/cfd/example_motorbike/0.orig/p create mode 100644 tests/cfd/example_motorbike/Allclean create mode 100644 tests/cfd/example_motorbike/Allrun create mode 100644 tests/cfd/example_motorbike/README.md create mode 100644 tests/cfd/example_motorbike/constant/transportProperties create mode 100644 tests/cfd/example_motorbike/constant/turbulenceProperties create mode 100644 tests/cfd/example_motorbike/openfoam-master-tutorials-incompressible-simpleFoam-motorBike.zip create mode 100644 tests/cfd/example_motorbike/system/blockMeshDict create mode 100644 tests/cfd/example_motorbike/system/controlDict create mode 100644 tests/cfd/example_motorbike/system/cuttingPlane create mode 100644 tests/cfd/example_motorbike/system/decomposeParDict-random create mode 100644 tests/cfd/example_motorbike/system/decomposeParDict.6 create mode 100644 tests/cfd/example_motorbike/system/ensightWrite create mode 100644 tests/cfd/example_motorbike/system/faMeshDefinition create mode 100644 tests/cfd/example_motorbike/system/faSchemes create mode 100644 tests/cfd/example_motorbike/system/faSolution create mode 100644 tests/cfd/example_motorbike/system/forceCoeffs create mode 100644 tests/cfd/example_motorbike/system/fvSchemes create mode 100644 tests/cfd/example_motorbike/system/fvSolution create mode 100644 tests/cfd/example_motorbike/system/meshQualityDict create mode 100644 tests/cfd/example_motorbike/system/profiling create mode 100644 tests/cfd/example_motorbike/system/snappyHexMeshDict create mode 100644 tests/cfd/example_motorbike/system/streamLines create mode 100644 tests/cfd/example_motorbike/system/surfaceFeatureExtractDict create mode 100644 tests/cfd/example_motorbike/system/topoSetDict create mode 100644 tests/cfd/example_motorbike/system/wallBoundedStreamLines diff --git a/tests/cfd/README.md b/tests/cfd/README.md index a3b452bb..c139a4a3 100644 --- a/tests/cfd/README.md +++ b/tests/cfd/README.md @@ -1,9 +1,17 @@ -# OpenFOAM testcase - -- Lid driven cavity -- openfoam.com, OpenFOAM2312 +# OpenFOAM testcases +Testcases are related to +- openfoam.com +- tested with openFOAM2312 +## Lid driven cavity Commands: - blockMesh -- icoFoam \ No newline at end of file +- icoFoam + +## Motorbike +Commands: +- Allrun + + + diff --git a/tests/cfd/0/U b/tests/cfd/example_cavity/0/U similarity index 100% rename from tests/cfd/0/U rename to tests/cfd/example_cavity/0/U diff --git a/tests/cfd/0/p b/tests/cfd/example_cavity/0/p similarity index 100% rename from tests/cfd/0/p rename to tests/cfd/example_cavity/0/p diff --git a/tests/cfd/example_cavity/README.md b/tests/cfd/example_cavity/README.md new file mode 100644 index 00000000..f1cc8c2f --- /dev/null +++ b/tests/cfd/example_cavity/README.md @@ -0,0 +1,9 @@ +# OpenFOAM testcase + +- Lid driven cavity +- openfoam.com, tested with openFOAM2312 + + +Commands: +- blockMesh +- icoFoam \ No newline at end of file diff --git a/tests/cfd/constant/transportProperties b/tests/cfd/example_cavity/constant/transportProperties similarity index 100% rename from tests/cfd/constant/transportProperties rename to tests/cfd/example_cavity/constant/transportProperties diff --git a/tests/cfd/system/PDRblockMeshDict b/tests/cfd/example_cavity/system/PDRblockMeshDict similarity index 100% rename from tests/cfd/system/PDRblockMeshDict rename to tests/cfd/example_cavity/system/PDRblockMeshDict diff --git a/tests/cfd/system/blockMeshDict b/tests/cfd/example_cavity/system/blockMeshDict similarity index 100% rename from tests/cfd/system/blockMeshDict rename to tests/cfd/example_cavity/system/blockMeshDict diff --git a/tests/cfd/system/controlDict b/tests/cfd/example_cavity/system/controlDict similarity index 100% rename from tests/cfd/system/controlDict rename to tests/cfd/example_cavity/system/controlDict diff --git a/tests/cfd/system/decomposeParDict b/tests/cfd/example_cavity/system/decomposeParDict similarity index 100% rename from tests/cfd/system/decomposeParDict rename to tests/cfd/example_cavity/system/decomposeParDict diff --git a/tests/cfd/system/fvSchemes b/tests/cfd/example_cavity/system/fvSchemes similarity index 100% rename from tests/cfd/system/fvSchemes rename to tests/cfd/example_cavity/system/fvSchemes diff --git a/tests/cfd/system/fvSolution b/tests/cfd/example_cavity/system/fvSolution similarity index 100% rename from tests/cfd/system/fvSolution rename to tests/cfd/example_cavity/system/fvSolution diff --git a/tests/cfd/example_motorbike/0.orig/U b/tests/cfd/example_motorbike/0.orig/U new file mode 100644 index 00000000..18723231 --- /dev/null +++ b/tests/cfd/example_motorbike/0.orig/U @@ -0,0 +1,51 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volVectorField; + object U; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "include/initialConditions" + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform $flowVelocity; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + #include "include/fixedInlet" + + outlet + { + type inletOutlet; + inletValue uniform (0 0 0); + value $internalField; + } + + lowerWall + { + type fixedValue; + value $internalField; + } + + motorBikeGroup + { + type noSlip; + } + + #include "include/frontBackUpperPatches" +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/0.orig/include/fixedInlet b/tests/cfd/example_motorbike/0.orig/include/fixedInlet new file mode 100644 index 00000000..4c91f75f --- /dev/null +++ b/tests/cfd/example_motorbike/0.orig/include/fixedInlet @@ -0,0 +1,15 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +inlet +{ + type fixedValue; + value $internalField; +} + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/0.orig/include/frontBackUpperPatches b/tests/cfd/example_motorbike/0.orig/include/frontBackUpperPatches new file mode 100644 index 00000000..19b3e235 --- /dev/null +++ b/tests/cfd/example_motorbike/0.orig/include/frontBackUpperPatches @@ -0,0 +1,19 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +upperWall +{ + type slip; +} + +frontAndBack +{ + type slip; +} + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/0.orig/include/initialConditions b/tests/cfd/example_motorbike/0.orig/include/initialConditions new file mode 100644 index 00000000..1688de8b --- /dev/null +++ b/tests/cfd/example_motorbike/0.orig/include/initialConditions @@ -0,0 +1,14 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +flowVelocity (20 0 0); +pressure 0; +turbulentKE 0.24; +turbulentOmega 1.78; + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/0.orig/k b/tests/cfd/example_motorbike/0.orig/k new file mode 100644 index 00000000..214d6603 --- /dev/null +++ b/tests/cfd/example_motorbike/0.orig/k @@ -0,0 +1,53 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object k; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "include/initialConditions" + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform $turbulentKE; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + //- Define inlet conditions + #include "include/fixedInlet" + + outlet + { + type inletOutlet; + inletValue $internalField; + value $internalField; + } + + lowerWall + { + type kqRWallFunction; + value $internalField; + } + + motorBikeGroup + { + type kqRWallFunction; + value $internalField; + } + + #include "include/frontBackUpperPatches" +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/0.orig/nut b/tests/cfd/example_motorbike/0.orig/nut new file mode 100644 index 00000000..e9516bd5 --- /dev/null +++ b/tests/cfd/example_motorbike/0.orig/nut @@ -0,0 +1,63 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object nut; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -1 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + frontAndBack + { + type calculated; + value uniform 0; + } + + inlet + { + type calculated; + value uniform 0; + } + + outlet + { + type calculated; + value uniform 0; + } + + lowerWall + { + type nutkWallFunction; + value uniform 0; + } + + upperWall + { + type calculated; + value uniform 0; + } + + motorBikeGroup + { + type nutkWallFunction; + value uniform 0; + } +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/0.orig/omega b/tests/cfd/example_motorbike/0.orig/omega new file mode 100644 index 00000000..135a6bd2 --- /dev/null +++ b/tests/cfd/example_motorbike/0.orig/omega @@ -0,0 +1,52 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object omega; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "include/initialConditions" + +dimensions [0 0 -1 0 0 0 0]; + +internalField uniform $turbulentOmega; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + #include "include/fixedInlet" + + outlet + { + type inletOutlet; + inletValue $internalField; + value $internalField; + } + + lowerWall + { + type omegaWallFunction; + value $internalField; + } + + motorBikeGroup + { + type omegaWallFunction; + value $internalField; + } + + #include "include/frontBackUpperPatches" +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/0.orig/p b/tests/cfd/example_motorbike/0.orig/p new file mode 100644 index 00000000..fdf95910 --- /dev/null +++ b/tests/cfd/example_motorbike/0.orig/p @@ -0,0 +1,52 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object p; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "include/initialConditions" + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform $pressure; + +boundaryField +{ + #includeEtc "caseDicts/setConstraintTypes" + + inlet + { + type zeroGradient; + } + + outlet + { + type fixedValue; + value $internalField; + } + + lowerWall + { + type zeroGradient; + } + + motorBikeGroup + { + type zeroGradient; + } + + #include "include/frontBackUpperPatches" +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/Allclean b/tests/cfd/example_motorbike/Allclean new file mode 100644 index 00000000..21a3ef14 --- /dev/null +++ b/tests/cfd/example_motorbike/Allclean @@ -0,0 +1,12 @@ +#!/bin/sh +cd "${0%/*}" || exit # Run from this directory +. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions # Tutorial clean functions +#------------------------------------------------------------------------------ + +cleanCase0 + +# Remove surface and features +rm -rf constant/triSurface +rm -rf constant/extendedFeatureEdgeMesh + +#------------------------------------------------------------------------------ diff --git a/tests/cfd/example_motorbike/Allrun b/tests/cfd/example_motorbike/Allrun new file mode 100644 index 00000000..c958df49 --- /dev/null +++ b/tests/cfd/example_motorbike/Allrun @@ -0,0 +1,54 @@ +#!/bin/sh +cd "${0%/*}" || exit # Run from this directory +. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions +#------------------------------------------------------------------------------ + +# Alternative decomposeParDict name: +decompDict="-decomposeParDict system/decomposeParDict.6" +## Standard decomposeParDict name: +# unset decompDict + +# copy motorbike surface from resources directory +mkdir -p constant/triSurface + +cp -f \ + "$FOAM_TUTORIALS"/resources/geometry/motorBike.obj.gz \ + constant/triSurface/ + +runApplication surfaceFeatureExtract + +runApplication blockMesh + +runApplication $decompDict decomposePar + +# Using distributedTriSurfaceMesh? +if foamDictionary -entry geometry -value system/snappyHexMeshDict | \ + grep -q distributedTriSurfaceMesh +then + echo "surfaceRedistributePar does not need to be run anymore" + echo " - distributedTriSurfaceMesh will do on-the-fly redistribution" +fi + +runParallel $decompDict snappyHexMesh -overwrite + +runParallel $decompDict topoSet + +#- For non-parallel running: - set the initial fields +# restore0Dir + +#- For parallel running: set the initial fields +restore0Dir -processor + +runParallel $decompDict patchSummary + +runParallel $decompDict potentialFoam -writephi + +runParallel $decompDict checkMesh -writeFields '(nonOrthoAngle)' -constant + +runParallel $decompDict $(getApplication) + +runApplication reconstructParMesh -constant + +runApplication reconstructPar -latestTime + +#------------------------------------------------------------------------------ diff --git a/tests/cfd/example_motorbike/README.md b/tests/cfd/example_motorbike/README.md new file mode 100644 index 00000000..900cf474 --- /dev/null +++ b/tests/cfd/example_motorbike/README.md @@ -0,0 +1,13 @@ +# OpenFOAM testcase Motorbike + +## Source +https://develop.openfoam.com/Development/openfoam/-/tree/master/tutorials/incompressible/simpleFoam/motorBike + +## OpenFOAM distribution and version: +- openfoam.com +- tested with openFOAM2312 + + +## Commands: +- blockMesh +- icoFoam \ No newline at end of file diff --git a/tests/cfd/example_motorbike/constant/transportProperties b/tests/cfd/example_motorbike/constant/transportProperties new file mode 100644 index 00000000..2f49eea5 --- /dev/null +++ b/tests/cfd/example_motorbike/constant/transportProperties @@ -0,0 +1,22 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +transportModel Newtonian; + +nu 1.5e-05; + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/constant/turbulenceProperties b/tests/cfd/example_motorbike/constant/turbulenceProperties new file mode 100644 index 00000000..e5d396e2 --- /dev/null +++ b/tests/cfd/example_motorbike/constant/turbulenceProperties @@ -0,0 +1,29 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object turbulenceProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType RAS; + +RAS +{ + RASModel kOmegaSST; + + turbulence on; + + printCoeffs on; +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/openfoam-master-tutorials-incompressible-simpleFoam-motorBike.zip b/tests/cfd/example_motorbike/openfoam-master-tutorials-incompressible-simpleFoam-motorBike.zip new file mode 100644 index 0000000000000000000000000000000000000000..bfaf46e7854d6966975371ef8f19a59ff18bc6bf GIT binary patch literal 29134 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 literal 0 HcmV?d00001 diff --git a/tests/cfd/example_motorbike/system/blockMeshDict b/tests/cfd/example_motorbike/system/blockMeshDict new file mode 100644 index 00000000..f9ac7e9e --- /dev/null +++ b/tests/cfd/example_motorbike/system/blockMeshDict @@ -0,0 +1,86 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +scale 1; + +vertices +( + (-5 -4 0) + (15 -4 0) + (15 4 0) + (-5 4 0) + (-5 -4 8) + (15 -4 8) + (15 4 8) + (-5 4 8) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (20 8 8) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + frontAndBack + { + type patch; + faces + ( + (3 7 6 2) + (1 5 4 0) + ); + } + inlet + { + type patch; + faces + ( + (0 4 7 3) + ); + } + outlet + { + type patch; + faces + ( + (2 6 5 1) + ); + } + lowerWall + { + type wall; + faces + ( + (0 3 2 1) + ); + } + upperWall + { + type patch; + faces + ( + (4 5 6 7) + ); + } +); + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/controlDict b/tests/cfd/example_motorbike/system/controlDict new file mode 100644 index 00000000..becc0bc0 --- /dev/null +++ b/tests/cfd/example_motorbike/system/controlDict @@ -0,0 +1,57 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application simpleFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 500; + +deltaT 1; + +writeControl timeStep; + +writeInterval 100; + +purgeWrite 0; + +writeFormat binary; + +writePrecision 6; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +functions +{ + #include "streamLines" + #include "wallBoundedStreamLines" + #include "cuttingPlane" + #include "forceCoeffs" + #include "ensightWrite" +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/cuttingPlane b/tests/cfd/example_motorbike/system/cuttingPlane new file mode 100644 index 00000000..4cc6f0ca --- /dev/null +++ b/tests/cfd/example_motorbike/system/cuttingPlane @@ -0,0 +1,33 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +cuttingPlane +{ + type surfaces; + libs (sampling); + writeControl writeTime; + + surfaceFormat vtk; + fields ( p U ); + + interpolationScheme cellPoint; + + surfaces + { + yNormal + { + type cuttingPlane; + point (0 0 0); + normal (0 1 0); + interpolate true; + } + } +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/decomposeParDict-random b/tests/cfd/example_motorbike/system/decomposeParDict-random new file mode 100644 index 00000000..47b9de2e --- /dev/null +++ b/tests/cfd/example_motorbike/system/decomposeParDict-random @@ -0,0 +1,22 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 3; + +method random; + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/decomposeParDict.6 b/tests/cfd/example_motorbike/system/decomposeParDict.6 new file mode 100644 index 00000000..dbee1d4f --- /dev/null +++ b/tests/cfd/example_motorbike/system/decomposeParDict.6 @@ -0,0 +1,27 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 6; + +method hierarchical; + +coeffs +{ + n (3 2 1); +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/ensightWrite b/tests/cfd/example_motorbike/system/ensightWrite new file mode 100644 index 00000000..0842906f --- /dev/null +++ b/tests/cfd/example_motorbike/system/ensightWrite @@ -0,0 +1,23 @@ +// -*- C++ -*- +// Minimal example of using the ensight write function object. +// Many more options possible +ensightWrite +{ + type ensightWrite; + libs (utilityFunctionObjects); + log true; + + // Fields to output (words or regex) + fields (U p "(k|epsilon|omega)"); + + writeControl writeTime; + writeInterval 1; + + //patches ( "motorBike.*" ); + + //- These patches are uninteresting + excludePatches ( inlet outlet frontAndBack ".*[Ww]all" ); +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/faMeshDefinition b/tests/cfd/example_motorbike/system/faMeshDefinition new file mode 100644 index 00000000..c2014342 --- /dev/null +++ b/tests/cfd/example_motorbike/system/faMeshDefinition @@ -0,0 +1,30 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object faMeshDefinition; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +polyMeshPatches (motorBikeGroup); + +boundary +{ + bottom + { + type patch; + // ownerPolyPatch motorBikeGroup; + neighbourPolyPatch lowerWall; + } +} + + +// ************************************************************************** // diff --git a/tests/cfd/example_motorbike/system/faSchemes b/tests/cfd/example_motorbike/system/faSchemes new file mode 100644 index 00000000..9f139ad9 --- /dev/null +++ b/tests/cfd/example_motorbike/system/faSchemes @@ -0,0 +1,32 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object faSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes {} + +gradSchemes {} + +divSchemes {} + +laplacianSchemes {} + +interpolationSchemes {} + +lnGradSchemes {} + +fluxRequired {} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/faSolution b/tests/cfd/example_motorbike/system/faSolution new file mode 100644 index 00000000..cccd624c --- /dev/null +++ b/tests/cfd/example_motorbike/system/faSolution @@ -0,0 +1,19 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object faSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers {} + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/forceCoeffs b/tests/cfd/example_motorbike/system/forceCoeffs new file mode 100644 index 00000000..0dc666a1 --- /dev/null +++ b/tests/cfd/example_motorbike/system/forceCoeffs @@ -0,0 +1,54 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +forceCoeffs1 +{ + type forceCoeffs; + + libs (forces); + + writeControl timeStep; + timeInterval 1; + + log yes; + + patches (motorBikeGroup); + rho rhoInf; // Indicates incompressible + rhoInf 1; // Required when rho = rhoInf + liftDir (0 0 1); + dragDir (1 0 0); + CofR (0.72 0 0); // Axle midpoint on ground + pitchAxis (0 1 0); + magUInf 20; + lRef 1.42; // Wheelbase length + Aref 0.75; // Estimated +} + +/* +binField1 +{ + type binField; + libs (fieldFunctionObjects); + binModel singleDirectionUniformBin; + fields (forceCoeff); + patches (motorBikeGroup); + decomposePatchValues true; + CofR ${../forceCoeffs1/CofR}; + + binData + { + nBin 20; // output data into 20 bins + direction (1 0 0); // bin direction + cumulative yes; + } + writeControl timeStep; +} +*/ + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/fvSchemes b/tests/cfd/example_motorbike/system/fvSchemes new file mode 100644 index 00000000..00ddba31 --- /dev/null +++ b/tests/cfd/example_motorbike/system/fvSchemes @@ -0,0 +1,62 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default steadyState; +} + +gradSchemes +{ + default Gauss linear; + grad(U) cellLimited Gauss linear 1; +} + +divSchemes +{ + default none; + + div(phi,U) bounded Gauss linearUpwindV grad(U); + + turbulence bounded Gauss upwind; + div(phi,k) $turbulence; + div(phi,omega) $turbulence; + + div((nuEff*dev2(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +wallDist +{ + method meshWave; +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/fvSolution b/tests/cfd/example_motorbike/system/fvSolution new file mode 100644 index 00000000..7b4f8358 --- /dev/null +++ b/tests/cfd/example_motorbike/system/fvSolution @@ -0,0 +1,87 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + p + { + solver GAMG; + smoother GaussSeidel; + tolerance 1e-7; + relTol 0.01; + } + + Phi + { + $p; + } + + U + { + solver smoothSolver; + smoother GaussSeidel; + tolerance 1e-8; + relTol 0.1; + nSweeps 1; + } + + k + { + solver smoothSolver; + smoother GaussSeidel; + tolerance 1e-8; + relTol 0.1; + nSweeps 1; + } + + omega + { + solver smoothSolver; + smoother GaussSeidel; + tolerance 1e-8; + relTol 0.1; + nSweeps 1; + } +} + +SIMPLE +{ + nNonOrthogonalCorrectors 0; + consistent yes; +} + +potentialFlow +{ + nNonOrthogonalCorrectors 10; +} + +relaxationFactors +{ + equations + { + U 0.9; + k 0.7; + omega 0.7; + } +} + +cache +{ + grad(U); +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/meshQualityDict b/tests/cfd/example_motorbike/system/meshQualityDict new file mode 100644 index 00000000..e35092c9 --- /dev/null +++ b/tests/cfd/example_motorbike/system/meshQualityDict @@ -0,0 +1,24 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object meshQualityDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Include defaults parameters from master dictionary +#includeEtc "caseDicts/meshQualityDict" + +//- minFaceWeight (0 -> 0.5) +minFaceWeight 0.02; + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/profiling b/tests/cfd/example_motorbike/system/profiling new file mode 100644 index 00000000..b762c1cd --- /dev/null +++ b/tests/cfd/example_motorbike/system/profiling @@ -0,0 +1,9 @@ +// -*- C++ -*- + +profiling +{ + #includeEtc "caseDicts/profiling/parallel.cfg" + detail 1; +} + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/snappyHexMeshDict b/tests/cfd/example_motorbike/system/snappyHexMeshDict new file mode 100644 index 00000000..89ccaf08 --- /dev/null +++ b/tests/cfd/example_motorbike/system/snappyHexMeshDict @@ -0,0 +1,326 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object snappyHexMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Which of the steps to run +castellatedMesh true; +snap true; +addLayers true; + + +// Geometry. Definition of all surfaces. All surfaces are of class +// searchableSurface. +// Surfaces are used +// - to specify refinement for any mesh cell intersecting it +// - to specify refinement for any mesh cell inside/outside/near +// - to 'snap' the mesh boundary to the surface +geometry +{ + motorBike.obj + { + type triSurfaceMesh; + name motorBike; + } + + refinementBox + { + type box; + min (-1.0 -0.7 0.0); + max ( 8.0 0.7 2.5); + } +} + + +// Settings for the castellatedMesh generation. +castellatedMeshControls +{ + + // Refinement parameters + // ~~~~~~~~~~~~~~~~~~~~~ + + // If local number of cells is >= maxLocalCells on any processor + // switches from from refinement followed by balancing + // (current method) to (weighted) balancing before refinement. + maxLocalCells 100000; + + // Overall cell limit (approximately). Refinement will stop immediately + // upon reaching this number so a refinement level might not complete. + // Note that this is the number of cells before removing the part which + // is not 'visible' from the keepPoint. The final number of cells might + // actually be a lot less. + maxGlobalCells 2000000; + + // The surface refinement loop might spend lots of iterations refining just a + // few cells. This setting will cause refinement to stop if <= minimumRefine + // are selected for refinement. Note: it will at least do one iteration + // (unless the number of cells to refine is 0) + minRefinementCells 10; + + // Allow a certain level of imbalance during refining + // (since balancing is quite expensive) + // Expressed as fraction of perfect balance (= overall number of cells / + // nProcs). 0=balance always. + maxLoadUnbalance 0.10; + + + // Number of buffer layers between different levels. + // 1 means normal 2:1 refinement restriction, larger means slower + // refinement. + nCellsBetweenLevels 3; + + + + // Explicit feature edge refinement + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies a level for any cell intersected by its edges. + // This is a featureEdgeMesh, read from constant/triSurface for now. + features + ( + { + file "motorBike.eMesh"; + level 6; + } + ); + + + + // Surface based refinement + // ~~~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies two levels for every surface. The first is the minimum level, + // every cell intersecting a surface gets refined up to the minimum level. + // The second level is the maximum level. Cells that 'see' multiple + // intersections where the intersections make an + // angle > resolveFeatureAngle get refined up to the maximum level. + + refinementSurfaces + { + motorBike + { + // Surface-wise min and max refinement level + level (5 6); + + // Optional specification of patch type (default is wall). No + // constraint types (cyclic, symmetry) etc. are allowed. + patchInfo + { + type wall; + inGroups (motorBikeGroup); + } + } + } + + // Resolve sharp angles + resolveFeatureAngle 30; + + + // Region-wise refinement + // ~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies refinement level for cells in relation to a surface. One of + // three modes + // - distance. 'levels' specifies per distance to the surface the + // wanted refinement level. The distances need to be specified in + // descending order. + // - inside. 'levels' is only one entry and only the level is used. All + // cells inside the surface get refined up to the level. The surface + // needs to be closed for this to be possible. + // - outside. Same but cells outside. + + refinementRegions + { + refinementBox + { + mode inside; + levels ((1E15 4)); + } + } + + + // Mesh selection + // ~~~~~~~~~~~~~~ + + // After refinement patches get added for all refinementSurfaces and + // all cells intersecting the surfaces get put into these patches. The + // section reachable from the locationInMesh is kept. + // NOTE: This point should never be on a face, always inside a cell, even + // after refinement. + locationInMesh (3.0001 3.0001 0.43); + + + // Whether any faceZones (as specified in the refinementSurfaces) + // are only on the boundary of corresponding cellZones or also allow + // free-standing zone faces. Not used if there are no faceZones. + allowFreeStandingZoneFaces true; +} + + + +// Settings for the snapping. +snapControls +{ + //- Number of patch smoothing iterations before finding correspondence + // to surface + nSmoothPatch 3; + + //- Relative distance for points to be attracted by surface feature point + // or edge. True distance is this factor times local + // maximum edge length. + tolerance 2.0; + + //- Number of mesh displacement relaxation iterations. + nSolveIter 30; + + //- Maximum number of snapping relaxation iterations. Should stop + // before upon reaching a correct mesh. + nRelaxIter 5; + + // Feature snapping + + //- Number of feature edge snapping iterations. + // Leave out altogether to disable. + nFeatureSnapIter 10; + + //- Detect (geometric only) features by sampling the surface + // (default=false). + implicitFeatureSnap false; + + //- Use castellatedMeshControls::features (default = true) + explicitFeatureSnap true; + + //- Detect points on multiple surfaces (only for explicitFeatureSnap) + multiRegionFeatureSnap false; +} + + + +// Settings for the layer addition. +addLayersControls +{ + // Are the thickness parameters below relative to the undistorted + // size of the refined cell outside layer (true) or absolute sizes (false). + relativeSizes true; + + // Per final patch (so not geometry!) the layer information + layers + { + "(lowerWall|motorBike).*" + { + nSurfaceLayers 1; + } + } + + // Expansion factor for layer mesh + expansionRatio 1.0; + + // Wanted thickness of final added cell layer. If multiple layers + // is the thickness of the layer furthest away from the wall. + // Relative to undistorted size of cell outside layer. + // See relativeSizes parameter. + finalLayerThickness 0.3; + + // Minimum thickness of cell layer. If for any reason layer + // cannot be above minThickness do not add layer. + // Relative to undistorted size of cell outside layer. + minThickness 0.1; + + // If points get not extruded do nGrow layers of connected faces that are + // also not grown. This helps convergence of the layer addition process + // close to features. + // Note: changed(corrected) w.r.t 1.7.x! (didn't do anything in 1.7.x) + nGrow 0; + + // Advanced settings + + // When not to extrude surface. 0 is flat surface, 90 is when two faces + // are perpendicular + featureAngle 60; + + // At non-patched sides allow mesh to slip if extrusion direction makes + // angle larger than slipFeatureAngle. + slipFeatureAngle 30; + + // Maximum number of snapping relaxation iterations. Should stop + // before upon reaching a correct mesh. + nRelaxIter 3; + + // Number of smoothing iterations of surface normals + nSmoothSurfaceNormals 1; + + // Number of smoothing iterations of interior mesh movement direction + nSmoothNormals 3; + + // Smooth layer thickness over surface patches + nSmoothThickness 10; + + // Stop layer growth on highly warped cells + maxFaceThicknessRatio 0.5; + + // Reduce layer growth where ratio thickness to medial + // distance is large + maxThicknessToMedialRatio 0.3; + + // Angle used to pick up medial axis points + // Note: changed(corrected) w.r.t 1.7.x! 90 degrees corresponds to 130 + // in 1.7.x. + minMedialAxisAngle 90; + + + // Create buffer region for new layer terminations + nBufferCellsNoExtrude 0; + + + // Overall max number of layer addition iterations. The mesher will exit + // if it reaches this number of iterations; possibly with an illegal + // mesh. + nLayerIter 50; +} + + + +// Generic mesh quality settings. At any undoable phase these determine +// where to undo. +meshQualityControls +{ + #include "meshQualityDict" + + + // Advanced + + //- Number of error distribution iterations + nSmoothScale 4; + //- Amount to scale back displacement at error points + errorReduction 0.75; +} + + +// Advanced + +// Write flags +writeFlags +( + scalarLevels + layerSets + layerFields // write volScalarField for layer coverage +); + + +// Merge tolerance. Is fraction of overall bounding box of initial mesh. +// Note: the write tolerance needs to be higher than this. +mergeTolerance 1e-6; + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/streamLines b/tests/cfd/example_motorbike/system/streamLines new file mode 100644 index 00000000..13fd49f1 --- /dev/null +++ b/tests/cfd/example_motorbike/system/streamLines @@ -0,0 +1,55 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +streamLines +{ + type streamLine; + libs (fieldFunctionObjects); + + // Output every + writeControl writeTime; + // writeInterval 10; + + setFormat vtk; + + // Tracking direction (forward | backward | bidirectional) + direction forward; + + // Fields to sample + fields (p U k); + + // Steps particles can travel before being removed + lifeTime 10000; + + //- Specify either absolute length of steps (trackLength) or a number + // of subcycling steps per cell (nSubCycle) + + // Size of single track segment [m] + //trackLength 1e-3; + + // Number of steps per cell (estimate). Set to 1 to disable subcycling. + nSubCycle 5; + + // Cloud name to use + cloud particleTracks; + + // Seeding method. + seedSampleSet + { + type uniform; + axis x; //distance; + + // Note: tracks slightly offset so as not to be on a face + start (-1.001 -0.05 0.0011); + end (-1.001 -0.05 1.0011); + nPoints 20; + } +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/surfaceFeatureExtractDict b/tests/cfd/example_motorbike/system/surfaceFeatureExtractDict new file mode 100644 index 00000000..b6841c0d --- /dev/null +++ b/tests/cfd/example_motorbike/system/surfaceFeatureExtractDict @@ -0,0 +1,45 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object surfaceFeatureExtractDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +motorBike.obj +{ + // How to obtain raw features (extractFromFile || extractFromSurface) + extractionMethod extractFromSurface; + + // Mark edges whose adjacent surface normals are at an angle less + // than includedAngle as features + // - 0 : selects no edges + // - 180: selects all edges + includedAngle 150; + + subsetFeatures + { + // Keep nonManifold edges (edges with >2 connected faces) + nonManifoldEdges no; + + // Keep open edges (edges with 1 connected face) + openEdges yes; + } + + + // Write options + + // Write features to obj format for postprocessing + writeObj yes; +} + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/topoSetDict b/tests/cfd/example_motorbike/system/topoSetDict new file mode 100644 index 00000000..e4f4c4f8 --- /dev/null +++ b/tests/cfd/example_motorbike/system/topoSetDict @@ -0,0 +1,31 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + // For easier post-processing, and data-conversion tests + { + name inner; + type cellZoneSet; + action new; + source boxToCell; + min (-1 -0.5 0); + max ( 6 0.5 2); + } +); + + +// ************************************************************************* // diff --git a/tests/cfd/example_motorbike/system/wallBoundedStreamLines b/tests/cfd/example_motorbike/system/wallBoundedStreamLines new file mode 100644 index 00000000..99f69864 --- /dev/null +++ b/tests/cfd/example_motorbike/system/wallBoundedStreamLines @@ -0,0 +1,95 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2312 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +// Interpolate U to create near-wall UNear +near +{ + type nearWallFields; + libs (fieldFunctionObjects); + + // Output every + writeControl writeTime; + + // Calculate every + executeControl writeTime; + + // Fields to be sampled. Per field original name and mapped field to + // create. + // Note: fields only get updated when writing! + fields + ( + (U UNear) + ); + + // Patches/groups to sample (regular expressions) + patches (motorBikeGroup); + + // Distance to sample + distance 0.001; +} + + +// Use UNear to track along wall +wallBoundedStreamLines +{ + type wallBoundedStreamLine; + libs (fieldFunctionObjects); + + U UNear; // Velocity field for tracking + fields (p U k UNear); // Fields to sample + setFormat vtk; + direction forward; + lifeTime 100; // Steps particles can travel before being removed + cloud wallBoundedParticleTracks; + + seedSampleSet + { + type patchSeed; + + uniformCoeffs + { + axis x; //distance; + start (0.0035 0.0999 0.0001); + end (0.0035 0.0999 0.0099); + nPoints 20; + } + + cloudCoeffs + { + axis x; //distance; + points ((0.351516548679288 -0.0116085375585099 1.24)); + } + + patchSeedCoeffs + { + patches (motorBikeGroup); + axis x; //distance; + maxPoints 20000; + } + } + + // Optional entries + // bounds (0.2 -10 -10)(0.22 10 10); + // trackLength 1e-3; + // nSubCycle 1; + interpolationScheme cellPoint; + + // Optional (inherited) entries + region region0; + enabled true; + log true; + timeStart 0; + timeEnd 1000; + executeControl timeStep; + executeInterval 1; + writeControl writeTime; + writeInterval -1; +} + + +// ************************************************************************* //