Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
1d949e5
It kind of runs
fsimonis Jun 24, 2024
ea64e38
remove blob
fsimonis Jun 24, 2024
a1c142c
Maybe right?
fsimonis Jun 24, 2024
f2fb4f3
setup setFields
fsimonis Jun 24, 2024
9a1e7b9
Set a cylinder, increase mesh cells, add U_vol workaround
fsimonis Jun 25, 2024
e363145
Add modified solver
fsimonis Jun 26, 2024
e103c9a
Remove U_vol and rename solver
fsimonis Jun 26, 2024
38f1424
fix
fsimonis Jun 26, 2024
14db9a1
Revert to default schemes
fsimonis Jun 26, 2024
a4d0899
Fix dimensions of T
fsimonis Jun 26, 2024
900eef5
Revert to tutorial files
fsimonis Jun 26, 2024
759e9e5
Recompute phi after the preCICE adapter
fsimonis Jun 26, 2024
78e4769
Correctly set blob
fsimonis Jun 26, 2024
3b001ee
Add OpenFOAM transport to README
fsimonis Jun 26, 2024
c711cce
Only set initial condition
fsimonis Jul 11, 2024
5602cfd
Add note about openfoam conserving T
fsimonis Jul 11, 2024
9d72498
Fix application name
fsimonis Jul 11, 2024
7e6502b
Add changelog
fsimonis Jul 11, 2024
9d4322b
Merge branch 'develop' into add-channel-transport-openfoam
MakisH Nov 26, 2025
7b2d66a
Change outlet to advective
fsimonis Dec 10, 2025
44e2384
Add new blockMesh including generator
fsimonis Dec 10, 2025
d65fc11
Coarsen the mesh
fsimonis Dec 10, 2025
a06b27b
Remove the accumulation note
fsimonis Dec 10, 2025
8ae9404
Move dynamicScalarTransportFoam into separate dir
fsimonis Dec 10, 2025
a8fa010
Move the openfoam solver gitignore
fsimonis Dec 10, 2025
4b715ba
Add the solver installation
fsimonis Dec 10, 2025
719fca6
Replace header
fsimonis Dec 10, 2025
e10d284
Add explanation for the expression
fsimonis Dec 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -116,3 +116,8 @@ runs/
.project
.settings/
*.swp

# OpenFOAM solvers
**/Make/*
!**/Make/files
!**/Make/option
1 change: 1 addition & 0 deletions changelog-entries/551.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Added OpenFOAM variant of the transport participant to the channel-transport tutorial.
2 changes: 2 additions & 0 deletions channel-transport/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ 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. 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

For the fluid solver, use Nutils for ease of installation and OpenFOAM for speed.
Expand Down
3 changes: 3 additions & 0 deletions channel-transport/solver-openfoam/Make/files
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
dynamicScalarTransportFoam.C

EXE = $(FOAM_USER_APPBIN)/dynamicScalarTransportFoam
10 changes: 10 additions & 0 deletions channel-transport/solver-openfoam/Make/options
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions channel-transport/solver-openfoam/clean.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env sh
set -e -u

wclean
43 changes: 43 additions & 0 deletions channel-transport/solver-openfoam/createFields.H
Original file line number Diff line number Diff line change
@@ -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"
62 changes: 62 additions & 0 deletions channel-transport/solver-openfoam/dynamicScalarTransportFoam.C
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you explain the exact history of this file?
What did you get from where, what did you add yourself?

Copy link
Member Author

@fsimonis fsimonis Sep 2, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where would you expect to find this information? In the file itself or in a README in the directory of the solver?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just here first, to decide on what to do with this header.
But eventually in the file itself.

Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
//
// 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"
#include "simpleControl.H"

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

int main(int argc, char *argv[])
{
argList::addNote(
"Dynamic 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);
}

runTime.write();
}

Info << "End\n"
<< endl;

return 0;
}

// ************************************************************************* //
175 changes: 175 additions & 0 deletions channel-transport/transport-openfoam/.clang-format
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I start feeling very uneasy that we duplicate this file everywhere.
Opened an issue: #559

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no uniform style in the tutorials repo. I don't see an easy solution for this.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a .clang-format file in the root directory: https://github.com/precice/tutorials/blob/develop/.clang-format

Let's discuss in #559.

Original file line number Diff line number Diff line change
@@ -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 <T>" (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:
...

1 change: 1 addition & 0 deletions channel-transport/transport-openfoam/.gitignore
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should have these in the central gitignore: https://github.com/precice/tutorials/blob/develop/.gitignore

The 0/ is already covered, the rest could go there as-is (strange we don't have them already).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's the other way around.

0/ is tracked and 0.*/ ignored by default. In my case I generate 0/ from 0.orig/, which is the exact opposite of what the gitignore defines.

tutorials/.gitignore

Lines 41 to 43 in 3f253cc

0.*/
[1-9]*/
!0/

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interestingly, we don't have a .gitignore in https://github.com/precice/tutorials/tree/develop/partitioned-pipe-two-phase, which should have the same issue.

But again, the Make/-related rules can go into the central .gitignore, or at least moved to the solver directory.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0/
44 changes: 44 additions & 0 deletions channel-transport/transport-openfoam/0.orig/T
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object T;
}

dimensions [0 0 0 1 0 0 0];

internalField uniform 0;

boundaryField
{
inlet
{
type zeroGradient;
}

outlet
{
type advective;
}

obstacle
{
type zeroGradient;
}

upperWall
{
type zeroGradient;
}

lowerWall
{
type zeroGradient;
}

frontAndBack
{
type empty;
}
}
Loading