Introduction#

What is it?#

OpenFOAM is a very popular open-source C++ CFD framework. With Fluidsimfoam, we try to design and propose a new workflow for OpenFOAM based on Python. However, experienced OpenFOAM users won’t be lost because Fluidsimfoam produces in the end standard OpenFOAM cases and it’s always possible to come back to the standard OpenFOAM workflow.

Fluidsimfoam can be seen as a workflow manager for OpenFOAM or a Python wrapper around OpenFOAM. It only uses OpenFOAM commands on the background and is thus NOT a rewrite of OpenFOAM!

Fluidsimfoam should be especially useful for:

  • automatisation of simulation launching for example for parametric studies or optimization,

  • programmatic generation of complex and parametrized input files (for example blockMeshDict) and initial conditions,

  • programmatic control of a simulation at runtime (an example here).

However, Fluidsimfoam is not restricted to these usages and should be convenient, especially for people knowing Python, for any OpenFOAM usages for which C++ programming is not needed.

Working with OpenFOAM implies writting and modifying a lot of input files describing a simulation. The method described in the official OpenFOAM documentations is to copy an existing simulation directory and to modify the input files by hand.

With Fluidsimfoam, we introduce the possibility to describe not only one case (as shown in the OpenFOAM tutorials), but sets of similar simulations. The description of one set of simulations is done in Python (and possibly with Jinja templates) in a small Python package that we call a “Fluidsim solver”.

Warning

Fluidsim solver” and “OpenFOAM solvers” are very different things. A Fluidsim solver is a small Python package describing a set of simulations. Fluidsimfoam allows one to write Fluidsim solvers based for the simulations on OpenFOAM.

As shown in our tutorials, with a Fluidsimfoam solver, it becomes very easy to

  • launch/restart simulations with Python scripts and terminal commands,

  • load simulations, read the associated parameters/data and produce nice figures/movies.

There are open-source solvers (some of them are included in our main repository) and it is not be difficult to write your own solver based on your OpenFOAM cases. For example, to produce a solver from an existing case, one can run

fluidsimfoam-initiate-solver cylinder -c $FOAM_TUTORIALS/basic/potentialFoam/cylinder

This command creates a solver fluidsimfoam-cylinder that can be used to run the simulation described in the Flow around a cylinder tutorial. But this solver can very easily be improved to be parametrized and to produce some input files programmatically. For example, the mesh of this tutorial is produced with the blockMesh OpenFOAM utility and the blockMeshDict is quite complex and contains a #codeStream directive (which implies writting C++ and compilations). With Fluidsimfoam, you can avoid this step and produce the blockMeshDict programmatically with a nice Python API and a nice mechanism to add and store parameters.

The best way to use Fluidsimfoam is to write or use a solver adapted for your particular use case. However, one can also use Python functions and classes provided by Fluidsimfoam for some common tasks, like parsing/writting input files, modifying field files, writting blockMeshDict files, etc.

Fluidsimfoam is now usable but still in quite early development. There are still very low hangling fruits not yet implemented (for example, restart utilities, production of figures and movies, etc.) and our documentation does not reflect what people can and will be able to do with this tool. One goal is to get the equivalent of Snek5000, our Fluidsim framework for the CFD code Nek5000. Looking at the Snek5000 tutorials should give a good idea of what Fluidsimfoam will soon allow.

Contributing

This project is young and we need any kind of feedback and contributions. Don’t be afraid that the project is not hosted on Github. If you think that this project is interesting please star our repository on Heptapod and/or open issues with feedback, feature requests or bug reports. Moreover, we would be very happy to welcome new core developers, so if you like OpenFOAM and Python, do not hesitate!

For our examples, we currently target OpenFOAM v2206 but it should be possible to write Fluidsimfoam solvers targeting any recent OpenFOAM versions.