VERIFIED — heave RAO 1.017 (+1.7% vs the wave-follower limit); draft +2.1%; periodic at T
Verify wave-excited rigid-body motion — the mechanism behind every seakeeping RAO. The verified numerical wave tank (#1170) and the verified heave-constrained sixDoF body (#1169) are combined into one case: a 0.2 m box floating at its Archimedes draft at x = 13 m, excited by the established regular wave. In the long-wavelength limit (λ/B ≈ 29, excitation period 3 s » heave natural period ~0.63–0.89 s) a freely heaving body rides the surface: heave RAO → 1 (Newman 1977, ch. 6). The incident amplitude is measured by a Goda–Suzuki incident/reflected split over the upstream gauge array, so the body's own scattered field cannot pollute the denominator.
This is the suite's first wave-body interaction case — incident waves exciting a floating structure whose motion feeds back on the flow. It is the CFD twin of the regular-wave RAO test run for every floating asset (FPSOs, semis, spars, floating wind, installation barges):
The first attempt at this case used the #1169 machinery unchanged: dynamicMotionSolverFvMesh
morphing a 2D slab background around the moving body. It floats perfectly through the calm ramp and
dies at first wave arrival — the distance-blended point motion shears a waterline corner cell to
zero volume and the run aborts on a deltaCoeffs divide-by-zero, reproducibly across
decompositions, Courant settings and blending distances (diagnosis on #1302). The overset approach
eliminates the failure structurally: the component mesh around the body moves rigidly (no cell ever
deforms) and the flow is interpolated across the overlap (inverseDistance). This is the standard
OpenFOAM path for wave + moving body, and the machinery the suite now has verified for large-motion
cases. One more portability note: sixDoFRigidBodyState hard-casts the mesh to
dynamicMotionSolverFvMesh, so under the overset mesh the body state is parsed from the sixDoF
report on log lines instead.
Gauge at x = 8.8 m excluded (red ×): the sample ray lands bit-exactly on a cell face and the interfaceHeight walk double-counts cell columns, reporting an impossible mean water level. Detected by the mean-level guard in incident_wave_split and reported, not hidden — the same class of lesson as the Kleefsman density-aware probes.
| Quantity | Measured | Reference | Error / gate | Status |
|---|---|---|---|---|
| Heave RAO (2Az/Hi) | 1.017 | 1.0 (wave-follower limit) | +1.7% (gate ±15%) | PASS |
| Mean draft | 0.1021 m | Archimedes 0.1000 m | +2.1% (gate ±5%) | PASS |
| Response period | 3.001 s | wave period 3 s | +0.0% (gate ±5%) | PASS |
| Incident wave at the array | 2ai = 0.0472 m | input H = 0.05 m | -5.6%, Kr = 0.098 | consistent |
| Fast regression variant (250×35, ~75 min at 8-way) | RAO 1.006, draft +2.0%, T 3.002 s | reference values reproduced | mesh-consistent | PASS |
Why RAO → 1 is the right gate — and what would break it. At λ/B ≈ 29 the wave surface is essentially flat across the body, and the excitation is far below the heave resonance; hydrostatics dominates and the body tracks the surface. Deviations of order kB/2 and (ω/ωn)² are a few percent — well inside the ±15% gate. A solver with broken wave kinematics, wrong buoyancy coupling, or overset interpolation losses would miss the limit; a body with significant draft-to-wavelength ratio or excited near resonance would legitimately depart from 1 (that departure IS the RAO curve this case is the anchor of).
| Item | Setting |
|---|---|
| Background | verified #1170 NWT (375×49, 20 m, top raised to 0.7 m), StokesII inlet + active absorption both ends |
| Component | 50×42 block around the body, hole by topoSet + subsetMesh, rigid overset motion (innerDistance » component size) |
| Overset | dynamicOversetFvMesh, inverseDistance interpolation, zoneID via merged-mesh topoSet (v2312 floatingBody tutorial recipe) |
| Motion | sixDoFRigidBodyMotion, Newmark, heave-only (line + orientation constraints), accelerationRelaxation 0.7 |
| Body | 0.2×0.2 m, ρ = 500 kg/m³ → Archimedes draft 0.10 m; starts at equilibrium (no decay transient) |
| Schemes | #1170 wave-fidelity divs (linearUpwind momentum, vanLeer alpha) + tutorial overset blocks; maxCo = maxAlphaCo = 0.65 |
| Recorder | sixDoF report on log lines (last outer-corrector per step); 8 interfaceHeight gauges |
| Run | two-stage: component blockMesh→topoSet→subsetMesh, then background blockMesh→mergeMeshes→topoSet→setFields→overInterDyMFoam (runner grew mergeMeshes + mesh-prep-only stages) |
The case is generated by digitalmodel.solvers.openfoam.validation.build_wave_excited_body_case.
Archived copy with analyzer: docs/api/cfd/cases/wave_excited_body/. The long solve is opt-in for
the regression suite via DIGITALMODEL_RUN_LONG_CFD=1 (Kleefsman tier).
The overset wave-body machinery reproduces the long-wave limit: heave RAO 1.017 against the theoretical 1.0, mean draft within 2.1% of Archimedes, response locked to the wave period. The deforming-mesh failure that parked this case is retired, and the suite now has a verified path to CFD RAOs for floating structures — the direct bridge to the OrcaWave/AQWA diffraction pipeline.
multiphase/overInterDyMFoam/floatingBody (overset recipe),
multiphase/interFoam/laminar/waves/stokesII (wave generation, verified in #1170),
multiphase/overInterDyMFoam/twoSquaresOutDomain (2D overset precedent).tests/solvers/openfoam/validation/test_wave_excited_body.py.Generated from a real OpenFOAM v2312 solve. All chart data and animation frames are computed directly from the solved fields, gauge records and body-state history — no values are hand-entered.