OpenFOAM CFD case for an FCS H4 surfboard center fin, with validated baseline polar (-10° to +10°, U = 6 m/s, seawater).
The geometry is reproduced from published FCS dimensions; the foil section, sweep, area, and depth match the manufacturer data sheet. The full case (mesh, solver, polar driver, post-processing) is included for direct reproducibility on OpenFOAM-v2512.
To my knowledge this is the most rigorous open-source surfboard fin CFD
reference available — the only other surfboard-related repo on GitHub
(edwardsp/surfboard) is an Azure HPC benchmark with no geometry, no
validation, and no documented methodology.
git clone https://github.com/sgoudarzi/openfoam-surf-fin.git
cd openfoam-surf-fin/case
# generate the geometry (writes constant/triSurface/fin.stl)
python3 ../scripts/make_fin_FCS_H4.py
# mesh and run α = 5°
./Allmesh
./Allrun 6.0 5.0
# or run the full polar (-10..+10°, ~3 hours on 12 cores)
python3 ../scripts/runAoASweep.py --speeds=6.0 --alphas=-10,-5,-3,0,3,5,10
python3 ../scripts/plotForces.py ../surfboardFin_sweep/polar.csvRequires OpenFOAM-v2512 (or v2412+), numpy, matplotlib.
| Property | Value | Source |
|---|---|---|
| Base chord | 111.76 mm | FCS II H4 Medium data sheet |
| Depth | 117.09 mm | FCS II H4 Medium data sheet |
| Sweep | 37.2° | FCS II H4 Medium data sheet |
| Area (planform) | 9 406 mm² | matched by fit (achieved 9 406) |
| Aspect ratio | 1.46 | computed |
| Planform shape | elliptical, raked | c(s) = c_base·(1−s²)^0.746 (fit to area) |
| LE rake | x_le(s) = depth·tan(37.2°)·s^1.2 |
|
| Foil section | NACA 0009 at base → NACA 0006 at tip | published as "tapered foil" |
| Tip handling | truncated at s = 0.98 | avoids degenerate centroid |
| STL | 47 878 triangles, watertight | verified by edge-count check |
The parametric generator is at scripts/make_fin_FCS_H4.py. All
geometric parameters are exposed at the top of the file. The planform
exponent is fitted by bisection to hit the published area exactly.
| Solver | simpleFoam (steady, incompressible) |
| Turbulence | k–ω SST (RANS) |
| Fluid | seawater, ν = 1.19 × 10⁻⁶ m²/s, ρ = 1000 kg/m³ |
| Inlet velocity | 6.0 m/s (≈ 12 knots, mid-range surfing speed) |
| Reynolds number | Re ≈ 5.6 × 10⁵ (based on base chord) |
| Domain | 2.8 m × 1.0 m × 1.2 m (X × Y × Z), fin centered at (0, 0, 0) |
| Boundaries | inlet (Dirichlet), outlet (inletOutlet), boardPlane (slip), farfield (slip), fin (wall) |
| Mesh | ~1.3 M cells, snappyHexMesh |
| Layer coverage | 97.4 % on fin patch, 6 prism layers |
| y⁺ on fin | 7.7 min / 14.1 avg / 123 max |
| Convergence | 2 500 SIMPLE iterations, residuals ~10⁻⁸ |
| Parallel | 12 ranks via scotch decomposition |
Reference quantities for force coefficients: Aref = 9 406 mm², lref = 111.76 mm, ρref = 1000 kg/m³.
| α [deg] | CL | CD | L/D | Cm,pitch |
|---|---|---|---|---|
| −10 | −0.0392 | 0.0228 | −1.72 | −0.0052 |
| −5 | −0.0087 | 0.0171 | −0.51 | −0.0083 |
| −3 | +0.0030 | 0.0163 | +0.19 | −0.0094 |
| 0 | +0.0204 | 0.0164 | +1.24 | −0.0111 |
| +3 | +0.0376 | 0.0183 | +2.05 | −0.0128 |
| +5 | +0.0491 | 0.0205 | +2.40 | −0.0139 |
| +10 | +0.0789 | 0.0296 | +2.67 | −0.0167 |
Reproducibility note: the table above is from a 12-rank parallel run. The same case run in serial converges to Cl = 0.0435, Cd = 0.0200 (L/D = 2.18) at α = 5°. The ~13% difference is parallel-decomposition scatter near separation onset — see
docs/validation.md. For an exactly reproducible single-point value, run serial; seeresults/serial_a5_reference.txt.
Notable features
- Lift slope in the linear regime (−3° to +3°): dCₗ/dα ≈ 0.0058 /deg. Helmbold prediction for AR = 1.46 inviscid is ≈ 0.036 /deg; the case recovers ≈ 16 % of inviscid slope, the expected penalty for fully turbulent RANS at transitional Re (see docs/validation.md).
- Zero-lift offset Cₗ(0) = +0.020. This is a real effect from the asymmetric thickness taper (NACA 0009 base → 0006 tip) creating an effective spanwise twist, not numerical noise.
- Drag bucket bottoms at α ≈ −3°, skewed negative by the same asymmetry. Cd asymmetry across α = ±10° is ~30 %.
- L/D is monotonic over the swept range; peak is past +10°. For typical surfing AoA (±5°), L/D operates in [−1, +2.4].
Honest caveats (also in docs/methodology.md):
- Absolute Cₗ is conservative — fully-turbulent RANS at transitional Re (5.6×10⁵) without a γ–Reθ transition model typically under-predicts lift by 30–40 %.
- Relative comparisons between fin variants are robust because both baseline and variant share the same numerical bias.
- The boardPlane is modeled as inviscid slip rather than a no-slip surfboard underside. This isolates fin behavior from the board boundary layer; results are comparable to wing-with-image-plane, not a board-mounted fin in a real boundary layer.
openfoam-surf-fin/
├── README.md
├── LICENSE # MIT
├── case/ # complete OpenFOAM case
│ ├── 0.orig/ # initial / BC fields (U, p, k, omega, nut)
│ ├── constant/
│ │ ├── triSurface/ # fin.stl lives here after generator runs
│ │ ├── transportProperties
│ │ └── turbulenceProperties
│ ├── system/
│ │ ├── controlDict # forceCoeffs1, yPlus, write controls
│ │ ├── fvSchemes
│ │ ├── fvSolution
│ │ ├── blockMeshDict # background hex grid
│ │ ├── snappyHexMeshDict # surface + layer refinement
│ │ ├── decomposeParDict # 12-rank scotch decomposition
│ │ └── surfaceFeatureExtractDict
│ ├── Allmesh # blockMesh → snappy → renumber
│ ├── Allrun # decomposePar → potentialFoam → simpleFoam → forces
│ └── Allclean
├── scripts/
│ ├── make_fin_FCS_H4.py # parametric STL generator
│ ├── runAoASweep.py # polar driver (clones case per AoA)
│ └── plotForces.py # plots polar.csv
├── results/
│ ├── polar.csv # validated baseline polar
│ ├── H4_baseline_polar.png # 3-panel polar plot
│ └── H4_baseline_U6_a5.txt # summary at α = 5°
└── docs/
├── methodology.md # solver, schemes, BCs, convergence
├── validation.md # comparison to published surfboard CFD literature
├── H4_polar_animated.gif # animation used at top of README
└── fin_FCS_H4.png # 3-view static render
- FCS product data, FCS II H4 Medium center fin specifications.
- Sakellariou, K., Bertz, T., Voss, R., Knoblauch, S., Pfaller, R. (2019). Computational hydrodynamics of a typical 3-fin surfboard setup. Applied Ocean Research 88, 209–222. DOI: 10.1016/j.apor.2019.04.016
- Knoblauch, S., Pfaller, R., Sakellariou, K., Voss, R. (2020). Numerical Investigation of the Hydrodynamics of Changing Fin Positions within a 4-Fin Surfboard Configuration. Applied Sciences 10(3), 816. DOI: 10.3390/app10030816
- Schäfer, M. et al. (2025). Measurements of the hydrodynamic pressure on a surfboard fin during surfing. Scientific Reports 15. DOI: 10.1038/s41598-025-94834-0
- Carswell, D. (2007). Hydrodynamic Performance of Surfboard Fins. BEng thesis, Plymouth University. (Frequently cited single-fin experimental + numerical baseline.)
- OpenFOAM Foundation / OpenCFD Ltd. OpenFOAM v2512. https://openfoam.com
MIT — see LICENSE. The H4 dimensions referenced here are public information from the FCS data sheet; no proprietary FCS data is distributed. The STL generator constructs an interpretation of those public specs, not the manufacturer file.
Sahar Goudarzi — sgoudarzi.github.io · LinkedIn
Related repos: nrel5mw-ami-openfoam · openfoam-hydraulic-validation


