CFD study · OpenFOAM · free-surface (VOF) + forced motion

Ballast-tank sloshing — the 2D CFD study

From analytical natural periods to CFD-benchmarked resonance: a partially filled tank has a gravity-driven sloshing mode; tune it near a vessel's roll period and it acts as a passive tuned-liquid (anti-roll) damper. This page showcases the 2D VOF CFD that pins the analytical master curve to measured data and shows how forced roll excites the resonance.

VERIFIED · real OpenFOAM v2312

SolverinterFoam (VOF), OpenFOAM ESI v2312
CFD cases171 (2D)
Nat-freq error≤0.30% vs theory
Resonanceat natural period
The effect of forced roll — same tank, same 70% fill. LEFT: with roll, the free surface piles up and sloshes wall-to-wall. RIGHT: without roll, it stays flat and calm. Live 2D VOF (OpenFOAM v2312) free-surface fields.
The effect of forced roll — same tank, same 70% fill. LEFT: with roll, the free surface piles up and sloshes wall-to-wall. RIGHT: without roll, it stays flat and calm. Live 2D VOF (OpenFOAM v2312) free-surface fields.

1 · Natural period — CFD vs analytical (without forced roll)

A free-decay run rings down a small first-mode perturbation in a static rectangular tank; the FFT natural frequency, non-dimensionalised as Ω₁ = ω₁√(L/g), is compared to the analytical linear-potential value √(π·tanh(πh/L)). Four fills bracket the curve.

0.000.250.500.751.001.251.500.00.51.01.52.0fill / slenderness ratio h / LΩ1 = ω1√(L/g)

— analytical   ◯ measured CFD (free-decay, no forced roll)

Free-surface (VOF) field of the free-decay first mode — the standing wave rings down in the static tank (water navy, air pale, interface at α=0.5). Real OpenFOAM output.
Free-surface (VOF) field of the free-decay first mode — the standing wave rings down in the static tank (water navy, air pale, interface at α=0.5). Real OpenFOAM output.
Fill h/LΩ₁ measured (CFD)Ω₁ analyticalError
15%1.17791.17460.28%
30%1.51641.52100.30%
50%1.69741.69740.00%
70%1.75081.75080.00%

Result. The 2D VOF pipeline reproduces the analytical first-mode frequency to within 0.30% across the fill range — the measured points sit on the rectangular master curve. See the CFD-vs-literature chart (which shape was validated) in the interactive explorer.

Grid & timestep convergence — is the ≤0.30% earned?

The literature (and our own adversarial review) is clear that a sub-percent match must be earned by a convergence study, not asserted. This refines the exact case with the known ~0.30% error (L=1 m tank, h/L = 0.30 — which lands on a cell face at every mesh, so the analytical target is identical) across five grids and three timesteps.

4060801201600.000.250.50mesh resolution — cells per breadth (log)|frequency error| (%)

Free-decay frequency error vs mesh — it falls only slowly toward a ~0.29% floor: the residual is physical (finite-amplitude), not mesh.

MeshCellsFreq (Hz)|error|Runtime (s)Predicted (s)
40×401,6000.755580.326%149117
60×603,6000.755650.317%241264
80×806,4000.755700.310%342470
120×12014,4000.755760.302%6841,058
160×16025,6000.755810.296%1,2081,881

The last two columns check the run-time estimator: its rate is calibrated at ~16-wide contention, so it reads as an upper bound here — this batch ran 7-wide and tapering, so actual came in below predicted, exactly as the contention model says (fewer concurrent → faster per case).

Timestep sweep (fixed 80×80 mesh)

Δt (s)TimestepsFreq (Hz)|error|
0.0043,0000.755700.310%
0.0026,0000.755700.310%
0.00112,0000.755720.308%

Richardson extrapolation (ratio-2 triple). Observed order of accuracy p = 0.191, grid-converged frequency 0.756556 Hz vs analytical 0.758054 Hz, fine-grid GCI = 0.1239%. The extrapolated value stays ~0.2% below the linear-analytical target, and p is far below the formal ~2 — so the study is not in the asymptotic regime and the GCI is indicative only (a non-mesh term dominates the error).

