Mason Shopperly

MS-10 · cfd · Atlas · Reviewed Apr 28, 2026

aeroBASE — compose-first OpenFOAM case builder

An independent, ongoing OpenFOAM workflow that turns small declarative descriptors into runnable case workspaces — nine canonical cases from lid-driven cavity to oblique-shock reflection, each on the same compose-first pipeline.

Role
Independent project · OpenFOAM workflow + nine canonical cases
Era
2025–ongoing
Status
ongoing
Tier
flagship
Tools
OpenFOAM · Python · JSON descriptors · snappyHexMesh · ParaView
Mach-2 oblique-shock reflection on a 15° wedge — numerical schlieren (|∇ρ|), compressible Euler with shockFluid; shock fronts as dark lines on white
WEDGE_2D_COMP_Ma2-W15 reflection — numerical schlieren (|∇ρ|), frame 49. Compressible Euler with shockFluid; the strongest single visual the repo ships.

Why a case builder

OpenFOAM is a CLI suite: dozens of small dictionary files per case, scattered across 0/, constant/, and system/, and the wrong one gets edited on a bad morning. GUIs exist but they hide the structure that makes the suite worth using in the first place. aeroBASE keeps the CLI but adds a layer above it — small declarative descriptors that compose into a runnable workspace, every choice diff-able, every render previewable before anything is written to disk.

Descriptors are data, not code. Templates live in libs/ and are the single source of truth for how each dictionary file looks. Tools merge descriptor knobs into tokens, render the templates, and only on opt-in write the result into a disposable workspace under .work/<runId>/. Curated cases get promoted into cases/ once they earn the slot.

What it is

Nine cases, one descriptor pattern, one library of templates. Each case lives under cases/<NAME>/ with a frozen descriptor set and a figs/ (or post/) directory of post-processed exports. The case naming itself encodes the physics: WEDGE_2D_COMP_Ma2-W15_Euler_shockFluid-reflect reads as 2-D compressible wedge at Mach 2, 15° angle, Euler with shockFluid solver, reflection setup — the directory tree is a sentence.

The cases span the canonical territory the OpenFOAM suite is built for: incompressible classical (lid-driven cavity, cylinder, backward-facing step, flat plate), compressible (Mach-2 oblique-shock baseline + reflection on a 15° wedge), and 3-D extensions (cube, Ahmed body, wing). Some are pedagogical exhibits; others are the in-house verification cases the workflow gets re-run against when the templates change.

Compose-first foundations and the LDC entry case

The lid-driven cavity is the entry case — Re=10k, laminar icoFoam, the README’s “first dry run”. It’s the simplest case the descriptor machinery can render end-to-end, and its purpose on the page is the same as its purpose in the repo: prove the pipeline runs from descriptor JSON to a fully-rendered runnable workspace before any of the harder cases come in. The mesh, the velocity magnitude on the steady solution, and the surface LCI quantitative output land in that order.

Incompressible canonical lineup

The next three cases are the OpenFOAM-suite classics on the same compose-first pipeline. Re=100 cylinder runs the laminar wake inside icoFoam; the mesh is the artefact that ships, the von-Kármán shedding result lives in the run. Backward-facing step at Re_h=25k uses the simpleFoam SST closure — the streamlines over a U_x slice draw the recirculation zone the case exists to capture. The zero-pressure-gradient flat plate uses the Spalart–Allmaras closure and is the workflow’s quantitative validation case: the U_x profile in the boundary layer, plotted in semilog y, is what the templates are checked against on every change.

Compressible payoff and the 3-D extension

The two wedge cases are the same Mach-2 / 15° geometry on the same templates, run with and without the reflection setup. The reflection case is the strongest single visual the repo currently ships — frame 49 of the U_mag animation, the incident shock and its reflection both visible on the same field. The mesh tells the second half of the story: a structured block-mesh, no surprises, the result is the templates doing their job. The baseline wedge sits next to it for comparison.

The 3-D cube is the smoke test for the 3-D pipeline — geometry-only right now; the result lives in the run timestamps and hasn’t been promoted to a canonical figure yet. The Ahmed body and the 3-D wing cases are configured but their canonical figures aren’t shipped — a deliberate honest gap, not a stub.

What it earns

aeroBASE’s payoff is not “I have OpenFOAM working on my machine.” It is every case I run is the same case the templates produced, and every change to the templates is a change I can diff. The discipline of separating descriptors from templates from workspaces — preview first, write second, curate third — is what makes a CFD workflow survive the second time it gets used. The next phase is whichever case earns its way into the canonical figure set next: a full-resolution Ahmed-body wake render, or a 3-D wing pressure-on-surface from the configured WING_3D_INC_Re3e6_AoA6 case, or the next compressible case after the wedge. The pipeline is what carries them in.

Compose-first entry — the lid-driven cavity

Lid-driven cavity Re=10k — structured block mesh, square domain, refined near walls
LDC_2D_INC_Re10k — the block mesh. A descriptor's worth of geometry; the pipeline renders this end-to-end as the first dry run.
Lid-driven cavity Re=10k — U magnitude on the steady solution, primary central vortex visible
LDC — |U| on the steady solution. The primary vortex sits where it should; the pipeline checked out before any further case complexity.
Lid-driven cavity — surface line-convolution image, quantitative validation output
LDC — surface LCI. Quantitative validation output of the same run, generated from the same descriptor without re-meshing.

Incompressible canonicals — wake, recirculation, boundary layer

Cylinder Re=100 — von-Kármán vortex shedding rendered as U_y on the x-y plane, alternating cross-stream lobes downstream
CYL_2D_INC_Re100 — Karman shedding rendered live from the run. U_y on the x-y plane; the alternating positive/negative lobes are the shedding signature.
Cylinder Re=100 — laminar wake case mesh, refined around the cylinder body
CYL — the mesh. Laminar icoFoam; refinement is concentrated around the cylinder where the shear layer is born.
Backward-facing step Re_h=25k — U_x slice with streamlines drawing the recirculation zone behind the step
BFS_2D_INC_Reh25k — U_x slice with streamlines. simpleFoam + SST; the recirculation zone behind the step reads cleanly without further post-processing.
Zero-pressure-gradient flat plate at Re=10⁶ — U_x boundary-layer profile on a semilog y axis, log layer visible
PLATE_2D_INC_Re10⁶ — boundary-layer U_x on a semilog y axis. Spalart–Allmaras; the log layer is where it should be — the workflow's quantitative validation rung.

Compressible payoff and the 3-D extension

Mach-2 wedge reflection — structured block mesh for the reflection case
WEDGE reflection — the structured mesh underneath the schlieren up top. Same descriptor pattern, compressible solver, attached oblique shock.
Mach-2 wedge baseline (no reflection) — U magnitude, attached oblique shock visible
WEDGE baseline — |U| on the no-reflection sister case. Same templates as the reflection run, with the upper-wall closure swapped — what compose-first is for.
3-D cube Re=4×10⁴ RANS — case mesh, structured grading toward the cube faces
CUBE_3D_INC_Re4e4 — the mesh. The 3-D smoke test for the pipeline; the canonical result lives next to it but hasn't been promoted to a hero figure yet.

← Previous · LightRAG · local-model retrieval over the CFDLab vault

Next · Fundamentals of UAVs — fixed-wing design →