Skip the navigation
DELPHIlaws of biology
Physics thread

Is a flying fish inside Thompson's flight envelope?

In 1917 D'Arcy Thompson argued that a flier of fixed proportions must move at least at a speed that grows with the square root of its size, and that the work of flight grows faster than the muscle to do it. This page checks a real flying fish against that argument using only numbers we could trace to a fetched source, and reports what the published record does and does not contain. Everything here is read from results.json, status.json and the two CSV files beside this page; nothing is typed by hand.

The envelope

The lift a wing makes is ½ ρ v² S CL. To stay up it must equal the weight W, so the slowest possible lift-supported speed is vmin = √(2 (W/S) / (ρ CL,max)). That is Thompson's "must": speed grows as the square root of wing loading W/S, and under isometry as the square root of length. The dashed line below has that slope, drawn through the flying fish.

The blue line is the slowest speed at which the measured fins of a 0.06 kg darkedged-wing flying fish can carry its weight; the shaded band runs to three times that. Each bar is a speed from the glide table, coloured by how the source got it. Hover any bar or the band for the source, the locator and the retrieval time. Standalone copy for the deck: vmin-band.svg.

Reading B: the fish on its own envelope

Reading A: does speed scale as (W/S)½?

Airspeed against wing loading, both on log scales. Gliders in blue, powered fliers in orange, fitted separately because they are two physical regimes; the vertical bar on the flying fish is the 10 to 20 m/s field range. Birds are absent on purpose: class Aves is the frozen holdout exam and no bird value may enter any test. Hover a point for its provenance.

Reading C: could its muscles power level flight?

Reading D: the exponents themselves

The simulator: swim, taxi, take-off, glide, in equations

A 2D side-view model of the Park and Choi specimen, integrated with RK4 from the parameters on this page, runs in the browser at sim/: live altitude, speed against the minimum lift-supported speed, and energy, with every parameter's source and kind shown and sliders on the assumed ones. Its validation was pre-registered before the first run (PREREG.md, hash in PREREG.sha256); the run log with every change made after seeing a result is RUNS.md. Tests 1 to 3 became exploratory after run 1 and are labelled post-hoc. Test 4 (the real fish cannot power-fly) has run with the physiology chain: it passes at the fish's own muscle and fails at the pre-registered upper bound (a bat's flight-muscle fraction), where the model lets the fish fly 26 s bouts on anaerobic stores; and with the chain capping the launch the fish cannot even lift off, which exposes the tuned launch thrust as unphysical. Both outcomes are reported in RUNS.md. The pure-glide bound from the Lean thread, one glide at most h·(L/D)max ≈ 35 m, is a visible row: long field flights need repeated taxis.

The simulator takes a design, so the same animal can be flown here and looked at in the 3D viewer. It accepts the parametric schema's own parameters (standard_length_m, body_mass_kg, pectoral_area_over_SL2, pectoral_span_over_SL, flight_muscle_fraction) by URL query and by postMessage from a parent frame, and posts its results and their provenance back; the contract is EMBED.md. Presets for the organisms we hold, each labelled with what it rests on: the real flying fish (measured), the HYPOTHETICAL TFF (a spec, which surfaces the four mismatches found while building it as a mesh, including a flight muscle only 29.5 % of which fits inside the animal), the HYPOTHETICAL winged zebrafish (its fin value is a chosen delta, not the paper's number, whose measurements are figure-only) and the zebrafish itself (schematic fins; it never leaves the water). Parameters supplied at run time make the run exploratory, and the page says so in red: a pre-registered test applies to the pre-registered parameters, not to whatever is typed in.

A truly flying fish: what it would take HYPOTHETICAL

A design study, not an organism. Starting from the real specimen, only morphology and physiology parameters are changed; the equations and the measured fin polar are the real fish's. Powered-flight values come from bats, insects and pterosaurs only; class Aves is the frozen holdout, and where a value exists only for birds the study says "unavailable (holdout)". Prior art and every number: PRIOR-ART-FLIER.md; the spec with its sources and arithmetic: spec.json; the candidate for the Lean checker: lean-candidate.json. Run it: the simulator with the flier selected.

What changes, real fish to flier

parameterreal (measured)flier (hypothetical)why
wing loading46.4 N/m²12 N/m²inside the bat range 6.5 to 14.25; below pterosaur hatchlings 15.8 to 17.9
lifting area0.0127 m²0.0491 m² (3.9×)follows from the wing loading at 60 g
span at aspect ratio 90.26 m0.66 m (2.5×)the fish's own aspect ratio, kept
flight-muscle fractionnot reported (small)0.16smallest that covers a 1 m/s climb at the bat-derived maximum specific power of 202 W/kg muscle; bats average 0.091, minimum 0.078
mass, CL,max, (L/D)max0.06 kg, 0.78, 4.37samesame body and fin section; conservative
O2 delivery for sustained climbunknownabout 930 ml O2 per min per kg18.6 W metabolic at 10 % conversion (bat-measured 7 to 10 %); 310 W/kg body, above bats (70 to 183) and below hovering bumblebees (559)

