Escolar Documentos
Profissional Documentos
Cultura Documentos
The Utilities
The library
Advanced topics
Conclusion
pyFoam
Happy foaming with Python
Zagreb Summer-School
10.September 2009
bgschaid
pyFoam
1/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Overview
1
Introduction
Overview
Python
Design and Conventions
The Utilities
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
The library
bgschaid
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
Advanced topics
Configuration files
Cluster support
The PyFoam-network
Other
Conclusion
pyFoam
2/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Overview
Python
Design and Conventions
bgschaid
pyFoam
3/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Overview
Python
Design and Conventions
Ignazs Python-code
2
4
sum =0
for v in [7 ,13 ,42]:
sum += v
print " The sum is " , sum
# this is a long line that will be <brk>
<cont> continued in the next line
> date
Fri May 15 01:56:12 CEST 2009
bgschaid
fooCoeffs {
bar 23;
lst ( inlet outlet ) ;
}
pyFoam
4/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Overview
Python
Design and Conventions
Motivation
How it started:
The official Version:
OpenFOAMTM is command-line oriented
OpenFOAMTM -files have a simple, structured syntax
bgschaid
pyFoam
5/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Overview
Python
Design and Conventions
What is Python
Is a scripting language
No compilation required
Is object-oriented
Comes batteries included: has a large standard-library for
the library
Widely used
Pre-installed on most Linux-systems because many system
tools (installers for instance) use it
Becomes scripting language of choice for a number of
programs (amongst others the post-processors ParaView
and Visit and the pre-processor Salome)
bgschaid
pyFoam
6/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Overview
Python
Design and Conventions
Why Python
... and not (for instance) Perl
It is named after Monty Python. Perl and Ruby are only
bit faster)
and the stuff from the previous slide
Widely used
Batteries included
bgschaid
pyFoam
7/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Overview
Python
Design and Conventions
bgschaid
pyFoam
8/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Overview
Python
Design and Conventions
pyFoam
9/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Overview
Python
Design and Conventions
Conventions
For utilities:
Utility names always start with pyFoam
If there is an OpenFOAMTM -utility in the argument list all
options after that utility are ignored by PyFoam
Options for PyFoam start with -- and there is a complete
listing to be had with --help
For the library
Classes are organized according to their purpose under the
base name PyFoam
Names try to by expressive enough but there is documentation
for most of the classes
bgschaid
pyFoam
10/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Overview
Python
Design and Conventions
8
10
12
14
16
18
20
22
24
Options
=======
-- version
-- help , -h
Default
---- --Options common to all PyFoam - applications
....
What
---Define what should be cleared
-- after = AFTER
-- processors - remove
-- vtk - keep
11/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
pyFoam
12/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
Using it
Ignaz wants to run the damBreak anew
1
3
5
7
9
11
Before running PyFoam removes all time-steps except the first one
A log-file PyFoamRunner.interFoam.logfile is found in the case-directory
bgschaid
pyFoam
13/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
pyFoam
14/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
Plotting graphs
Ignaz prepares a customRegexp
2
{ " expr " : " Courant Number mean : (% f %) max : (% f %) " ," name " : " My Courant " ,"<brk>
<cont> titles " :[ " Mean " ," Max " ]}
{ " expr " : " Liquid phase volume fraction = .+ Min \( gamma \) = -(% f %) Max " ,"<brk>
<cont> name " : " Negative fraction " ," logscale " : True }
15/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
bgschaid
pyFoam
16/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
and directories
Advantage Easy to handle using the usual system-tools
Disadvantage Hard to handle
Try removing all timesteps except 0 and 0.5
with a single rm
PyFoam offers a number of utilities for common tasks
The OpenFOAMTM -files are essentially text-files
PyFoam has tools to manipulate them
bgschaid
pyFoam
17/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
The tar-file contains all the necessary directories to run the case
(plus the last time-step) bgschaid
pyFoam
18/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
bgschaid
pyFoam
19/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
bgschaid
pyFoam
20/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
4
6
> pyFoamDec ompose . py -- method = simple --n ="2 ,2 ,0" -- delta =1 e -4 damBreak 4
PyFoam FATAL ERROR on line 153 of file / home / common / python / PyFoam / Applications /<brk>
<cont> Decomposer . py : Subdomains (2 , 2 , 0) inconsistent with processor number 4
> pyFoamDec ompose . py -- method = simple --n ="2 ,2 ,1" -- delta =1 e -4 damBreak 4
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*\
| =========
|
|
| \\
/ F ield
| OpenFOAM : The Open Source CFD Toolbox
|
....
Ignaz didnt have to edit the decomposeParDict. PyFoam did it for him
And runs the case in parallel
1
bgschaid
pyFoam
21/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
> ll
total 0
drwxr - xr - x
drwxr - xr - x
drwxr - xr - x
9 igarten
17 igarten
2 igarten
wheel
wheel
wheel
306 Sep
578 Sep
68 Sep
9 11:28 damBreakOrig
9 11:33 d a mB r e ak P a ra llel
9 11:37 notACas eIThink
More information
1
3
5
bgschaid
pyFoam
22/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
bgschaid
pyFoam
23/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
Preparing a case
Ignaz is asked to set the boundary-conditions on a
mesh that the snappyHexMesh-specialist Kasimir
produced (and cant use OF 1.6 yet)
Ignaz wants to try the motorcycle
1
3
5
7
9
11
13
24/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
Comparing dictionaries
Ignazs colleague Isidor modified transportProperties and now gets strange
results.
Ignaz has a hard time recognizing the differences
The original transportProperties
18
20
22
24
26
28
30
32
34
36
phase1
{
tran sportModel Newtonian ;
nu
nu [0 2 -1 0 0 0 0] 1e -06;
rho
rho [1 -3 0 0 0 0 0] 1000;
CrossPowerLawCoeffs
{
nu0
nu0 [0 2 -1 0 0 0 0] 1e<brk>
<cont> -06;
nuInf
nuInf [0 2 -1 0 0 0 0] <brk>
<cont> 1e -06;
m
m [0 0 1 0 0 0 0] 1;
n
n [0 0 0 0 0 0 0] 0;
}
B i rd C a r r eau C o ef fs
{
nu0
nu0 [0 2 -1 0 0 0 0] <brk>
<cont> 0.0142515;
nuInf
nuInf [0 2 -1 0 0 0 0] <brk>
<cont> 1e -06;
k
k [0 0 1 0 0 0 0] 99.6;
n
n [0 0 0 0 0 0 0] <brk>
<cont> 0.1003;
}
}
bgschaid
Isidors transportProperties
17
19
21
23
25
27
29
31
33
phase1
{
//
transportModel Isidor ;
transportModel Newtonian ;
nu
nu [0 2 -1 0 0 0 0] 1e -06;
rho
rho [1 -3 0 0 0 0 0] 100;
C r o s s Po w e r L a w C o ef f s
{
nuInf
nuInf [0 2 -1 0 0 0 0] <brk>
<cont> 1e -06;
nu0
nu0 [0 2 -1 0 0 0 0] 1e<brk>
<cont> -06;
m
m [0 0 1 0 0 0 0] 1;
n
n [0 0 0 0 0 0 0] 0;
}
Is ido rMo delC oef fs
{
alpha 1;
}
}
35
37
phase2
{
pyFoam
25/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
Comparing dictionaries
Ignaz wants to see what Isidor did
bgschaid
pyFoam
26/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
Updating dictionaries
Ignaz wants to merge his and Isidors parameters
interactively
Ignaz is picky about things
bgschaid
pyFoam
27/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
changed
For similar cases state-files can be used like this:
1 Prepare a visualization in ParaView with case 1
2 Save the state
3 Use the state-file together with case 2
bgschaid
pyFoam
28/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
bgschaid
pyFoam
29/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
3010
3012
3014
3016
3018
3020
pyFoam
30/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
bgschaid
pyFoam
31/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
.... and finds this picture on his disk (with the correct case-name):
bgschaid
pyFoam
32/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
OpenFOAMTM is needed
A shell has to be spoilt with the other version
... or the default version has to be changed
bgschaid
pyFoam
33/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Executing solvers
Working with cases
Working with dictionaries
Paraview
Development support
bgschaid
pyFoam
34/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
bgschaid
import PyFoam or a
to get the functionality of a class
pyFoam
35/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
OpenFOAMTM -files
Files are read and represented in memory as
Python-data-structures and can be manipulated as such
Dictionaries are Python-dictionaries
Lists are Python-lists
pyFoam
36/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
Reading a dictionary
This abstract example
shows how a
dictionary-file is seen
inside a
Python-program
The dictionary
testDict
The Python-code
1
7
9
11
model theModel ;
patches ( inlet
outlet ) ;
13
15
17
theMo delCoeffs {
alpha 0.3;
beta 2 inlet ;
}
11
13
# manipulation is possible
file [ " theModelCoeffs " ][ " alpha " ]+=1
file [ " newCoeffs " ]={ " a " :1 , " b " :[2 ,3 ,4]}
15
print file
bgschaid
pyFoam
37/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
Writing dictionaries
The output from the previous slide
2
ParsedParameterFile-
elements
the comments
10
FoamFile
{
version 2.0;
format ascii ;
class dictionary ;
object testDict ;
}
12
model theModel ;
14
patches
(
inlet
outlet
);
6
8
16
18
20
22
24
theMo delCoeff s
{
alpha 1.3;
beta
2 inlet ;
}
26
newCoeffs
{
a 1;
b
30
(2 3 4) ;
bgschaid}
pyFoam
28
38/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
24
t urbule nce Mo de l kEpsilon ;
26
16
turbulence
on ;
28
30
36
38
kEpsilon ;
turbulence
on ;
printCoeffs
on ;
20
32
34
RASModel
18
laminarCoeffs
{
}
22
kEps ilonCoe ffs
{
Cmu
Cmu [0 0 0 0 0 0 0] <brk>
<cont> 0.09;
C1
C1 [0 0 0 0 0 0 0] <brk>
<cont> 1.44;
C2
C2 [0 0 0 0 0 0 0] <brk>
<cont> 1.92;
alphaEps
alphaEps [0 0 0 0 0 <brk>
<cont> 0 0] 0.76923;
}
24
laminarCoeffs
{
}
26
28
30
32
kEpsilonCoeffs
{
Cmu
C1
C2
alphaEps
}
0.09;
1.44;
1.92;
0.76923;
40
R N G kE p s il o nC o e f f s
bgschaid
pyFoam
39/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
Using ParsedParameterFile
Ignaz has a lot of old cases from his 1.4.1-days
Ignaz wants to keep using his 1.4.1 turbulence files
2
8
10
14
for k in turb :
if type ( turb [ k ]) == DictProxy :
for par in turb [ k ]:
if len ( turb [ k ][ par ]) ==3:
turb [ k ][ par ]= turb [ k ][ par ][2]
16
12
bgschaid
pyFoam
40/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
OpenFOAMTM -applications
The provide most of the functionality pyFoamRunner is
popular for
bgschaid
pyFoam
41/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
12
14
16
BasicRunner ( argv =[ " interFoam " ," - case " , case ]) . start ()
Calling it
2
bgschaid
pyFoam
42/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
utilities
Sometimes it is easier to re-use than to re-build
The utilities can be called as classes
The parameters are specified by a list of strings that resemble
the parameters on the command-line
bgschaid
pyFoam
43/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
import sys
case = sys . argv [1]
proc = int ( sys . argv [2])
6
8
10
12
14
Runner ( args =[ " -- clear " ," blockMesh " ," - case " , case ])
Runner ( args =[ " setFields " ," - case " , case ])
Decomposer ( args =[ case , str ( proc ) ])
PlotRunner ( args =[ " -- proc =% d " % proc , " -- with - all " ," -- progress " ," interFoam " ," -<brk>
<cont> case " , case ])
Runner ( args =[ " reconstructPar " ," - case " , case ])
bgschaid
pyFoam
44/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
pyFoam
45/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
# To be run using " Tools -> Python Shell -> Run Script " inside of paraFoam
# assumes that one OpenFOAM - case is opened
5
7
9
11
ro = readerObject ()
13
15
17
19
gly . repr . Color =(0 ,0 ,0)
bgschaid
pyFoam
46/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
bgschaid
pyFoam
47/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
Overview
bgschaid
pyFoam
48/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
Analyzing a SolutionDirectory
Ignaz wonders whether dimensions can change during a run
He wants to check all the files
2
4
6
import sys
from PyFoam . RunDictionary . Sol uti onD ir ec tor y import So lut ionD ire cto ry
sol = S olu tio nDi r ec tory ( sys . argv [1])
for t in sol :
print " t = " ,t . baseName ()
for f in t . getFiles () :
print " " ,f , " : " ,t [ f ]. ge t Di me n si o nS tr i ng ()
Relief. Everything OK
1
3
5
7
9
11
bgschaid
pyFoam
49/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
bgschaid
pyFoam
50/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
from
from
from
from
from
6
from os import path
8
10
orig = S olu tio nD i r e c t or y ( path . expandvars ( " $ FO AM_ TU TO RIA LS / interFoam / damBreak " ) ,
archive = None ,
paraviewLink = False )
12
14
16
18
20
22
24
bgschaid
pyFoam
51/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
ParsedParameterFile
The Runner-classes
The Application classes
Paraview/paraFoam
Structure of cases
Documentation and conclusion
bgschaid
pyFoam
52/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Configuration files
Cluster support
The PyFoam-network
Other
Configuring PyFoam
configuration files
This can happen in three locations (lowest number wins):
1
2
3
User-specific in ~/.pyFoam/pyfoamrc
System-wide in /etc/pyFoam/pyfoamrc
Hardcoded in the library
bgschaid
pyFoam
53/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Configuration files
Cluster support
The PyFoam-network
Other
> p y F o a m D u m p C o n f i g u r a t i o n . py
[ Paths ]
python : / usr / bin / python
bash : / bin / bash
5
7
9
11
13
15
17
19
21
[ CommandOptionDefaults ]
sortlistcases : mtime
[ Logging ]
default : INFO
server : INFO
[ Network ]
searchservers : 192.168.42.0/24 ,192.168.43.0/24
nrserverports : 100
socketretries : 10
sockettimeout : 1.
s ta rt se r verport : 18000
portwait : 1.
[ Execution ]
c o n t r o l d i c t r e s t o r e w a i t : 60.
23
25
[ ClusterJob ]
path : / opt / openmpi / bin
bgschaid
pyFoam
54/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Configuration files
Cluster support
The PyFoam-network
Other
Changing settings
Ignaz wants to use the pyFoamNetList (see below)
in his network but the server has a different IP-address
than the one hard-coded in the library
Ignaz has a different Meta-Server
1
[ Metaserver ]
ip : 10.127.66.66
3
5
[ Network ]
searchservers : 10.127.0.0/16
pyFoam
55/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Configuration files
Cluster support
The PyFoam-network
Other
In the following example the lines starting with #$ are options for
the Sun Grid Engine
bgschaid
pyFoam
56/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Configuration files
Cluster support
The PyFoam-network
Other
Executing cluster-scripts
Ignazs simple script
1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
31
33
35
bgschaid
pyFoam
57/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Configuration files
Cluster support
The PyFoam-network
Other
bgschaid
pyFoam
58/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Configuration files
Cluster support
The PyFoam-network
Other
bgschaid
pyFoam
59/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Configuration files
Cluster support
The PyFoam-network
Other
Meta-Server
The Meta-Server is unique in the network and keeps track of
pyFoamNetShell
bgschaid
pyFoam
60/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Configuration files
Cluster support
The PyFoam-network
Other
Architecture overview
bgschaid
pyFoam
61/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Configuration files
Cluster support
The PyFoam-network
Other
6
8
10
12
14
16
18
bgschaid
pyFoam
62/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Configuration files
Cluster support
The PyFoam-network
Other
Controlling runs
Ignaz has a look and stops (with writing)
1
3
5
7
9
11
13
15
17
19
bgschaid
pyFoam
63/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Configuration files
Cluster support
The PyFoam-network
Other
Unmentioned scripts
Three interesting applications that were not menitoned are
pyFoamBench Utility to run benchmarks that are specified in a
parameter-file and compares them with a baseline
pyFoamCaseBuilder Builds cases from a template, a Xml-file
and a small number of user-inputs
pyFoamComparator Do systematic parameter-variations
pyFoamDisplayBlockMesh Displays the data from a
blockMeshDict graphically using the Vtk
... and a number of smaller utilities
bgschaid
pyFoam
64/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
bgschaid
pyFoam
65/66
Introduction
The Utilities
The library
Advanced topics
Conclusion
Suggestions/Questions
bgschaid
pyFoam
66/66