Verdict. Numerically sound: the frequency is grid- and timestep-converged — mesh error falls monotonically to a ~0.29% plateau (only the finest 25,600-cell mesh reaches ≤0.30%) and the timestep sweep is flat over a 4× refinement. But the residual is predominantly PHYSICAL, not discretization: Richardson extrapolation gives 0.7566 Hz, still ~0.20% below the linear-analytical 0.758 Hz — an irreducible finite-amplitude offset (0.02 m perturbation) from the linear tanh dispersion. The low observed order (p ≈ 0.19, far below the formal ~2) confirms a non-mesh term dominates the error budget, so the GCI (0.12%) is indicative only. Bottom line: the ~0.3% agreement is a finite-amplitude modeling difference, not numerical error that vanishes with refinement.

2 · Forced-roll resonance — with vs without

Without forced roll, the free-decay run gives the intrinsic natural period. With forced roll, driving the tank (4.0° roll) at a range of roll periods and measuring the steady wall run-up traces a resonance curve that peaks at that same natural period — roll excites the mode the free-decay rings down. The dashed grey curve is the linear damped-oscillator amplification (Faltinsen & Timokha 2009; Abramson 1966).

One roll cycle at resonance (0, T/4, T/2, 3T/4, T), h/L=0.70 — the tank tilts and the free surface sweeps wall-to-wall. Real OpenFOAM (VOF) output.
One roll cycle at resonance (0, T/4, T/2, 3T/4, T), h/L=0.70 — the tank tilts and the free surface sweeps wall-to-wall. Real OpenFOAM (VOF) output.
0.60.70.80.91.01.11.21.31.41.50.000.250.500.751.00drive period / natural period T_drive / T1wall run-up (normalised)natural period (free-decay)

● fill h/L = 0.3 ● fill h/L = 0.5 ● fill h/L = 0.7   – – damped-oscillator model (ζ = 0.170)

Fill h/LNatural T₁ analytical (s)Natural T₁ free-decay CFD (s) Resonant T forced CFD (s)resonant / natural
30%1.2511.2471.2511.00
50%1.1211.1171.1211.00
70%1.0871.0891.0871.00

Confidence. At every fill the forced-roll resonant period lands on the natural period (ratio ≈ 1.00). Roll excitation and free decay agree on the same mode — the methodology is self-consistent.

3 · Roll-amplitude backbone — amplitude-dependent detuning

At 4° roll the resonant peak sits on the linear T₁ (section 2). Nonlinear theory predicts this only holds at small amplitude: the fundamental sloshing mode is a soft spring whose resonant frequency drifts with amplitude. This sweep drives each fill at 2–8° over a frequency grid and locates resonance by the quadrature (damping) coefficient peak — the phase-based locator (Bäuerlein & Avila 2021); the wall run-up saturates near resonance and is not a reliable locator, so it is reported separately.

02468-16.6-8.3+0.0+8.3+16.6roll amplitude (deg)resonant-frequency detuning f_res/f1 − 1 (%)hardening ↑softening ↓

● h/L = 0.3 (near / below critical depth)   ● h/L = 0.7 (above critical depth)

Fill h/LRoll ampResonant T/T₁Freq detuningPeak run-up (m)
30%2°1.009-0.92%0.255
30%4°1.054-5.10%0.422
30%6°1.094-8.60%0.419
30%8°1.121-10.81%0.432
70%2°1.046-4.38%0.339
70%4°1.088-8.06%0.390
70%6°1.122-10.89%0.404
70%8°1.153-13.25%0.409

Result. Both fills show soft-spring detuning: the resonant frequency drops monotonically as roll amplitude grows, reaching ~11–13% below f₁ at 8° (h/L = 0.30: −0.9% → −10.8%; h/L = 0.70: −4.4% → −13.2%). The h/L = 0.70 case (above the h/L ≈ 0.34 critical depth) is the clear soft spring; h/L = 0.30 sits right at the critical depth and also detunes downward under strong shallow-water nonlinearity rather than showing the clean hardening small-amplitude theory would predict. So “resonance at T₁” is the small-amplitude limit only — at operational roll angles the tank detunes, and anti-roll tuning must use the amplitude-annotated value. (The base grid is Δr = 0.05; the h/L = 0.70 grid was extended to r = 1.25 at 6–8° so the strongly-detuned peak is now bracketed interior — the 8° peak was previously clamped at the r = 1.15 edge, i.e. a lower bound; the de-clamped value is −13.2%. Values reduced with the corrected sub-grid vertex interpolation introduced with the shallow-fill sweep — the originally published detunings placed each peak correctly only to the Δr = 0.05 grid.)

