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

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.
— analytical ◯ measured CFD (free-decay, no forced roll)

| Fill h/L | Ω₁ measured (CFD) | Ω₁ analytical | Error |
|---|---|---|---|
| 15% | 1.1779 | 1.1746 | 0.28% |
| 30% | 1.5164 | 1.5210 | 0.30% |
| 50% | 1.6974 | 1.6974 | 0.00% |
| 70% | 1.7508 | 1.7508 | 0.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.
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.
Free-decay frequency error vs mesh — it falls only slowly toward a ~0.29% floor: the residual is physical (finite-amplitude), not mesh.
| Mesh | Cells | Freq (Hz) | |error| | Runtime (s) | Predicted (s) |
|---|---|---|---|---|---|
| 40×40 | 1,600 | 0.75558 | 0.326% | 149 | 117 |
| 60×60 | 3,600 | 0.75565 | 0.317% | 241 | 264 |
| 80×80 | 6,400 | 0.75570 | 0.310% | 342 | 470 |
| 120×120 | 14,400 | 0.75576 | 0.302% | 684 | 1,058 |
| 160×160 | 25,600 | 0.75581 | 0.296% | 1,208 | 1,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).
| Δt (s) | Timesteps | Freq (Hz) | |error| |
|---|---|---|---|
| 0.004 | 3,000 | 0.75570 | 0.310% |
| 0.002 | 6,000 | 0.75570 | 0.310% |
| 0.001 | 12,000 | 0.75572 | 0.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.
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).

● fill h/L = 0.3 ● fill h/L = 0.5 ● fill h/L = 0.7 – – damped-oscillator model (ζ = 0.170)
| Fill h/L | Natural T₁ analytical (s) | Natural T₁ free-decay CFD (s) | Resonant T forced CFD (s) | resonant / natural |
|---|---|---|---|---|
| 30% | 1.251 | 1.247 | 1.251 | 1.00 |
| 50% | 1.121 | 1.117 | 1.121 | 1.00 |
| 70% | 1.087 | 1.089 | 1.087 | 1.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.
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.
● h/L = 0.3 (near / below critical depth) ● h/L = 0.7 (above critical depth)
| Fill h/L | Roll amp | Resonant T/T₁ | Freq detuning | Peak 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.)
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.
| Quantity | Value | Note |
|---|---|---|
| CFD first-impact peak (Sensor 1) | 4,688 Pa | single 2D interFoam realisation |
| Experiment, first-peak (water, 1X) | 3,710 ± 732 Pa | mean ± SD, 100 runs (CoV ~19.7%) |
| Experimental 2σ band | 2,246–5,174 Pa | CFD / 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).
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).
● roll 1° ● roll 2° ● roll 4° ● roll 6° ● roll 8° — each curve normalised to its own peak; the peak location is the resonance.

| Roll amp | Resonant T/T₁ | Freq detuning | Peak run-up / h | Crest/trough asymmetry |
|---|---|---|---|---|
| 1° | 0.930 | +7.49% | 1.633 | 4.385 |
| 2° | 0.935 | +6.98% | 1.890 | 4.209 |
| 4° | 0.944 | +5.96% | 2.356 | 3.685 |
| 6° | 0.973 | +2.77% | 2.554 | 4.119 |
| 8° | 0.988 (≈ within resolution) | +1.23% | 3.090 | 4.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).
● 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.
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.
● 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.
| Drive | Resonant T/T₁ | Detuning | Detuning (forcing-normalised) | Peak run-up (m) | Run-up vs roll-only |
|---|---|---|---|---|---|
| roll-only | 1.117 | -10.5% | -10.5% | 0.389 | 1.00× |
| EGA d=0.5L | 1.186 | -15.7% | -15.8% | 0.450 | 1.16× |
| EGA d=1L | 1.253 | -20.2% | -21.0% | 0.445 | 1.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.
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.
● 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).
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.
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 class | Mesh (cells) | Timesteps | Sim time (s) | Runtime median (s) | s / sim-s | µs / cell·step (contended) | Fan-out |
|---|---|---|---|---|---|---|---|
| backbone (forced roll, 60x60) | 3,600 | 7,175 | 7.15 | 719 | 100.5 | 27.847 | 14× |
| forced roll (60x60) | 3,600 | 6,810 | 6.73 | 547 | 81.3 | 22.316 | 16× |
| free-decay (80x80) | 6,400 | 6,000 | 12.0 | 470 | 39.2 | 12.25 | 16× |
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.
| Tier | Assumptions | Est. wall-clock | Est. core-hours |
|---|---|---|---|
| Courant / mesh convergence — free-decay 160×160, Co halved | static-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×60 | 3,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 dim | 216k-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.
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.
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):
// 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 }
// 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
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.