What the budget says

  • Level flight at the best speed (6 m/s) costs 1.28 W mechanical including 0.48 W of flapping inertia; a 1 m/s climb costs 1.86 W.
  • A 60 g fish with the bat mean muscle fraction (9.1 %) has 1.1 W at the bat-derived maximum specific power: not enough for level flight, let alone a climb.
  • At 16 % flight muscle it has 1.94 W: level flight with margin and a 1 m/s climb. In the simulator this fish lifts off at 11.6 m/s and climbs to 42 m in 40 s at about 6 m/s, with the real fish's equations. With the physiology chain on, the climb reaches 179 m at 66 s and ends when the burst store empties, with the blood oxygen store still at 35 %: it is a burst of about a minute on anaerobic stores, not sustained flight. In air, gills do not ventilate, so the 930 ml O2 per minute per kg must come from an air-breathing respiratory surface; that is a design requirement the genome would have to meet, and the climb result is expected to change once the physiology chain is wired. The real fish, in the same simulator, cannot (it gets no flapping thrust; whether its muscles could is test 4, pending the physiology chain).
  • Environment: water 25 °C, air 1.225 kg/m³, calm air and average nutrition, rest and clearance, held fixed by the project baseline (conditions/baseline.json) and shown as locked in the simulator's panel.
  • The flapping power is a figure derived from two sourced bat numbers (0.140 W of mechanical power from 0.69 g of flight muscle); it is the parameter the physiology chain and the Lean O2-to-power bound will replace or confirm.
  • Minimum lift-supported speed of the flier: 5.0 m/s (constraint C9); the candidate file asks the Lean checker to confirm 7 m/s cruise is consistent and a 4 m/s claim is eliminated.

Not established: that such a fish could develop (development is not simulated), that fins of four times the area keep the measured polar, that any gill can deliver the oxygen, and anything about birds. The genome question is Genotype's: the parameter diff above is what they translate.

TFF v2: a co-design map for altitude HYPOTHETICAL

The Lean thread's certificates make the oxygen side binding: sustained aerobic flight is eliminated for the real fish and the first flier (aerobic ceiling 0.0357 W against about 1 W), and gills do not work in air. So the truly-flying fish is no longer a point but a map: for each altitude, the pairs of wing loading and aerobic capacity (η·E·Q·Ca) that allow sustained level flight, using the real fin polar, the standard atmosphere for air density and oxygen partial pressure (NASA GRC fit, fetched), and the trout haemoglobin curve from the physiology chain. Birds are the frozen holdout, so "similar to birds" is not benchmarked against any bird: the target altitude, 1000 m, comes from a bat reference (Brazilian free-tailed bats forage at over 1 km above ground), and the map is drawn to 5000 m to show the shrinkage. Files: tff.json, lean-candidates-tff.json, COEVOLUTION.md. Run it: the simulator with the TFF (altitude readout) and the winged zebrafish.

Above each curve, sustained level flight is possible at that altitude. The region shrinks with altitude on both axes: thinner air raises the minimum speed and the power for every wing loading, and lower oxygen pressure lowers the arterial content for every cardiac output. Along a curve, bigger wings (lower wing loading) buy lower oxygen capacity as a square root. The real fish sits below every curve by more than thirty times; the TFF point reaches 1000 m only with an oxygen supply no sourced fish has. Hover any curve or point for its numbers.

The TFF v2 spec, and what no animal has

Ceiling as a function of parameters

Highest altitude at which η·E·Q·Ca(h) ≥ W·vmin(h)/(L/D) + inertial power, with arterial PO2 taken equal to inspired PO2 (an assumed upper bound). "none" means not even at sea level.

Co-evolution of wings and oxygen processing: what the literature search found

The project lead's hypothesis is that wing size co-evolves with oxygen processing because oxygen thins with altitude. The map above says a model-level version of that: at a given altitude, flight needs either lower wing loading or higher oxygen delivery. A logged literature search for comparative evidence in bats and insects (no birds) found no source either supporting or opposing the co-variation; two insect elevational-gradient papers would be the first to read, and the high-altitude mammal haemoglobin literature exists by title but was not read. The claim stays a hypothesis. Details and verdict: COEVOLUTION.md.

The 2×2: a winged zebrafish

One panel of the developmental comparison. An adult zebrafish of 3.0 cm standard length weighs 0.51 g by the FishBase length-weight row for the species (an unverified estimate, like most flying-fish rows). Given flying-fish fin proportions by isometric scaling of the measured fins, its wing loading is 18 N/m² and its minimum lift-supported speed 6.1 m/s, which is 205 body lengths per second. The simulator result for whether it can reach that speed on its scaled physiology is in the status line below once run.