External validation — Delorme / SPHERIC Test 10 (shallow fill, impact pressure)

The one recognised external benchmark with published experimental data (not our own analytical): the SPHERIC Test 10 lateral-impact case (Delorme et al. 2009; benchmark values Botia-Vera et al. 2010). A shallow-filled tank (L=0.9 m, h=0.093 m ≈ 18% fill) in 4.0° forced roll at T=1.6298 s (0.85·T₀) throws an overturning wave that slams the side wall at the still-water line; the first-impact pressure at Sensor 1 (y=0.093 m) is the validated quantity. A moving-wall patchProbes tap tracks the rotating wall.

QuantityValueNote
CFD first-impact peak (Sensor 1)4,688 Pasingle 2D interFoam realisation
Experiment, first-peak (water, 1X)3,710 ± 732 Pamean ± SD, 100 runs (CoV ~19.7%)
Experimental 2σ band2,246–5,174 PaCFD / mean = 1.264

Within the experimental scatter. The CFD peak sits at 1.264× the experimental mean (upper part of the 2σ band) — consistent with the documented tendency of violent-impact CFD/SPH to over-predict pressure maxima. A single deterministic 2D CFD run is one draw from a strongly stochastic impact distribution (experimental CoV ~20%), so agreement is judged as landing within the experimental scatter, not as an exact number; 2D also omits the experiment's out-of-plane-thickness dependence and air entrapment. This validates the forced-roll VOF impact path against measured data at shallow fill.

Sources: Botia-Vera, Souto-Iglesias, Bulian & Lobovsky (2010), Table II (100 runs); Delorme et al. (2009), Ocean Eng. 36(2).

Shallow-fill bore regime — amplitude sweep at h/L = 0.15

The fills above sit at or above the h/L ≈ 0.34 critical depth. Real ballast operation also passes through shallow fills, where the response is set by travelling bores / hydraulic jumps and low-order (tanh-dispersion) theory degrades — the regime where anti-roll tuning must come from CFD. This refined sweep drives h/L = 0.15 (h = 0.135 m) at 1–8° roll over a fine Δr = 0.025 frequency grid with 16-cycle records (38 cases; the 2° case is refined to a Δr = 0.0125 half-step for a grid-convergence check). The free-decay benchmark (section 1) anchors the small-amplitude natural frequency at this fill to within 0.28% of linear theory; the sweep measures how fast that anchor degrades as amplitude grows. Resonance is located by the quadrature (damping) coefficient peak. Bore onset is tracked by two wall-probe indicators: run-up / depth (the shallow-water nonlinearity parameter) and crest/trough asymmetry (bores throw a sharp high crest over a drawn-down trough; a linear standing wave is symmetric).

0.800.850.900.951.001.051.101.150.000.250.500.751.00drive period / natural period T_drive / T1quadrature (damping) coefficient (normalised)linear T₁8°6°4°2°1°

● roll 1°   ● roll 2°   ● roll 4°   ● roll 6°   ● roll 8°  — each curve normalised to its own peak; the peak location is the resonance.

The shallow-fill bore over one drive period (h/L = 0.15, 8° roll, r = 0.95 — near the detuned resonance). The water mass travels wall-to-wall as a bore and throws run-up several times the still depth up the tank walls. Live 2D VOF fields on the actual rolled mesh.
The shallow-fill bore over one drive period (h/L = 0.15, 8° roll, r = 0.95 — near the detuned resonance). The water mass travels wall-to-wall as a bore and throws run-up several times the still depth up the tank walls. Live 2D VOF fields on the actual rolled mesh.
Roll ampResonant T/T₁Freq detuning Peak run-up / hCrest/trough asymmetry
1°0.930+7.49%1.6334.385
2°0.935+6.98%1.8904.209
4°0.944+5.96%2.3563.685
6°0.973+2.77%2.5544.119
8°0.988 (≈ within resolution)+1.23%3.0904.955

Run-up / h and asymmetry are each amplitude's maximum across the ratio grid; they occur near (not exactly at) the resonant ratio. Off resonance both indicators fall sharply — toward the edges of the swept band the run-up drops well below its resonant value and the asymmetry falls toward 1. “≈ within resolution” flags an amplitude whose quadrature peak is flat enough that the detuning is within grid/method resolution of the linear anchor (sign-consistent only).

