See
discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/282272911
OpenFOAM step by step tutorial
Technical Report · April 2015
CITATIONS READS
0 7,041
1 author:
Victor Pozzobon
Ecole Centrale Paris
7 PUBLICATIONS 8 CITATIONS
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
Microalgae Lagragian tracking in photobioreactor View project
Available from: Victor Pozzobon
Retrieved on: 23 September 2016
OpenFOAM tutorial
OpenFOAM tutorial
Discover it, tame it, use it
by Victor Pozzobon
([email protected])
14th March 2016 Version 1.02
Disclaimer
“This offering is not approved or endorsed by
OpenCFD Limited, the producer of the
OpenFOAM software and owner of the
OPENFOAM® and OpenCFD® trade marks.”
14th March 2016 Pozzobon Victor 2
Introduction
● This tutorial is a brief introduction to
OpenFOAM
● This document is a step by step guide
● It was done to be used on its own, there should
be no need for a presenter (myself)
● It was designed for OpenFOAM 3.0.1 (changes
may appear in superior versions)
14th March 2016 Pozzobon Victor 3
OpenFOAM
● OpenFOAM (Open Field Operation And
Manipulation) is a versatile equations solver
● Why do I use OpenFOAM ?
- free
- powerful
- opensource
- allows a lot of freedom
- no GUI (helps to focus on the equations)
14th March 2016 Pozzobon Victor 4
How to use this tutorial
● Almost every command will passed through the
temrinal. For example, when you see:
gedit system/controlDict
you type it in the terminal
● As OpenFOAM has no GUI, we will modify files.
For example, when you see this kind of picture:
modify the file so that
its content is the same
before you save it
14th March 2016 Pozzobon Victor 5
Battle plan
● Ex. 1: Cavity ● Ex. 6: Tubular reactor
- getting started - solver modifying (1/2)
● Ex. 2: Square tube ● Ex. 7: Tubular reactor
- mesh manipulation - solver modifying (2/2)
- steady state
● Ex. 8: Heating pipe
● Ex. 3: 1D beam - custom boundary
- 1D problem condition
- transient
● Ex. 9: Cake backing
● Ex. 4: 2D flat plate - field affectation
- 2D problem
● Ex. 10: Tank filling
● Ex. 5: 2D pipe - importing a mesh
- axisymmetric problem - run in parallel
14th March 2016 Pozzobon Victor 6
Ex. 1: Cavity - Objectives
● Accessing your work directory
● Accessing OpenFOAM tutorials
● Understanding case architecture
● Running your first OpenFOAM case
● Postprocessing with ParaFoam: data modifying,
line date / point data extraction
14th March 2016 Pozzobon Victor 7
Ex. 1: Cavity - Run
● To access your directory type in a terminal:
run
● To get the full path type:
pwd
● You will see:
/home/YourName/OpenFOAM/YourName-OpenFOAMVersion/run
14th March 2016 Pozzobon Victor 8
Ex. 1: Cavity - Tutorials
● To copy official tutorials to your run:
cp -r $FOAM_TUTORIALS Tutorials
● Go to the case directory:
cd Tutorials/incompressible/icoFoam/cavity
14th March 2016 Pozzobon Victor 9
Ex. 1: Cavity - Architecture
Case directory
Initial conditions directory
Pressure / Velocity initial conditions
Mesh directory
Mesh instructions
Physical properties values
Solving parameters directory
Parameters file
14th March 2016 Pozzobon Victor 10
Ex. 1: Cavity – Run the case
● Once in 'cavity' directory, create the mesh:
blockMesh
● Call the solver:
icoFoam
(you can note that the solver created several
directories e.g. '0.1'. These directories contain
data for a given time)
● Watch the results:
paraFoam
14th March 2016 Pozzobon Victor 11
Ex. 1: Cavity – Postprocessing
Data analysis pipeline
Load the case
Load geometric fields
Load the fields
14th March 2016 Pozzobon Victor 12
Ex. 1: Cavity – Postprocessing
Current
time
step
Plotted Observation tools
data
Plot Rescale
legend legend Time
step
tool
Legend
Scene
14th March 2016 Pozzobon Victor 13
Ex. 1: Cavity – Postprocessing
● Make it look shinier:
Filters / Alphabetical / Cell data to point data
● Calculate something:
Filters / Common / Calculator OR
● Extract profiles:
Filters / Data Analysis / Plot Over Line
● Extract histories:
Filters / Data Analysis / Plot Selection Over Time
14th March 2016 Pozzobon Victor 14
Battle plan
● From Ex. 2 to Ex. 5, we are going to learn how
to use existing solvers in different
configurations.
● We are going to set 3D, 2D planar, 2D
axisymmetrical and 1D cases
● We are going to explore postprocessor basic
functions
14th March 2016 Pozzobon Victor 15
Ex. 2: Square tube - Objectives
● Creating your own case
● Creating a mesh
● Specifying initial / boundary conditions
● Specifying physical properties values
● Solving a steady state problem
● Postprocessing with ParaFoam: integrating
variable / checking mass conservation
14th March 2016 Pozzobon Victor 16
Ex. 2: Square tube – Case setup
● Solving steady state incompressible
Navier-Stokes equation, in a fourth of a square
pipe
⃗
dU p 2
⃗ ⃗
+ U ∇ . U =−∇ ρ +η ∇ U⃗
dt
2 cm 20 cm
14th March 2016 Pozzobon Victor 17
Ex. 2: Square tube – A new case
● Go to your 'run' directory:
run
● Copy an existing case:
cp -r
$FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily/ Ex2
● Move to the case directory:
cd Ex2
● Open the mesh file:
gedit system/blockMeshDict
14th March 2016 Pozzobon Victor 18
Ex. 2: Square tube – A new mesh
● A fourth of a square tube with symmetry plane
● Points have to be prescribed in order to bluid a
mesh (consider doing a sketch) 5 6 x
Wall 2
7 1
4
Inlet Outlet
y
Symmetry
0 3
14th March 2016 plane Pozzobon Victor 19
Ex. 2: Square tube – A new mesh
● Beware, the
points are to be Scaling
prescribed in factor
order not to
back cross a line Block division
● Do (0 4 7 3) along axis
Points
locations Division grading
4 7
0 3 Points needed to
14th March 2016 Pozzobon Victor build a block 20
Ex. 2: Square tube – A new mesh
Face
● Avoid (0 3 4 7) name
4 7
Face
type
0 3 Point sequence
delimiting the
face
Wall
Inlet Outlet
14th March 2016 Pozzobon Victor 21
Ex. 2: Square tube – A new mesh
● Compile your mesh:
blockMesh
● Check its quality:
checkMesh
14th March 2016 Pozzobon Victor 22
Ex. 2: Square tube – Turbulence
model and parameters
● Choose the turbulence
model. In this case, there
is no turbulence:
gedit constant/turbulenceProperties
● Because we disabled the
turbulence, there will
be no need to specify:
epsilon, k, nut and nuTilda
fields:
rm 0/epsilon 0/k 0/nut 0/nuTilda
0/f 0/omega 0/v2
14th March 2016 Pozzobon Victor 23
Ex. 2: Square tube – IC / BC
● Open initial / boundary conditions files in the
'0' directory:
gedit 0/p
gedit 0/U
Physical field
Physical field unit
[ kg m s K mol A Cd]
Initial condition
Boundary condition
on 'inlet' patch
14th March 2016 Pozzobon Victor 24
Ex. 2: Square tube – IC / BC, p
● Open initial / boundary
conditions for the pressure
field
Field type, here
scalar
14th March 2016 Pozzobon Victor 25
Ex. 2: Square tube – IC / BC, U
● Open initial / boundary
conditions for the velocity
field
Field type, here
vector
14th March 2016 Pozzobon Victor 26
Ex. 2: Square tube – Setting values
● Open transportProperties
file, this is where physical
properties value (e.g.
viscosity) are specified:
gedit constant/transportProperties
Property name
Property dimension
[ kg m s K mol A Cd]
Property value
Subdictionaries for some viscosity laws,
can be removed in our case
14th March 2016 Pozzobon Victor 27
Ex. 2: Square tube – Control values
● Open case control file:
gedit system/controlDict
● Erase the “functions” and
below
End time = maximum
number of iteration
Constant “time step”
equals to 1
14th March 2016 Pozzobon Victor 28
Ex. 2: Square tube – Control values
● In steady state, the maximum number of
iteration is prescribed using “endTime”. Yet, there
is no variation in time. It is a “trick”, nothing
more
Data are extracted every
50 iterations
14th March 2016 Pozzobon Victor 29
Ex. 2: Square tube – Run the case
● The mesh has already been built, so let's run
the case:
simpleFoam
(it should converge in about 20 iterations)
● Have a look at the results:
paraFoam
14th March 2016 Pozzobon Victor 30
Ex. 2: Square tube – Postprocessing
● Check mass conservation:
Filters / Common / Slice
Filters / Data Analysis / Integrate Variables
● Check velocity profile:
Filters / Data Analysis / Plot Over Line
14th March 2016 Pozzobon Victor 31
Ex. 3: 1D beam - Objectives
● Setting a 1D case
● Solving a transient problem
● Postprocessing with ParaFOAM: importing
variables (other than p and U)
14th March 2016 Pozzobon Victor 32
Ex. 3: 1D beam – Case setup
● Solving transient heat conduction a 1D beam
dT 2
=α ∇ T
dt Symmetry
planes
Hot side Cold side
20 cm
14th March 2016 Pozzobon Victor 33
Ex. 3: 1D beam – Case creation
● Reach 'run' directory:
run
● Copy an existing heat transfer case:
cp -r $FOAM_TUTORIALS/basic/laplacianFoam/flange Ex3
cd Ex3
● Clean the case directory:
rm Allclean Allrun flange.ans
● Copy Ex2 mesh:
cp ../Ex2/system/blockMeshDict system/.
14th March 2016 Pozzobon Victor 34
Ex. 3: 1D beam – Modifying mesh
● Modify file:
gedit system/blockMeshDict
● Build mesh:
blockMesh
14th March 2016 Pozzobon Victor 35
Ex. 3: 1D beam – IC / BC
● Modify temperature file:
gedit 0/T
14th March 2016 Pozzobon Victor 36
Ex. 3: 1D beam – Diffusivity
● Modify transport property
file:
gedit constant/transportProperties
14th March 2016 Pozzobon Victor 37
Ex. 3: 1D beam – Control value
● Modify control dictionary:
gedit system/controlDict
● Run the case:
laplacianFoam
● Postprocess the case:
paraFoam
14th March 2016 Pozzobon Victor 38
Ex. 3: 1D beam – Postprocessing
● Check T, as a 'Volume field' when loading data
14th March 2016 Pozzobon Victor 39
Ex. 4: 2D flat plate - Objectives
● Setting a 2D case
● Building a 2 block mesh
● Changing convergence criterion
● Postprocessing with ParaFoam: plotting
streamlines
14th March 2016 Pozzobon Victor 40
Ex. 4: 2D flat plate – Case setup
● Solving incompressible air flow above a flat
plate, in steady state
⃗
dU p 2 ⃗
⃗ ⃗
+ U ∇ . U =−∇ ρ +η∇ U
dt
3m
2m
2m
14th March 2016 Pozzobon Victor 41
Ex. 4: 2D flat plate – Case creation
● Reach 'run' directory:
run
● Copy an existing case:
cp -r Ex2 Ex4
cd Ex4
● Clean the case directory:
rm -r 0.* 1* 2* 3* 4* 5* 6* 7* 8* 9*
(consider creating an alias)
14th March 2016 Pozzobon Victor 42
Ex. 4: 2D flat plate – Mesh
● We will create a mesh made of two blocks.
●
Modify file: gedit system/blockMeshDict
Top
Inlet Outlet
Symmetry
wall
Block 1
Down Plate
Block 2
14th March 2016 Pozzobon Victor 43
Ex. 4: 2D flat plate – Creating mesh
● Create the two blocks
●
blockMesh will
merge them
14th March 2016 Pozzobon Victor 44
Ex. 4: 2D flat plate – Creating mesh
● Set the faces
● Build mesh:
blockMesh
14th March 2016 Pozzobon Victor 45
Ex. 4: 2D flat plate – IC / BC
● Modify velocity file:
gedit 0/U
14th March 2016 Pozzobon Victor 46
Ex. 4: 2D flat plate – IC / BC
● Modify pressure file:
gedit 0/p
14th March 2016 Pozzobon Victor 47
Ex. 4: 2D flat plate – Viscosity
● Modify the kinematic viscosity:
gedit constant/transportProperties
14th March 2016 Pozzobon Victor 48
Ex. 4: 2D flat plate – Convergence
● Modify pressure / velocity convergence criteria:
gedit system/fvSolution
● In this case, there are a
lot of options. Some
solvers are much
simpler
Solver
Solved type and
field options
14th March 2016 Pozzobon Victor 49
Ex. 4: 2D flat plate – Convergence
● Simulations can be stopped automatically once
residues values have been reached
● For 2D cases, the unsolved
component of the velocity
vector prevents the solver from
reaching the tolerance most of
time. Therefore, a number of
iterations has to be
prescribed
Residues values
set for convergence
14th March 2016 Pozzobon Victor 50
Ex. 4: 2D flat plate – Run the case
● The mesh has already been built
● The controlDict has not changed from Ex2. The solver
will run for 100 iterations. It is enough to get the
residues below 10-6
gedit system/controlDict
● Run the case:
simpleFoam
● Have a look at the results:
paraFoam
14th March 2016 Pozzobon Victor 51
Ex. 4: 2D flat plate – Postprocessing
● Lower the first scene opacity:
'Click on the filter' / Display / Styling / Opacity
● Plot the streamline from the inlet:
Filters / Common / Stream Tracer
● Set streamlines' sources as a line, not a point:
'Click on stream tracer' / Properties / Seeds / Seed type =>
High resolution line source
● Set the line you want using the coordinates
14th March 2016 Pozzobon Victor 52
Ex. 4: 2D flat plate – Postprocessing
14th March 2016 Pozzobon Victor 53
Ex. 5: 2D pipe - Objectives
● Creating a 2D axisymmetrical mesh
● Nothing fancy ...
14th March 2016 Pozzobon Victor 54
Ex. 5: 2D pipe – Case setup
● Solving incompressible flow in a 2D
axisymmetrical pipe, in steady state
⃗
dU p 2 ⃗
⃗ ⃗
+ U ∇ . U =−∇ ρ +η∇ U
dt 10 cm
1 cm
14th March 2016 Pozzobon Victor 55
Ex. 5: 2D pipe – Case creation
● Reach 'run' directory:
run
● Copy an existing heat transfer case:
cp -r Ex2 Ex5
● Go to the new case directory:
cd Ex5
● Clean the case directory:
rm -r 0.* 1* 2* 3* 4* 5* 6* 7* 8* 9*
14th March 2016 Pozzobon Victor 56
Ex. 5: 2D pipe – Mesh
● Modify file: gedit system/blockMeshDict
Axis
Outlet
Inlet
5°
Front and
Back
Wall
14th March 2016 Pozzobon Victor 57
Ex. 5: 2D pipe – Block creation
● Draw a wegde,
with a 5° angle
(twice 2.5°)
● Points 1, 2 and 3 are
not used to build the cos(2.5°)
geometry. OpenFOAM
uses them to define sin(2.5°)
x, y and z directions :
- point 0 to point 1 = x
- point 1 to point 2 = y
- point 0 to point 4 = z
14th March 2016 Pozzobon Victor 58
Ex. 5: 2D pipe – Patches creation
● In order to do things
by the book, create
two 'wedge' patches
(here, 'front' and
'back')
● It would have worked
with only one, but
checkMesh would have
returned an error
14th March 2016 Pozzobon Victor 59
Ex. 5: 2D pipe – IC / BC p
● Set pressure boundary /
initial conditions:
gedit 0/p
14th March 2016 Pozzobon Victor 60
Ex. 5: 2D pipe – IC / BC U
● Set veolicty boundary /
initial conditions:
gedit 0/U
14th March 2016 Pozzobon Victor 61
Ex. 5: 2D pipe – Run the case
● (As usual now) The mesh has already been built,
the controlDict has not changed from Ex2. As for
Ex4, we have to set the desired number of
iterations:
gedit system/controlDict
● So let's run the case:
simpleFoam
● Have a look at the results:
paraFoam
14th March 2016 Pozzobon Victor 62
Ex. 5: 2D pipe – Postprocessing
● E.g. check velocity profile
14th March 2016 Pozzobon Victor 63
Battle plan
● We have used two different builtin solvers
(icoFoam, simpleFoam and laplacianFoam)
● We have set cases in 3D, 2D planar, 2D
axisymmetrical and 1D configurations
● We have learnt how to process data with
Paraview (paraFoam)
● We are going to learn how to solve our own
equations and set fancy cases
14th March 2016 Pozzobon Victor 64
Ex. 6: Tubular reactor – Objectives
● Create our own solver
● Use basic operators
● Create the associated case
14th March 2016 Pozzobon Victor 65
Ex. 6: Tubular reactor – Case setup
● 1D tubular reactor with heterogeneous catalysis
on porous media without chemical reaction in
steady state / hydrodynamics only
⃗ =0
∇ .U ⃗ = −κ
U μ ∇p ∇ 2 p=0
Symmetry
planes
Inlet Outlet
100 cm
14th March 2016 Pozzobon Victor 66
Ex. 6: Tubular reactor – Solver
directory creation
● Reach 'run' directory:
run
● Create a solver directory:
mkdir solvers
● Copy an existing solver:
cp -r $FOAM_APP/solvers/basic/laplacianFoam solvers/.
● Rename the solver directory:
mv solvers/laplacianFoam solvers/tubeFoam
14th March 2016 Pozzobon Victor 67
Ex. 6: Tubular reactor – Solver
cleaning up
● Move to solver directory:
cd solvers/tubeFoam
● Clean the directory:
wclean
rm write.H
● Rename the file:
mv laplacianFoam.C tubeFoam.C
14th March 2016 Pozzobon Victor 68
Ex. 6: Tubular reactor – Solver
modification
● Modify compilation file:
gedit Make/files
● You can specify compilation options:
gedit Make/options
(None need to be applied here)
14th March 2016 Pozzobon Victor 69
Ex. 6: Tubular reactor – Solver
modification / createFields.H
● Modify createFields.H to
create the new fields:
gedit createFields.H
Pressure field
(scalar field)
Velocity field
(vector field)
14th March 2016 Pozzobon Victor 70
Ex. 6: Tubular reactor – Solver
modification / createFields.H
● Modify createFields.H to
read the physical
properties:
gedit createFields.H
Physical property
called 'Mu'
14th March 2016 Pozzobon Victor 71
Ex. 6: Tubular reactor – Solver
modification / tubeFoam.C
● Modify tubeFoam.C
to specify the
equations that will
be solved:
gedit tubeFoam.C
Time loop
Correction loop
(not mandatory)
Solved equations
(implicit '=0')
14th March 2016 Pozzobon Victor 72
Ex. 6: Tubular reactor – Solver
compilation
● Clean the directory and compile:
wclean; wmake
● If you get an error, here is what to do:
1. Read the expection message
2. Get error file and line number
Error file
and line number
3. Take care of it
14th March 2016 Pozzobon Victor 73
Ex. 6: Tubular reactor – Case
creation
● Now that the solver has been compiled, let's create
the case we are going to solve. Since it is a 1D
case, copy Ex3 (1D thermal beam) case directory:
run
cp -r Ex3 Ex6
● Go to the case directory, clean it:
cd Ex6
rm -r 0.* 1* 2* 3* 4* 5* 6* 7* 8* 9*
(consider creating an alias)
14th March 2016 Pozzobon Victor 74
Ex. 6: Tubular reactor – Mesh
creation
● Create the mesh:
gedit system
/blockMeshDict
14th March 2016 Pozzobon Victor 75
Ex. 6: Tubular reactor – IC / BC
● Build the mesh:
blockMesh
● Create IC / BC files:
mv 0/T 0/p
cp 0/p 0/U
gedit 0/p 0/U
14th March 2016 Pozzobon Victor 76
Ex. 6: Tubular reactor – IC / BC
Pressure field Velocity field
(scalar field) (vector field)
14th March 2016 Pozzobon Victor 77
Ex. 6: Tubular reactor – Physical
properties
● Modify physical properties file:
gedit contant/transportProperties
14th March 2016 Pozzobon Victor 78
Ex. 6: Tubular reactor – Numerical
schemes
● Modify numerical schemes in order to specify a
steady state resolution:
gedit system/fvSchemes
14th March 2016 Pozzobon Victor 79
Ex. 6: Tubular reactor – Solver
parameters
● Modify solver parameters:
gedit system/fvSolution
Specify tolerance on pressure equation
as single iteration stopping criterion
Number of correction
iteration (used for non
orthogonal meshes)
Specify tolerance on pressure equation
as simulation stopping criterion
14th March 2016 Pozzobon Victor 80
Ex. 6: Tubular reactor – Control
parameters
● Modify solver parameters:
gedit system/controlDict
● In this case, the solver is
only calculating a Laplacian
operator, Thus, a 10-6 residue
is reached quite fast
(2 iterations)
Changing it is not
mandatory
14th March 2016 Pozzobon Victor 81
Ex. 6: Tubular reactor – Run it
● Let's run the case:
tubeFoam
● Process it:
paraFoam
14th March 2016 Pozzobon Victor 82
Ex. 7: Tubular reactor – Objectives
● Create our own solver with more complex
equations
● Use common operators
● Evolving a case
14th March 2016 Pozzobon Victor 83
Ex. 7: Tubular reactor – Case setup
● 1D tubular reactor with chemical reaction, in
transient state A +B=C
dA ⃗ 2
ω=v AB
+ ∇ .( U A)= D ∇ A−ω
dt
dB ⃗ 2
⃗ =0 2
+∇ .( U B)=D ∇ B−ω ∇ .U ∇ p=0
dt
dC ⃗ = −κ
U μ ∇p
2
⃗
+ ∇ .( U C)=D ∇ C +ω Symmetry
dt planes
Inlet Outlet
100 cm
14th March 2016 Pozzobon Victor 84
Ex. 7: Tubular reactor – Solver
directory creation
● Reach 'run' directory:
run
● Move to solver directory:
cd solvers
● Copy the existing solver:
cp -r tubeFoam tubeChemFoam
● Move to and clean the directory:
cd tubeChemFoam
wclean
14th March 2016 Pozzobon Victor 85
Ex. 7: Tubular reactor – Solver
modification
● Rename the file:
mv tubeFoam.C tubeChemFoam.C
● Modify compilation file:
gedit Make/files
14th March 2016 Pozzobon Victor 86
Ex. 7: Tubular reactor – Solver
modification / createFields.H
● Modify createFields.H to create the species fields:
gedit createFields.H
Defined in
the source
14th March 2016 Pozzobon Victor code 87
Ex. 7: Tubular reactor – Solver
modification / createFields.H
● Modify createFields.H to
read the physical
properties:
gedit createFields.H
14th March 2016 Pozzobon Victor 88
Ex. 7: Tubular reactor – Solver
modification / tubeChemFoam.C
● Modify
tubeChemFoam.C
to add species fields:
gedit tubeChemFoam.C
Interpolates the
velocity field on the
mesh in order to
later calculate the
divergence operator
14th March 2016 Pozzobon Victor 89
Ex. 7: Tubular reactor – Solver
compilation / Case creation
● Clean the directory and compile:
wclean; wmake
● Move to cases directory:
run
● Copy Ex6 directory:
cp -r Ex6 Ex7
● Move to the case directory:
cd Ex7
14th March 2016 Pozzobon Victor 90
Ex. 7: Tubular reactor – Case
creation
● Clean the directory:
rm -r 0.* 1* 2* 3* 4* 5* 6* 7* 8* 9*
● Build the mesh:
blockMesh
● Modify physical
properties:
gedit constant/transportPropeties
14th March 2016 Pozzobon Victor 91
Ex. 7: Tubular reactor – IC / BC
● Create file for the species fields: A field
cp 0/p 0/A
cp 0/p 0/B
cp 0/p 0/C
● Keep the existing files
for pressure and velocity
● Modify species files:
gedit 0/A
gedit 0/B
gedit 0/C
14th March 2016 Pozzobon Victor 92
Ex. 7: Tubular reactor – IC / BC
B field C field
14th March 2016 Pozzobon Victor 93
Ex. 7: Tubular reactor – Numerical
schemes
● Set numerical schemes:
gedit system/fvSchemes
14th March 2016 Pozzobon Victor 94
Ex. 7: Tubular reactor – Solver
parameters
● Add solvers:
gedit system/fvSolution
● Due to the use of the
divergence, we need to
use asymmetric solvers
for the species fields
14th March 2016 Pozzobon Victor 95
Ex. 7: Tubular reactor – Control
parameters
● Add solvers:
gedit system/controlDict
● Run the case:
tubeChemFoam
● Process it:
paraFoam
14th March 2016 Pozzobon Victor 96
Ex. 7: Tubular reactor – Nice pics
14th March 2016 Pozzobon Victor 97
Ex. 8: Heating pipe – Objectives
● Modify an existing solver
● Create a variating boundary condition
● Evolve a case
14th March 2016 Pozzobon Victor 98
Ex. 8: Heating pipe – Case setup
● Solving incompressible flow in a 2D
axisymmetrical pipe with heat transfer , in
steady state
10 cm
1 cm
⃗
dU p 2 ⃗
⃗ ⃗
+ U ∇ . U =−∇ ρ +η∇ U
dt
14th March 2016 Pozzobon Victor 99
Ex. 8: Heating pipe – Case setup
● Solving incompressible flow in a 2D
axisymmetrical pipe with heat transfer, in
steady state
dT ⃗ T =−∇ .(−k ∇ T )
ρ Cp +ρ Cp ∇ . U
dt
T inlet = 20 °C
T surrounding = 80 °C
−k ∇ T . ⃗n =−h(T −T sur )
14th March 2016 Pozzobon Victor 100
Ex. 8: Heating pipe – Solver
creation
● Reach 'run' directory:
run
● Move to solver directory:
cd solvers
●
Copy simpleFoam:
cp -r $FOAM_APP/solvers/incompressible/simpleFoam .
mv simpleFoam simpleThermFoam
● Move to the new solver directory:
cd simpleThermFoam
14th March 2016 Pozzobon Victor 101
Ex. 8: Heating pipe – Solver
creation / modification
● Clean the directory:
rm -r porousSimpleFoam/ SRFSimpleFoam/ simpleFoam.dep
● Clean the directory:
wclean
● Rename icoFoam:
mv simpleFoam.C simpleThermFoam.C
● Change compilation file:
gedit Make/files
14th March 2016 Pozzobon Victor 102
Ex. 8: Heating pipe – Solver
modification / createFields.H
● Add temperature field
and related physical
properties to createFields.H:
gedit createFields.H
14th March 2016 Pozzobon Victor 103
Ex. 8: Heating pipe – Solver
modification / createFields.H
● Carry on ...
Loading turbulence
model (we do not
use it in this case)
Add temperature
field
14th March 2016 Pozzobon Victor 104
Ex. 8: Heating pipe – Solver
modification / createFields.H
● Carry on ...
Loading
transportProperties
dictionary
Loading physical values
14th March 2016 Pozzobon Victor 105
Ex. 8: Heating pipe – Solver
modification / simpleThermFoam.C
● Modify solver to add temperature equation:
gedit simpleThermFoam.C
14th March 2016 Pozzobon Victor 106
Ex. 8: Heating pipe – Solver
compilation / boundary condition
● Clean the directory and compile:
wclean; wmake
● Move to cases directory:
run
● Create a directory to store boundary condition:
mkdir boundaryConditions
● Move to this directory:
cd boundaryConditions
14th March 2016 Pozzobon Victor 107
Ex. 8: Heating pipe – Create
boundary condition
● Copy an existing boundary condition:
cp -r
$FOAM_SRC/finiteVolume/fields/fvPatchFields/derived/tot
alTemperature convectiveHeatFlux
● Move to the convectiveHeatFlux directory and
clean it (if need be):
cd convectiveHeatFlux
rm totalTemperatureFvPatchScalarField.dep
14th March 2016 Pozzobon Victor 108
Ex. 8: Heating pipe – Modify
boundary condition
● Renane the boundary condition files:
mv totalTemperatureFvPatchScalarField.C
convectiveHeatFluxFvPatchScalarField.C
mv totalTemperatureFvPatchScalarField.H
convectiveHeatFluxFvPatchScalarField.H
14th March 2016 Pozzobon Victor 109
Ex. 8: Heating pipe – Compilation
rules
● Create Make folder:
mkdir Make
● Create rule files:
gedit Make/files Make/options
files
options
14th March 2016 Pozzobon Victor 110
Ex. 8: Heating pipe – Modify
boundary condition .H file
● Modify convectiveHeatFluxFvPatchScalarField.H:
gedit convectiveHeatFluxFvPatchScalarField.H
● Replace all “totalTemperature” occurences by
“convectiveHeatFlux” (consider using ctrl + H)
14th March 2016 Pozzobon Victor 111
Ex. 8: Heating pipe – Modify
boundary condition .H file
14th March 2016 Pozzobon Victor 112
Ex. 8: Heating pipe – Modify
boundary condition .H file
14th March 2016 Pozzobon Victor 113
Ex. 8: Heating pipe – Modify
boundary condition .C file
● Modify convectiveHeatFluxFvPatchScalarField.C:
gedit convectiveHeatFluxFvPatchScalarField.C
● Replace all “totalTemperature” occurences by
“convectiveHeatFlux” (consider using ctrl + H)
● Change scalar affection to a gradient
affectation
● Set thermal gradient equation
14th March 2016 Pozzobon Victor 114
Ex. 8: Heating pipe – Modify
boundary condition .C file
14th March 2016 Pozzobon Victor 115
Ex. 8: Heating pipe – Modify
boundary condition .C file
14th March 2016 Pozzobon Victor 116
Ex. 8: Heating pipe – Modify
boundary condition .C file
14th March 2016 Pozzobon Victor 117
Ex. 8: Heating pipe – Modify
boundary condition .C file
● Compile the boundary condition:
wclean; wmake OR wclean; wmake libso
14th March 2016 Pozzobon Victor 118
Ex. 8: Heating pipe – Create case
directory
● Move to cases directory:
run
● Copy Ex5 directory:
cp -r Ex5 Ex8
● Move to the case directory:
cd Ex8
14th March 2016 Pozzobon Victor 119
Ex. 8: Heating pipe – Create case
directory
● Clean the cases directory:
rm -r 0.* 1* 2* 3* 4* 5* 6* 7* 8* 9*
● Modify physical properties:
gedit constant/transportPropeties
14th March 2016 Pozzobon Victor 120
Ex. 8: Heating pipe – IC / BC
● Create temperature field:
cp 0/p 0/T
● Edit the field:
gedit 0/T
14th March 2016 Pozzobon Victor 121
Ex. 8: Heating pipe – Solver
● Pick a solver for the temperature field:
gedit system/fvSolution
Deliberately high to
prevent the problem
with the unsolved
component of the
velocity field (cf. Ex 4)
14th March 2016 Pozzobon Victor 122
Ex. 8: Heating pipe – Schemes
● Choose numerical scheme for temperature
divergence:
gedit system/fvSchemes
● Keep the default
Laplacian scheme
14th March 2016 Pozzobon Victor 123
Ex. 8: Heating pipe – Specify library
use
● Modify controlDict to specify
the use of convectiveHeatFlux
boundary condition:
gedit system/controlDict
● 1000 iterations maximum
should be enough
(mine converged after
402 iterations)
14th March 2016 Pozzobon Victor 124
Ex. 8: Heating pipe – Run the case
● Create the mesh:
blockMesh
● Run the case:
simpleThermFoam
● Open paraFoam:
paraFoam
14th March 2016 Pozzobon Victor 125
Ex. 8: Heating pipe – Process the
case
● Have a look at the temperature field:
14th March 2016 Pozzobon Victor 126
Ex. 9: Cake baking – Objectives
● Modify an existing solver
● Set a field that depend on another field
● Set custom field
● Use an existing case as initial condition
● We are going to simulate the backing of a cake:
- heating up with chocolate melting (20 min, 180°C)
- cooling down with chocolate solidification (1 hour)
14th March 2016 Pozzobon Victor 127
Ex. 9: Cake baking – Case setup
● 2D cake backing, with chocolate phase change
dT 1 dC dLC
ρ Cp =−∇ .(−k ∇ T )+Q Q= ( − )Δ H
dt 2 dt dt
−Ea 1
dC RT −Ea T T surrounding = 180 °C
=− A 1 e C + A2 e LC
2
dt −k ∇ T . ⃗n =−h(T −T sur )
−Ea
d LC
1
−Ea T
=−A 2 e LC + A 1 e RT C
2
dt
Chocolate
14th March 2016 Pozzobon Victor 128
Ex. 9: Cake baking – Solver
directory creation
● Reach 'run' directory:
run
● Move to solver directory:
cd solvers
● Copy the existing solver:
cp -r tubeFoam cakeFoam
● Move to and clean the directory:
cd cakeFoam
wclean
14th March 2016 Pozzobon Victor 129
Ex. 9: Cake baking – Set
compilation rules
● Rename tubeFoam:
mv tubeFoam.C cakeFoam.C
● Change compilation file:
gedit Make/files
14th March 2016 Pozzobon Victor 130
Ex. 9: Cake baking – Modiy
createFields.H
● Modify fields and physical properties:
gedit createFields.H
14th March 2016 Pozzobon Victor 131
Ex. 9: Cake baking – Modiy
createFields.H
14th March 2016 Pozzobon Victor 132
Ex. 9: Cake baking – Modify the
solver
● Rename tubeFoam:
gedit cakeFoam.C
14th March 2016 Pozzobon Victor 133
Ex. 9: Cake baking – Compile the
solver / create case
● Compile the solver:
wclean; wmake
● Move to 'run':
run
● Create the case directory:
cp -r Ex4 Ex9
● Move to the case directory:
cd Ex9
14th March 2016 Pozzobon Victor 134
Ex. 9: Cake baking – Prepare case
● Clean the case:
rm -r 0.* 1* 2* 3* 4* 5* 6* 7* 8* 9* (I hope you created
that alias)
rm 0/U
● Create fields files:
cp 0/p 0/C
cp 0/p 0/LC
mv 0/p 0/T
14th March 2016 Pozzobon Victor 135
Ex. 9: Cake baking – Create mesh
● Boundary name and location:
Top
Left
Down Right
SymmetryWall
14th March 2016 Pozzobon Victor 136
Ex. 9: Cake baking – Create mesh
● Modify the mesh:
gedit system/blochMeshDict
14th March 2016 Pozzobon Victor 137
Ex. 9: Cake baking – IC / BC
● Modify the mesh:
gedit 0/T
14th March 2016 Pozzobon Victor 138
Ex. 9: Cake baking – IC / BC
● Modify the mesh:
gedit 0/C
14th March 2016 Pozzobon Victor 139
Ex. 9: Cake baking – IC / BC
● Modify the mesh:
gedit 0/LC
14th March 2016 Pozzobon Victor 140
Ex. 9: Cake baking – Chocolate
● We have to specify the position of every
chocolate chip. In this case, only three pieces
will be set. First, copy an existing dictionary:
cp
$FOAM_TUTORIALS/multiphase/interFoam/ras/damBrea
k/system/setFieldsDict system/.
14th March 2016 Pozzobon Victor 141
Ex. 9: Cake baking – Chocolate
● Set the chips location
and shape:
gedit system/setFieldsDict
14th March 2016 Pozzobon Victor 142
Ex. 9: Cake baking – Set properties
for the heating phase
● Set the physical properties for the heating
phase
● Chocolate solidification parameter are set to 0:
gedit constant/transportProperties
14th March 2016 Pozzobon Victor 143
Ex. 9: Cake baking – Set properties
for the heating phase
● Set the case to transient
and specify solver features:
gedit system/fvSchemes
gedit system/fvSolution
14th March 2016 Pozzobon Victor 144
Ex. 9: Cake baking – Set control
parameters
● The heating phase
lasts 20 min (1800 s):
gedit system/controlDict
14th March 2016 Pozzobon Victor 145
Ex. 9: Cake baking – Run the case
● Create the mesh:
blockMesh
● Set chocolate field:
setFields
● Solve the case:
cakeFoam
14th March 2016 Pozzobon Victor 146
Ex. 9: Cake baking – Modify the
case
● Now that the heating phase has been run,
modify physical properties value:
gedit constant/transportProperties
● This time, chocolate melting is disabled and
chocolate solidification is enabled
14th March 2016 Pozzobon Victor 147
Ex. 9: Cake baking – Reset control
parameters
● The cooling phase
lasts 60 min (3600 s):
gedit system/controlDict
The last iteration will be
used as initialization
14th March 2016 Pozzobon Victor 148
Ex. 9: Cake baking – Rerun the
case
● Solve the last part of the case:
cakeFoam
● Process the case:
paraFoam
14th March 2016 Pozzobon Victor 149
Ex. 9: Cake baking – Process the
case
Temperature during the
Chocolate chips cooldown
location
14th March 2016 Pozzobon Victor 150
Ex. 10: Tank filling - Objectives
● This case is really basic. Its purpose is only to
discuss topics that were left uncovered
● Import a mesh created with an external tool
● Run a case in parallel
● Exporting an animation
14th March 2016 Pozzobon Victor 151
Ex. 10: Tank filling – Case setup
● Transient filling of a tank. Initially, it is full of air,
then, we are going to fill it using the two phases
flow solver interFoam
Air outlet
Water inlet
Tank walls
14th March 2016 Pozzobon Victor 152
Ex. 10: Tank filling – A new case
● Go to your 'run' directory:
run
● Copy 'damBreak':
cp -r
$FOAM_TUTORIALS/multiphase/interFoam/laminar/dam
Break/ Ex10
● Move to the case directory:
cd Ex10
14th March 2016 Pozzobon Victor 153
Ex. 10: Tank filling – Importing the
mesh
●
The mesh is called 'Tank.unv'. It was drawn using
salome. It should have already been provided to
you, if this is not the case, you can find it here:
http://perso.mines-albi.fr/~vpozzobo/dl/Tank.unv
● Move the mesh file to the case directory:
mv 'somewhere'/Tank.unv Ex10/.
● Import the mesh:
ideasUnvToFoam Tank.unv
14th March 2016 Pozzobon Victor 154
Ex. 10: Tank filling – Importing the
mesh
● There is no need to build the mesh using
blockMesh, is has already been done when
importing it. Yet, it has to be resized: atmosphere
transformPoints -scale '(0.001 0.001 0.001)'
● You can check the
mesh using paraFoam: inlet
paraFoam
fixedWalls
14th March 2016 Pozzobon Victor 155
Ex. 10: Tank filling – IC / BC
● Modify velocity
boundary conditions
according to the case
setup:
gedit 0/U
Negative because of
axis orientation
14th March 2016 Pozzobon Victor 156
Ex. 10: Tank filling – IC / BC
● Modify the pressure
boundary conditions:
gedit 0/p_rgh
14th March 2016 Pozzobon Victor 157
Ex. 10: Tank filling – IC / BC
● Copy the water phase file:
cp 0/alpha.water.org 0/alpha.water
● Keep the '.org' file. It is used as a backup in
case you would have modified the initial
condition using setFields
●
To prevent any problem, move the '.org' file to
the case root
mv 0/alpha.water.org .
14th March 2016 Pozzobon Victor 158
Ex. 10: Tank filling – IC / BC
● Modify the water
boundary conditions:
gedit 0/alpha.water
14th March 2016 Pozzobon Victor 159
Ex. 10: Tank filling – Setting gravity
● Modify gravity orientation, so that the tank will
be vertical:
gedit constant/g
Negative because of
axis orientation
14th March 2016 Pozzobon Victor 160
Ex. 10: Tank filling – Running
parallel
● OpenFOAM runs in parallel using a decomposition of
mesh and fields. You can specify the cut yourself or ask
scotch to do it for you (our call here). As a good rule of
thumb, each processor should at least have 30000 cells
to compute, if you want to see an increase in
computational speed.
● Copy the decomposition dictionary from an existing case:
cp
$FOAM_TUTORIALS/multiphase/interDyMFoam/ras/damBreakWithO
bstacle/system/decomposeParDict system/.
14th March 2016 Pozzobon Victor 161
Ex. 10: Tank filling – Running
parallel
● Modify the decomposition dictionary:
gedit system/decomposeParDict
● Once it is done, decompose the case:
decomposePar
Number of processors
that are going to be
used
14th March 2016 Pozzobon Victor 162
Ex. 10: Tank filling – Control values
● Open case control file:
gedit system/controlDict
● The tank takes about 40s to
fill up, which represented a
cpu time of 2 days for me.
So set endTime according to
your liking. I would advice
0.30s. It still requires
30 minutes to run
14th March 2016 Pozzobon Victor 163
Ex. 10: Tank filling – Control values
● Note that interFoam uses an
adaptive time step
Maximum Courant
number
Maximum time step
(in second)
14th March 2016 Pozzobon Victor 164
Ex. 10: Tank filling – Run the case
● The mesh has already been built. The case has
been split between processors, so let's run the
case:
mpirun -np 2 interFoam
Number of processors
you want to use (has to
be in agreement with
decomposeParDict)
14th March 2016 Pozzobon Victor 165
Ex. 10: Tank filling – Post
processing the case
● The case can then be processed. First, create a
new directory to store the pictures that we will
use to build the animation:
mkdir Extraction
● Then launch the post processor:
paraFoam
14th March 2016 Pozzobon Victor 166
Ex. 10: Tank filling – Postprocessing
● Load all the fields, then set opacity of the base
filter to 0.1:
Ex10.OpenFOAM / Style / Opacity
● Add a contour filter, on alpha.water field, with a
threshold of 0.1:
Filters / Common / Contour
● Change the background color to white:
Edit / View Settings ... / Choose color
14th March 2016 Pozzobon Victor 167
Ex. 10: Tank filling – Postprocessing
● Set the camera angle to your liking by using the
mouse or the 'Adjust Camera' tool:
Adjust Camera
button
14th March 2016 Pozzobon Victor 168
Ex. 10: Tank filling – Postprocessing
● Save the individual picture:
File / Save Animation ...
● Click 'Save Animation' on the prompted form
(the settings do not matter here)
● Pick 'Extraction' folder and choose a name for
the pictures (I chose 'Water')
●
Now paraFoam is filling 'Extraction' directory with
frames of the animation
14th March 2016 Pozzobon Victor 169
Ex. 10: Tank filling – Postprocessing
● Close paraFoam and go 'Extraction' folder:
cd Extraction
● Create your .gif file:
convert -delay 10 -loop 0 Water.*.png Your.gif
Time between two
frames in milliseconds
14th March 2016 Pozzobon Victor 170
It's over
● This tutorial is over, thank you for your attention
● I hope you enjoyed it
● It was just a brief and partial overview of
OpenFOAM possibilities
● Please feel free to contact me:
[email protected]14th March 2016 Pozzobon Victor 171
The extra mile
● The open source software, I use to draw and
mesh complex geometries:
SALOME: www.salome-platform.org
● Another open source software which can be
used to process high volume results:
VisIt: https://visit.llnl.gov
● Where I ask for help:
CFD Online: www.cfd-online.com/Forums/openfoam
14th March 2016 Pozzobon Victor 172
It's over
Again, thank you for your attention.
14th March 2016 Pozzobon Victor 173