Fuzzball Documentation
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Executing an OpenFOAM Motorbike Simulation

The instructions on this page will show you how to execute the OpenFOAM motorbike tutorial from the workflow catalog template with the Fuzzball web UI and CLI. For both methods you can choose a number of parameters.

  • The workflow template uses an ephemeral ScratchVolume to run the simulation. In addition, you provide a persistent DataVolume. If provided, the case folder will be saved in the ResultsPath directory on the persistent volume.
  • If you provide an S3Bucket and S3Secret, a tar archive of the case folder will also be saved to AWS S3 as part of the egress stage of the workflow.
  • You can separately choose the resources used for the serial steps of the workflow (UtilityJobCores, UtilityJobMemory), the parallel steps (SimulationOrMeshJobCores, SimulationOrMeshJobMemory, SimulationOrMeshJobNodes) and the optional Paraview server step (ParaviewCores, ParaviewMemory).
  • You can choose the Coefficients used in DecomposeParDict.
  • If you provide the URI for a Paraview container (ParaviewContainerUri), a Paraview server will be started at the end of the workflow. You can use a Paraview client to connect to the server with port forwarding to visualize the results.
Please select either the web UI or CLI tab to see the appropriate instructions for your environment.

You can run the OpenFOAM motorbike workflow template from the workflow catalog page by locating the OpenFoam motorbike card with the CIQ badge and clicking “Run”:

Fuzzball workflow catalog OpenFoam card

You will be prompted to supply values for the configurable parameters of the template. You can examine all the options and their documentation in the option dialog box:

Fuzzball workflow catalog OpenFOAM options

If you keep all the default options, you will run the OpenFOAM motorbike tutorial workflow with 1 CPU core for the utility steps, 6 Cores for the parallel steps, results saved to a persistent volume (but not S3), and a Paraview server started at the end. Click “Validate” to check the options you provided against the workflow template. If there were no errors “Validate” will be replaced by “Continue”

Fuzzball workflow catalog OpenFOAM continue

After clicking “Continue” you will be prompted in a dialog box to “Start Workflow” to submit the Fuzzfile rendered from the workflow template and your inputs. At this stage you can modify the name of the run or accept the defaults.

Fuzzball workflow catalog start OpenFOAM start

Once the workflow has been submitted successfully, you can select “Go to status” to view the status of the workflow’s stages

Fuzzball workflow catalog OpenFOAM status

Select a stage that produces output and choose the “Logs” tab to see the output generated by the stage as we did in an earlier example with a manually written workflow. In the example below, we are looking at the output of the optional port-forwarding-info step that shows you the command needed to set up port forwarding required to connect to the Paraview server running as a Fuzzball job with your local Paraview client:

Fuzzball workflow catalog OpenFOAM logs

By clicking on “Open in Workflow Editor” in the top right corner, you can open the Fuzzfile generated from the template and your inputs in the workflow editor. In the example above the graph of jobs looks like so:

Fuzzball workflow catalog OpenFOAM editor

To run this workflow through the CLI you will need access to the Fuzzball CLI. You can install it using the Fuzzball CLI installation instructions.

When using the CLI to execute workflow templates from the workflow catalog, you need to supply parameters in the form of a YAML file. For the OpenFoam motorbike workflow you can create this file like so:

$ cat > motorbike.yaml <<EOF
values:
  - name: OpenFoamVersion
    string_value: "2412"
  - name: OpenFoamContainerUri
    string_value: docker://opencfd/openfoam-default
  - name: ParaviewContainerUri
    string_value: ""
  - name: DataVolume
    string_value: volume://user/persistent
  - name: S3Bucket
    string_value: ""
  - name: ResultPath
    string_value: "results/openfoam"
  - name: ResultName
    string_value: openfoam-motorbike
  - name: WmProjectDir
    string_value: /usr/lib/openfoam/openfoam
  - name: UtilityJobCores
    uint_value: 1
  - name: UtilityJobMemory
    string_value: 1GiB
  - name: SimulationOrMeshJobCores
    uint_value: 6
  - name: SimulationOrMeshJobNodes
    uint_value: 1
  - name: SimulationOrMeshJobMemory
    string_value: 4GiB
  - name: Coefficients
    string_value: 3 2 1
EOF

Note that we elected not to start a Paraview server by leaving ParaviewContainerUri blank and not to save results to S3 by leaving S3Bucket blank. That means we can omit parameters needed only for those steps.

Next you need to obtain the ID of the OpenFoam workflow template. That can be done in a few different ways. For example:

$ fuzzball application list
NAME                           | ID                                   | OWNER    | PROVIDER | UPDATETIME            | DISABLED
SomeApp                        | 1767f241-c9ad-44ae-a2b6-e1edbf00770d | ACCOUNT  |          | 2025-04-21 04:38:09PM | false
...
LAMMPS (GPU)                   | 00000007-aaaa-bbbb-cccc-dddddddddddd | PROVIDER | CIQ      | 2025-03-06 08:00:00PM | false
BLAST                          | 00000008-aaaa-bbbb-cccc-dddddddddddd | PROVIDER | CIQ      | 2025-03-06 08:00:00PM | false
OpenFOAM Motorbike Flow Example| 00000009-aaaa-bbbb-cccc-dddddddddddd | PROVIDER | CIQ      | 2025-03-06 08:00:00PM | false