02468-16.6-8.3+0.0+8.3+16.6roll amplitude (deg)resonant-frequency detuning f_res/f1 − 1 (%)hardening ↑softening ↓

● h/L = 0.3 (near / below critical depth)   ● h/L = 0.7 (above critical depth)   ● h/L = 0.15 (shallow-water / bore regime)

Result. Below the h/L ≈ 0.34 critical depth the shallow fill detunes the opposite way to the deeper fills: a hardening response with the resonant frequency above linear f₁ at every amplitude (the sign flip nonlinear theory predicts below critical depth; Faltinsen & Timokha 2009). This is now grid-resolved, not a sub-grid artifact: on the refined Δr = 0.025 grid the quadrature-peak node itself walks with amplitude (0.925@1° → 0.9375@2° → 0.95@4° → 0.975@6° → 1.0@8°). A half-step Δr = 0.0125 convergence check at 2° holds the peak at r ≈ 0.935, so the sub-grid vertex is confirmed, not manufacturing the trend. The flip is between h/L = 0.15 and the 0.30/0.70 fills; our h/L = 0.30 case, nominally just below critical, already softens, so the practical boundary sits below 0.30 rather than exactly at 0.34. The hardening weakens monotonically as roll grows — from ~+7% at 1° to ~+1% at 8° (within grid/method resolution of the anchor — sign-consistent only). That is not a clean hardening backbone (which would bend away from f₁ as amplitude grows); it is the signature of bore dissipation — the travelling bore breaks harder at higher amplitude, broadening the peak and pulling the effective resonance back toward T₁. Correction. An earlier 8-cycle coarse-grid (Δr = 0.05) sweep placed every amplitude's peak at r = 0.95 and reported the hardening as indicative. The refined 16-cycle Δr = 0.025 sweep supersedes it: the low amplitudes are confirmed (within ~±0.4 pct-pt), but the high amplitudes were overstated by ~2 pct-pt (6°: +4.8% → +2.8%; 8°: +2.9% → +1.2%) — the short records had not settled near resonance. The 1° anchor (+7.5%, the strongest swept) shows the hardening does not reverse above 1°; reconciliation with the near-zero free-decay anchor (natural frequency within 0.28% of linear at ≈0 amplitude) therefore happens only in the un-swept sub-1° limit — and note free decay (unforced transient frequency) and forced phase-resonance coincide only in the linear limit, so part of that gap is definitional. What is not in doubt is the violence: near resonance even 2° roll is a bore-like wave, run-up 1.6× the still depth (rising to ~3× at 8°) and crest/trough asymmetry ~4–5 (a linear standing wave is symmetric); away from resonance the surface relaxes toward a moderate nonlinear wave. Practical consequence: if ballast operation passes through shallow fills, anti-roll tuning there cannot come from the tanh master curve — it needs the forced-response CFD, the resonant frequency is amplitude-dependent, and below ~critical depth expect hardening, not softening. Caveats: single 2D grid (cpb = 60); the quadrature-coefficient locator is a single-harmonic proxy under heavy bore breaking; the deep-fill backbone above used 6 drive cycles vs 16 here; the sub-1° onset and roof-impact physics (at 6–8° the bore crest reaches ~0.64 m against 0.77 m freeboard) are beyond this sweep's scope.

Combined sway + roll — the Effective Gravity Angle

The forced-roll and backbone sweeps above roll the tank about its own floor. A real vessel's roll axis sits below the ballast tank, so a rolling tank also feels a lateral acceleration — the true forcing is an Effective Gravity Angle that combines the angular tilt with an in-phase lateral translation (Carette 2023). Rolling about the tank floor captures only the tilt term, so it is a partial drive. This sweep adds the lateral term with OpenFOAM multiMotion (roll about the floor + an anti-phase lateral surge) and measures the difference at h/L = 0.7, 4.0° roll, 12 cycles (24 cases). The surge amplitude is set to the roll-induced lateral for a roll axis a distance d below the floor; the construction is validated — the multiMotion run-up matches the exact roll-about-a-lower-axis case to five significant figures.

0.951.001.051.101.151.201.251.301.351.40drive period / natural period T_drive / T1quadrature (damping) coefficient (normalised)linear T₁roll-onlyEGA d=0.5LEGA d=1L

