Compute a volume integral

VolIntegrate is the canonical reducer for volume fields: it multiplies by cell volume and sums. Use it whenever “how much” is the question — total mass, total energy, integrated source term.

We compute the total water volume in the damBreak case at t=0.

Open the case

import os
import subprocess

import pyOFTools.patch_pybfoam  # noqa: F401
from pyOFTools import clone_example

CASE = clone_example("damBreak")
subprocess.run(
    ["./Allrun"],
    cwd=CASE,
    check=True,
    env={**os.environ},
    capture_output=True,
    text=True,
)

from pybFoam import Time, fvMesh, volScalarField

time = Time(str(CASE.parent), CASE.name)
mesh = fvMesh(time)
volScalarField.read_field(mesh, "alpha.water")
<pybFoam.pybFoam_core.volScalarField object at 0x7f46cb50b910>

Integrate

field | VolIntegrate — read as “wrap the field, integrate it by cell volumes”. The result is an AggregatedDataSet with one value.

from pyOFTools.aggregators import VolIntegrate
from pyOFTools.builders import field

result = (field(mesh, "alpha.water") | VolIntegrate()).compute()
total_water_volume = result.values[0].value
print(f"total water volume at t=0: {total_water_volume:.6g} m^3")
total water volume at t=0: 0.000840422 m^3

Write it to a CSV

For a standalone script, the raw value is usually enough. But if you are going to wire this into @postProcess.Table later (see Wire pyOFTools into system/controlDict), it is useful to know that the CSV row you get is exactly what AggregatedDataSet.grouped_values returns.

print("headers:", result.headers)
print("rows:   ", result.grouped_values)
headers: ['alpha.water_volIntegrate']
rows:    [[0.0008404216050726664]]

Total running time of the script: (0 minutes 10.581 seconds)

Gallery generated by Sphinx-Gallery