From OpenFOAMWiki
< Contrib
Revision as of 11:17, 5 August 2019 by Bgschaid (Talk | contribs)

A python library to control OpenFOAM-runs and manipulate OpenFOAM-data. Comes with a number of utilities that should make your life easier if you're not scared by commandlines

Valid versions: OF version 141.png OF version 15.png OF version 16.png OF version 17.png OF Version 20.png OF Version 21.png OF Version 22.png works with older versions (but I don't support that)


1 Short description

This Python-library can be used to

  • analyze the logs produced by OpenFoam-solvers
  • execute OpenFoam-solvers and utilities and analyze their output simultaneously
  • manipulate the parameter files and the initial-conditions of a run in a non-destructive manner
  • plots the residuals of OpenFOAM solvers

1.1 Motivation

This library was developed to control OpenFOAM-simulations with a decent (sorry Perl) scripting language to do parameter-variations and results analysis.

It is an ongoing effort. I add features on an As-Needed basis but am open to suggestions.

1.2 Compatibility

This Library tries to be as conservative as possible in the libraries it uses. This means that it tries to use only libraries that are in the standard Python-distribution. Currently it needs at least version 2.5 of Python but it has been tested on all versions up to 2.7. Python 3 is currently supported (but currently only 3.4 is tested)

For plotting support it needs the Numpy-library. It is recommended to use the version that is supplied by the package manager of the distribution (PyFoam does not require a specific version).

It should run on any system with OpenFOAM and python2.5 (but some features require at least 2.6). Currently it has been tested on

  • Linux (various flavours)
  • MacOS X

1.3 Other material

This presentation "Happy Foaming with Python" from the 4th Workshop gives a short overview of the things that can be done with PyFoam.

There is another presentation on the "Automatization with pyFoam" from the 5th Workshop in Gothenburg avalaible (the material is available at this link).

The presentation PyFoam - the dark, unknown corners about the tools for quantitative analysis, handling cases with version control and the server mechanism held at the PFAU (Austrian User Meeting) at the TU Wien in March 2012

Complementary there is a complete tutorial on "Particles with pyFoam - The air classification test case" available here.

A presentation about automatic solver testing using PyFoam, a feature that was added in PyFoam 0.5.7, and a file with the data described there (rename file appropriately before using)

The presentation held at the 8th OpenFOAM Workshop gives a nice introduction to pyFoam from a user perspective (the first part. The second is a bit more advanced). The material mentioned is available here

The presentation Building Block for Automatization (a HTML5-browser is required) from the OpenSource CFD International Conference 2013 gives an overview of newer features of 0.6.2.

The Presentation Before and after the case held at the Austrian User Group Metting PFAU 8.0 demonstrates the use of a new utility to set up cases and interaction with IPython-notebooks. The files to reproduce the presentation are available here.

There was a a basic training about swak4foam and PyFoam at the 9th OpenFOAM Workshop which gives an overview over the work-flow. Updated version of this training from the 10th OpenFOAM Workshop which was updated once more at the 11th OpenFOAM Workshop.

At the 10th OpenFOAM Workshop a comprehensive about the utility was given

At the 11th OpenFOAM Workshop the presentation PyFoam 4 the lazy gives an overview of some utilities that allow processing simulation results (case file for this presentation is found here)

At the PFAU 14 (Austrian User Meeting) the talk Talking to PyFoam (and it talks back) demonstrated two features that have been in PyFoam for some time: the server-process that allows controlling a PyFoam-controlled OpenFOAM-run over the net and hooks: little Python-programs that are executed at the start and the end of an execution

Introductory training for swak4Foam and PyFoam at the 12th International OpenFOAM Workshop. This is a completely new training. An updated version of the Training held at the 2019 Workshop in Duisburg

2 Examples

These examples should demonstrate the possible applications of the library. They are enclosed in the source distribution.

2.1 Compact output

This example is a wrapper for solvers. For each time-step only one line is output: the time and the initial residuals of the linear solvers (with the name of the solved variable). The complete output of the solver is written to a log-file. The residuals are written to separate files in a special directory in the simulation-directory (for plotting).

import re,sys
from PyFoam.LogAnalysis.LogLineAnalyzer import LogLineAnalyzer
from PyFoam.LogAnalysis.BoundingLogAnalyzer import BoundingLogAnalyzer
from PyFoam.Execution.AnalyzedRunner import AnalyzedRunner
class CompactLineAnalyzer(LogLineAnalyzer):
    def __init__(self):
        self.exp=re.compile("^(.+):  Solving for (.+), Initial residual = (.+), Final residual = (.+), No Iterations (.+)$")
    def doAnalysis(self,line):
        if m!=None:
            if time!=self.told:
                print "\n t = %6g : " % ( float(time) ),
            print " %5s: %6e " % (name,float(resid)),
class CompactAnalyzer(BoundingLogAnalyzer):
    def __init__(self):

2.2 Parameter Variation

This example does 10 runs of the same case. For each case a different velocity at the inlet is set. After the simulation has ended the mass flow (with this utility) and the pressure difference (with this utility) are calculated and written to the file InflowVariationResults. In addition to this the data of the last time-step is saved to a separate directory (for further analysis):

from PyFoam.Execution.ConvergenceRunner import ConvergenceRunner
from PyFoam.Execution.UtilityRunner import UtilityRunner
from PyFoam.LogAnalysis.BoundingLogAnalyzer import BoundingLogAnalyzer
from PyFoam.RunDictionary.SolutionFile import SolutionFile
from PyFoam.RunDictionary.SolutionDirectory import SolutionDirectory
for i in range(nr+1):
    # Set the boundary condition at the inlet
    print "Inlet velocity:",val
    sol.replaceBoundary("inlet","(%f 0 0)" %(val))
    # Run the solver
    print "Last Time = ",dire.getLast()
    # Get the pressure difference (Using an external utility)
    pUtil.add("deltaP","Pressure at .* Difference .*\] (.+)")
    # Get the mass flow
    mUtil.add("mass","Flux at (.+?) .*\] (.+)",idNr=1)
    # Archive the results
    dire.lastToArchive("vel=%g" % (val))
    # Clear results
    # Output current stuff
    print "Vel: ",val,"DeltaP: ",deltaP,"Mass Flow:",massFlow
    f.writeLine( (val,deltaP,massFlow) )

2.3 Manipulating dictionaries

Between Version 1.3 and 1.4 the format for the specification of the linear solvers was changed. The following script takes a fvSolution-file in the old format and rewrites it in the equivalent new format (only works for some solvers, but should work for all the tutorials):

#! /usr/bin/python
"""Given a pre-OpenFOAM-1.4 fvSolution file, this script transforms the solvers
section into the equivalen 1.4-format
Incomplete, because it doesn't support (B)DCG and GaussSeidl but should work for
instance for all the tutorials"""
import sys
from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile
if len(sys.argv)<2:
    print "I need at least one fvSolution-file to work with"
for fName in sys.argv[1:]:
    print "Working on",fName
        for name,val in sol.iteritems():
            if type(name)!=str or type(val)!=tuple or len(val)<3:
                # this is not an old-school entry
            if solver=="ICCG":
                new=( "PCG" , { "preconditioner":"DIC" } )
            elif solver=="BICCG":
                new=( "PBiCG" , { "preconditioner":"DILU" } )
            elif solver=="AMG":
                new=( "GAMG" , { "agglomerator":"faceAreaPair",
                                 "smoother":"GaussSeidel"} )
                print "Unsupported solver",solver
    except IOError:
        print "File",fName,"does not exist"
    except KeyError:
        print "File",fName,"is not a fvSolution-file"
    except IOError:
        print "Can't write file. Content would have been:"
        print f

Of course 1.4 can read the old format, so this script is not needed. It's only an example.

2.4 Setting boundary conditions for walls

This example sets the boundary condition for all patches whose names contain the string "Wall" to zero-velocity:

from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile
for b in f["boundaryField"]:
    if "Wall" in b:
        f["boundaryField"][b]["value"]="uniform (0 0 0)"

This can serve as a starting-point for automatically setting up cases where the patches are named after a specific scheme

3 Installation

The easies way to install PyFoam is as root, but it is also possible to do it as a regular user.

3.1 Prerequisites

To install PyFoam you need (obviously) Python.

The smallest Python-version known to work is 2.5 but higher versions are better (not all features might be available with smaller versions). Basically the python that is preinstalled with most Linux-versions currently in use should be fine.

3.1.1 Libraries

PyFoam brings some essential libraries. For plotting and other data handling operations you will need numpy. Use the version provided by the package manager of your distribution.

Some utilities need additional libraries. Once installed you can use the to find out who they are

If one gets a warning message:

 Neither numpy nor Numeric python-package installed. Plotting won't work

that can be fixed by installing the necessary package, by running the respective installation command, depending on your Linux Distribution:

  • Debian/Ubuntu:
    sudo apt-get install python-numpy
  • Fedora/CentOS/RHEL/SL:
    sudo yum install numpy
  • openSUSE:
    sudo zypper install python-numpy

3.2 Installing with pip

This is now the preferred way of installing PyFoam.

PyFoam is now available at the Python Package Index. This means that if pip is installed a single command as root:

pip install PyFoam


sudo pip install PyFoam

installs PyFoam on the machine. The library numpy is also installed if it is not yet installed on the machine as it is required for plotting

If you can not write to the global Python installation because you don't have administrative rights try

pip install --user PyFoam

but you'l have to make sure that the location the utilities are installed to are in your PATH

An existing installation can be easily upgraded via pip:

pip install --upgrade PyFoam

3.3 Installation as root

This used to be the old way to install PyFoam but now should only be used in emergency cases. If possible use pip.

  1. Download the latest tar
  2. Untar it, e.g.:
    tar -xf PyFoam-0.6.6.tar.gz
  3. Go to the directory PyFoam-0.6.6 (or for whichever version you downloaded):
    cd PyFoam-0.6.6
  4. Install it with the command:
    sudo python install

Should step 4 fail one of the most common causes is that some Linux-distributions (usually Debian-based, don't know about Mandrake) don't install the packages that are necessary for Usually they are in the Developer-package which is installed by running the respective installation command, depending on your Linux Distribution:

  • Debian/Ubuntu:
    sudo apt-get install python-dev python-setuptools
  • Fedora/CentOS/RHEL/SL:
    sudo yum install python-devel
  • openSUSE:
    sudo zypper install python-devel

3.4 Installation as a regular user

If you don't want to (or can't) install it as root things are a bit more complicated. Let's assume that you have directory /home/nonroot/my_python to which you have write access:

  1. Download PyFoam-0.x.x (0.x.x being the current version)
  2. Untar it, e.g.:
    tar -xf PyFoam-0.6.5.tar.gz
  3. Go to the directory PyFoam-0.6.5 (or for whichever version you downloaded):
    cd PyFoam-0.6.5
  4. Add the path to the library to the PYTHONPATH environment-variable, e.g.:
    export PYTHONPATH=$HOME/my_python/lib/python-2.3/site-packages:$PYTHONPATH
    • The lib/python-2.3/site-packages portion of the path may depend on your Python-version; in that directory there must be a directory named PyFoam.
  5. Install it with the command
    python install --prefix=$HOME/my_python
    • After installing, in $HOME/my_python there should be two directories that contain the shell scripts and the Python libraries for PyFoam: bin and lib
  6. If you want to use the scripts distributed with PyFoam extend your path with the following command:
    export PATH=$HOME/my_python/bin:$PATH

3.5 Installation via RPMs

Starting with version 0.4.0 a source rpm and a regular rpm are provided for those who prefer to install it that way (The rpms have not been extensively tested. If there is a problem: please contact me)

For recent versions no RPMs were made available. You can produced them from the tarballs with something like:
python bdist

3.6 Obsolete: Installation under gentoo Linux

PyFoam is now in the main portage tree, so you can install it with emerge.

emerge PyFoam

Note: According to the information found at Gentoo this is quite an old version. It seems like the port is unmaintained

3.7 Installation under Debian/Ubuntu

Files to package PyFoam for the Debian packaging system are in the downloaded tarball or repository.

3.8 Testing the installation

To test whether the installation of PyFoam is working start the interactive Python shell with


(The shell can be left with Control-D). In that shell type

import PyFoam
import PyFoam.FoamInformation
print PyFoam.FoamInformation.foamTutorials()

If the last command produces an output similar to


everything is well.

If things don't work check in the Python-shell with the commands

import sys
print sys.path

whether the directory in which PyFoam resides is on the path searched by Python.

It can be useful to use the utility to view the PYTHONPATH, PyFoam version, OpenFOAM version and the installed libraries.

3.9 Docker containers

At this page there are instructions to install Docker containers with preinstalled versions of swak4Foam and PyFoam. These containers are based on publicly available containers of others (so your preferred OpenFOAM-version might not be there) and might not be the newest versions. But they should be fine for testing

4 Installed Utilities

All the utilities described in this section are installed to /usr/bin (if installed as root) and should be in the standard path for execution. They can all be called with the --help-option which gives all the available options and the latest, up-to-date information about the utility.

One recommended usage of these utilities would be to start a simulation with foamJob and display the residuals with without interfering with the simulation.

The following descriptions are not necessarily up to date. The text generated with the --help-option is

4.1 Runner-Utilities

These are utilities that start and control OpenFOAM-Runs. Apart from the features described below they start a little XMLRPC-server through which these runs can be controlled (see Network-Utilities).

Most of the utilities can be used to start parallel runs (the number of processors and a host-file have to be provided, depending on the MPI-implementation. The parallel environment is set up automatically).


Runs an OpenFoam solver. Needs the usual 3 arguments (<solver> <directory> <case>) and passes them on (plus additional arguments). Output is sent to stdout and a logfile inside the case directory (PyFoamSolver.logfile). The Directory PyFoamSolver.analyzed contains this information:

  • Residuals and other information of the linear solvers
  • Execution time
  • continuity information
  • bounding of variables


Runs a OpenFoam Utility an analyzes the output. Needs a regular expression to look for. The next 3 arguments are the usual OpenFoam arguments (<solver> <directory> <case>) and passes them on (plus additional arguments). Output is sent to stdout and a logfile inside the case directory (PyFoamUtility.logfile). The Directory PyFoamUtility.analyzed contains a file with the information of the regexp (the pattern groups) at every time-step.

Doesn't start an XMLRPC-Server


Runs an OpenFoam steady solver. Needs the usual 3 arguments (<solver> <directory> <case>) and passes them on (plus additional arguments) Output is sent to stdout and a logfile inside the case directory (PyFoamSolver.logfile). The Directory PyFoamSolver.analyzed contains this information

  • Residuals and other information of the linear solvers
  • Execution time
  • continuity information
  • bounding of variables

If the solver has converged (all linear solvers below threshold) it is stopped and the last simulation state is written to disk


Runs an OpenFoam solver. Needs the usual 3 arguments (<solver> <directory> <case>) and passes them on (plus additional arguments). Output is sent to stdout and a logfile inside the case directory (PyFoamSolver.logfile). Information that is output as graphs are

  • residuals of the linear solver
  • continuity
  • bounding of variables (if it occurs)
  • Courant-number (optional)
  • Execution time of a time-step (optional)
  • number of iterations of the linear solver (optional)
  • arbitrary regular expressions can used to look for solver-specific data
    • The groups in the regular expressions (patterns that are in brackets) are plotted
    • in the regular expressions %f% can be used as a shortcut for floating-point numbers
    • Any number of expressions can be specified and will be plotted in a separate window
  • For steady runs it behave like


Some utilities that manipulate meshes store the new mesh into the first timestep (so that they don't destroy the original mesh). This can be inconvenient because you have to copy the mesh back to constant for all further steps. This utility

  1. Runs a mesh-utility
  2. Moves the resulting mesh from the first time-step to the constant-directory

Be careful: This utility deletes the old mesh. If you don't know what you're doing, it will be gone forever


Runs potentialFoam on a case and writes the results to p and U. Before running the solver it manipulates the dictionaries in system in such a way that potentialFoam runs and afterwards resets them to their old form.


Runs a utility multiple times using different values for the -time option. Workaround for utilities that only allow a single time-step


This utility takes a template case and a file specifying the parameter variation and creates cases with the, runs a solver on these cases and collects the data into a database. The database can then be extracted with

4.2 Utilities for Logfiles

These utilities can be used to analyze the output of an OpenFOAM-solver that has been written to a file


Gets the name of a logfile which is assumed to be the output of a OpenFOAM- solver. Parses the logfile for information about the convergence of the solver and generates gnuplot-graphs. Watches the file until interrupted.


Analyzes a Log written by foamJob. Needs the name of the Logfile to be analyzed the data is being written to a directory that has the same name with _analyzed appended

4.3 Networking Utilities

Most Runner-Utilities start a Server-thread that makes it possible to contact control an OpenFOAM-run and get information about it. These utilities help to access these servers.


  • These utilities are beta-qualitiy. They work for my network but have not been tested in other environments
    • The address of the is hardcoded into the sources, but can be overwritten using system-wide configuration-files
  • doesn't need any additional infrastructure. Only the address and the port have to be known


This command lists all the OpenFOAM-simulations in your network environment and gives you information about them. Amongst the information is:

  • Hostname and port (useful for
  • Details about the run (solver, working directory ...)
  • Estimates about the time at which the run will end (using the time since the start, current timestep and the endTime)

This utilitiy only works if a can be contacted at the configured address

This program spawns a daemon process that runs forever. It stores information about the running processes. There are two mechanisms for it to get that information

  • scanning the network (at the start and on demand)
  • Runner-utilities try to register with it, when they start an OpenFOAM-run
    • The utilities also dregister their process when they exit gracefully


Connects to an OpenFOAM-run started by a runner-Utility using

  • the hostname of the machine it runs on
  • the port number (usually 18000, if more than one run is running one of the following ports)

and starts an interactive shell there. On the shells the XMLRPC-commands provided by the server can be used to

  • get information about the run
    • environment
    • start-times
  • manipulate the run
    • for instance stop() tells the run to write at the next time-step and then end
    • kill() brutally terminates the run

Help about the available commands is provided.

Can also be used to control the (which is usually contacted on port 17999)

4.4 Utilities for Manipulating case data

These utilities are used for manipulating case date. They are especially useful in scripts that automatically set up simulation runs.


Adds an empty patch to the boundary file. Such a patch is needed for some mesh-maipulation utilities.


Changes the type of a boundary patch.


Changes the name of a boundary patch.


Creates boundary patches in a field-file by looking at the boundary-file


Removes all the timesteps except for the first from a case directory.


Packs the essential files (the ones that are needed to run it) of a case into a tar-file for archiving/mailing-purposes


Creates a copy of a case with only the most essential files


Copy last time-step from one case to the first one of another (making it the initial condition)


Clears the solution from the internal field


Clear non-uniform values from the boundary-fields


Initialize the case for the use with the Version Control System (VCS) of your choice


This utility replaces a symlink with a copy of the file/directories it points to. To be used after a in --symlink-mode


Goes through a case and compresses single files that are bigger than a certain threshold. Purpose is to shrink cases that were run with the setting uncompressed in the controlDict

4.5 Manipulating dictionaries (from scripts)

For more complex cases these utilities require an understanding of the syntax/semantics of Python-lists and dictionaries


Reads data from the root of a OpenFOAM-dictionary and prints it. To access subexpressions of a dictionary entry Python-expressions can be used (note: the expression is evaluated by the Python-interpreter, so quoting has to be used for strings, otherwise Python confuses them with variables)


Writes data to the root of a OpenFOAM-dictionary and writes it to disk. Subexpressions can be selected (see note:


Generate a dictionary from a template file


Compares two dictionaries structurally (not textually). Useful when the order of the entries or the formating have changed and diff won't give useful results


Updates a dictionary from another by adding/removing entries that are not in both.


Checks the case and if fvSolution is in the old format rewrites it to the new format


Checks the case and if blockMeshDict and thermophysicalProperties is in the old format tries to rewrite them to the new format. Also applies the changes would do

4.6 Paraview related utilities

Thes utilities require a paraview that is compiled with python-support. They have been only tested with ParaView 3.4 and may not work with other versions.


Generates snapshots from OpenFOAM-data using a ParaView-state-file that was generated with another, similar case


Loads OpenFOAM-data and a Paraview-state-file that was generated with another similar case and lets you continue work like regular paraFoam

4.7 Other

Utilities that don't fit any of the other categories.


Gives a ls-like overview of the OpenFOAM-cases in a directory


  • Generates a decomposeParDict according to the user specifications and
  • runs dcomposePar

This utility is quite useful when writing scripts where the number of available processors is not known beforehand (for instance if you are using a queueing-system)


A utilitiy that automatically does a series of variations on a run (for benchmarking, testing and verification purposes). The behaviour is specified by an XML-file.

Work in progress. Therefor no example is present and the DTD that assists editing the XML-file is not included. Contact me, if you want to give it a spin (and want the DTD)


Prints the Version of OpenFOAM and pyFoam. Used for information purposes (when reporting bugs). Also lists the Foam-versions installed in the OpenFOAM-directory


Execute a command specifying a OpenFOAM-Version. Useful for compiling/executing a debug-version without changing the shell


Helper utility to build a project and its prerequisites (OF, libraries etc)


Dumps the values that can be changed via configuration files. The location of these configuration values are (lower overrides higer):

  1. Hardcoded in the Library
  2. Systemwide configuration file: /etc/pyfoamrc
  3. User configuration file: ~/pyFoam/pyfoamrc

Parts of the output of the utilitiy can be pasted into the configuration files and modified to change the behaviour of PyFoam


Creates Gnuplot commands that plot the results of the sample-Utility (sorted by timestep, field etc) or the sample-function object


Uses VTK to plot surfaces generated by the sampleSurface-Utility (sorted by timestep, field etc) or the sample-function object


Creates Gnuplot commands to plot timelines produced by various functionObjects


Generates images by either connecting to a running server-process (one that is started for instance by or by reading a pickle-file (found in the .analyzed-directory)


Prints small reports about a case. Currently implemnted:

  • Table of the boundary conditions
  • Boundary conditions on a per-patch basis (as opposed to the files where they are listed per-field)
  • Dimensions of the fields
  • Internal fields


Just outputs a dictionary. Used to find bugs in the dictionary-parser


Outputs the data from a pickle file. Either to the terminal or to a pipe


Command line interface to the CaseBuilder-functionality


Joins different CSV-files and resamples them if needed


Takes a file with column oriented data and converts it into a CSV


Takes a number of STL-files and joins them into one (with unique patch names)


Prints data generated from the Data2DStatistics data structure


Utility to create files for [1] that help switching between OF-versions


Calculates the size of the binaries in an OpenFOAM-installation separated by compile-option


Assists the user in rewriting the blockMeshDict by doing simple, but error-prone transformations. Assumes "sensible" formatting: one block/vertex etc per line.

Sub-commands are:

refines mesh by multiplying cell numbers in the blocks
Adds comments with the vertex numbers. Should help the user when editing/modifying the mesh
Remove the comments added by number
Adds vertices from other blockMeshes that are not present in the current blockMesh
Take another blockMeshDict, copy over the vertices-section of that mesh and rewrite blocks and patches so that they conform to these vertices. The original vertices have to be a sub-set of the vertices in the other mesh
Rotates patches so that the lowest number is in front

4.8 GUI-Tools

Stuff that is not purely command-line oriented


Graphically displays a blockMesh and helps highlights selected blocks and patches. It is not a blockMesh-editor, but it helps to find errors in the order of vertices etc (editing of the blockMesh is still done in a text editor).

This needs an installation of the VTK with Python-bindings. The ways to get this are very different on various systems. But usually you have to compile it from the sources. Sorry.

Since 0.5.4 this is implemented in PyQT4. If that library is not found it falls back to the old (less feature-rich) version implemented in Tkinter

4.8.2 A Poor Man's FoamX

TUI (terminal/curses based) interface to the CaseBuilder-functionality (discontinued in PyFoam 0.5.6 as the TUI library was not available for most platforms)


Implementation of using PyQt

4.9 Special utilities

Utilities for special applications


Modify GGI boundary condition parameters

5 Library Documentation

The tar-file contains the documentation of the Library as HTML (in the folder doc)

6 Rocks-Cluster support

There is library support to run OpenFOAM on a link Rocks cluster. It has only been tested on that type of cluster and probably has to be extended/adapted for other Clusters/Queuing-systems. There is a good chance that it might work on vanilla SunGridEngine installations, but this has not been tested.

An example cluster script would be

#$ -cwd
#$ -j y
#$ -S /opt/rocks/bin/python
#$ -m be
import sys,os
from os import path
from PyFoam.Infrastructure.ClusterJob import SolverJob
from PyFoam.Error import error
from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile
class Pitz(SolverJob):
    def __init__(self):
    def setup(self,parameters):
        vel["boundaryField"]["inlet"]["value"] = "uniform (%s 0 0)" % velIn

If this script (assume it has the name is submitted to a Rocks-Cluster with the SunGridEngine installed via

qsub 5

(serial variant) or

qsub -pe mpi 4 5

the following things happen once the Job gets scheduled:

  1. it is ensured that version 1.5 of OpenFOAM gets used
  2. the template-case pitzDaily gets copied to a case (automatically)
  3. blockMesh is run on that case (by the script)
  4. the inlet velocity is set to 5 (by the script)
  5. if the case was submitted in parallel then it is decomposed (using the Metis-algorithm) - automatically
  6. the case is run
  7. if it was run in parallel it is reconstructed (automatically)

Apart from the setup-method the SolverJob-class has a number of other hooks that allow to manipulate the case before/after decomposition/reconstruction

A script can be tested on the local machine using 5

or in parallel --proc=4 5

The tester-utility does not need the SGE (SunGridEngine)

6.1 Preparation of a user account on the SGE

For the Cluster to be able to find the PyFoam-stuff a user has to create a file .sge_request with the contents

-v PYTHONPATH=/home/common/python

(assuming that the PyFoam-library resides in a directory /home/common/python/PyFoam that is reachable from all cluster nodes)

7 Technical notes/known problems

This is a list of the currently known problems. If you find any other bugs (also known as "surprising features") don't hesitate to contact the author

  • if a run-fails the error message might be "eaten" by the utility controlling it. I'm working on this
  • the only MPI-environment I currently have available is OpenMPI. The pyFoam-Libraries used to work with LAM (still should, but I can not test it). If you have problems, please contact me (also "success-stories": "it works with MPIch" are most welcome)

7.1 Bug reporting

Bugs can be reported on the Bug-Tracker at

In reporting a bug, it can be useful to add the information given by the utility

8 Additional stuff

Since Version 0.2 the distribution contains the (Since 0.2.4 the benchmark suite is stable enough to be used by the public). From version 0.3.0 on it can be used as

9 Other topics

9.1 Plotting with customRegexp-files

The utilities that do the plotting of time-graphs ( and automatically plot user defined quantities if they find a file customRegexp in the case directory. Since Version 0.4.3 this file may have a more complicated syntax. One line of the file may for instance look like this (connaisseurs will recognize a Python-dictionary):

{"expr":"Reaction Speed: (%f%) min (%f%) max","name":"Reaction speed","titles":["min","max"]}

If the output of the solver has lines that look like this

Reaction Speed: -0.43 min 0.23 max

a plot with the name "Reaction speed" and two data sets ("min" and "max") will be created.

The fields in the dictionary are:

This is a regular expression that is looked for in the output of the solver. The string %t% is shorthand for a more complicated expression that fits any real number. Any Regexp-Groups (the stuff between "()") is used as data for plotting. Please note that regular expression need some getting used to. One extra character can completely change the meaning of an expression and cause the expression to fail
The title of the plot
The "legend" of the data lines found during fitting. These names are used in the order in which they are found in the Regexp

9.1.1 New format

Starting with version 0.5.3 a new format for the customRegexp is introduced. It basically looks like a OF-dictionary where each plot is specified by a separate sub-dictionary. The above custom plot can be written as

  expr "Reaction Speed: (%f%) min (%f%) max";
  name Custom01_Reaction_speed;
  theTitle "Custom 1 - Reaction speed";
  type regular;

customRegexp-files in the old format are still recognized and can be dumped in the new format using the --dump-custom-regegexp-option

It is possible to let the titles be determined by the regular expression (idNr identifies the sub-expression that is the name):

  expr "Value of species (.+) is (%f%)";
  theTitle "Don't know how many species we have";
  type dynamic;
  idNr 1;
  with steps;

Instead of plotting data can be appended to a different plot (and will be plotted there):

  expr "Average reaction speed (%f%)";
  titles ( avg );
  type slave;
  master ReactionSpeed;

9.1.2 Information on regular expressions

If a line contains a special character, one must indicate that for the parser just like in case of a regular expression. Solver output with multiple parentheses and square brackets:

Integral of U = (-0.05 0.02 0.05) [0 4 -1 0 0 0 0]

The matching expression:

expr "Integral of U = \((%f%) (%f%) (%f%)\) \[0 4 -1 0 0 0 0\]";

If in trouble, some nice summaries about regular expressions can be found with this search.

9.2 Settings

Several aspects of pyFoam can be modified using settings-files

The current settings can be viewed with the They are output in the format that is needed in pyfoamrc (so you can paste them in there and modify them) (BTW: the format is basically similar to the INI-files in Windows ca. 3.XX - in the days before the registry. It's primitive, but it's sufficient for our purposes)

The precedence of settings is:

  1. Hardcoded in the PyFoam-sources
  2. Systemwide in /etc/pyfoamrc
  3. User-specific in ~/.pyFoam/pyfoamrc

Highest number wins

Settings can be overwritten for specific OF versions by adding new sections that are of the format MPI-1.7 for instance (entries in that section would overwrite the settings in MPI if the used version of OpenFOAM starts with 1.7 (1.7.x, 1.7 etc)

9.2.1 Modifying the call to mpirun

Different MPI-implementations and sites may need different options to mpirun.

The section of variables that is relevant to this is

options_openmpi_post: ["-x","LD_LIBRARY_PATH","-x","WM_PROJECT_DIR","-x","FOAM_MPI_LIBBIN","-x","MPI_B UFFER_SIZE"]
options_openmpi_pre: ["--mca","pls_rsh_agent","rsh"]

The _pre-option is the command-line arguments that are added to the mpirun command-line BEFRORE the -np/-machinefie argument the _post-option is for stuff that comes afterward (but before the actual OpenFOAM-command)

The middle-part of the variable name depends on the value of the $WM_MPILIB-variable. So for LAM this would be options_lam_pre/post.

9.3 Version control support

PyFoam adds some facilities to work with cases under version control. The advantage of this is that changes to a case are recorded when experimenting with a case (when using a Distributed VCS this also has some interesting applications for cloning/branching/merging cases). The disadvantage is that huge amounts of disc space are wasted if this is used unwisely.

Currently only support for mercurial is implemented (it was the natural choice as it is mainly implemented in Python). The implementation is generic enough to support other VCS but some low-level support has to be added

The case is initialized for VCS with the This initializes the VCS-repository and adds the most important stuff in the case (the directories 0, constant and system. After that further files can be added using the usual commands of the used VCS. Options of the runner-utilities allow "commit before running"

The contrib-folder of the distribution contains a Mercurial-extension foamdiff. When this extension is installed a command like

hg foamdiff -r 23 system/controlDict

compares different revisions of a file not for textual differences but for semantic differences (using the same mechanisms that uses)

10 paraFoam/paraview 'support'

If you have an installation of paraview that is 'Python-enabled' and PyFoam is found on the PYTHON_PATH then PyFoam can be used in the 'Programmable Filter'/'Programmable Source' of paraview by importing it as usual

import PyFoam

This is especially useful for data that was written by OpenFOAM but is not recognized by the regular importer. It can be loaded as usual with the ParsedParameterFile-class

Please note:

  • To visualize the data you need to know how to program VTK
  • Be aware, that due to the very general parser of PyFoam large datasets might consume huge amounts of memory and time during loading

10.1 Displaying the gravitation direction

10.1.1 As a Programmable Source

This little example displays the gravitation vector as a line. Just use it as a Programmable Source. It assumes that paraFoam was called in the case directory (otherwise casepath has to be modified)

from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile
from PyFoam.Paraview import caseDirectory
from os import path
import paraview
pdo.InsertNextCell(line.GetCellType(), line.GetPointIds())

Using the timeDirectory()-function you can program similar Programmable Filters for data that is stored in the time directories

10.1.2 As a script

An alternative is running this script via "Tools -> Python Shell":

from PyFoam.Paraview import readerObject,caseDirectory
from PyFoam.Paraview.SimpleSources import Glyph,Arrow
from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile
from os import path
# gly=Glyph("Gravity",ro.getCenter(),ro.getCenter()+0.5*g*abs(ro.getExtent())/abs(g))

10.2 Other example scripts

Can be found in the examples/paraview3-directory of the release. These are:

Displays the most important feature of a snappyHexMeshDict including the bounding-box and the STL-files
displays the probes specified in system/controlDict

These Utilities are quite useful to find mistakes when setting up these files

10.3 General Remarks on the Programming

PyFoam takes care of some of the things described in this document when creating a new object. The two aspects of the object are accessible as

the actual VTK-object
its paraview representation

You can access their properties as described in the document

There are still some issues with the deletion of these objects

  • sometimes they are still visible but not deleted
  • sometimes paraview crashes after deleting them using the "Delete"-button on the GUI

but your milage may vary

All this has been tested with ParaView 3.4 and may not work with other versions as the Python-API of paraview seems to be in flux

10.4 Necessary changes in the OF-installation to use the paraview-stuff

The etc/apps/paraview3/bashrc must be extended to extend the Python-PATH:

if [ "$PYTHONPATH" ]; then
    export PYTHONPATH=$PYTHONPATH:$ParaView_DIR/Utilities/VTKPythonWrapping
    export PYTHONPATH=$ParaView_DIR/Utilities/VTKPythonWrapping
export PYTHONPATH=$ParaView_DIR/lib/paraview-3.3/:$PYTHONPATH
# export PYTHONPATH=$ParaView_DIR/lib/paraview-3.4/:$PYTHONPATH

For the Version 3.3-cvs that is distributed with 1.5 a little bug has to be fixed: look for the file ~/OpenFOAM/ThirdParty/ParaView3.3-cvs/platforms/linuxGcc/Utilities/VTKPythonWrapping/paraview/ and there change the line 1110 from




11 Other OpenFOAM-related Python libraries

PyFoam can't do everything (and it doesn't even try) but there are other efforts that help to use OpenFOAM programmed in Python

11.1 pythonFlu

pythonFlu is a wrapper to OpenFOAM that allows the programming of top-level solvers in Python (and I'm sure there will be other great applications that can't be easily done otherwise). More information can be found on the official pythonFlu website.


12.1 Subversion

The current version can also be fetched using the command

svn co

This is the current stable version plus

  • Bugfixes
  • User contributions

not the development version. User contributions will be considered for inclusion in the next stable version

12.1.1 Updating existing working copies

If you downloaded this repository before January 2013 and want to keep this working copy see this article on information how to switch it to the new link.

12.2 Python Package Index

The latest released version is available via the Python Package Index

12.3 Current version (0.6.6)

12.4 Current version (0.6.5)

12.5 Previous version (0.6.4)

12.6 Previous version (0.6.3)

12.7 Previous version (0.6.2)

12.8 Previous version (0.6.1)

12.9 Previous version (0.6.0)

12.10 Previous version (0.5.7)

12.11 Previous version (0.5.6)

12.12 Previous version (0.5.5)

12.13 Previous version (0.5.4)

12.14 Previous version (0.5.3)

12.15 Previous version (0.5.2)

12.16 Previous version (0.5.1)

12.17 Previous version (0.5.0)

12.18 Previous version (0.4.3)

12.18.1 Buggy version (0.4.2)

From this version the Gnuplot-package was missing. Forget it

12.19 Ancient history

12.20 Previous version (

12.21 Previous version (0.4.1)

12.21.1 Previous version (0.4.0)

There were no complaints about this version

12.21.2 Very old versions

13 History

  • 2005-08-15: Version 0.1
  • 2006-01-13: Version 0.2
  • 2006-01-16: Version 0.2.1
  • 2006-01-16: Version 0.2.2
  • 2006-01-23: Version 0.2.3
  • 2006-01-23: Version 0.2.4
  • 2006-02-03: Version 0.2.5
    • Improves the stability of the benchmark-script for parallel runs
    • adds benchmakr suite for ancient versions of OpenFOAM
  • 2006-02-03: Version 0.2.6
    • Minor changes to the benchmark-scripts (other cases than the tutorial cases can now be used for benching)
  • 2006-02-23: Version 0.3.0
    • live plotting of residuals of solvers
    • benchmark script moved to bin-directory
  • 2006-03-22: Version 0.3.1
    • BugFix: Plotting residuals in interFoam did not work
    • Extending the Resiudals-Plotting (Courant-Numbers etc)
    • Parsing of Dictionary-files into Python-Dictionaries (not yet fully tested)
  • 2006-03-22: Version 0.3.2
    • Plotting resiudals now works with OpenFOAM 1.3
  • 2006-10-18: Version 0.3.3
    • pyFoam distinguishes between the used MPI-implementations when starting parallel runs (currently LAM and OpenMPI)
    • BugFixes
    • added Utility pyFoamAddEmptyBoundary
  • 2006-11-29: Version 0.3.4
    • An error pointed out by Andrea Rimondi: the last version was incomplete. Due to a code reorganisation and missing files in the distribution half of the scripts in bin stopped working, but apart from Andrea everyone was too polite to mention it
    • added Utility
  • 2007-03-29: Version 0.4.0
    • Reimplementation of the parsing of OpenFOAM-Dictionaries
      • Can be manipulated like regular Python-Data-Structures
    • Extension of the plotting-Utilities: arbitrary expressions are possible
      • The data can also be written to the disk
    • Runs that are started by pyFoam can be accessed and controlled over the network (using XMLRPC)
    • The runner-Utilities can start parallel-runs
      • A utility for generating a dictionary and decomposing a case is added
    • Bug removed that didn't let work properly with OpenFOAM 1.3 (due to changes in the solver output)
  • 2007-08-29: Version 0.4.1
    • Debugging and stabilizing of the parsed OpenFOAM-Dictionaries
      • Changes in semantics: numbers are converted to numbers (not strings as before)
      • Can read and write gnuzipped files
      • More elegant access of the data
      • Order of entries in dictionaries is preserved, if possible
    • Gnuplot-library enclosed in distribution (to ease installation)
    • Enhancement of utilities
      • Runner-utilities can choose the Foam-version that should be used
      • Plot-Runner automaticaly loads regular expressions for a case
      • pyFoamBench now writes CSV-files which can be loaded into a spreadsheet-program
      • other stuff
    • New utilities
      • Creation of boundary conditions
      • Cloning and packing cases
      • VTK-based utility to display blockMeshes
      • Specialized runner for mesh utilities
    • Implementation of Unit-Tests for base classes to ensure stability
    • Other changes I can't remember
  • 2007-11-24: Version 0.4.2
    • A framework to run jobs on a Rocks-cluster was implemented
    • Support for cases that have more than one mesh-region (in the library and the utilities)
    • Changes in the Library
      • the Application-classes have been changed, so that they can be called from other scripts
      • the OpenFOAM-version can be changed for the called applications
      • Extension of the Parser (Tensors etc)
      • Updated Parser Ply to newest version 2.3
      • A symbolic link controlDict.foam is automaticaly created (for the Paraview3.x-reader)
      • is adapted to use either numpy or Numeric (whatever is available)
      • mpirun can now have configurable parameters
    • Changes in Utilities
      • the Runner-Utilities now have a --restart-option
      • All Utilities that start an OpenFOAM-application now can select the OF-Version with a --foam-version-option
      • Possibility to temporarily lower the relaxation factors for steady runs
      • Runner-Utilities can report memory usage
      • Clone-Case is now securer
    • New Utilities
      • Dump the current configuration file for the PyFoam-installation
      • Execute a command specifying a OpenFOAM-Version
      • Generate a dictionary from a template file
      • Updates a dictionary from another by adding/removing entries that are not in both
      • Compares two dictionieries structurally (not textually)
      • Test pyFoam-Scripts before submitting them to the cluster
    • Semantic changes
      • Counting of linear iterations now accumulates over various solutions during the same timestep (different numbers in Plots!!)
    • Removed Bugs: many
  • 2007-12-04: Uploaded a bugfix version (Missing Gnuplot-library)
  • 2008-04-21: Version 0.4.3
    • Changes in the Library
      • Faster parsing of long lists
      • Parsing works with unicode
      • Better handling of solution-directories
    • Changes in Utilities
      • Logfiles are now created using the name of the application
      • Various extensions of the Comparator-Utility (CSV-files etc)
      • Advanced syntax for the customRegexp-files
    • New Utilities
      • Copy last timestep to another case (as initial condition)
      • Runs potentialFoam on a case (leaving everything else unchanged)
      • Generates graphs from data generated by the sampe-Utility
      • Resets the whole internal field to one value
      • Information about a case (table of boundary conditions)
    • includes new Version 1.8 of the Gnuplot-Library
    • Removed Bugs: all that were reported (and some more)
  • 2008-09-09: Version 0.5.0
    • This version detects whether a OF-1.5 or previous is used and acts according to the convention for utilities in that version
      • the --foamVersion-option of the utilities is also aware of switches that change the convention
    • Plot utilities do Postscript-Hardcopies if requested
    • CaseReporter now also reports data about the decomposition
    • Other extension of the CaseReporter
    • Added an option to the runner-utils that temporarily disabel libs and functions in the cointrolDict (for incompatible utilities)
    • Parser extended to handle special dictionary files (files without headers. Chemical reactions)
    • added
    • Various bugfixes (especially in the parser)
  • 2008-10-30: Version 0.5.1
    • Moved common functionality of the application to common classes
    • Options get grouped in the online-help
    • Parser is aware of include and parameter substitution
    • Profiling of applications enabled
    • Example for a Paraview-Source added
    • Error with 1.5 and MultiRegion-cases fixed
    • Parser fixed so that it can work with patch-names that are generated by snappyHexMesh
    • CaseBuiilder-functionality added
      • Small TUI added as a demo
    • Parser is now Version 2.5 of PLY (20% speed improvement)
    • Bug in the potentialRunner-application fixed
  • 2009-03-12: Version 0.5.2
    • Uses color on the terminal to format the output of certain utilities ( etc)
      • Can be configured
    • User can be selected for pyFoamNetList
    • Log-File can be surpressed
    • The XMLRPC-server is more tolerant if the port is already in use
    • Removed incompatibility with python 2.6 (clashes with the with-keyword)
      • 2.6 now complains about deprecated Libraries
    • CaseBuilder allows the grouping of arguments
    • Extended support for Paraview 3.4
      • Easy creation of graphics primitives (Spheres, Glyphs etc)
      • Automatically finds the case-directory of an OpenFOAM-case loaded in paraFoam
    • Allows to chose whether symlinks will be followed when cloning a case
    • Added and
    • Vector-class for vector-objects read during case-parsing (allows vector-arithmetics)
    • Repaired
    • added
    • added
    • switch of the usage of the XMLRPC-server for certain utilities
    • extension of
    • Enhancements of the dictionary parser
      • tries to preserve comments when writing the results to disk
      • is now based on PLY 3.1
    • the plot-utilities can accumulate in different ways if a match is found multiple times per timestep
      • Display of data for cases with >>2000 time-steps is improved (better downsampling)
    • now can make hardcopies of the graphs
      • format of the hard-copies can be choosen
  • 2009-11-10: Version 0.5.3
    • General new stuff
      • Support for the regular-expressions that come with 1.6
      • Matplotlib can be used as an additional backend for plotting (this is beta-quality)
      • improved format for the customRegexp that looks more 'FOAMlike'. Old files can be dumped in the new format using the --dump-option of the PlotWatcher
      • two new plot types in the customRegexp ('dynamic' for getting the data names from the regular expression and 'slave' to add data to another plot instead of plotting itself)
    • Additional utilities
      • GGI-script by Martin Beaudoin
      • after an idea by waterboy (MessageBoard-name)
    • Bugfixes
      • Amount of files opened by FileCollection is limited (won't hit the OS-limit on the number of open files
      • Fixed a hang at the end of a run that occured if no meta-server was present
      • FoamServer reports actual IP (not
    • Changes
      • Additional parameter to the Decomposer-script (Martin Beaudoin)
      • Decomposer-script now recognizes scotch as a valid decompositon method and uses it as a default when used with OF-1.6
      • Plotter-Utilities write data to file
      • Added general options --force-debug --force-opt --force-32 --force-64 to switch to a specific subversion of OF
      • Changes that concern the network-infrastructure
      • Mesh can be excluded for the Pack-script
      • more stable method to handle temporary changes to the controlDict
      • for-loops over a PArsedParameter-file are possible
      • unit-tests work with the new tutorial-structure in 1.6
      • upgraded parser to PLY 3.2
      • Created files can be forced to gz
      • Various upgrades to the ParsedParameterFile-family
      • Utilities write a history to the case-directory
      • further adaptions for Python2.6
      • Watcher can read compressed logfiles
      • Written logs can be compressed on-the-fly
      • Clone works with cases that don't have a time-step
      • zsh is recognized (for switching OF-versions)
    • Known limitations
      • Currently does not work with Paraview 3.6 (which comes with OF 1.6)
  • 2010-06-11: Version 0.5.4
    • Utilities
      • DisplayBlockmesh now converted to PyQT4.
        • Major enhancements (built-in editor)
        • If no PyQT4 found the old Tkinter-version will be used
      • PlotWatcher can be stopped on a file that is no longer updated (Mantis Bug #8)
      • Decomposer can treat regions separatly
      • Decomposer can be called directly in the case-directory
      • Runners can now switch on purgeWrite
      • RedoPlot adds titles
      • PotentialRunner works with 1.6
      • Enhancments to the CaseReporter
        • Writes to files
        • Report on linear solvers and relaxation
      • New utility: to generate images from suface-samples
      • New utility: that plots timelines that were generated by functionObjects. Also can plot Bar-plots
      • New utility: to plot timelines from running processes (requires a server-process - for instance one started by pyFoamRunner) and pickled data from finished runs
      • ClearCase tries to remove data from functionObjects, too
      • SamplePlot can now write the Gnuplot-commands to a file
    • Library
      • General application-class for PyQT4-classes
      • TimeLineAnalyzer is more tolerant
      • TemplateFile now shows the expression that gives a problem
      • numpy now preferred to Numeric
      • Pickle-file with the plot-data is written
      • Race condition with the pickle-file avoided
      • Configuration can now overwrite parameters depending on the OF-version
      • Configuration now allows directories with configuration snipplets (profile.d-style)
      • local configuration in a case-directory possible
      • Regular expression for "Time =" can now be configured
      • Paraview-stuff now accepts the native reader
      • SolutionDirectory automatically creates a .foam-stub-file for the native reader
      • FoamInformation more tolerant if no OF-installation is found
    • Packaging
      • Basic framework for debian-packaging is there (only in SVN)

... and a number of other enhancements

  • 2011-04-06 Version 0.5.5
    • Utilities
      • CaseReporter now generates restructured text (this allows easy generation of PDFs and HTML using the right tools)
      • CaseReporter can now work with regions
      • Paraview-Utilities now know th native reader in Paraview 3.8
      • PyFoamChangeBoundaryName by Martin Beaudoin added
      • CloneCase now knows how to handle parallel runs
      • SamplePlot and TimelinePlot now can plot reference data
      • In the Runners the writing of data files now MUST be switched on
      • ListCases reports the state-files written by BasicRunner (if present)
      • ListCases has additional reporting options
      • CompareDictionary can now compare more than one dictionary at once
      • Option --autosense for the Runner-utilities now automatically determines the number of processors to use
      • SamplePlot, TimelinePlot and RedoPlot now can write CSV-Files
      • PyQT-variant of 'A Poor Mans FoamX' added to the distro
      • Decomposer now can handle parMetis
      • Utility added
      • --current uses the current OF-version (when switching to Debug) in all utilties that support version-switching
      • CloneCase now uses the VCS for cloning if the case is under version control
      • TimelinePlot now allows the usage of the time of the reference data for scaling
      • TimelinePlot and SamplePlot now can compare the data to the reference data quantitatively
      • Utility JoinCSV to join different CSV-files (resamples data if needed)
      • Runner-Utilites now can commit if the case is under VCS
      • Utility ConvertToCSV added
      • RunAtMultipleTimes now also works for parallel cases
    • customRegexp
      • New entry progress now allows addition of custom values to the progress output of runners (for instance "h: $0" for addition of the first value found)
      • Plots now can be selected from the command line
      • All Utilities have an option to switch on/off the stack-trace in the event of an error
    • Library
      • Gnuplot-Library bumped to 1.8
      • PLY updated to 3.3
      • Improved handling of Macros in the Dictionary Parser
      • Paraview-Sublibrary adapted to Paraview 3.8
      • Unittests now can be done using the nose-library
      • BasicRunner now writes some state-files
      • New SpreadsheetData-class generalizes the handling of data that will go into CSV-files
      • Enhancements to the CaseBuilder-backend
      • error-function now throws an Exception (this allows graceful error-handling)
      • Parser now knows that he can't handle binary files
    • Bugfixes
      • WriteDictionary now can write negative values
      • BlockMeshes without edges not correctly parsed
      • If more than one triggered restore was accessing the file it was not correctly restored
    • Other enhancements
      • In the configuration files features can be switched depening on the version. For instance the section MPI-1.7 overrides everything specified in MPI if the OpenFOAM-version starts with 1.7
      • File LocalConfigPyFoam in a case can be used to override the global settings for this case
      • Automatic reconstruction can be switched off for ClusterJobs
      • ClusterJobs can now also live with alread reconstructed Jobs
      • Addition of a Mercurial-extension foamdiff that can show changes between revisions like CompareDictionary does
      • Installed OpenFOAM-versions now can be looked for in more than one directory
  • 2011-07-26 Version 0.5.6
    • Changes to the parser
      • Now can parse the codestreams introduced in OpenFOAM 2.0
      • ParsedBlockMeshDict understands the new format
    • Utilities
      • and to automatically upgrade selected dictionaries (fvSolution, blockMeshDict, thermoPhysicalProperties) to new formats
    • Internal changes
      • Direct calls to shell commands for copying and removing files now replaced by Python-library calls
    • Bugfixes
      • pyFoamCaseReporter can now handle all known formats of fvSolution/solvers
      • Fixed a problem where the Library was still using the old OF-calling convention when starting parallel runs
    • Mercurial extension foamdiff
      • Now works with Mercurial 1.9 (new version untested with older Mercurial-version)
  • 2012-04-13 Version 0.5.7
    • Parser improvements
      • Problem with nested comments
      • Parse code streams
      • Preserving of comments can be switched off
      • Ignore extra semicolons
      • Allows parsing lists of length 3 and 9 as lists and not as vectors and tensors
      • "lookup redirection" in OF-dictionaries now works
    • Utility improvements
      • stops if the same directory is compared
      • shows the location of the biggest difference
      • allows only same ranges for comparisons
      • Generation of pickled-files can be switched of for runner-utilities
      • Frequency with which the pickled file is written is adapted (so that it doesn't use ALL the CPU-time)
      • improved (Version of Python is checked etc)
      • fixed parameter checking
      • temporarily disable libs and functions
      • Only write last N loglines from Runner-utility
      • allow local specification of additional files that should be cleared
      • Runner utilities can report data about the run
      • now allows selection of columns
      • Utilities for quantative analysis now can return data
      • Utilities for quantative now correctly return data for multiple places
      • now allows specification of valid variable pre and postfixes to allow correct parsing of variable names with a _
      • endTime can be specified by the runner-utilities
      • Utilities now allow piping (using pickled data)
      • now allows the specification of a reference time
      • Nomenclature of and now similar (both call it fields)
      • now can use the -region-option if the OF-version is right
      • Forcing debug-mode fixed for older OF-versions
      • now accepts globalFaceZones in Python or OpenFOAM-syntax
      • Plot-utilities now don't interpret _ in names not as LaTeX
    • New Utilities
      • pyFoamEchoPickledApplicationData to output pickled data
      • to output data from comparisons
      • to build project and its prerequisites (work in progress)
      • to create files for (by Martin Beaudoin)
      • to join STL-files
    • Library improvements
      • stabler comparisons
      • Paraview-Utilities work with 1.x and 2.x
      • Runner classes return a dictionary with data
      • TimelineDirectory ignores dot-files
      • Application-objects can now be used like dictionaries to access data
      • New class TableData for simple data tables
      • New class Data2DStatistics for statistics about tables
      • new class CTestRun as basis for automated testing
      • FoamOptionParser now resets environment variables so that application-classes can call other application classes
      • Improvements to HgInterface
      • Additional VCS-subclasses for git, svn and svk (implementation only as needed)
      • SolutionDir now uses as initial directory if no valid initial directory is present (this affects clearing and cloning)
      • FoamFileGenerator now more flexible for long lists
      • ParsedBlockMeshDict now doesn't introduce prefixes for 'long' lists
    • Removed utilities
    • Thirdparty
      • Got rid of Numeric-support in Gnuplot-library
    • Other
      • script to generate man-pages for the utilities
      • Paraview3-example now renamed to and reads sampledSets from controlDict and sampleDict

13.1 Version 0.6.0 - Release 2013-03-14

13.1.1 Major changes Adaption to work with Python3

Sources are adapted so that PyFoam works with Python3 too. This breaks support for Python 2.4 and earlier (possibly also Python 2.5)

Some of the Libraries in PyFoam.ThirdParty had to be adapted to work with Python3:
The original version 1.8 is quite old. It was adapted with the help of the six-library (see below) to work with Python2 and Python3 (inspired by [2] which is a pure port to Python3 without backwards compatibility) New ThirdParty-Libraries
Library that helps supporting Python 2 and Python 3 in the same source code. Currently version 1.2 from [3] is used
Templating library to support the new templating format. Version 0.2.0 from [4] is used Porting to Windows

Port to allow running PyFoam on Windows was done by Bruno Santos of blueCAPE (

Patch was originally posted at

Note: many of PyFoam's features are not yet fully functional on Windows. Experimental port to pypy

Sources are executed in pypy but it seems there are problems with numpy and also with code like for l in open(f).readlines()

13.1.2 Third-Party Upgraded ply to 3.4

This brings virtually no changes. README with copyright information has been added

13.1.3 Infrastructure Parameters can't be modified in CTestRun after initialization

This should help to avoid side-effects Treat timeouts in the MetaServer right

Due to a previous workaround timeouts when collecting information about new machines was not treated correctly Add execute-method to ClusterJob

This allows the execution of a shell-script in the directory of the case Add possibility to run specific modules before or after the solver

These modules are found in PyFoam.Infrastructure.RunHooks. Two concrete implementations:

to print a text to the terminal
encode an URL and send it to a webservice (example for added)

Hooks are automatically instantiated from the configuration data (examples are hardcoded)) Parameters added to the info about the run

The Runner-classes now have a parameter parameters. This data (usually it would be a dictionary) is added verbatim to the run info.

Most runner applications now have the possibility to add this info.

Purpose of this facility is to identify different runs in the database better. Parameter handling in ClusterJob extended

Parameter values are now handed to the actual job. Also a dictionary with parameters can be handed to the constructor and will be used in the relevant callbacks Run data written alongside PickledPlots

During the run whenever the PickledPlots-file is written a file pickledUnfinishedData gets written. This has the current solver data and is similar to pickledData.

Also a file pickledStartData gets written that has the data that is available at the start of the run. BasicRunner collects error and warning texts

The runner collects

  • at every warning the next 20 lines of the output until a total of 500 lines is reached (this avoids filling disk and memory if the solver produces too many warnings)
  • All output from an error message until the end

And stores them in the application data

13.1.4 Library TemplateFile now uses pyratemp

The class TempalteFile now uses an enhanced templating engine. The old implementation is in the class TemplateFileOldFormat Clearer error message in Application-classes

If used as classes (not as utilities) these classes print the class name instead of the calling utilities name Output is only colored if it goes to the terminal

Error and warning messages don't decorate the output if it goes to files or other non-terminal streams error-method of application classes now raises an exception

An exception is now raised by self.error(). This makes it easier to handle such errors if the application class is used. The exception is passed up until there is a "real" application ParsedParameterFile now knows how to handle binary files

When the format of a file is binary lists with a length prefix are being read as binary blobs.

For reading the blobs a simple heuristics is used: a multiple of the length in bytes is read. If the next character is a ) and the characters after that are a certain combination of characters (newlines and ;) then it is assumed that the blob has ended. This may fail on certain occasions:

  • if the combination of characters appears at these places
  • if the objects inside the binary data are of different sizes

It would be hard to work around these restrictions without reprogramming the full functionality of OpenFOAM LabledReSTTable for more flexible table generation

New class in the RestructuredTextHelper allows more flexible generation of tables. Items are added with column and row and if these don't exist in the first row/column the table is extended appropriately Plotting classes now allow setting of xlabel

This is implemented for Gnuplot and Matplotlib. Default for the label on the x-Axis is now "Time [s]"

13.1.5 Utilities with new templating engine

The utility can now use the pyratemp-templating engine which allows templates with loops, conditions and other fancy stuff allows using the reference data as basis for comparison

Instead of using the x-values from the original data the y-values of the reference data can be used for comparing (with the --use-reference-option)

Same for Scaling and offsets are now used in plots of

If scales not equal to \(1\) and offsets not equal to \(0\) are specified they are used in the gnuplot-output prints relative average error

With the --relative-average-error-option Enhancements to
  • More tolerant if no library was found
  • Reports the location of the PyFoam-Library
  • Checks whether utility version is consistent the library found allows hooks

Hooks can be added at the start and the end of a run supports range for plots

Added -end and -start-option to select a range that should be plotted.

Currently not working with the Matplotlib-implementation (only gnuplot) no supports templates

If a file with values is specified then the utility assumes you're editing a template file and will evaluate it before displaying it is tolerant towards binary files

New switch that makes the parser treat files that are declared binary in the header as if they were ascii and raise error if no plots are generated

This makes it easier to catch faulty specifications (or empty timeline-files) can wait for a key

An option --wait has been added that makes the utility wait before displaying the next picture is more flexible with binary files

Switch allows forcing it to read a binary File as an ASCII All utilities now have a switch that starts the debugger even with syntax-errors

Previously the option --interactive-debug only started the debugger if the error was no syntax error. This is still the default behavior, but can be overruled Utilities now can be killed with USR1 and will give a traceback

The option --catch-USR1-signal now installs a signal-handler that prints a traceback and finishes the run. If the interactive debugger is enabled then it goes to the debugger-shell.

Option --keyboard-interrupt-trace triggers the same behaviour for keyboard interrupts with <Ctrl>-C Switch to switch on all debug options

For the purpose of developing a switch --i-am-a-developer has been added. Plotting utilities now allow specification of x-Axis label

With the option xlabel in the customRegexp-file the label on the x-axis of the plot can be changed. Setting ylabel and y2label (for the secondary axis) was already possible Metrics and compare for and support time ranges

Now the options --min-time and --max-time are supported by --metrics and --compare allows graphical selection of blocks and patches

New addition by Marc Immer allows the graphical selection of blocks and patches and adds them to the blockMeshDict and accept additional parameters

The file LocalConfigPyFoam is read by these utilities and if there is a parameter addItem in the section Cloning defined then these files are cloned/packed automatically (no user specification required) now calculates estimated end-times

Additional option to print the estimated end times. These can be wrong if the case did not start from the startTime in the controlDict.

Also now allows printing the end and the start-time according to the controlDict

13.1.6 New features Different "phases" for multi-region solvers

Plots of type phase in customRegexp don't actually plot anything. The set a phase-name that is used for subsequent values (for instance to distinguish the different residuals) allows selection of region and time

Options --region and --time-directory added that allow selecting different boundary-files New class for storing case data in a sqlite-database and associated utilities

The class RunDatabase stores the data from runs. Utility is one way to populate the database. allows dumping that data to a file for further processing (in a spreadsheet for instance)

Database can also be populated using a special post-run hook

13.1.7 Bugfixes Only binary packages of 1.x were found

Pattern had to start with 1 (now every digit is possible)) Option group Regular expressions was listed twice

No harm done. But fixed --clear-option for not working

Reason was that rmtree does not allow wildcards. Fixed not working with variable substitution

The DictRedirect would not convert to float. Fixed. Although it might happen again for other data types Option --function-object-data of not working with directories

The option was only implemented for the list-form of the functions entry in controlDict

Now fixed to also work with the dictionary-form nonuniform of length 0 not correctly printed

Seems like the length was interpreted as the name of the list. Fixed Building of pseudocases with broken

Only worked if no region was specified (= not at all). Fixed did not correctly honor --end and --start

Plots were over the whole data range. This is now fix (also the issue that --end alone did not work) WriteParameterFile does not preserve the order of additions

Contents was "only" set as a dictionary which does not preserve the order in which entries are added. Replaced with a DictProxy Wrong number of arguments when using TimelinePlot in positions-mode

Problem that was introduced by changes in the fields-mode ClusterJob uses only metis for decomposition

For OpenFOAM-versions 1.6 and higher the automatic decomposition used is now scotch and produced no pictures for regions

As regions have their own subdirectories the / from the directory name was inserted into the filename and if the subdirectory did not exist gnuplot did not create the picture Barplots in not working if value is a vector

The base class didn't correctly handle the ( and ). Fixed Mysterious deadlocks while plotting long logfiles

The problem was that during splitting the timeline data an exception was raised. This exception was caught by another part of PyFoam. This left a lock on the data structure locked and the next access to the structure was held indefinitely. Fixed Scanning linear expressions form the block coupled solver failed

As there is a tuple of residuals the scanner did not analyze the output of the output of the block-coupled solver from 1.6-ext correctly. This is now treated as a special case and each residual is plotted separately (distinguished by a [x] with x being the number of the component) #include not correctly working with macros in the included file

Macros $var were not correctly expanded. Fixed Macros not correctly expanded to strings

When being expanded to string form macros were not correctly expanded in the working directory produces 'invisible' tar

If the utility was used in the form .

then an 'invisible' tar ..tgz was produced. Fixed String at the end of a linear solver output makes parsing fail

Reported in [5] the string is assumed to be part of the iteration number. Fixed Paraview utilities not working with higher Paraview versions

At least for PV 3.14 and 3.98 the way the version number is determined has changed and the PV-utilities failed. This has been fixed but is untested with old versions Camera settings not honored with

For the first rendered view Paraview automatically resets the camera. This has now been switched off (so the snapshot is rendered correctly)

13.2 Version 0.6.1- Release 2013-05-24

13.2.1 Bugfixes Restoring of controlDict after write

When activating an on-demand write the constrolDict was not restored because the output-line about the file being read was not recognized (due to a change in the output in recent OF-versions). Now a number of different formats is recognized Custom-plot type slave not working if no master defined

That plot-type needs a master. Fixed to fail if none is defined -list-only did not correctly parse lists with a numeric prefix

This did affect all utilities that use that option and also calls with listOnly to the library class

13.2.2 Utilities now allow more than one action

If multiple actions like --update and --build are specified they are executed in a sensible order (update before build etc) Utilities warn if OpenFOAM-version is unset

If the environment variable that determines the OpenFOAM-version is unset a warning is issued by the utilities allows single files

If single file is specified then the action to transform it has can be specified transforms reaction-schemes

Now knows how to transform "old" reaction files (where the reactions-entry was a list) to the new format (where it is a dictionary). Only a limited number of reaction types is supported. transforms thermophysical data

Now the old form of thermophysical data (lists) is transformed into the new dictionary-form pyFoamCloneCase now allows creating directory that symlinks to the original

Now with the option --symlink-mode instead of copying the directories from the original new directories art created and populated with symlinks to the files in the original. The depth until which no symlinks to directories are created can be specified. This allows the clone to share the configuration files with the original now removes postProcessing and allows removal of additional files

The directory postProcessing is now automatically removed (can be switched off with --keep-postprocessing). Also with the --additional-option patterns with additional files to remove can be specified. Improvements to
  • Now reports the location of the python-executable
  • Reports locations of used libraries Additional files automatically cloned

The files Allrun, Allclean and are automatically added during cloning as these are often used by the standard-utilities uses the same options for template format as

This makes sure that templates are handled consistently and also allows different delimiters in the blockMeshDict.template

13.2.3 Library Improvements in syntax of ParsedParameterFile

Now the new relative scoping that was introduced in OF 2.2 is supported Utilities-class now function to find files matching a pattern

Added a function find that approxiamtes the find-command VCS ignores more files

Some more patterns have been added that will be ignored in a VSC-controlled case. All of them concerning files that PyFoam creates during operation

13.2.4 New features/Utilities New Utility

This utility replaces a symlink with a copy of the file/directories it points to. To be used after a in --symlink-mode

13.3 Version 0.6.2 - 2013-11-03

13.3.1 Major changes Use of pandas-library

Starting with this version the pandas-library is used fordata-analysis. When possible and appropriate classes returnpandas-objects. Currently these are:* CSVCollection. With a call-operator this class returns the collected data as a DataFrame of the collected data* SpreadsheetData now has methods to return Series and DataFrame objectsIt is not necessary to install pandas if these classes are notused (and even then most of their functionality works)

13.3.2 Incompatibilities Different separator for databases in CSV-files

The class RunDatabase (and therefor also the now write as a separator for datafrom sub-tables a // instead of the space. This especially meansthat scripts that rely on a data-item foo in analyzed mightbreak because this is now called analyzed//foo instead of=analyzed foo=. On the other hand this makes the names moreconsistent and easier to parse as // is the saperator for otherlevels of dictionaries Change of independent variable name in sample data

Instead of col0 this is now coord. This could cause problemswith scripts that use that column name in the resultingSpreadsheetData-object

13.3.3 Bugfixes does not handle symbolic links correctly

Symbolic links were copied as is and did not work correctlyafterwards. This is fixed. If the symbolic link is an absolutepath or points outside the case directory it is replaced with thefile it points to. Otherwise it is preserved as a symbolic link not working with OpenFOAM 2.0 or newer

These versions require an entry potentialFlow in thefvSolution-file instead of the old SIMPLE fails with controlDict that use preprocessing

Fixed by first trying to read that with preprocessing. Without ifthat fails Cloning fails in symlink-mode if files are specified twice

Now using a set instead of a list makes sure that no file iscloned twice

13.3.4 Utilities now allows removing of functions and libs

The utility now allows removing these entries in case that theydon't work with potentialFoam The Runner-utilities now have more options for clearing

Some of the options of for clearing cases(for instance specifying additional files) have been ported to theRunner-utilities. Also is the postProcessing-directoryremoved by default

13.3.5 Library SolutionDirectory and TimeDirectory are more tolerant

If there are field files and their zipped counterpart thaninstead of an error a warning *can* be given ClusterJob now handles template files

A new method templateFile gets the name of a file which isconstructed from a template of the same name plus the extension.template Additional parameters in ClusterJob

The method additionalParameters can return a dictionary withadditional parameters Custom data in directory easier accessible

In the written data in the sub-dictionary analyzed there is nowa subdictionary Custom with the values of the custom expressionswith the prefix CustomXX_ removed. This means that values thatwere available as data['Custom02_velCheck']['min']are now available as data['Custom']['velCheck']['min']The advantage is that the number part which was dependent on theorder the expressions were specified is now no longer necessary(this should make scripts more stable)The old notation is still available but deprecated SolverJob now allows compression of output

The parameter solverLogCompress compresses the log-file whilewriting it to disc. *Attention:* This may lead to corruptedlog-files if the run crashes PyFoamApplication-class now allows quick access to data

The dictionary returned by getData() now allows access to allthe elements as attributes.

13.3.6 New features/Utilities Post-run hook that sends mail at the end of run

The hook-module MailToAddress sends a mail at the end of arun. Prerequisite is an SMTP-Server that doesn't needauthentication New utility

This utility goes through cases and compresses single files. Thecases can be searched recursively to.Purpose of this utility is to shrink cases wherewriteCompression was not turned on during the run Paraview-module to read additional data

A new module PyFoam.Paraview.Data reads additional data usuallywritten by OpenFOAM. These are converted to vtkArray using thefollowing functions and can be used in =Programmable filters=:- setSampleData :: reads the data from sampled sets- setTimelineData :: reads data from a timeline directory- setPlotData :: reads pickled plot data using RedoPlot

13.3.7 Enhancements can plot in XKCD-mode

When used with the option --implementationxkcd= and version ofmatplotlib that supports it is installed then plots are done inthe style of the webcomics [[6]] now displays disk usage in human readable form

If the disk usage of the cases is calculated then it is displayedin human readable form (as KB, MB, GB or TB) for sizes larger thanone Kilobyte more flexible in selection of data to be removed

Options to be more flexible in removing data are added:; keep-interval : keep timesteps at a specified interval. For instance --keep-interval0.1= will keep times like $1$, $1.1$ etc but remove $1.05$; keep-parallel : this will not remove any times in the processor-directories. Also are things like keep-last now honored for processor directories; remove-analyzed : Remove the directories with the analyzed datatoo. Old behavior was to remove them. Now they are kept by default automatically chooses template and default values

If an output file foo is specified and no template then theutility looks for a file foo.template as a template.If a file foo.defaults is present then this file is read andused as default parameter values. Other specifications overridethese defaults can disable standard-fields

Additional option --disable-run-data prints pandas-object

With the -pandas-print-option a DataFrame is generated andprinted Better debugging with ipdb

If the ipdb-package (basically pdb with IPython-additions)is installed then it is used. This gives additions liketab-completion Interactive shell after execution for utilities

The option --interactive-after-execution drops the user to aninteractive shell where the namespace can be inspected. If presentIPython will be used, otherwise the regular shell is used Utilities that read quantitative data convert to pandas-data and/or numpy

This is mainly to be used on the interactive shell to do furtheranalysis or write this data out. The utilities are:; : add an item dump with the wholedata as a DataFrame; : add element series with all the dataas Series and dataFrame with the same data as a DataFrame; : Like; : Now can get series and the whole plot dataas pandas-objects Utilities that read quantitative data write Excel files

The utilities,, now have options to write Excel-files Specify additional settings for GnuPlot in customRegexp

If an item in customRegexp has an item gnuplotCommands thenit is assumed that this is a list of strings which are executedbefore the first plotting. For instance gnuplotCommands ( "set format y '%.2e'" );changes the number format on the y-axis More flexible data specification for

Instead of determining the names of the fields and lines form thefilenames it is now also possible to specify them through options.The option --is-distribution is a shorthand that sets theseoptions for distribution files now allows specification of x-range

The range of the x-axis of the plots can either be set byautomatically scaling to the domains of all the data sets with--scale-domain or by specifying them with --domain-minimum or--domain-maximum.These domains are set for all plots

13.4 Release 0.6.3 - 2014-06-23

For release notes see here

13.5 Release 0.6.4 - 2014-11-24

The release notes for this release are found here

13.6 Release 0.6.5 - 2015-06-23

The release notes for this release are found here

13.7 Release 0.6.6 - 2016-07-15

The release notes for this release are found here

13.8 Release 0.6.7 - 2017-06-04

The release notes for this release are found here

13.9 Release 0.6.8 - 2017-07-06

The release notes for this release are found here

13.10 Release 0.6.9 - 2018-02-25

The release notes for this release are found here

--Bgschaid 21:50, 15 Aug 2005 (CEST)