● roll-only   ● EGA d=0.5L   ● EGA d=1L  — each curve normalised to its own peak; the dashed vertical marks the located resonance. The peak marches to LONGER period (right) as the sub-floor lever grows.

DriveResonant T/T₁Detuning Detuning (forcing-normalised)Peak run-up (m)Run-up vs roll-only
roll-only1.117-10.5%-10.5%0.3891.00×
EGA d=0.5L1.186-15.7%-15.8%0.4501.16×
EGA d=1L1.253-20.2%-21.0%0.4451.15×

The effective-forcing magnification 1 + dω²/g is frequency-dependent; the forcing-normalised column divides the response by it to isolate the transfer function. Run-up is each drive's peak across the ratio grid.

Result. Roll-only about the tank floor is a partial, non-conservative drive: adding the roll-induced lateral acceleration (the EGA term) both detunes the resonance to longer period and under-predicts the run-up. The deep fill (h/L = 0.7, above the critical depth) soft-springs further as the sub-floor lever grows — resonant detuning deepens from -10% (roll-only) to -16% at d = 0.5 L and -20% at d = 1 L, because the added lateral forcing raises the effective amplitude and the tank runs further down its soft-spring backbone. This shift is robust: normalising the response by the (frequency-dependent) effective forcing barely moves it and if anything deepens it (-21.0% at d = 1 L), so the quad-peak locator — which is normalised to the roll angle, not the effective angle — reports a lower bound on the true shift, not an artifact of it. The response magnitude tells the second half: roll-only under-predicts peak run-up by ~16%, but that gap saturates — a ~3×-larger effective forcing at d = 1 L (near resonance) yields no more run-up than d = 0.5 L (0.45 m on a 0.9 m tank — the free surface is near its headroom ceiling, breaking-influenced). Practical consequence: anti-roll assessment cannot use roll-only-about-the-tank CFD — it under-states both the detuning and the peak response; the roll axis must be placed at the real vessel lever. Caveats: single deep fill and roll amplitude, 2D (no swirl); the lever d is a dimensionless lab-scale parameter (0.5–1 tank breadth), not a specific vessel value; resonance from a coarse Δr = 0.05 grid (ratios good to ~±0.02, so detunings are quoted to the nearest percent); run-up is a saturated single-probe metric near the ceiling. Corollary: the 12-cycle roll-only baseline here detunes −10.5% versus the shipped 6-cycle backbone's −8.1% at the same point, so the 6-cycle backbone under-reports detuning — read it as a lower bound too.

Coupled anti-roll response — the two-peak split & the optimum

All the sweeps above characterise the tank alone. Its purpose is to damp a vessel's roll: a partially filled tank tuned near the roll frequency is a tuned-liquid damper. Coupling it to the vessel roll (the Den Hartog tuned-absorber equations; Moaleji & Greig 2007) shows the design trade-off — and it turns on the tank damping, which is exactly what the forced-roll CFD measured. This is not new CFD: it feeds the CFD-measured equivalent damping ratio ζ (which rises with fill, ≈ 0.10 / 0.18 / 0.31 at h/L = 0.30 / 0.50 / 0.70, from the SDOF reduction) into the coupled response at a representative mass ratio μ = 0.05.

0.80.91.01.11.21.30510tuningfrequency ratio ω / ω_rollvessel roll response |X₁/X_st|

● CFD h/L=0.3 (ζ=0.10, 2 peaks, peak 9.9)   ● Den Hartog optimum (ζ=0.13, 2 peaks, peak 8.9)   ● CFD h/L=0.5 (ζ=0.18, merged, peak 9.2)   ● CFD h/L=0.7 (ζ=0.30, merged, peak 13.5)