The bridge: fin proportion from real specimens, under the envelope

The Genotype thread extracted Daane et al. 2021's measurements of 109 preserved beloniform specimens (Harvard MCZ): standard length and pectoral fin length, from needlefish through halfbeaks and gliding halfbeaks to flying fish. The same paper names the genes (lat4a with kcnh2a) that reproduce the flying-fish fin proportion in zebrafish. Here the five wind-tunnel specimens whose wing loading set vmin are placed on that series. Their fin length is not reported, only the tip-to-tip span and the dihedral angle, so each is an upper bound: fin length ≤ half span / cos(dihedral), because body width is at least zero. No length is converted to an area: there is no sourced shape factor, so none is assumed.

Recount against the Genotype thread

What this does and does not establish

What a flying fish does in the air: the table (issue #50)

One row per value per source. measured means the authors measured it; secondary means a fetched paper quotes an older one we could not get; theory means a model's number, kept only to say so. Blank cells are blank: nothing is filled in.

What is missing, stated plainly

    The glide table
    Fin size and proportion: the allometry that is in the abstracts

    Comparison lineages

    The cladogram on the main page compares flying fish with flies, bats, flying squirrels and colugos. Each non-bird lineage that has a fetched source with a speed is here; those with a wing loading as well enter the fit.

    What goes to the Lean thread

    The exponents are consequences of definitions, not measurements, so they belong in the proof checker. Each statement, with symbols, units, the assumptions that are not mathematics, and a mutant that must fail to compile, is in FORMAL-STATEMENTS.md. R2 to R8 are now proved by the Lean thread in lean/Delphi/Scaling.lean as theorems over named hypotheses; this thread checked the Lean build report (standard axioms, zero sorry, built 19:00 UTC) but did not re-run the proofs. With R7 in place the ledger's 13 square-cube candidates moved from "cannot rule" to "consistent", none eliminated, because they restate the law. The one strength row still open is petiole bending, so R9 was written next.

    1. R1 cube law W ∝ L³ proved earlier (thompson1917-ch03-07).
    2. R2 area law S ∝ L², Acs ∝ L² proved
    3. R3 wing loading W/S ∝ L proved
    4. R4 minimum speed v ≥ √(2W/(ρSCL,max)) exactly, no isometry; vmin ∝ L½ under R1 and R2 proved (ch02-06 first half, ch02-10).
    5. R5 power required Preq ∝ L7/2 at vmin with constant L/D proved (ch02-06 second half).
    6. R6 power available Pavail ∝ L³ as a named hypothesis only, never asserted; a size limit exists but its value needs f, p, L/D, ρ, CL,max, so no animal is placed above it proved as conditional (ch02-07).
    7. R7 strength Fbreak ∝ L², safety factor = σk3/(k1L), a size Lmax above which a member cannot carry n body weights; axial only proved
    8. R8 Froude v ∝ √(gL) proved (ch02-10).
    9. R9 bending σb = Mb/Z with Z ∝ d³: for a body-like load (∝ L³) stress ∝ L and a limit exists; for a constant-thickness sheet (load ∝ L²) stress is size-independent and no limit follows. Written for the petiole-bending candidate WP-077/C1 proposed, not yet formalised

    How this was done

    1. Prior art first. A logged search for flying-fish aerodynamics and glide performance before any model: OpenAlex via the OpenResearch CLI (rate-limited after one call), then Europe PMC, Crossref and Semantic Scholar. Every call is in SEARCHES.md; findings in PRIOR-ART.md. No run identifier is issued by the tool, so none is recorded. No email, name or account id went into any request.
    2. Pre-register, then read. The test's pass and fail rules were written to result.json at 18:21 UTC before any wing loading, lifting area or lift coefficient had been read; the file lists the few values seen in abstracts before that moment. One amendment at 18:26 UTC, requested by the hub before any fit ran, separates gliders from powered fliers and names the flying fish in the set.
    3. Fetch, verify, record. Candidate DOIs recalled from memory were resolved in Crossref and kept only when the title matched; one guess returned 404 and is cited nowhere. Paywalled texts are cited as abstract-only. Open copies came from PubMed Central, Zenodo, Inter-Research and the Wayback Machine.
    4. Compute from files. analysis.py reads the two CSVs and writes every number to results.json; this page reads that file. Air density 1.225 kg/m³ and g = 9.81 m/s² are the only constants.
    5. Keep the kinds apart. Measured, secondary, theory and simulation are separate labels on every row. A CFD result is a simulation and enters no verdict.

    What this does not establish

    Sources

    Each row says what was actually read. DOIs were verified by fetching Crossref metadata.