Uncertainty Quantification Toolbox for OpenFOAM and Python Unified Simulation workflows
Project description
UQTOPUS is a Python framework for uncertainty quantification (UQ) studies with OpenFOAM CFD simulations It automates sampling, case templating, execution, and results analysis to enable reproducible and scalable UQ experiments. The pipeline is designed to be extensible, including hooks for surrogate modeling and custom post-processing around OpenFOAM runs.
Ultimately, this project aims to enable the usage of OpenFOAM simulator to perform efficient and automated uncertainty quantification studies aided by surrogate modeling techniques wrapping the OpenFOAM simulation process.
Built on top of Jinja2, xarray and fluidfoam.
Features
- End-to-end UQ workflow: sample → render cases → run → collect → analyze
- OpenFOAM-native integration: Jinja2-templated dictionaries and Allrun orchestration
- Parallel execution built-in support for sampled scenarios
- Reproducible experiment management and basic statistics with CSV/NumPy-friendly outputs
- Extensible hooks for surrogate modeling with
uqpylab(https://uqpylab.uq-cloud.io/) and custom post-processing
Installation
OpenFOAM Installation
For Ubuntu/Debian systems:
sudo sh -c "wget -O - https://dl.openfoam.org/gpg.key | apt-key add -"
sudo add-apt-repository http://dl.openfoam.org/ubuntu
sudo apt-get update
sudo apt-get -y install openfoam9
Source OpenFOAM environment:
source /opt/openfoam9/etc/bashrc
For other systems, visit: https://openfoam.org/download/
Requirements
- Python 3.9+
- OpenFOAM 9+ (for running actual simulations)
Setup
-
Install Python package:
pip install uqtopus
-
Ensure OpenFOAM is installed and sourced:
source /opt/openfoam9/etc/bashrc # Adjust path as needed
Basic Usage
- Set a config file:
# config.yaml
output_path: experiments/myUQStudy
input_path: templates/templateSimulation
solver: mySolverScript
parameter_ranges:
[folder_path]__[file_name]__[param_name]: [0.01, 0.3]
nthreads: 2
- Templatize the simulation file with the desired variables in Jinja2 format (double curly braces):
...
FoamFile
{
format ascii;
class dictionary;
location "constant";
object transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
param1 {{param1}};
param2 {{param2}};
param3 {{param3}};
...
- Set the solver script:
#!/bin/bash
cd ${0%/*} || exit 1 # Run from this directory
# Source tutorial run functions
. $WM_PROJECT_DIR/bin/tools/RunFunctions
runApplication blockMesh
runApplication $(getApplication)
- Run a UQ study:
import uqtopus as uqt
config = 'config.yaml'
uqt.run_uq_study(config, n_samples=50)
For more information on configuring and running UQ studies, please refer to the example notebooks.
Directory Structure
UQTOPUS/
├── src/ # Python package
├── examples/ # Example of usage with scripts and templates
│ ├── templates/ # OpenFOAM case templates
│ │ └── base_case/ # Base case with Jinja2 placeholders
│ │ ├── constant/
│ │ ├── system/
│ │ ├── 0/
│ │ └── [script_file] # Run script (e.g., Allrun)
│ ├── experiments/ # UQ study results
│ │ └── [study_name]/ # Individual study results
│ │ ├── sample_001/ # OpenFOAM case for sample 1
│ │ ├── sample_002/ # OpenFOAM case for sample 2
│ │ └── ...
│ └── config.yaml # Configuration file for examples
└── README.md # This file
Configuring a template case
-
Add Jinja2 placeholders in OpenFOAM dictionaries where parameters vary.
- Example (constant/transportProperties):
transportModel {{ transportModel | default('Newtonian') }}; nu [0 2 -1 0 0 0 0] {{ nu | default(1e-5) }}; - Example with conditionals (constant/turbulenceProperties):
simulationType RAS; RAS { RASModel {% if turbulence == "kEpsilon" %}kEpsilon{% else %}kOmegaSST{% endif %}; turbulence on; printCoeffs on; } - Jinja tips:
- Use default: {{ var|default(1.0) }}
- Use rounding: {{ diameter|round(5) }}
- Use conditionals/loops for switching models or patch sets.
- Example (constant/transportProperties):
-
Provide a run script in the template root (e.g., templates/base_case/Allrun). Keep it non-templated.
- Minimal example (mesh + solver):
cd ${0%/*} || exit 1 # Run from this directory # Source tutorial run functions . $WM_PROJECT_DIR/bin/tools/RunFunctions runApplication blockMesh runApplication $(getApplication)
- Minimal example (mesh + solver):
-
Place the template under
templatesdirectory to ensure organization with standard OpenFOAM layout (0/, constant/, system/). The UQ runner will render the Jinja placeholders per sample and invoke your run script.
Examples
See examples folder for notebooks with workflow demonstrations.
License
MIT License - see LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file uqtopus-0.1.0.tar.gz.
File metadata
- Download URL: uqtopus-0.1.0.tar.gz
- Upload date:
- Size: 4.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a0c12180a995afbbe472fc6c42c77b67fa686517db600f7d97d02fb85203215
|
|
| MD5 |
6c2bd3cdaa54662cb075ee4c9873b20f
|
|
| BLAKE2b-256 |
46a5e437613a1a018f4335cd52ead6dbd7af92e4998f2d4153a57be6954a080c
|
File details
Details for the file uqtopus-0.1.0-py2.py3-none-any.whl.
File metadata
- Download URL: uqtopus-0.1.0-py2.py3-none-any.whl
- Upload date:
- Size: 12.4 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f25584efbe37883107a135d80ac763e31b73732777af76087ce5132681d19d7f
|
|
| MD5 |
df79683d2c26e6b2925a0fdc4e4c3dff
|
|
| BLAKE2b-256 |
835feedf9cacfad3b2b720f7f1c9a2f3c2ed59fced2288eb0596936fec759bcd
|