Result. A lightly damped tuned tank splits the vessel roll response into two adverse peaks straddling the tuning frequency; as tank damping rises the peaks merge into a single controlled peak, and past the optimum the tank over-damps and the peak grows back. The CFD fill ζ ladder brackets the Den Hartog optimum (ζopt = 0.13 at this mass ratio): the low fill (CFD h/L=0.3) is under-damped and shows the two-peak split; the lowest peak — the best anti-roll performance among the fills — is at CFD h/L=0.5 (ζ = 0.18, closest to the optimum); and the high fill (CFD h/L=0.7) is over-damped — its single peak is taller than the mid-fill one because a too-stiff tank stops moving relative to the vessel and stops absorbing. So “more damping is better” is wrong: there is an optimum, and our fill sweep straddles it. In practice the tank damping is set by an internal baffle or damping screen (Moaleji & Greig's device) rather than by fill; the physics is the same, and the CFD ζ ladder shows the target band. Caveats: representative mass ratio μ = 0.05 (the split/merge is generic in μ — only the peak separation scales as √μ); perfect tuning (f = 1) and an undamped-hull idealisation (adds hull roll damping in a full design); constant-ζ screening from the 4° 2D CFD (ζ does not Froude-scale, and swirl/baffle detail is 3D).

4 · Literature survey — support & contrast

The literature supports our 2D VOF free-decay + forced-roll approach for the FREQUENCY, TUNING and DAMPING questions it is scoped to answer, but with more caveats than the original draft implied. Independent VOF-CFD (Yang & West 2016) and shaker/sway experiments (Bäuerlein & Avila 2021; Chen & Xue 2018; Faltinsen/Rognebakke) confirm that linear tanh dispersion predicts first-mode natural frequencies well at intermediate-to-deep fills and that free-decay-then-FFT is an accepted extraction method, so a sub-percent free-decay match is credible - but a specific '<0.3%' figure must be EARNED by a Courant/mesh-convergence study, not asserted a priori. Bäuerlein & Avila validate the 90-degree phase-lag/quadrature criterion as a rigorous resonance locator, and the anti-roll-tank literature (Carette 2023; Moaleji & Greig 2007) supports reducing a partially filled tank to a lightly-damped tuned SDOF. Confidence is genuinely PARTIAL for design loads and combined-motion excitation: above the ~0.34 critical depth the resonance detunes off linear T1 onto a soft-spring branch (confirmed by Bäuerlein & Avila 2024), 2D omits swirl and the effective-gravity-angle (sway+roll) forcing, and impact-pressure magnitude is mesh/air-compressibility sensitive.

Supports our approach

Caveats & contrasts

5 · Way forward — further CFD analysis

6 · Compute & runtime — machine effectiveness

What a 2D interFoam sloshing case costs on this box (dev-secondary, 32 cores, interFoam (VOF), OpenFOAM ESI v2312 — single-threaded per case), so future compute can be predicted. The mesh-normalised cost (µs of wall per cell·timestep) is the machine invariant. Its intrinsic value is ~12–17µs across classes; the higher per-class figures in the table below are the same work inflated ~1.5–2.3× by memory-bandwidth contention when 14–16 cases share the box — a batch artifact, not a physics cost curve. That contention is the dominant compute-planning lever. Scoping a new run? Use the interactive run-time estimator → to read the anticipated wait for a proposed mesh / case count / fan-out.

This box runs 2D interFoam sloshing at an intrinsic ~12-17 us per cell·timestep (static free-decay ~12; a single uncontended moving-mesh forced case ~16-17). The 22-28 us per-class figures are NOT a physics cost curve — they are the same work inflated ~1.5-2.3x by memory-bandwidth contention when 14-16 cases share the 32-core / 31 GB box. Contention, not mesh motion, is the dominant compute-planning lever; a 14-wide fan-out still cut the 48-case backbone from ~5-6 h serial to 34.7 min (~7-10x wall-clock).

Case classMesh (cells)TimestepsSim time (s) Runtime median (s)s / sim-sµs / cell·step (contended)Fan-out
backbone (forced roll, 60x60)3,6007,1757.15719100.527.84714×
forced roll (60x60)3,6006,8106.7354781.322.31616×
free-decay (80x80)6,4006,00012.047039.212.2516×

Parallel effectiveness. The 48-case backbone batch ran 14× concurrent in 34.7 min — versus ~5–6 h one-at-a-time (a ~7–10× wall-clock speedup, the range reflecting how the serial baseline is estimated), even though each case ran ~2.33× slower under memory-bandwidth contention. Fan-out wins decisively on total throughput.

Runtime model: t_wall ≈ C · N_cells · N_timesteps · f(concurrency) — Wall time scales with the product of mesh cells and solver timesteps; the mesh-normalised cost (µs per cell·timestep) is the machine invariant, and f(concurrency) is the contention factor for parallel fan-out.

Projected compute for the way-forward tiers

TierAssumptionsEst. wall-clockEst. core-hours
Courant / mesh convergence — free-decay 160×160, Co halvedstatic-mesh @ ~12 us/cell·ts intrinsic; 25,600 cells × ~12,000 timesteps; ~4 cases fit one fan-out wave~1-2 h (one 14-wide wave)~4-8 core-h
Shallow-fill amplitude sweep — 24 forced-roll @ 60×603,600 cells × ~7,000 ts; 2 fan-out waves of 14; +10-20% if impacts cut dt~20-25 min~2-5 core-h
3D L-shaped ballast tank — extrude ~60-100 cells in 3rd dim216k-360k cells × ~7,000 ts, moving mesh; 3D cost/cell an unmeasured ~1.2× extrapolation; single-thread per case~12-24 h single-thread per case; ~1-2.5 h with ~16-core MPI (UNMEASURED — benchmark first)~12-24 core-h/case; ~35-70 for a 3-fill set

Caveats: Contention is memory-bandwidth-bound (not compute-bound): 14-16 concurrent interFoam on 32 cores / 31 GB slow each ~2.3x; the 22-28 us/cell·ts figures are batch-specific artifacts, not physics. · No large intrinsic moving-mesh premium: the raw 12→22→28 ordering conflates mesh motion with contention; use ~12-17 us intrinsic for 2D planning. · Adaptive-timestep variance: forced/backbone timesteps vary ±10-20% case-to-case with the free-surface dynamics; runtimes are medians, not guarantees. · 2D→3D is an unmeasured extrapolation (assumed 1.2× 3D cost/cell); the ~1-2.5 h MPI figure must be benchmarked on this host before it is promised. · Fan-out speedup is a ~7-10x range: the serial baseline is 247 min (measured 309 s/case) to 336 min (sim-time-scaled); sub-14 case counts finish in a single wave.

Method & provenance

2D interFoam (VOF) on OpenFOAM ESI v2312. Free-decay: static slip-wall tank, first-mode cosine perturbation, FFT of the wall free-surface. Forced roll: rigid whole-mesh roll via the ESI solidBody motion solver, partial fill snapped to a cell face, wall run-up + tank reaction-moment reduced to in-phase / quadrature coefficients. Engines and validated cases ship in digitalmodel (solvers/openfoam/validation/sloshing_2d.py, sloshing_sweep.py); the drivers are scripts/cfd/run_sloshing_benchmark.py, run_sloshing_response_sweep.py, run_sloshing_backbone.py and run_sloshing_shallow_sweep.py. Related: 2D tank-sloshing verification · master-curve explorer.

References

Appendix · CFD input files — how the roll & analysis are set up

The cases are generated by the drivers (no hand-editing); these are the load-bearing OpenFOAM dictionary excerpts. The roll is a prescribed whole-mesh rigid rotation about the tank floor centre; the analysis is a near-wall free-surface probe (run-up) plus a wall-force integration reduced to the roll moment. Verified excerpts from a forced-roll case (h/L = 0.70):

constant/dynamicMeshDict
// Prescribed roll: whole-mesh rigid rotation (ESI solidBody)
dynamicFvMesh    dynamicMotionSolverFvMesh;
motionSolver     solidBody;
solidBodyMotionFunction oscillatingRotatingMotion;
oscillatingRotatingMotionCoeffs
{
    origin      (0.45 0 0);   // roll axis = tank floor centre
    omega       5.779;        // rad/s  (T1 = 1.087 s at h/L = 0.70)
    amplitude   (0 0 4);      // degrees — 4 deg roll about z
}
constant/transportProperties
// Two-phase VOF: water & air
phases          (water air);
water
{ transportModel Newtonian; nu 1e-06;    rho 1000; }
air
{ transportModel Newtonian; nu 1.48e-05; rho 1;    }
sigma            0.07;   // N/m surface tension
system/controlDict (solver + analysis function objects)
application     interFoam;   // 2-phase VOF free-surface solver
functions
{
    // wall run-up — the resonance metric
    interfaceHeight1 { type interfaceHeight; alpha alpha.water;
                       locations ( (0.0075 0 0.005) ); }  // near-wall antinode
    // roll-reaction moment -> added inertia + damping
    tankRollMoment   { type forces; patches (leftWall rightWall lowerWall);
                       rho rho; CofR (0.45 0 0); }  // M_z about the roll axis
}

Generated by SloshingForcedRollConfig / build_forced_roll_case in digitalmodel/solvers/openfoam/validation/sloshing_2d.py.