Skip to main content

A Python interface for interacting with OpenFOAM

Project description

foamlib

Documentation CI Codecov Checked with mypy Ruff uv Publish PyPI Conda Version PyPI - Python Version OpenFOAM Docker Docker image

foamlib provides a simple, modern, ergonomic and fast Python interface for interacting with OpenFOAM.

benchmark
Parsing a volVectorField with 200k cells.

👋 Basics

foamlib offers the following Python classes:

  • FoamFile (and FoamFieldFile): read-write access to OpenFOAM configuration and field files as if they were Python dicts, using foamlib's own parser and in-place editor. Supports ASCII and binary field formats (with or without compression).
  • FoamCase: a class for configuring, running, and accessing the results of OpenFOAM cases.
  • AsyncFoamCase: variant of FoamCase with asynchronous methods for running multiple cases at once.
  • AsyncSlurmFoamCase: subclass of AsyncFoamCase used for running cases on a Slurm cluster.

☑️ Get started

📦 Install

  • With pip:

    pip install foamlib
    
  • With conda:

    conda install -c conda-forge foamlib
    

🐑 Clone a case

import os
from pathlib import Path
from foamlib import FoamCase

pitz_tutorial = FoamCase(Path(os.environ["FOAM_TUTORIALS"]) / "incompressible/simpleFoam/pitzDaily")

my_pitz = pitz_tutorial.clone("myPitz")

🏃 Run the case

my_pitz.run()

🔎 Access the results

latest_time = my_pitz[-1]

p = latest_time["p"]
U = latest_time["U"]

print(p.internal_field)
print(U.internal_field)

🧹 Clean the case

my_pitz.clean()

⚙️ Edit the controlDict file

my_pitz.control_dict["writeInterval"] = 10

📝 Make multiple file reads and writes in a single go

with my_pitz.fv_schemes as f:
    f["gradSchemes"]["default"] = f["divSchemes"]["default"]
    f["snGradSchemes"]["default"] = "uncorrected"

⏳ Run a case asynchronously

import asyncio
from foamlib import AsyncFoamCase

async def run_case():
    my_pitz_async = AsyncFoamCase(my_pitz)
    await my_pitz_async.run()

asyncio.run(run_case())

🔢 Parse a field using the FoamFieldFile class directly

from foamlib import FoamFieldFile

U = FoamFieldFile(Path(my_pitz) / "0/U")

print(U.internal_field)

🔁 Run an optimization loop on a Slurm-based cluster

import os
from pathlib import Path
from foamlib import AsyncSlurmFoamCase
from scipy.optimize import differential_evolution

base = AsyncSlurmFoamCase(Path(os.environ["FOAM_TUTORIALS"]) / "incompressible/simpleFoam/pitzDaily")

async def cost(x):
    async with base.clone() as clone:
        clone[0]["U"].boundary_field["inlet"].value = [x[0], 0, 0]
        await clone.run(fallback=True) # Run locally if Slurm is not available
        return abs(clone[-1]["U"].internal_field[0][0])

result = differential_evolution(cost, bounds=[(-1, 1)], workers=AsyncSlurmFoamCase.map, polish=False)

📄 Use it to create a run (or clean) script

#!/usr/bin/env python3
from pathlib import Path
from foamlib import FoamCase

case = FoamCase(Path(__file__).parent)
# Any additional configuration here
case.run()

📘 Documentation

For more information, check out the documentation.

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

foamlib-0.7.2.tar.gz (35.5 kB view details)

Uploaded Source

Built Distribution

foamlib-0.7.2-py3-none-any.whl (39.6 kB view details)

Uploaded Python 3

File details

Details for the file foamlib-0.7.2.tar.gz.

File metadata

  • Download URL: foamlib-0.7.2.tar.gz
  • Upload date:
  • Size: 35.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.5.2

File hashes

Hashes for foamlib-0.7.2.tar.gz
Algorithm Hash digest
SHA256 f5cdf5b48c2f974372380b1ab0859b7f3ea9a0b9d216f88cf24a07799304b45e
MD5 ed175f521dc891d9ea9ebe7288fb754f
BLAKE2b-256 85a940553dd713f020b454e792934d2bb01c19a59a7500924bf43946a35a0fe6

See more details on using hashes here.

File details

Details for the file foamlib-0.7.2-py3-none-any.whl.

File metadata

  • Download URL: foamlib-0.7.2-py3-none-any.whl
  • Upload date:
  • Size: 39.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.5.2

File hashes

Hashes for foamlib-0.7.2-py3-none-any.whl
Algorithm Hash digest
SHA256 22dd1bed3bed5068d7d23dea94e3dcc5211eba7be5a044610a0c53bff8c53c5b
MD5 2312229bb54f96fad89e7fcc1fc49ce5
BLAKE2b-256 ebbab160ab12f4a3936178cf54e62a548c7a82576a0f6521da42816fb25f5955

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page