$ id="$(fuzzball application list | awk -F'|' '$4 ~ /CIQ/ && $1 ~ /OpenFOAM Motorbike/{print $2}' | tr -d ' ')"

Of if you have jq installed you could make use of the option to return json format metadata about all applications as shown below:

$ id=$(fuzzball application list --json | jq -r '.applications[] | select(.name == "OpenFOAM Motorbike Flow Example" and .provider=="CIQ") | .id')

Or you can copy and paste the workflow template id instead of assigning it to a variable. Once you have the id of the workflow template and a values file you can use them to create a Fuzzfile for submission like so:

$ fuzzball application render-application $id motorbike.yaml | awk '/^version/{p=1} p==1' > motorbike.fz

$ head motorbike.fz
version: v1
volumes:
  scratch:
    reference: volume://user/ephemeral
  data:
    reference: volume://user/persistent

jobs:
  preprocess-model:
    image:

Note that we used awk to remove any content above the initial version line in case there were any lines at the top.

The Fuzzfile is then submitted and monitored as described previously like so:

$ fuzzball workflow start motorbike.fz
Workflow "a03c9a93-8dd5-47db-8fce-ad212029714b" started.

$ fuzzball workflow describe a03c9a93-8dd5-47db-8fce-ad212029714b
Name:      motorbike.fz
Email:     wresch@ciq.com
UserId:    87145648-b830-4291-ab7e-40880d61334e
Status:    STAGE_STATUS_STARTED
Cluster:   fuzzball-aws-stable
Created:   2025-04-29 08:59:14AM
Started:   2025-04-29 08:59:15AM
Finished:  N/A
Error:


Stages:
KIND     | STATUS   | NAME                                   | STARTED               | FINISHED
Workflow | Started  | a03c9a93-8dd5-47db-8fce-ad212029714b   | 2025-04-29 08:59:14AM | N/A
Volume   | Finished | data                                   | 2025-04-29 08:59:15AM | 2025-04-29 08:59:44AM
Volume   | Finished | scratch                                | 2025-04-29 08:59:15AM | 2025-04-29 08:59:43AM
Image    | Finished | docker://opencfd/openfoam-default:2412 | 2025-04-29 08:59:16AM | 2025-04-29 08:59:43AM
Image    | Finished | docker://alpine:latest                 | 2025-04-29 08:59:15AM | 2025-04-29 08:59:42AM
Job      | Finished | preprocess-model                       | 2025-04-29 09:00:13AM | 2025-04-29 09:00:29AM
Job      | Finished | snappy-hex-mesh                        | 2025-04-29 09:02:49AM | 2025-04-29 09:03:59AM
Job      | Finished | toposet                                | 2025-04-29 09:06:15AM | 2025-04-29 09:06:23AM
Job      | Finished | set-initial-conditions                 | 2025-04-29 09:06:47AM | 2025-04-29 09:06:54AM
Job      | Finished | patch-summary                          | 2025-04-29 09:09:13AM | 2025-04-29 09:09:19AM
Job      | Finished | potential-foam                         | 2025-04-29 09:11:40AM | 2025-04-29 09:11:48AM
Job      | Pending  | check-mesh                             | N/A                   | N/A
Job      | Pending  | simple-foam                            | N/A                   | N/A
Job      | Pending  | reconstruct-mesh                       | N/A                   | N/A
Job      | Pending  | to-vtk                                 | N/A                   | N/A
Job      | Pending  | tar-results                            | N/A                   | N/A

$ fuzzball workflow log a03c9a93-8dd5-47db-8fce-ad212029714b toposet
/*---------------------------------------------------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  2412                                  |
|   \\  /    A nd           | Website:  www.openfoam.com                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
Build  : _45e7c4a0-20241224 OPENFOAM=2412 version=2412
Arch   : "LSB;label=32;scalar=64"
Exec   : topoSet -parallel
Date   : Apr 29 2025
Time   : 13:06:20
Host   : toposet
PID    : 18
I/O    : uncollated
Case   : /scratch/openfoam-motorbike-1745931477
nProcs : 6
Hosts  :
(
    (toposet 6)
)
Pstream initialized with:
    floatTransfer      : false
    maxCommsSize       : 0
    nProcsSimpleSum    : 0
    nonBlockingExchange: 0 (tuning: 0)
    exchange algorithm : 0
    commsType          : nonBlocking
    polling iterations : 0
trapFpe: Floating point exception trapping enabled (FOAM_SIGFPE).
fileModificationChecking : Monitoring run-time modified files using timeStampMaster (fileModificationSkew 5, maxFileModificationPolls 20)
allowSystemOperations : Allowing user-supplied system call operations
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Create time
Create polyMesh for time = 0
Reading topoSetDict
Time = 0
    mesh not changed.
Created cellZoneSet inner
    Applying source boxToCell
    Adding cells with centre within boxes 1((-1 -0.5 0) (6 0.5 2))
    cellZoneSet inner now size 253116
End
Finalising parallel run