From 1d949e5ffc81d2b6d6a3f5f301177abacb6c279b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Mon, 24 Jun 2024 16:10:07 +0200 Subject: [PATCH 01/27] It kind of runs --- channel-transport/transport-openfoam/0/T | 69 +++++++++ channel-transport/transport-openfoam/0/U | 39 +++++ channel-transport/transport-openfoam/clean.sh | 6 + .../constant/transportProperties | 9 ++ channel-transport/transport-openfoam/run.sh | 12 ++ .../transport-openfoam/system/blockMeshDict | 146 ++++++++++++++++++ .../transport-openfoam/system/controlDict | 44 ++++++ .../system/decomposeParDict | 16 ++ .../transport-openfoam/system/fvSchemes | 39 +++++ .../transport-openfoam/system/fvSolution | 25 +++ .../transport-openfoam/system/preciceDict | 37 +++++ 11 files changed, 442 insertions(+) create mode 100644 channel-transport/transport-openfoam/0/T create mode 100644 channel-transport/transport-openfoam/0/U create mode 100755 channel-transport/transport-openfoam/clean.sh create mode 100644 channel-transport/transport-openfoam/constant/transportProperties create mode 100755 channel-transport/transport-openfoam/run.sh create mode 100644 channel-transport/transport-openfoam/system/blockMeshDict create mode 100644 channel-transport/transport-openfoam/system/controlDict create mode 100644 channel-transport/transport-openfoam/system/decomposeParDict create mode 100644 channel-transport/transport-openfoam/system/fvSchemes create mode 100644 channel-transport/transport-openfoam/system/fvSolution create mode 100644 channel-transport/transport-openfoam/system/preciceDict diff --git a/channel-transport/transport-openfoam/0/T b/channel-transport/transport-openfoam/0/T new file mode 100644 index 000000000..a64055ab1 --- /dev/null +++ b/channel-transport/transport-openfoam/0/T @@ -0,0 +1,69 @@ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object T; +} + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + inlet + { + type zeroGradient; + } + + outlet + { + type fixedValue; + value uniform 0; + } + + obstacle + { + type zeroGradient; + } + + upperWall + { + type zeroGradient; + } + + lowerWall + { + type zeroGradient; + } + + frontAndBack + { + type empty; + } + + blob + { + type codedFixedValue; + value uniform 0; + redirectType fixedValue; + code + #{ + const fvPatch& boundaryPatch = patch(); + scalarField& field = *this; + + // Blob parameters + vector xblob(1, 1, 0); // Center of the blob + scalar R = 0.5; // Characteristic length (radius) + scalar width = 0.1; // Smoothing factor + + forAll(boundaryPatch, faceI) + { + const point& faceCenter = boundaryPatch.faceCentres()[faceI]; + scalar distanceSquared = magSqr(faceCenter - xblob.xy()); + field[faceI] = 0.5 - 0.5 * tanh((distanceSquared - R*R) / width); + } + #}; + } +} diff --git a/channel-transport/transport-openfoam/0/U b/channel-transport/transport-openfoam/0/U new file mode 100644 index 000000000..2cf022003 --- /dev/null +++ b/channel-transport/transport-openfoam/0/U @@ -0,0 +1,39 @@ +FoamFile +{ + version 2.0; + format ascii; + class volVectorField; + object U; +} + +dimensions [0 1 -1 0 0 0 0]; +internalField uniform (10 0 0); + +boundaryField +{ + inlet + { + type fixedValue; + value $internalField; + } + outlet + { + type zeroGradient; + } + obstacle + { + type noSlip; + } + upperWall + { + type noSlip; + } + lowerWall + { + type noSlip; + } + frontAndBack + { + type empty; + } +} diff --git a/channel-transport/transport-openfoam/clean.sh b/channel-transport/transport-openfoam/clean.sh new file mode 100755 index 000000000..b64fc5101 --- /dev/null +++ b/channel-transport/transport-openfoam/clean.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env sh +set -e -u + +. ../../tools/cleaning-tools.sh + +clean_openfoam . diff --git a/channel-transport/transport-openfoam/constant/transportProperties b/channel-transport/transport-openfoam/constant/transportProperties new file mode 100644 index 000000000..43d8644a6 --- /dev/null +++ b/channel-transport/transport-openfoam/constant/transportProperties @@ -0,0 +1,9 @@ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object transportProperties; +} + +DT 0.01; diff --git a/channel-transport/transport-openfoam/run.sh b/channel-transport/transport-openfoam/run.sh new file mode 100755 index 000000000..8f55fbfa5 --- /dev/null +++ b/channel-transport/transport-openfoam/run.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -e -u + +. ../../tools/log.sh +exec > >(tee --append "$LOGFILE") 2>&1 + +blockMesh + +../../tools/run-openfoam.sh "$@" +. ../../tools/openfoam-remove-empty-dirs.sh && openfoam_remove_empty_dirs + +close_log diff --git a/channel-transport/transport-openfoam/system/blockMeshDict b/channel-transport/transport-openfoam/system/blockMeshDict new file mode 100644 index 000000000..bdb4fe67b --- /dev/null +++ b/channel-transport/transport-openfoam/system/blockMeshDict @@ -0,0 +1,146 @@ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} + +x0 0.; +x1 2.; +x2 3.; +x3 6.; + +y0 0.; +y1 1.; +y2 2.; + +z0 0; +z1 1; + +vertices +( + ($x0 $y0 $z0 ) // 0 + ($x1 $y0 $z0 ) // 1 + ($x2 $y0 $z0 ) // 2 + ($x3 $y0 $z0 ) // 3 + ($x0 $y1 $z0 ) // 4 + ($x1 $y1 $z0 ) // 5 + ($x2 $y1 $z0 ) // 6 + ($x3 $y1 $z0 ) // 7 + ($x0 $y2 $z0 ) // 8 + ($x1 $y2 $z0 ) // 9 + ($x2 $y2 $z0 ) // 10 + ($x3 $y2 $z0 ) // 11 + + ($x0 $y0 $z1 ) // 12 + ($x1 $y0 $z1 ) // 13 + ($x2 $y0 $z1 ) // 14 + ($x3 $y0 $z1 ) // 15 + ($x0 $y1 $z1 ) // 16 + ($x1 $y1 $z1 ) // 17 + ($x2 $y1 $z1 ) // 18 + ($x3 $y1 $z1 ) // 19 + ($x0 $y2 $z1 ) // 20 + ($x1 $y2 $z1 ) // 21 + ($x2 $y2 $z1 ) // 22 + ($x3 $y2 $z1 ) // 23 +); + + +// Grading +h1 16; +h2 8; +h3 24; +v1 8; + +blocks +( + hex ( 0 1 5 4 12 13 17 16 ) + ($h1 $v1 1 ) + simpleGrading (1 1 1) + + hex ( 2 3 7 6 14 15 19 18 ) + ($h3 $v1 1) + simpleGrading (1 1 1) + + hex ( 4 5 9 8 16 17 21 20 ) + ($h1 $v1 1) + simpleGrading (1 1 1) + + hex ( 5 6 10 9 17 18 22 21 ) + ($h2 $v1 1) + simpleGrading (1 1 1) + + hex ( 6 7 11 10 18 19 23 22 ) + ($h3 $v1 1 ) + simpleGrading (1 1 1) +); + +boundary +( + inlet + { + type patch; + faces + ( + ( 0 4 16 12 ) + ( 4 8 20 16 ) + ); + } + outlet + { + type patch; + faces + ( + ( 3 7 19 15 ) + ( 7 11 23 19 ) + ); + } + obstacle + { + type wall; + faces + ( + ( 1 5 17 13 ) + ( 5 6 18 17 ) + ( 6 2 14 18 ) + ); + } + upperWall + { + type wall; + faces + ( + ( 8 9 21 20 ) + ( 9 10 22 21 ) + ( 10 11 23 22 ) + ); + } + lowerWall + { + type wall; + faces + ( + ( 0 1 13 12 ) + ( 2 3 15 14 ) + ); + } + frontAndBack + { + type empty; + faces + ( + ( 0 1 5 4 ) + ( 2 3 7 6 ) + ( 4 5 9 8 ) + ( 5 6 10 9 ) + ( 6 7 11 10 ) + ( 12 13 17 16 ) + ( 14 15 19 18 ) + ( 16 17 21 20 ) + ( 17 18 22 21 ) + ( 18 19 23 22 ) + ); + } +); \ No newline at end of file diff --git a/channel-transport/transport-openfoam/system/controlDict b/channel-transport/transport-openfoam/system/controlDict new file mode 100644 index 000000000..6211271cc --- /dev/null +++ b/channel-transport/transport-openfoam/system/controlDict @@ -0,0 +1,44 @@ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object controlDict; +} + +application scalarTransportFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 1.0; + +deltaT 0.005; + +writeControl adjustableRunTime; + +writeInterval 0.005; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +functions +{ + preCICE_Adapter + { + type preciceAdapterFunctionObject; + libs ("libpreciceAdapterFunctionObject.so"); + } +} diff --git a/channel-transport/transport-openfoam/system/decomposeParDict b/channel-transport/transport-openfoam/system/decomposeParDict new file mode 100644 index 000000000..f9eae003a --- /dev/null +++ b/channel-transport/transport-openfoam/system/decomposeParDict @@ -0,0 +1,16 @@ +FoamFile { + version 2.0; + class dictionary; + object decomposeParDict; + format ascii; +} + +numberOfSubdomains 4; + +method simple; + +simpleCoeffs +{ + n (2 2 1); + delta 0.001; +} \ No newline at end of file diff --git a/channel-transport/transport-openfoam/system/fvSchemes b/channel-transport/transport-openfoam/system/fvSchemes new file mode 100644 index 000000000..7ffafdece --- /dev/null +++ b/channel-transport/transport-openfoam/system/fvSchemes @@ -0,0 +1,39 @@ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSchemes; +} + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; +} + +divSchemes +{ + default none; + div(phi,T) Gauss linearUpwind grad(T); +} + +laplacianSchemes +{ + default none; + laplacian(DT,T) Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} diff --git a/channel-transport/transport-openfoam/system/fvSolution b/channel-transport/transport-openfoam/system/fvSolution new file mode 100644 index 000000000..df39d3595 --- /dev/null +++ b/channel-transport/transport-openfoam/system/fvSolution @@ -0,0 +1,25 @@ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} + +solvers +{ + T + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-6; + relTol 0; + norm default; + } +} + +SIMPLE +{ + nNonOrthogonalCorrectors 0; +} diff --git a/channel-transport/transport-openfoam/system/preciceDict b/channel-transport/transport-openfoam/system/preciceDict new file mode 100644 index 000000000..aca923918 --- /dev/null +++ b/channel-transport/transport-openfoam/system/preciceDict @@ -0,0 +1,37 @@ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object preciceDict; +} + +preciceConfig "../precice-config.xml"; + +participant Transport; + +modules (FF); + +interfaces +{ + Interface1 + { + mesh Transport-Mesh; + patches (); + locations volumeCenters; + + readData + ( + Velocity + ); + + writeData + ( + ); + }; +}; + +FF +{ + solverType incompressible; +} From ea64e381d460245850947b38207eb311411ceb72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Mon, 24 Jun 2024 16:52:14 +0200 Subject: [PATCH 02/27] remove blob --- channel-transport/transport-openfoam/0/T | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/channel-transport/transport-openfoam/0/T b/channel-transport/transport-openfoam/0/T index a64055ab1..d2d0bf23d 100644 --- a/channel-transport/transport-openfoam/0/T +++ b/channel-transport/transport-openfoam/0/T @@ -42,28 +42,4 @@ boundaryField { type empty; } - - blob - { - type codedFixedValue; - value uniform 0; - redirectType fixedValue; - code - #{ - const fvPatch& boundaryPatch = patch(); - scalarField& field = *this; - - // Blob parameters - vector xblob(1, 1, 0); // Center of the blob - scalar R = 0.5; // Characteristic length (radius) - scalar width = 0.1; // Smoothing factor - - forAll(boundaryPatch, faceI) - { - const point& faceCenter = boundaryPatch.faceCentres()[faceI]; - scalar distanceSquared = magSqr(faceCenter - xblob.xy()); - field[faceI] = 0.5 - 0.5 * tanh((distanceSquared - R*R) / width); - } - #}; - } } From a1c142cdb08f5a498c0bd7b69db7e5f60e509ed2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Mon, 24 Jun 2024 16:53:09 +0200 Subject: [PATCH 03/27] Maybe right? --- channel-transport/transport-openfoam/0/U | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/channel-transport/transport-openfoam/0/U b/channel-transport/transport-openfoam/0/U index 2cf022003..1f4cb2292 100644 --- a/channel-transport/transport-openfoam/0/U +++ b/channel-transport/transport-openfoam/0/U @@ -7,7 +7,7 @@ FoamFile } dimensions [0 1 -1 0 0 0 0]; -internalField uniform (10 0 0); +internalField uniform (0 0 0); boundaryField { From f2fb4f3fa23ec32566df4368d003025a22cb994a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Mon, 24 Jun 2024 17:00:46 +0200 Subject: [PATCH 04/27] setup setFields --- .../transport-openfoam/{0 => 0.orig}/T | 0 .../transport-openfoam/{0 => 0.orig}/U | 0 channel-transport/transport-openfoam/run.sh | 2 ++ .../transport-openfoam/system/setFieldsDict | 24 +++++++++++++++++++ 4 files changed, 26 insertions(+) rename channel-transport/transport-openfoam/{0 => 0.orig}/T (100%) rename channel-transport/transport-openfoam/{0 => 0.orig}/U (100%) create mode 100644 channel-transport/transport-openfoam/system/setFieldsDict diff --git a/channel-transport/transport-openfoam/0/T b/channel-transport/transport-openfoam/0.orig/T similarity index 100% rename from channel-transport/transport-openfoam/0/T rename to channel-transport/transport-openfoam/0.orig/T diff --git a/channel-transport/transport-openfoam/0/U b/channel-transport/transport-openfoam/0.orig/U similarity index 100% rename from channel-transport/transport-openfoam/0/U rename to channel-transport/transport-openfoam/0.orig/U diff --git a/channel-transport/transport-openfoam/run.sh b/channel-transport/transport-openfoam/run.sh index 8f55fbfa5..3cbec2a56 100755 --- a/channel-transport/transport-openfoam/run.sh +++ b/channel-transport/transport-openfoam/run.sh @@ -5,6 +5,8 @@ set -e -u exec > >(tee --append "$LOGFILE") 2>&1 blockMesh +cp -r 0.orig 0 +setFields ../../tools/run-openfoam.sh "$@" . ../../tools/openfoam-remove-empty-dirs.sh && openfoam_remove_empty_dirs diff --git a/channel-transport/transport-openfoam/system/setFieldsDict b/channel-transport/transport-openfoam/system/setFieldsDict new file mode 100644 index 000000000..c0c2e35b3 --- /dev/null +++ b/channel-transport/transport-openfoam/system/setFieldsDict @@ -0,0 +1,24 @@ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object setFieldsDict; +} + +defaultFieldValues +( + volScalarFieldValue T 0 +); + +regions +( + boxToCell + { + box (0.5 0.5 0) (1.5 1.5 1); + fieldValues + ( + volScalarFieldValue T 1 + ); + } +); From 9a1e7b90d6e57d8043596ec44417e8249eb70a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Tue, 25 Jun 2024 15:57:16 +0200 Subject: [PATCH 05/27] Set a cylinder, increase mesh cells, add U_vol workaround --- channel-transport/transport-openfoam/clean.sh | 1 + .../transport-openfoam/constant/fvOptions | 44 +++++++++++++++++++ .../constant/transportProperties | 2 +- channel-transport/transport-openfoam/run.sh | 1 + .../transport-openfoam/system/blockMeshDict | 20 ++++++--- .../transport-openfoam/system/fvSchemes | 4 +- .../transport-openfoam/system/fvSolution | 4 +- .../transport-openfoam/system/preciceDict | 1 + .../transport-openfoam/system/setFieldsDict | 8 +++- .../transport-openfoam/system/topoSetDict | 20 +++++++++ 10 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 channel-transport/transport-openfoam/constant/fvOptions create mode 100644 channel-transport/transport-openfoam/system/topoSetDict diff --git a/channel-transport/transport-openfoam/clean.sh b/channel-transport/transport-openfoam/clean.sh index b64fc5101..5120c1355 100755 --- a/channel-transport/transport-openfoam/clean.sh +++ b/channel-transport/transport-openfoam/clean.sh @@ -4,3 +4,4 @@ set -e -u . ../../tools/cleaning-tools.sh clean_openfoam . +rm -rf ./0/ diff --git a/channel-transport/transport-openfoam/constant/fvOptions b/channel-transport/transport-openfoam/constant/fvOptions new file mode 100644 index 000000000..8cea42d49 --- /dev/null +++ b/channel-transport/transport-openfoam/constant/fvOptions @@ -0,0 +1,44 @@ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvOptions; +} + +codedSource +{ + type vectorCodedSource; + // selectionMode all; + selectionMode cellSet; + cellSet box1; + + fields (U); + name sourceTime; + + codeConstrain //constrain + #{ + return; + #}; + + codeCorrect //correct + #{ + const labelList& cells = this->cells(); + const volVectorField& U_vol = mesh_.lookupObject("U_vol"); + for(auto cell : cells) + { + fld[cell].x() = U_vol[cell].x(); + } + #}; + + codeAddSup // source term + #{ + return; + #}; + + codeAddSupRho + #{ + return; + #}; +} +// vim:ft=foam diff --git a/channel-transport/transport-openfoam/constant/transportProperties b/channel-transport/transport-openfoam/constant/transportProperties index 43d8644a6..8d841ddc5 100644 --- a/channel-transport/transport-openfoam/constant/transportProperties +++ b/channel-transport/transport-openfoam/constant/transportProperties @@ -6,4 +6,4 @@ FoamFile object transportProperties; } -DT 0.01; +DT 0.1; diff --git a/channel-transport/transport-openfoam/run.sh b/channel-transport/transport-openfoam/run.sh index 3cbec2a56..20b10d2a4 100755 --- a/channel-transport/transport-openfoam/run.sh +++ b/channel-transport/transport-openfoam/run.sh @@ -5,6 +5,7 @@ set -e -u exec > >(tee --append "$LOGFILE") 2>&1 blockMesh +topoSet cp -r 0.orig 0 setFields diff --git a/channel-transport/transport-openfoam/system/blockMeshDict b/channel-transport/transport-openfoam/system/blockMeshDict index bdb4fe67b..19774348b 100644 --- a/channel-transport/transport-openfoam/system/blockMeshDict +++ b/channel-transport/transport-openfoam/system/blockMeshDict @@ -49,10 +49,20 @@ vertices // Grading -h1 16; -h2 8; -h3 24; -v1 8; +//h1 16; +//h2 8; +//h3 24; +//v1 8; + +//h1 40; +//h2 20; +//h3 60; +//v1 32; + +h1 20; +h2 10; +h3 30; +v1 16; blocks ( @@ -143,4 +153,4 @@ boundary ( 18 19 23 22 ) ); } -); \ No newline at end of file +); diff --git a/channel-transport/transport-openfoam/system/fvSchemes b/channel-transport/transport-openfoam/system/fvSchemes index 7ffafdece..6bb4d7d8c 100644 --- a/channel-transport/transport-openfoam/system/fvSchemes +++ b/channel-transport/transport-openfoam/system/fvSchemes @@ -19,12 +19,14 @@ gradSchemes divSchemes { default none; - div(phi,T) Gauss linearUpwind grad(T); + div(phi,U) Gauss linear; + div(phi,T) Gauss upwind; //linearUpwind grad(T); } laplacianSchemes { default none; + laplacian(DT,U) Gauss linear corrected; laplacian(DT,T) Gauss linear corrected; } diff --git a/channel-transport/transport-openfoam/system/fvSolution b/channel-transport/transport-openfoam/system/fvSolution index df39d3595..74640654b 100644 --- a/channel-transport/transport-openfoam/system/fvSolution +++ b/channel-transport/transport-openfoam/system/fvSolution @@ -11,11 +11,11 @@ solvers { T { - solver PBiCGStab; + solver PBiCGStab; preconditioner DILU; tolerance 1e-6; relTol 0; - norm default; + norm default; } } diff --git a/channel-transport/transport-openfoam/system/preciceDict b/channel-transport/transport-openfoam/system/preciceDict index aca923918..205148959 100644 --- a/channel-transport/transport-openfoam/system/preciceDict +++ b/channel-transport/transport-openfoam/system/preciceDict @@ -34,4 +34,5 @@ interfaces FF { solverType incompressible; + nameU U_vol; } diff --git a/channel-transport/transport-openfoam/system/setFieldsDict b/channel-transport/transport-openfoam/system/setFieldsDict index c0c2e35b3..245a5ca0e 100644 --- a/channel-transport/transport-openfoam/system/setFieldsDict +++ b/channel-transport/transport-openfoam/system/setFieldsDict @@ -13,12 +13,16 @@ defaultFieldValues regions ( - boxToCell + cylinderToCell { - box (0.5 0.5 0) (1.5 1.5 1); + p1 (1 1 0); + p2 (1 1 1); + radius 0.5; + fieldValues ( volScalarFieldValue T 1 + //TODO "0.5 - 0.5 * tanh(((x - 1)*(x - 1) + (y - 1)*(y - 1) - 0.5) / 0.1)" ); } ); diff --git a/channel-transport/transport-openfoam/system/topoSetDict b/channel-transport/transport-openfoam/system/topoSetDict new file mode 100644 index 000000000..0c557f640 --- /dev/null +++ b/channel-transport/transport-openfoam/system/topoSetDict @@ -0,0 +1,20 @@ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} + +actions +( + { + name box1; + type cellSet; + action new; + source boxToCell; + box (0 0 0) (2 2 1); + } +); + + From e3631451aa3caf842a0abc62a0d9db4dee59465c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 26 Jun 2024 10:09:11 +0200 Subject: [PATCH 06/27] Add modified solver --- .../transport-openfoam/.gitignore | 2 + channel-transport/transport-openfoam/0.orig/T | 3 +- .../transport-openfoam/Make/files | 3 + .../transport-openfoam/Make/options | 10 ++ .../transport-openfoam/constant/fvOptions | 6 +- .../transport-openfoam/createFields.H | 43 +++++++ .../dynamicScalarTransportFoam.C | 113 ++++++++++++++++++ channel-transport/transport-openfoam/run.sh | 1 - .../transport-openfoam/system/controlDict | 2 +- .../transport-openfoam/system/topoSetDict | 20 ---- 10 files changed, 176 insertions(+), 27 deletions(-) create mode 100644 channel-transport/transport-openfoam/.gitignore create mode 100644 channel-transport/transport-openfoam/Make/files create mode 100644 channel-transport/transport-openfoam/Make/options create mode 100644 channel-transport/transport-openfoam/createFields.H create mode 100644 channel-transport/transport-openfoam/dynamicScalarTransportFoam.C delete mode 100644 channel-transport/transport-openfoam/system/topoSetDict diff --git a/channel-transport/transport-openfoam/.gitignore b/channel-transport/transport-openfoam/.gitignore new file mode 100644 index 000000000..52b9cb41a --- /dev/null +++ b/channel-transport/transport-openfoam/.gitignore @@ -0,0 +1,2 @@ +Make/ +0/ diff --git a/channel-transport/transport-openfoam/0.orig/T b/channel-transport/transport-openfoam/0.orig/T index d2d0bf23d..3125d4d34 100644 --- a/channel-transport/transport-openfoam/0.orig/T +++ b/channel-transport/transport-openfoam/0.orig/T @@ -19,8 +19,7 @@ boundaryField outlet { - type fixedValue; - value uniform 0; + type zeroGradient; } obstacle diff --git a/channel-transport/transport-openfoam/Make/files b/channel-transport/transport-openfoam/Make/files new file mode 100644 index 000000000..6a9053551 --- /dev/null +++ b/channel-transport/transport-openfoam/Make/files @@ -0,0 +1,3 @@ +dynamicScalarTransportFoam.C + +EXE = $(FOAM_USER_APPBIN)/dynamicScalarTransportFoam diff --git a/channel-transport/transport-openfoam/Make/options b/channel-transport/transport-openfoam/Make/options new file mode 100644 index 000000000..acbe7a647 --- /dev/null +++ b/channel-transport/transport-openfoam/Make/options @@ -0,0 +1,10 @@ +EXE_INC = \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude + +EXE_LIBS = \ + -lfiniteVolume \ + -lfvOptions \ + -lmeshTools \ + -lsampling diff --git a/channel-transport/transport-openfoam/constant/fvOptions b/channel-transport/transport-openfoam/constant/fvOptions index 8cea42d49..efde08222 100644 --- a/channel-transport/transport-openfoam/constant/fvOptions +++ b/channel-transport/transport-openfoam/constant/fvOptions @@ -9,9 +9,7 @@ FoamFile codedSource { type vectorCodedSource; - // selectionMode all; - selectionMode cellSet; - cellSet box1; + selectionMode all; fields (U); name sourceTime; @@ -28,6 +26,8 @@ codedSource for(auto cell : cells) { fld[cell].x() = U_vol[cell].x(); + fld[cell].y() = U_vol[cell].y(); + fld[cell].z() = U_vol[cell].z(); } #}; diff --git a/channel-transport/transport-openfoam/createFields.H b/channel-transport/transport-openfoam/createFields.H new file mode 100644 index 000000000..82417fbb0 --- /dev/null +++ b/channel-transport/transport-openfoam/createFields.H @@ -0,0 +1,43 @@ +Info << "Reading field T\n" + << endl; + +volScalarField T( + IOobject( + "T", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE), + mesh); + +Info << "Reading field U\n" + << endl; + +volVectorField U( + IOobject( + "U", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE), + mesh); + +Info << "Reading transportProperties\n" + << endl; + +IOdictionary transportProperties( + IOobject( + "transportProperties", + runTime.constant(), + mesh, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE)); + +Info << "Reading diffusivity DT\n" + << endl; + +dimensionedScalar DT("DT", dimViscosity, transportProperties); + +#include "createPhi.H" + +#include "createFvOptions.H" diff --git a/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C b/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C new file mode 100644 index 000000000..f26165ffd --- /dev/null +++ b/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C @@ -0,0 +1,113 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2011-2017 OpenFOAM Foundation +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Application + scalarTransportFoam + +Group + grpBasicSolvers + +Description + Passive scalar transport equation solver. + + \heading Solver details + The equation is given by: + + \f[ + \ddt{T} + \div \left(\vec{U} T\right) - \div \left(D_T \grad T \right) + = S_{T} + \f] + + Where: + \vartable + T | Passive scalar + D_T | Diffusion coefficient + S_T | Source + \endvartable + + \heading Required fields + \plaintable + T | Passive scalar + U | Velocity [m/s] + \endplaintable + +\*---------------------------------------------------------------------------*/ + +#include "fvCFD.H" +#include "fvOptions.H" +#include "simpleControl.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + argList::addNote( + "Passive scalar transport equation solver."); + +#include "addCheckCaseOptions.H" +#include "createMesh.H" +#include "createTime.H" +#include "setRootCaseLists.H" + + simpleControl simple(mesh); + +#include "createFields.H" + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + Info << "\nCalculating scalar transport\n" + << endl; + +#include "CourantNo.H" + + while (simple.loop()) { + Info << "Time = " << runTime.timeName() << nl << endl; + + while (simple.correctNonOrthogonal()) { + // TODO directly read from U + fvOptions.correct(U); + phi = fvc::flux(U); + // fvOptions.correct(phi); + + fvScalarMatrix TEqn( + fvm::ddt(T) + fvm::div(phi, T) - fvm::laplacian(DT, T) == + fvOptions(T)); + + TEqn.relax(); + fvOptions.constrain(TEqn); + TEqn.solve(); + fvOptions.correct(T); + } + + runTime.write(); + } + + Info << "End\n" + << endl; + + return 0; +} + +// ************************************************************************* // diff --git a/channel-transport/transport-openfoam/run.sh b/channel-transport/transport-openfoam/run.sh index 20b10d2a4..3cbec2a56 100755 --- a/channel-transport/transport-openfoam/run.sh +++ b/channel-transport/transport-openfoam/run.sh @@ -5,7 +5,6 @@ set -e -u exec > >(tee --append "$LOGFILE") 2>&1 blockMesh -topoSet cp -r 0.orig 0 setFields diff --git a/channel-transport/transport-openfoam/system/controlDict b/channel-transport/transport-openfoam/system/controlDict index 6211271cc..ef74b7f99 100644 --- a/channel-transport/transport-openfoam/system/controlDict +++ b/channel-transport/transport-openfoam/system/controlDict @@ -6,7 +6,7 @@ FoamFile object controlDict; } -application scalarTransportFoam; +application dynamicScalarTransportFoam; startFrom startTime; diff --git a/channel-transport/transport-openfoam/system/topoSetDict b/channel-transport/transport-openfoam/system/topoSetDict deleted file mode 100644 index 0c557f640..000000000 --- a/channel-transport/transport-openfoam/system/topoSetDict +++ /dev/null @@ -1,20 +0,0 @@ -FoamFile -{ - version 2.0; - format ascii; - class dictionary; - object topoSetDict; -} - -actions -( - { - name box1; - type cellSet; - action new; - source boxToCell; - box (0 0 0) (2 2 1); - } -); - - From e103c9a169c03501f1a75c4caa53865c1e28e135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 26 Jun 2024 10:25:08 +0200 Subject: [PATCH 07/27] Remove U_vol and rename solver --- channel-transport/transport-openfoam/clean.sh | 1 + .../transport-openfoam/constant/fvOptions | 44 ------------ .../dynamicScalarTransportFoam.C | 70 ++++++++++--------- .../transport-openfoam/system/preciceDict | 1 - 4 files changed, 39 insertions(+), 77 deletions(-) delete mode 100644 channel-transport/transport-openfoam/constant/fvOptions diff --git a/channel-transport/transport-openfoam/clean.sh b/channel-transport/transport-openfoam/clean.sh index 5120c1355..6ab219250 100755 --- a/channel-transport/transport-openfoam/clean.sh +++ b/channel-transport/transport-openfoam/clean.sh @@ -5,3 +5,4 @@ set -e -u clean_openfoam . rm -rf ./0/ +rm -rf ./Make/linux* diff --git a/channel-transport/transport-openfoam/constant/fvOptions b/channel-transport/transport-openfoam/constant/fvOptions deleted file mode 100644 index efde08222..000000000 --- a/channel-transport/transport-openfoam/constant/fvOptions +++ /dev/null @@ -1,44 +0,0 @@ -FoamFile -{ - version 2.0; - format ascii; - class dictionary; - object fvOptions; -} - -codedSource -{ - type vectorCodedSource; - selectionMode all; - - fields (U); - name sourceTime; - - codeConstrain //constrain - #{ - return; - #}; - - codeCorrect //correct - #{ - const labelList& cells = this->cells(); - const volVectorField& U_vol = mesh_.lookupObject("U_vol"); - for(auto cell : cells) - { - fld[cell].x() = U_vol[cell].x(); - fld[cell].y() = U_vol[cell].y(); - fld[cell].z() = U_vol[cell].z(); - } - #}; - - codeAddSup // source term - #{ - return; - #}; - - codeAddSupRho - #{ - return; - #}; -} -// vim:ft=foam diff --git a/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C b/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C index f26165ffd..9ac8e7ba3 100644 --- a/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C +++ b/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C @@ -63,51 +63,57 @@ Description int main(int argc, char *argv[]) { - argList::addNote( - "Passive scalar transport equation solver."); + argList::addNote + ( + "Passive scalar transport equation solver." + ); -#include "addCheckCaseOptions.H" -#include "createMesh.H" -#include "createTime.H" -#include "setRootCaseLists.H" + #include "addCheckCaseOptions.H" + #include "setRootCaseLists.H" + #include "createTime.H" + #include "createMesh.H" - simpleControl simple(mesh); + simpleControl simple(mesh); -#include "createFields.H" + #include "createFields.H" - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - Info << "\nCalculating scalar transport\n" - << endl; + Info<< "\nCalculating scalar transport\n" << endl; -#include "CourantNo.H" + #include "CourantNo.H" - while (simple.loop()) { - Info << "Time = " << runTime.timeName() << nl << endl; + while (simple.loop()) + { + Info << "Time = " << runTime.timeName() << nl << endl; - while (simple.correctNonOrthogonal()) { - // TODO directly read from U - fvOptions.correct(U); - phi = fvc::flux(U); - // fvOptions.correct(phi); + while (simple.correctNonOrthogonal()) + { + // Update phi as U changes + phi = fvc::flux(U); - fvScalarMatrix TEqn( - fvm::ddt(T) + fvm::div(phi, T) - fvm::laplacian(DT, T) == - fvOptions(T)); + fvScalarMatrix TEqn + ( + fvm::ddt(T) + + fvm::div(phi, T) + - fvm::laplacian(DT, T) + == + fvOptions(T) + ); - TEqn.relax(); - fvOptions.constrain(TEqn); - TEqn.solve(); - fvOptions.correct(T); - } + TEqn.relax(); + fvOptions.constrain(TEqn); + TEqn.solve(); + fvOptions.correct(T); + } - runTime.write(); - } + runTime.write(); + } - Info << "End\n" - << endl; + Info<< "End\n" << endl; - return 0; + return 0; } + // ************************************************************************* // diff --git a/channel-transport/transport-openfoam/system/preciceDict b/channel-transport/transport-openfoam/system/preciceDict index 205148959..aca923918 100644 --- a/channel-transport/transport-openfoam/system/preciceDict +++ b/channel-transport/transport-openfoam/system/preciceDict @@ -34,5 +34,4 @@ interfaces FF { solverType incompressible; - nameU U_vol; } From 38f1424ede691a57fdf70db1b1e78088dbfbc773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 26 Jun 2024 10:29:07 +0200 Subject: [PATCH 08/27] fix --- .../transport-openfoam/.clang-format | 175 ++++++++++++++++++ .../transport-openfoam/.gitignore | 4 +- 2 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 channel-transport/transport-openfoam/.clang-format diff --git a/channel-transport/transport-openfoam/.clang-format b/channel-transport/transport-openfoam/.clang-format new file mode 100644 index 000000000..00adea7a3 --- /dev/null +++ b/channel-transport/transport-openfoam/.clang-format @@ -0,0 +1,175 @@ +--- +Language: Cpp +# BasedOnStyle: LLVM +# +# Proposed clang-format-11 style for OpenFOAM, trying to follow the OpenFOAM style guide: +# https://develop.openfoam.com/Development/openfoam/-/wikis/coding/style/style +# Configuration developed for the OpenFOAM-preCICE adapter code: +# https://github.com/precice/openfoam-adapter +# Contribute to the discussion at the respective OpenFOAM issue: +# https://develop.openfoam.com/Development/openfoam/-/issues/1634 +# +# Keep `public:` at the first indentation level +AccessModifierOffset: -4 +# Undocumented guideline: align arguments after an open bracket. +AlignAfterOpenBracket: Align +AlignConsecutiveMacros: false +AlignConsecutiveAssignments: false +AlignConsecutiveBitFields: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Right +# Align operands after operators (+,*,<<) (see BreakBeforeBinaryOperators) +AlignOperands: AlignAfterOperator +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllConstructorInitializersOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortEnumsOnASingleLine: true +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Always +AllowShortLoopsOnASingleLine: false +# Guideline: Splitting return type and function name +# (this guideline is apparently not strictly followed in OpenFOAM) +# AlwaysBreakAfterReturnType: All +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: Yes +BinPackArguments: false +BinPackParameters: false +# Covered by "BreakBeforeBraces" +BraceWrapping: + AfterCaseLabel: true + AfterClass: true + AfterControlStatement: Always + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: true + AfterStruct: true + AfterUnion: true + AfterExternBlock: true + BeforeCatch: true + BeforeElse: true + BeforeLambdaBody: true + BeforeWhile: true + IndentBraces: true + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +# Guideline (almost): Splitting long lines at an = sign. Indent after split. +# Guideline (almost): Splitting formulae over several lines. +BreakBeforeBinaryOperators: NonAssignment +# Always break before braces: if, for, functions, classes, etc. +BreakBeforeBraces: Allman +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +# Guideline (almost): Splitting logical tests over several lines. +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +# Undocumented guideline (almost): Have the initializer : in a new line. +BreakConstructorInitializers: BeforeColon +BreakStringLiterals: true +# Here we could set the 80 charactes limit, but that would lead to more aggressive changes. +ColumnLimit: 0 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 0 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +DisableFormat: false +# Undocumented guideline: add line after "public:" etc (since clang-format 12) +# EmptyLineAfterAccessModifier: Always +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +# Guideline: Macro loops are like for loops, but without a space. +ForEachMacros: + - forAllIters + - forAllConstIters + - forAllReverseIters + - forAllConstReverseIters + - forAll + - forAllReverse + - forAllIter + - forAllConstIter +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + - Regex: '.*' + Priority: 1 + SortPriority: 0 +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentCaseLabels: false +IndentCaseBlocks: false +IndentGotoLabels: true +IndentPPDirectives: None +IndentExternBlock: AfterExternBlock +# Guideline: The normal indentation is 4 spaces per logical level. +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertTrailingCommas: None +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +# Required to not change code following the guidelines +# "Leave two empty lines between sections" and +# "Use two empty lines between functions" +MaxEmptyLinesToKeep: 2 +NamespaceIndentation: None +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Left +ReflowComments: true +# Do not change the order of include statements (could be catastrophic for OpenFOAM) +SortIncludes: false +SortUsingDeclarations: false +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +# No "template " (guideline already used, but not documented) +SpaceAfterTemplateKeyword: false +SpaceBeforeAssignmentOperators: true +# No a{1} (no guideline) +SpaceBeforeCpp11BracedList: true +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +# Guideline: Spaces in "if ()", "for ()", but not "forAll ()". +SpaceBeforeParens: ControlStatementsExceptForEachMacros +# Guideline: Range-based for should have a space surrounding the ':'. +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInConditionalStatement: false +# No "arr[3] = [ 1, 2, 3 ]" (no guideline). +SpacesInContainerLiterals: false +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceBeforeSquareBrackets: false +# Treat the code as C++11 or later +Standard: Latest +StatementMacros: +TabWidth: 4 +UseCRLF: false +# Guideline: No tab characters - only use spaces for indentation. +UseTab: Never +WhitespaceSensitiveMacros: +... + diff --git a/channel-transport/transport-openfoam/.gitignore b/channel-transport/transport-openfoam/.gitignore index 52b9cb41a..1f7d5d93a 100644 --- a/channel-transport/transport-openfoam/.gitignore +++ b/channel-transport/transport-openfoam/.gitignore @@ -1,2 +1,4 @@ -Make/ +Make/* +!Make/files +!Make/options 0/ From 14db9a1a661779e201bf9c9efae0b6f2b396daa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 26 Jun 2024 10:41:19 +0200 Subject: [PATCH 09/27] Revert to default schemes --- channel-transport/transport-openfoam/system/fvSchemes | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/channel-transport/transport-openfoam/system/fvSchemes b/channel-transport/transport-openfoam/system/fvSchemes index 6bb4d7d8c..7ffafdece 100644 --- a/channel-transport/transport-openfoam/system/fvSchemes +++ b/channel-transport/transport-openfoam/system/fvSchemes @@ -19,14 +19,12 @@ gradSchemes divSchemes { default none; - div(phi,U) Gauss linear; - div(phi,T) Gauss upwind; //linearUpwind grad(T); + div(phi,T) Gauss linearUpwind grad(T); } laplacianSchemes { default none; - laplacian(DT,U) Gauss linear corrected; laplacian(DT,T) Gauss linear corrected; } From a4d0899d04166b23bfce5954ce2f47d224869552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 26 Jun 2024 11:42:37 +0200 Subject: [PATCH 10/27] Fix dimensions of T --- channel-transport/transport-openfoam/0.orig/T | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/channel-transport/transport-openfoam/0.orig/T b/channel-transport/transport-openfoam/0.orig/T index 3125d4d34..d7a18ffa1 100644 --- a/channel-transport/transport-openfoam/0.orig/T +++ b/channel-transport/transport-openfoam/0.orig/T @@ -6,7 +6,7 @@ FoamFile object T; } -dimensions [0 2 -2 0 0 0 0]; +dimensions [0 0 0 1 0 0 0]; internalField uniform 0; From 900eef567361a9014917e2bb2d0b20bfb3bfb57b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 26 Jun 2024 11:43:02 +0200 Subject: [PATCH 11/27] Revert to tutorial files --- .../transport-openfoam/system/fvSchemes | 11 ++++++++ .../transport-openfoam/system/fvSolution | 28 +++++++++++++------ 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/channel-transport/transport-openfoam/system/fvSchemes b/channel-transport/transport-openfoam/system/fvSchemes index 7ffafdece..f3a636050 100644 --- a/channel-transport/transport-openfoam/system/fvSchemes +++ b/channel-transport/transport-openfoam/system/fvSchemes @@ -1,3 +1,10 @@ +/*--------------------------------*- 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; @@ -5,6 +12,7 @@ FoamFile class dictionary; object fvSchemes; } +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // ddtSchemes { @@ -37,3 +45,6 @@ snGradSchemes { default corrected; } + + +// ************************************************************************* // diff --git a/channel-transport/transport-openfoam/system/fvSolution b/channel-transport/transport-openfoam/system/fvSolution index 74640654b..b258c9b1b 100644 --- a/channel-transport/transport-openfoam/system/fvSolution +++ b/channel-transport/transport-openfoam/system/fvSolution @@ -1,25 +1,35 @@ +/*--------------------------------*- 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; - location "system"; object fvSolution; } +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // solvers { - T - { - solver PBiCGStab; - preconditioner DILU; - tolerance 1e-6; - relTol 0; - norm default; - } + T + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-6; + relTol 0; + norm default; + } } SIMPLE { nNonOrthogonalCorrectors 0; } + + +// ************************************************************************* // From 759e9e50d7e764f2ff08a1c51b5a260f8058cfe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 26 Jun 2024 12:45:11 +0200 Subject: [PATCH 12/27] Recompute phi after the preCICE adapter --- .../transport-openfoam/dynamicScalarTransportFoam.C | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C b/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C index 9ac8e7ba3..f880dd720 100644 --- a/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C +++ b/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C @@ -81,17 +81,17 @@ int main(int argc, char *argv[]) Info<< "\nCalculating scalar transport\n" << endl; - #include "CourantNo.H" - while (simple.loop()) { Info << "Time = " << runTime.timeName() << nl << endl; + Info<< "Recompute phi" << endl; + fvOptions.correct(U); + phi = fvc::flux(U); + #include "CourantNo.H" + while (simple.correctNonOrthogonal()) { - // Update phi as U changes - phi = fvc::flux(U); - fvScalarMatrix TEqn ( fvm::ddt(T) From 78e47697a821b7e726d339534c61c7c64384ba8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 26 Jun 2024 13:40:30 +0200 Subject: [PATCH 13/27] Correctly set blob --- channel-transport/transport-openfoam/run.sh | 2 +- .../system/setExprFieldsDict | 29 +++++++++++++++++++ .../transport-openfoam/system/setFieldsDict | 28 ------------------ 3 files changed, 30 insertions(+), 29 deletions(-) create mode 100644 channel-transport/transport-openfoam/system/setExprFieldsDict delete mode 100644 channel-transport/transport-openfoam/system/setFieldsDict diff --git a/channel-transport/transport-openfoam/run.sh b/channel-transport/transport-openfoam/run.sh index 3cbec2a56..bf6db3941 100755 --- a/channel-transport/transport-openfoam/run.sh +++ b/channel-transport/transport-openfoam/run.sh @@ -6,7 +6,7 @@ exec > >(tee --append "$LOGFILE") 2>&1 blockMesh cp -r 0.orig 0 -setFields +setExprFields ../../tools/run-openfoam.sh "$@" . ../../tools/openfoam-remove-empty-dirs.sh && openfoam_remove_empty_dirs diff --git a/channel-transport/transport-openfoam/system/setExprFieldsDict b/channel-transport/transport-openfoam/system/setExprFieldsDict new file mode 100644 index 000000000..69f06ed75 --- /dev/null +++ b/channel-transport/transport-openfoam/system/setExprFieldsDict @@ -0,0 +1,29 @@ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object setExprFieldsDict; +} + +expressions +( + T + { + field T; + + variables + ( + "x = pos().x()" + "y = pos().y()" + "r = 0.5" + "bx = 1" + "by = 1" + ); + + expression + #{ + r - r * tanh(((x - bx)*(x - bx) + (y - by)*(y - by) - r) / 0.1) + #}; + } +); diff --git a/channel-transport/transport-openfoam/system/setFieldsDict b/channel-transport/transport-openfoam/system/setFieldsDict deleted file mode 100644 index 245a5ca0e..000000000 --- a/channel-transport/transport-openfoam/system/setFieldsDict +++ /dev/null @@ -1,28 +0,0 @@ -FoamFile -{ - version 2.0; - format ascii; - class dictionary; - object setFieldsDict; -} - -defaultFieldValues -( - volScalarFieldValue T 0 -); - -regions -( - cylinderToCell - { - p1 (1 1 0); - p2 (1 1 1); - radius 0.5; - - fieldValues - ( - volScalarFieldValue T 1 - //TODO "0.5 - 0.5 * tanh(((x - 1)*(x - 1) + (y - 1)*(y - 1) - 0.5) / 0.1)" - ); - } -); From 3b001ee1b46940aaef0d9839b254593151b3fd42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 26 Jun 2024 13:47:56 +0200 Subject: [PATCH 14/27] Add OpenFOAM transport to README --- channel-transport/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/channel-transport/README.md b/channel-transport/README.md index 267a70550..da8367ad6 100644 --- a/channel-transport/README.md +++ b/channel-transport/README.md @@ -41,6 +41,8 @@ Transport participant: * Nutils. For more information, have a look at the [Nutils adapter documentation](https://precice.org/adapter-nutils.html). This Nutils solver requires at least Nutils v7.0. +* OpenFOAM. This case uses a modified version of scalarTransportFoam, which recomputes `phi` after the preCICE adapter reads the velocity field. Build it with `wmake`. Read more details in the [OpenFOAM adapter](https://precice.org/adapter-openfoam-overview.html). + ## Running the simulation Open two separate terminals and start one fluid and one transport participant by calling the respective run scripts `run.sh` located in each of the participants' directory. For example: From c711cce87b5d1a23ba868c8fc2993a6a11e5cdfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Thu, 11 Jul 2024 13:09:40 +0200 Subject: [PATCH 15/27] Only set initial condition --- channel-transport/transport-openfoam/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/channel-transport/transport-openfoam/run.sh b/channel-transport/transport-openfoam/run.sh index bf6db3941..9a8884f2c 100755 --- a/channel-transport/transport-openfoam/run.sh +++ b/channel-transport/transport-openfoam/run.sh @@ -6,7 +6,7 @@ exec > >(tee --append "$LOGFILE") 2>&1 blockMesh cp -r 0.orig 0 -setExprFields +setExprFields -time 0 ../../tools/run-openfoam.sh "$@" . ../../tools/openfoam-remove-empty-dirs.sh && openfoam_remove_empty_dirs From 5602cfd397d5ad6ad6c2e2bf41ca0e640cf1fb5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Thu, 11 Jul 2024 13:13:11 +0200 Subject: [PATCH 16/27] Add note about openfoam conserving T --- channel-transport/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/channel-transport/README.md b/channel-transport/README.md index da8367ad6..497bed369 100644 --- a/channel-transport/README.md +++ b/channel-transport/README.md @@ -41,7 +41,7 @@ Transport participant: * Nutils. For more information, have a look at the [Nutils adapter documentation](https://precice.org/adapter-nutils.html). This Nutils solver requires at least Nutils v7.0. -* OpenFOAM. This case uses a modified version of scalarTransportFoam, which recomputes `phi` after the preCICE adapter reads the velocity field. Build it with `wmake`. Read more details in the [OpenFOAM adapter](https://precice.org/adapter-openfoam-overview.html). +* OpenFOAM. This case uses a modified version of scalarTransportFoam, which recomputes `phi` after the preCICE adapter reads the velocity field. Build it with `wmake`. Read more details in the [OpenFOAM adapter](https://precice.org/adapter-openfoam-overview.html). Note that T accumulates in front of the outlet as this case conserves overall T. ## Running the simulation From 9d7249849169963830b61d4423592caca7731a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Thu, 11 Jul 2024 13:15:08 +0200 Subject: [PATCH 17/27] Fix application name --- .../transport-openfoam/dynamicScalarTransportFoam.C | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C b/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C index f880dd720..0a3e787ca 100644 --- a/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C +++ b/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C @@ -24,7 +24,7 @@ License along with OpenFOAM. If not, see . Application - scalarTransportFoam + dynamicScalarTransportFoam Group grpBasicSolvers From 7e6502ba4d3dd93bce81ad1db685a3b2091e16f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Thu, 11 Jul 2024 13:25:55 +0200 Subject: [PATCH 18/27] Add changelog --- changelog-entries/551.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog-entries/551.md diff --git a/changelog-entries/551.md b/changelog-entries/551.md new file mode 100644 index 000000000..86ff9b8ac --- /dev/null +++ b/changelog-entries/551.md @@ -0,0 +1 @@ +- Added OpenFOAM variant of the transport participant to the channel-transport tutorial. From 7b2d66af23309ffb5adda91ee7fd0f15f7d55528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 10 Dec 2025 15:11:10 +0100 Subject: [PATCH 19/27] Change outlet to advective --- channel-transport/transport-openfoam/0.orig/T | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/channel-transport/transport-openfoam/0.orig/T b/channel-transport/transport-openfoam/0.orig/T index d7a18ffa1..7a51af811 100644 --- a/channel-transport/transport-openfoam/0.orig/T +++ b/channel-transport/transport-openfoam/0.orig/T @@ -19,7 +19,7 @@ boundaryField outlet { - type zeroGradient; + type advective; } obstacle From 44e2384dbdac0362c633a7354b6da69465615f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 10 Dec 2025 15:11:52 +0100 Subject: [PATCH 20/27] Add new blockMesh including generator --- .../transport-openfoam/createMesh.py | 101 +++++++ .../transport-openfoam/system/blockMeshDict | 264 +++++++++--------- 2 files changed, 234 insertions(+), 131 deletions(-) create mode 100755 channel-transport/transport-openfoam/createMesh.py diff --git a/channel-transport/transport-openfoam/createMesh.py b/channel-transport/transport-openfoam/createMesh.py new file mode 100755 index 000000000..7174da406 --- /dev/null +++ b/channel-transport/transport-openfoam/createMesh.py @@ -0,0 +1,101 @@ +#!/bin/env -S uv run --script +# /// script +# requires-python = ">=3.14" +# dependencies = ["classy_blocks", "typing_extensions"] +# /// + +# Generator script for the system/blockMeshDict + +import classy_blocks as cb +import pathlib + +x0 = 0 +x1 = 2 +x2 = 3 +x3 = 5 +x4 = 6 + +y0 = 0 +y1 = 1 +y2 = 2 + +# Blocks + + +def blockFor(l, r, b, t): + return cb.Extrude(cb.Face([ + [l, b, 0], + [r, b, 0], + [r, t, 0], + [l, t, 0]]), 1) + + +lb = blockFor(x0, x1, y0, y1) +lt = blockFor(x0, x1, y1, y2) + +mt = blockFor(x1, x2, y1, y2) + +rt1 = blockFor(x2, x3, y1, y2) +rb1 = blockFor(x2, x3, y0, y1) +rt2 = blockFor(x3, x4, y1, y2) +rb2 = blockFor(x3, x4, y0, y1) + +# Patches + + +def patch(side: str, name: str, *items): + for i in items: + i.set_patch(side, name) + + +patch("left", "inlet", lb, lt) +patch("right", "outlet", rb2, rt2) + +patch("back", "upperWall", lt, mt, rt1, rt2) +patch("front", "lowerWall", lb, rb1, rb2) + +patch("right", "obstacle", lb) +patch("front", "obstacle", mt) +patch("left", "obstacle", rb1) + +for b in [lb, lt, mt, rt1, rt2, rb1, rb2]: + b.set_patch(["top", "bottom"], "frontAndBack") + +# Cells + + +def chop(x, *items): + for i in items: + i.chop(0, count=x) + i.chop(1, count=16) + i.chop(2, count=1) + + +chop(20, lb, lt, rb1, rt1) +chop(10, mt) + +rb2.chop(0, count=20, start_size=0.1) +rb2.chop(1, count=16) +rb2.chop(2, count=1) + +rt2.chop(0, count=20, start_size=0.1) +rt2.chop(1, count=16) +rt2.chop(2, count=1) + +# Mesh + +m = cb.Mesh() +m.add(lb) +m.add(lt) +m.add(mt) +m.add(rb1) +m.add(rb2) +m.add(rt1) +m.add(rt2) + +m.modify_patch("obstacle", "wall") +m.modify_patch("upperWall", "wall") +m.modify_patch("lowerWall", "wall") +m.modify_patch("frontAndBack", "empty") + +m.write(pathlib.Path(__file__).parent / "system" / "blockMeshDict") diff --git a/channel-transport/transport-openfoam/system/blockMeshDict b/channel-transport/transport-openfoam/system/blockMeshDict index 19774348b..3d6b2e58f 100644 --- a/channel-transport/transport-openfoam/system/blockMeshDict +++ b/channel-transport/transport-openfoam/system/blockMeshDict @@ -1,3 +1,10 @@ +/*---------------------------------------------------------------------------*\ +| ========= | | +| \ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \ / O peration | Script: ./createMesh.py | +| \ / A nd | Time: 2025-12-10 15:04:24.979831 | +| \/ M anipulation | | +\*---------------------------------------------------------------------------*/ FoamFile { version 2.0; @@ -5,152 +12,147 @@ FoamFile class dictionary; object blockMeshDict; } - -x0 0.; -x1 2.; -x2 3.; -x3 6.; - -y0 0.; -y1 1.; -y2 2.; - -z0 0; -z1 1; +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // vertices ( - ($x0 $y0 $z0 ) // 0 - ($x1 $y0 $z0 ) // 1 - ($x2 $y0 $z0 ) // 2 - ($x3 $y0 $z0 ) // 3 - ($x0 $y1 $z0 ) // 4 - ($x1 $y1 $z0 ) // 5 - ($x2 $y1 $z0 ) // 6 - ($x3 $y1 $z0 ) // 7 - ($x0 $y2 $z0 ) // 8 - ($x1 $y2 $z0 ) // 9 - ($x2 $y2 $z0 ) // 10 - ($x3 $y2 $z0 ) // 11 + (0.00000000 0.00000000 0.00000000) // 0 + (2.00000000 0.00000000 0.00000000) // 1 + (2.00000000 1.00000000 0.00000000) // 2 + (0.00000000 1.00000000 0.00000000) // 3 + (0.00000000 0.00000000 1.00000000) // 4 + (2.00000000 0.00000000 1.00000000) // 5 + (2.00000000 1.00000000 1.00000000) // 6 + (0.00000000 1.00000000 1.00000000) // 7 + (2.00000000 2.00000000 0.00000000) // 8 + (0.00000000 2.00000000 0.00000000) // 9 + (2.00000000 2.00000000 1.00000000) // 10 + (0.00000000 2.00000000 1.00000000) // 11 + (3.00000000 1.00000000 0.00000000) // 12 + (3.00000000 2.00000000 0.00000000) // 13 + (3.00000000 1.00000000 1.00000000) // 14 + (3.00000000 2.00000000 1.00000000) // 15 + (3.00000000 0.00000000 0.00000000) // 16 + (5.00000000 0.00000000 0.00000000) // 17 + (5.00000000 1.00000000 0.00000000) // 18 + (3.00000000 0.00000000 1.00000000) // 19 + (5.00000000 0.00000000 1.00000000) // 20 + (5.00000000 1.00000000 1.00000000) // 21 + (6.00000000 0.00000000 0.00000000) // 22 + (6.00000000 1.00000000 0.00000000) // 23 + (6.00000000 0.00000000 1.00000000) // 24 + (6.00000000 1.00000000 1.00000000) // 25 + (5.00000000 2.00000000 0.00000000) // 26 + (5.00000000 2.00000000 1.00000000) // 27 + (6.00000000 2.00000000 0.00000000) // 28 + (6.00000000 2.00000000 1.00000000) // 29 +); - ($x0 $y0 $z1 ) // 12 - ($x1 $y0 $z1 ) // 13 - ($x2 $y0 $z1 ) // 14 - ($x3 $y0 $z1 ) // 15 - ($x0 $y1 $z1 ) // 16 - ($x1 $y1 $z1 ) // 17 - ($x2 $y1 $z1 ) // 18 - ($x3 $y1 $z1 ) // 19 - ($x0 $y2 $z1 ) // 20 - ($x1 $y2 $z1 ) // 21 - ($x2 $y2 $z1 ) // 22 - ($x3 $y2 $z1 ) // 23 +blocks +( + hex ( 0 1 2 3 4 5 6 7 ) ( 20 16 1 ) simpleGrading ( 1 1 1 ) // 0 + hex ( 3 2 8 9 7 6 10 11 ) ( 20 16 1 ) simpleGrading ( 1 1 1 ) // 1 + hex ( 2 12 13 8 6 14 15 10 ) ( 10 16 1 ) simpleGrading ( 1 1 1 ) // 2 + hex ( 16 17 18 12 19 20 21 14 ) ( 20 16 1 ) simpleGrading ( 1 1 1 ) // 3 + hex ( 17 22 23 18 20 24 25 21 ) ( 20 16 1 ) simpleGrading ( 0.19723533562312945 1 1 ) // 4 + hex ( 12 18 26 13 14 21 27 15 ) ( 20 16 1 ) simpleGrading ( 1 1 1 ) // 5 + hex ( 18 23 28 26 21 25 29 27 ) ( 20 16 1 ) simpleGrading ( 0.19723533562312945 1 1 ) // 6 ); +edges +( +); -// Grading -//h1 16; -//h2 8; -//h3 24; -//v1 8; +boundary +( + frontAndBack + { + type empty; + faces + ( + (14 21 27 15) + (6 14 15 10) + (2 12 13 8) + (18 23 28 26) + (16 17 18 12) + (17 22 23 18) + (0 1 2 3) + (12 18 26 13) + (19 20 21 14) + (7 6 10 11) + (20 24 25 21) + (3 2 8 9) + (4 5 6 7) + (21 25 29 27) + ); + } -//h1 40; -//h2 20; -//h3 60; -//v1 32; + lowerWall + { + type wall; + faces + ( + (20 24 22 17) + (4 5 1 0) + (19 20 17 16) + ); + } -h1 20; -h2 10; -h3 30; -v1 16; + obstacle + { + type wall; + faces + ( + (5 1 2 6) + (19 16 12 14) + (6 14 12 2) + ); + } -blocks -( - hex ( 0 1 5 4 12 13 17 16 ) - ($h1 $v1 1 ) - simpleGrading (1 1 1) + inlet + { + type patch; + faces + ( + (7 3 9 11) + (4 0 3 7) + ); + } - hex ( 2 3 7 6 14 15 19 18 ) - ($h3 $v1 1) - simpleGrading (1 1 1) + upperWall + { + type wall; + faces + ( + (27 29 28 26) + (15 27 26 13) + (11 10 8 9) + (10 15 13 8) + ); + } - hex ( 4 5 9 8 16 17 21 20 ) - ($h1 $v1 1) - simpleGrading (1 1 1) + outlet + { + type patch; + faces + ( + (24 22 23 25) + (25 23 28 29) + ); + } - hex ( 5 6 10 9 17 18 22 21 ) - ($h2 $v1 1) - simpleGrading (1 1 1) +); - hex ( 6 7 11 10 18 19 23 22 ) - ($h3 $v1 1 ) - simpleGrading (1 1 1) +faces +( ); -boundary +mergePatchPairs ( - inlet - { - type patch; - faces - ( - ( 0 4 16 12 ) - ( 4 8 20 16 ) - ); - } - outlet - { - type patch; - faces - ( - ( 3 7 19 15 ) - ( 7 11 23 19 ) - ); - } - obstacle - { - type wall; - faces - ( - ( 1 5 17 13 ) - ( 5 6 18 17 ) - ( 6 2 14 18 ) - ); - } - upperWall - { - type wall; - faces - ( - ( 8 9 21 20 ) - ( 9 10 22 21 ) - ( 10 11 23 22 ) - ); - } - lowerWall - { - type wall; - faces - ( - ( 0 1 13 12 ) - ( 2 3 15 14 ) - ); - } - frontAndBack - { - type empty; - faces - ( - ( 0 1 5 4 ) - ( 2 3 7 6 ) - ( 4 5 9 8 ) - ( 5 6 10 9 ) - ( 6 7 11 10 ) - ( 12 13 17 16 ) - ( 14 15 19 18 ) - ( 16 17 21 20 ) - ( 17 18 22 21 ) - ( 18 19 23 22 ) - ); - } ); + +scale 1; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Created with classy_blocks: https://github.com/damogranlabs/classy_blocks // +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // From d65fc1150b596ebb60ed6c3bd42194d44732cb2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 10 Dec 2025 15:41:34 +0100 Subject: [PATCH 21/27] Coarsen the mesh --- .../transport-openfoam/createMesh.py | 16 +++++------ .../transport-openfoam/system/blockMeshDict | 28 +++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/channel-transport/transport-openfoam/createMesh.py b/channel-transport/transport-openfoam/createMesh.py index 7174da406..d567572d5 100755 --- a/channel-transport/transport-openfoam/createMesh.py +++ b/channel-transport/transport-openfoam/createMesh.py @@ -12,7 +12,7 @@ x0 = 0 x1 = 2 x2 = 3 -x3 = 5 +x3 = 5.5 x4 = 6 y0 = 0 @@ -67,19 +67,19 @@ def patch(side: str, name: str, *items): def chop(x, *items): for i in items: i.chop(0, count=x) - i.chop(1, count=16) + i.chop(1, count=5) i.chop(2, count=1) -chop(20, lb, lt, rb1, rt1) -chop(10, mt) +chop(10, lb, lt, rb1, rt1) +chop(5, mt) -rb2.chop(0, count=20, start_size=0.1) -rb2.chop(1, count=16) +rb2.chop(0, count=10, start_size=0.1) +rb2.chop(1, count=5) rb2.chop(2, count=1) -rt2.chop(0, count=20, start_size=0.1) -rt2.chop(1, count=16) +rt2.chop(0, count=10, start_size=0.1) +rt2.chop(1, count=5) rt2.chop(2, count=1) # Mesh diff --git a/channel-transport/transport-openfoam/system/blockMeshDict b/channel-transport/transport-openfoam/system/blockMeshDict index 3d6b2e58f..a5addedc3 100644 --- a/channel-transport/transport-openfoam/system/blockMeshDict +++ b/channel-transport/transport-openfoam/system/blockMeshDict @@ -2,7 +2,7 @@ | ========= | | | \ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \ / O peration | Script: ./createMesh.py | -| \ / A nd | Time: 2025-12-10 15:04:24.979831 | +| \ / A nd | Time: 2025-12-10 15:40:31.134565 | | \/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile @@ -33,30 +33,30 @@ vertices (3.00000000 1.00000000 1.00000000) // 14 (3.00000000 2.00000000 1.00000000) // 15 (3.00000000 0.00000000 0.00000000) // 16 - (5.00000000 0.00000000 0.00000000) // 17 - (5.00000000 1.00000000 0.00000000) // 18 + (5.50000000 0.00000000 0.00000000) // 17 + (5.50000000 1.00000000 0.00000000) // 18 (3.00000000 0.00000000 1.00000000) // 19 - (5.00000000 0.00000000 1.00000000) // 20 - (5.00000000 1.00000000 1.00000000) // 21 + (5.50000000 0.00000000 1.00000000) // 20 + (5.50000000 1.00000000 1.00000000) // 21 (6.00000000 0.00000000 0.00000000) // 22 (6.00000000 1.00000000 0.00000000) // 23 (6.00000000 0.00000000 1.00000000) // 24 (6.00000000 1.00000000 1.00000000) // 25 - (5.00000000 2.00000000 0.00000000) // 26 - (5.00000000 2.00000000 1.00000000) // 27 + (5.50000000 2.00000000 0.00000000) // 26 + (5.50000000 2.00000000 1.00000000) // 27 (6.00000000 2.00000000 0.00000000) // 28 (6.00000000 2.00000000 1.00000000) // 29 ); blocks ( - hex ( 0 1 2 3 4 5 6 7 ) ( 20 16 1 ) simpleGrading ( 1 1 1 ) // 0 - hex ( 3 2 8 9 7 6 10 11 ) ( 20 16 1 ) simpleGrading ( 1 1 1 ) // 1 - hex ( 2 12 13 8 6 14 15 10 ) ( 10 16 1 ) simpleGrading ( 1 1 1 ) // 2 - hex ( 16 17 18 12 19 20 21 14 ) ( 20 16 1 ) simpleGrading ( 1 1 1 ) // 3 - hex ( 17 22 23 18 20 24 25 21 ) ( 20 16 1 ) simpleGrading ( 0.19723533562312945 1 1 ) // 4 - hex ( 12 18 26 13 14 21 27 15 ) ( 20 16 1 ) simpleGrading ( 1 1 1 ) // 5 - hex ( 18 23 28 26 21 25 29 27 ) ( 20 16 1 ) simpleGrading ( 0.19723533562312945 1 1 ) // 6 + hex ( 0 1 2 3 4 5 6 7 ) ( 10 5 1 ) simpleGrading ( 1 1 1 ) // 0 + hex ( 3 2 8 9 7 6 10 11 ) ( 10 5 1 ) simpleGrading ( 1 1 1 ) // 1 + hex ( 2 12 13 8 6 14 15 10 ) ( 5 5 1 ) simpleGrading ( 1 1 1 ) // 2 + hex ( 16 17 18 12 19 20 21 14 ) ( 10 5 1 ) simpleGrading ( 1 1 1 ) // 3 + hex ( 17 22 23 18 20 24 25 21 ) ( 10 5 1 ) simpleGrading ( 0.19032670369558663 1 1 ) // 4 + hex ( 12 18 26 13 14 21 27 15 ) ( 10 5 1 ) simpleGrading ( 1 1 1 ) // 5 + hex ( 18 23 28 26 21 25 29 27 ) ( 10 5 1 ) simpleGrading ( 0.19032670369558663 1 1 ) // 6 ); edges From a06b27b1175761ae863dd342ad2d5dcc0ea0a602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 10 Dec 2025 15:42:32 +0100 Subject: [PATCH 22/27] Remove the accumulation note --- channel-transport/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/channel-transport/README.md b/channel-transport/README.md index 09feec2cf..71ac01d24 100644 --- a/channel-transport/README.md +++ b/channel-transport/README.md @@ -45,7 +45,7 @@ Transport participant: * Nutils with support for [adaptive mesh refinement](https://precice.org/couple-your-code-moving-or-changing-meshes.html#pseudo-reference-domain). For more information, have a look at the [Nutils adapter documentation](https://precice.org/adapter-nutils.html). This Nutils solver requires at least Nutils v7.0 and a preCICE release with [remeshing support](couple-your-code-moving-or-changing-meshes.html#remeshing-using-precice). -* OpenFOAM. This case uses a modified version of scalarTransportFoam, which recomputes `phi` after the preCICE adapter reads the velocity field. Build it with `wmake`. Read more details in the [OpenFOAM adapter](https://precice.org/adapter-openfoam-overview.html). Note that T accumulates in front of the outlet as this case conserves overall T. +* OpenFOAM. This case uses a modified version of scalarTransportFoam, which recomputes `phi` after the preCICE adapter reads the velocity field. Build it with `wmake`. Read more details in the [OpenFOAM adapter](https://precice.org/adapter-openfoam-overview.html). ## Running the simulation From 8ae94048612ac9b126788ab88f11cd23f18b8047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 10 Dec 2025 16:40:25 +0100 Subject: [PATCH 23/27] Move dynamicScalarTransportFoam into separate dir --- .../Make/files | 0 .../Make/options | 0 channel-transport/solver-openfoam/clean.sh | 4 + .../createFields.H | 0 .../dynamicScalarTransportFoam.C | 88 +++++++++---------- channel-transport/transport-openfoam/clean.sh | 1 - 6 files changed, 44 insertions(+), 49 deletions(-) rename channel-transport/{transport-openfoam => solver-openfoam}/Make/files (100%) rename channel-transport/{transport-openfoam => solver-openfoam}/Make/options (100%) create mode 100755 channel-transport/solver-openfoam/clean.sh rename channel-transport/{transport-openfoam => solver-openfoam}/createFields.H (100%) rename channel-transport/{transport-openfoam => solver-openfoam}/dynamicScalarTransportFoam.C (65%) diff --git a/channel-transport/transport-openfoam/Make/files b/channel-transport/solver-openfoam/Make/files similarity index 100% rename from channel-transport/transport-openfoam/Make/files rename to channel-transport/solver-openfoam/Make/files diff --git a/channel-transport/transport-openfoam/Make/options b/channel-transport/solver-openfoam/Make/options similarity index 100% rename from channel-transport/transport-openfoam/Make/options rename to channel-transport/solver-openfoam/Make/options diff --git a/channel-transport/solver-openfoam/clean.sh b/channel-transport/solver-openfoam/clean.sh new file mode 100755 index 000000000..2ca6224c6 --- /dev/null +++ b/channel-transport/solver-openfoam/clean.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +set -e -u + +wclean diff --git a/channel-transport/transport-openfoam/createFields.H b/channel-transport/solver-openfoam/createFields.H similarity index 100% rename from channel-transport/transport-openfoam/createFields.H rename to channel-transport/solver-openfoam/createFields.H diff --git a/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C b/channel-transport/solver-openfoam/dynamicScalarTransportFoam.C similarity index 65% rename from channel-transport/transport-openfoam/dynamicScalarTransportFoam.C rename to channel-transport/solver-openfoam/dynamicScalarTransportFoam.C index 0a3e787ca..4cd24c9ff 100644 --- a/channel-transport/transport-openfoam/dynamicScalarTransportFoam.C +++ b/channel-transport/solver-openfoam/dynamicScalarTransportFoam.C @@ -63,57 +63,49 @@ Description int main(int argc, char *argv[]) { - argList::addNote - ( - "Passive scalar transport equation solver." - ); - - #include "addCheckCaseOptions.H" - #include "setRootCaseLists.H" - #include "createTime.H" - #include "createMesh.H" - - simpleControl simple(mesh); - - #include "createFields.H" - - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - - Info<< "\nCalculating scalar transport\n" << endl; - - while (simple.loop()) - { - Info << "Time = " << runTime.timeName() << nl << endl; - - Info<< "Recompute phi" << endl; - fvOptions.correct(U); - phi = fvc::flux(U); - #include "CourantNo.H" - - while (simple.correctNonOrthogonal()) - { - fvScalarMatrix TEqn - ( - fvm::ddt(T) - + fvm::div(phi, T) - - fvm::laplacian(DT, T) - == - fvOptions(T) - ); - - TEqn.relax(); - fvOptions.constrain(TEqn); - TEqn.solve(); - fvOptions.correct(T); - } - - runTime.write(); + argList::addNote( + "Passive scalar transport equation solver."); + +#include "addCheckCaseOptions.H" +#include "createMesh.H" +#include "createTime.H" +#include "setRootCaseLists.H" + + simpleControl simple(mesh); + +#include "createFields.H" + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + Info << "\nCalculating scalar transport\n" + << endl; + + while (simple.loop()) { + Info << "Time = " << runTime.timeName() << nl << endl; + + Info << "Recompute phi" << endl; + fvOptions.correct(U); + phi = fvc::flux(U); +#include "CourantNo.H" + + while (simple.correctNonOrthogonal()) { + fvScalarMatrix TEqn( + fvm::ddt(T) + fvm::div(phi, T) - fvm::laplacian(DT, T) == + fvOptions(T)); + + TEqn.relax(); + fvOptions.constrain(TEqn); + TEqn.solve(); + fvOptions.correct(T); } - Info<< "End\n" << endl; + runTime.write(); + } - return 0; -} + Info << "End\n" + << endl; + return 0; +} // ************************************************************************* // diff --git a/channel-transport/transport-openfoam/clean.sh b/channel-transport/transport-openfoam/clean.sh index 6ab219250..5120c1355 100755 --- a/channel-transport/transport-openfoam/clean.sh +++ b/channel-transport/transport-openfoam/clean.sh @@ -5,4 +5,3 @@ set -e -u clean_openfoam . rm -rf ./0/ -rm -rf ./Make/linux* From a8fa0108b78291c339deb6d1bef07849c2770f9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 10 Dec 2025 16:41:29 +0100 Subject: [PATCH 24/27] Move the openfoam solver gitignore --- .gitignore | 5 +++++ channel-transport/transport-openfoam/.gitignore | 3 --- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index ac8ae3c1f..2bc8e9e9a 100644 --- a/.gitignore +++ b/.gitignore @@ -116,3 +116,8 @@ runs/ .project .settings/ *.swp + +# OpenFOAM solvers +**/Make/* +!**/Make/files +!**/Make/option diff --git a/channel-transport/transport-openfoam/.gitignore b/channel-transport/transport-openfoam/.gitignore index 1f7d5d93a..e20d1247a 100644 --- a/channel-transport/transport-openfoam/.gitignore +++ b/channel-transport/transport-openfoam/.gitignore @@ -1,4 +1 @@ -Make/* -!Make/files -!Make/options 0/ From 4b715ba4c1f059f6d71268428bdf115fb09050bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 10 Dec 2025 16:46:29 +0100 Subject: [PATCH 25/27] Add the solver installation --- channel-transport/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/channel-transport/README.md b/channel-transport/README.md index 71ac01d24..8f187ea35 100644 --- a/channel-transport/README.md +++ b/channel-transport/README.md @@ -45,7 +45,7 @@ Transport participant: * Nutils with support for [adaptive mesh refinement](https://precice.org/couple-your-code-moving-or-changing-meshes.html#pseudo-reference-domain). For more information, have a look at the [Nutils adapter documentation](https://precice.org/adapter-nutils.html). This Nutils solver requires at least Nutils v7.0 and a preCICE release with [remeshing support](couple-your-code-moving-or-changing-meshes.html#remeshing-using-precice). -* OpenFOAM. This case uses a modified version of scalarTransportFoam, which recomputes `phi` after the preCICE adapter reads the velocity field. Build it with `wmake`. Read more details in the [OpenFOAM adapter](https://precice.org/adapter-openfoam-overview.html). +* OpenFOAM. This case uses a modified version of scalarTransportFoam, which recomputes `phi` after the preCICE adapter reads the velocity field. Find it in the `solver-openfoam` folder and build it with `wmake`. Read more details in the [OpenFOAM adapter](https://precice.org/adapter-openfoam-overview.html). ## Running the simulation From 719fca6df9da7581176d27c5fb78a12434367ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 10 Dec 2025 16:54:22 +0100 Subject: [PATCH 26/27] Replace header --- .../dynamicScalarTransportFoam.C | 65 +++---------------- 1 file changed, 8 insertions(+), 57 deletions(-) diff --git a/channel-transport/solver-openfoam/dynamicScalarTransportFoam.C b/channel-transport/solver-openfoam/dynamicScalarTransportFoam.C index 4cd24c9ff..e36e0103e 100644 --- a/channel-transport/solver-openfoam/dynamicScalarTransportFoam.C +++ b/channel-transport/solver-openfoam/dynamicScalarTransportFoam.C @@ -1,59 +1,10 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | www.openfoam.com - \\/ M anipulation | -------------------------------------------------------------------------------- - Copyright (C) 2011-2017 OpenFOAM Foundation -------------------------------------------------------------------------------- -License - This file is part of OpenFOAM. - - OpenFOAM is free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - OpenFOAM is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - for more details. - - You should have received a copy of the GNU General Public License - along with OpenFOAM. If not, see . - -Application - dynamicScalarTransportFoam - -Group - grpBasicSolvers - -Description - Passive scalar transport equation solver. - - \heading Solver details - The equation is given by: - - \f[ - \ddt{T} + \div \left(\vec{U} T\right) - \div \left(D_T \grad T \right) - = S_{T} - \f] - - Where: - \vartable - T | Passive scalar - D_T | Diffusion coefficient - S_T | Source - \endvartable - - \heading Required fields - \plaintable - T | Passive scalar - U | Velocity [m/s] - \endplaintable - -\*---------------------------------------------------------------------------*/ +// +// This file is based on the OpenFOAM example application scalarTransportFoam +// +// GitLab link: https://gitlab.com/openfoam/core/openfoam/-/tree/master/applications/solvers/basic/scalarTransportFoam +// +// This modified version doesn't expect a static velocity field U, instead, it repomputes it every time step. +// Therefore it allows the preCICE adapter to provide the velocities. #include "fvCFD.H" #include "fvOptions.H" @@ -64,7 +15,7 @@ Description int main(int argc, char *argv[]) { argList::addNote( - "Passive scalar transport equation solver."); + "Dynamic scalar transport equation solver."); #include "addCheckCaseOptions.H" #include "createMesh.H" From e10d284200c7e2f8e43e723befef8d1a23af59dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 10 Dec 2025 16:58:24 +0100 Subject: [PATCH 27/27] Add explanation for the expression --- channel-transport/transport-openfoam/system/setExprFieldsDict | 2 ++ 1 file changed, 2 insertions(+) diff --git a/channel-transport/transport-openfoam/system/setExprFieldsDict b/channel-transport/transport-openfoam/system/setExprFieldsDict index 69f06ed75..dc859d900 100644 --- a/channel-transport/transport-openfoam/system/setExprFieldsDict +++ b/channel-transport/transport-openfoam/system/setExprFieldsDict @@ -6,6 +6,8 @@ FoamFile object setExprFieldsDict; } +// Initializes the blob at coordinates (bx,by) with given radius. +// The formula is consistent with the one used in the original nutils case. expressions ( T