Hydrodynamic Forensic Analysis
First-principles fluid mechanics predicts what a high-velocity rifle round to a vascular neck target would produce. The recorded evidence shows none of it.
The Question
The prosecution's case rests on the assertion that a single .30 caliber rifle round, fired from the rooftop position, struck the victim in the neck. If that account is correct, the resulting hydrodynamic event has well-characterized signatures: an outward-traveling cone of fine blood mist from the entry wound (back spatter), a forward cone of larger droplets ejected with the bullet wake (forward spatter), and visible vascular bleeding onset within tens of milliseconds for any major neck vessel.
These signatures are not optional. They are the consequence of pressure-impulse fluid mechanics, Rayleigh–Taylor instability of an accelerated free surface, and Bernoulli–Torricelli flow from a pressurized vessel. They have been quantitatively characterized in the peer-reviewed forensic-fluids literature, primarily by Comiskey, Yarin, Kim and Attinger between 2016 and 2019.
This page applies those models to the parameters of the prosecution's stated scenario, generates the predicted patterns, and compares them with what the recorded evidence actually shows. The full Python pipeline is downloadable below for independent verification.
The Model
The analysis combines three physics models, each derived from peer-reviewed work. Each predicts a specific, observable signature. Each is independent of the others.
Comiskey, Yarin, Kim & Attinger 2016 (Phys. Rev. Fluids 1, 043201) treats a slender conical bullet penetrating a vascular tissue surface. The bullet's potential-flow field accelerates blood at the free surface outward (against the bullet direction), and Rayleigh–Taylor instability of that accelerated surface determines drop size and count.
Comiskey, Yarin & Attinger 2017 (Phys. Rev. Fluids 2, 073906) treats forward (downrange) spatter from the bullet wake exiting tissue. The same Rayleigh–Taylor framework applies, with a different potential-flow geometry. Drag deceleration over the 61 cm flight to the backdrop is then computed via Reynolds-dependent drag coefficient (Eq. 25):
Independent of the ballistic models, the time from wounding to visible blood on the skin surface is governed by pressurized flow through the wound channel. Torricelli's equation for jet velocity from a vessel at pressure P:
Bullet: .30 cal (7.62 mm) spitzer, semi-jacketed, 150 gr, 800 m/s impact velocity. Tip semi-angle θ = 14°. Penetration depth at peak ejection h = 20 mm. Blood properties: ρ = 1060 kg/m³, σ = 0.06045 N/m, μ = 3.7 cP, viscoelastic. Back-spatter cone half-angle 57° (per high-speed video studies). Forward-spatter cone half-angle 15°. Ejected back-spatter volume calibrated to 0.3 mL; ejected forward-spatter volume calibrated to 1.5 mL.
Prediction 1 — Entry Shirt
The model predicts approximately 4.4 million back-spatter droplets of 27–84 µm diameter, ejected in a wide ~57° cone toward the shooter, depositing on any surface within centimeters of the entry wound. With the shirt 5 mm in front of the skin and the wound site exposed, essentially every droplet reaches the fabric within 1–2 ms.
Drop diameters spread on impact according to the Weber/Ohnesorge stain-spreading law (paper Eq. 29), producing visible stains of 120–240 µm. The dominant pattern is a dense radial halo of fine, individually resolvable stains extending 2–3 cm from the bullet hole, fading into scattered satellite drops at the periphery.

3,000 individually rendered stains, scaled and oriented per the impact velocity and angle from each subfamily. Central black region is the predicted bullet perforation (7.6 mm). Scorching halo represents thermal/contact transfer. The dense 2–3 cm halo of fine elongated stains is the back-spatter signature. Scale bar 2 cm.

Four-panel diagnostic: predicted droplet size distribution from the Rayleigh–Taylor instability, predicted stain radial distribution at the close shirt and far backdrop ranges, and the 2D pattern projection.
For a real high-velocity rifle round to a vascular neck target with an exposed shirt nearby, this pattern is unavoidable. Its absence from the recorded evidence is a primary forensic observation. In video2_1.mp4, the white "Freedom" t-shirt remains visually clean at Frame 68 (the claimed impact reference frame, t = 2.239 s) and through the subsequent frames preceding visible blood at Frame 81–82. A back-spatter cone of the predicted density would deposit within ~2 ms of impact — that is, before the next frame could capture absence-to-presence at 30 fps. The shirt shows no spatter halo at any frame.
Prediction 2 — Forward Spatter
The forward-spatter model predicts approximately 22 million drops of 19–460 µm diameter, ejected with the bullet wake in a tight ~15° cone, traversing the 61 cm gap to the backdrop and impacting at speeds of 3–20 m/s after drag deceleration.
Peak stain density is predicted at the geometric cone projection: 61 cm × tan(15°) = 16.3 cm radial from the bullet line. Maximum reach extends to 67 cm due to large slow drops drifting under gravity. The model predicts approximately 8,800 stains visible on a 60 cm × 60 cm portion of the backdrop.

Multi-panel diagnostic of forward-spatter trajectory integration. Top left: free-surface velocity vz(r) and droplet diameter l*(r). Top right: number-weighted size distribution. Bottom: radial stain distribution and 2D pattern with color encoding impact speed. Peak stain density at 15.7 cm, consistent with cone projection.
The American Comeback banner and tent backdrop visible in multiple recordings should have caught the forward-spatter cone. The frame sequences show no such pattern. The forward-spatter prediction is independent of the back-spatter prediction; both null observations require explanation.
Prediction 3 — Bleeding Timing
Frame-by-frame analysis of video2_1.mp4 (30 fps), the closest available eyewitness recording with an unobstructed view of the seated subject, establishes the bleeding-onset interval directly from the source video. Three reference frames anchor the measurement:

Frame 68 (t = 2.239 s): subject seated, shirt clean, no posture distress; this frame defines the t=0 reference. Frame 70 (+66 ms): posture beginning to shift; no blood visible. Frame 81 (+429 ms): first mark appearing on the right side of the neck. Frame 82 (+461 ms): blood unambiguously visible. Throughout the 461 ms window, the wound site is on exposed skin with no fabric obstruction.
For comparison, Torricelli–Bernoulli flow through an open wound channel of bullet diameter, from a vessel at typical physiological pressure, predicts the following:
| Vessel | vjet | Q (mL/s) | t to 0.1 mL | t to 1 mL |
|---|---|---|---|---|
| Carotid (systolic, peak) | 5.72 m/s | 287 | 0.35 ms | 3.48 ms |
| Carotid (mean arterial) | 4.84 m/s | 243 | 0.41 ms | 4.11 ms |
| Carotid (diastolic, trough) | 4.49 m/s | 225 | 0.44 ms | 4.43 ms |
| Jugular (mean venous) | 1.42 m/s | 71 | 1.40 ms | 14.0 ms |
For an exposed neck wound (no fabric to wick through), the expected delay to a photographically resolvable bloodstain is 1–5 ms for carotid involvement, 5–15 ms for jugular involvement. The observed 429–461 ms interval is 30× to 110× longer than physics predicts.
At a heart rate of 60–72 bpm, one cardiac cycle is 833–1000 ms. The observed delay corresponds to roughly half a cardiac cycle — a duration during which a real vascular wound would have produced visible blood within the first ~5% of that interval. The interval itself is the anomaly; it requires explanation.
Three explanations are consistent with the observed timing:
The standard rifle-shot account predicts three independent observables. None are present in the recordings. The three alternative explanations (no major vessel struck, pre-existing arrest, mis-identified t=0) each account for the absence in a different way, but all three are inconsistent with the prosecution's stated mechanism. The simplest unifying alternative — an internal energetic event at the RØDE transmitter location rather than an external projectile — is documented in Sections 01–04 of the main analysis and accounts for all three null observations simultaneously.
Methodology
The complete analysis is implemented in approximately 350 lines of Python (NumPy + SciPy + Matplotlib). The core computation has three phases: subfamily generation (discretizing the continuous distribution of drop sizes into rings of constant r/a), trajectory integration (vectorized RK2 with Reynolds-dependent drag and adaptive sub-stepping per drop), and stain rendering (Weber/Ohnesorge spreading with radial-direction elongation).
For each ring i defined by inner radius bi and outer radius bi+1 (geometrically spaced from 1.05a to 5a), the closed-form mass integral (Eq. 23 of the 2017 paper for forward spatter; Eq. 24 of the 2016 paper for back spatter) gives Mi. The droplet diameter li* is evaluated at the bin midpoint. The number of drops per bin is then ni = Mi / (ρ π li*3 / 6).
def back_subfamilies(n_rings=80): h = h_penetration r_min = theta_tip * h * 1.05 r_max = 0.05 r_edges = np.geomspace(r_min, r_max, n_rings + 1) r_mid = np.sqrt(r_edges[:-1] * r_edges[1:]) # Eq. 21: A = -theta^2 V^2 / r A_mag = theta_tip**2 * V**2 / r_mid # Eq. 22: l* = 2 pi w / sqrt(rho |A| / 3 sigma) l_i = 2*np.pi * w_slender / np.sqrt(rho * A_mag / (3 * sigma)) # Eq. 23: v_z = -theta^2 V (h/r) v_z = theta_tip**2 * V * h / r_mid # Eq. 24: M_i = 2 pi rho (h theta)^2 (b_i+1 - b_i) c db = np.diff(r_edges) / h M_i = 2 * np.pi * rho * (h * theta_tip)**2 * db * c_slender M_i *= (target_volume * rho) / M_i.sum() n_i = M_i / (rho * (4/3) * np.pi * (l_i/2)**3) return r_mid, l_i, v_z, n_i, M_i
Each drop's trajectory in 3D with quadratic drag and gravity is integrated using midpoint (RK2) stepping. All drops are integrated simultaneously as NumPy arrays. Per-drop step size is adapted to each drop's stopping time, so a 20 µm drop and a 400 µm drop both integrate to acceptable accuracy without forcing the small-drop step on every drop. Reynolds-dependent drag coefficient (Eq. 25) and a phenomenological dense-spray wake-drag-reduction factor are applied.
The wake-drag-reduction factor (WAKE_FACTOR = 0.2) is a phenomenological knob in the current implementation. The proper two-phase jet treatment from Comiskey/Yarin/Kim/Attinger 2016 would replace it; sensitivity to that factor is documented in the source code. Absolute droplet counts also depend on the dimensionless impulse-time factor c, which is calibrated to specific experimental geometries in the source papers; for the prosecution's stated geometry the calibration is approximate. The shape of the predicted patterns (radial cone projection, droplet-size distribution, bleeding-onset timing) is robust to both knobs; the absolute counts are not.
Verify It Yourself
The complete Python pipeline is available below. It runs on any system with Python 3.8+, NumPy, SciPy, and Matplotlib (Plotly optional for the 3D visualizations). All parameters — impact velocity, bullet caliber, vessel pressure, standoff distance, ejected volume — are exposed at the top of the script so independent investigators can vary them and re-run.
The script implements each equation from the source papers directly, with the equation number and source paper cited inline. There are no hidden constants, no synthetic data, no fitted parameters used to make the predictions match a desired outcome. The predictions follow from the equations, the published calibration values, and the prosecution's stated impact parameters.
Complete back- and forward-spatter pipeline with Re-dependent drag, RT droplet generation, and trajectory integration. Generates the shirt-face and backdrop figures shown above.
Download Python ScriptShirt-face renderer. Takes the back-spatter subfamily output and produces the exhibit photograph showing the predicted entry-shirt pattern. Configurable standoff, color, and stain rendering.
Download Python ScriptBleeding-onset timing calculation. Torricelli–Bernoulli jet velocity for carotid and jugular at physiological pressures; predicted time to a photographically resolvable blood volume on the skin.
Download Python Script1. Install dependencies: pip install numpy scipy matplotlib plotly
2. Save the .py files (the download attribute restores the proper filename).
3. Run: python blood_spatter_pipeline.py to regenerate the back-spatter and forward-spatter figures. Run python shirt_face_2d.py to regenerate the shirt-face exhibit. Run python vascular_timing.py to regenerate the bleeding-onset table.
4. All parameters — impact velocity, bullet geometry, blood properties, ejected volume, wake factor, standoff distance — are at the top of each script. Vary them and re-run.
The scripts use the equations as published in Comiskey/Yarin/Kim/Attinger 2016 (Phys. Rev. Fluids 1, 043201) and Comiskey/Yarin/Attinger 2017 (Phys. Rev. Fluids 2, 073906). If you obtain different predictions for the same input parameters, contact followtheepicenter.com.
Prediction of blood back spatter from a gunshot in bloodstain pattern analysis. Phys. Rev. Fluids 1, 043201. The slender-bullet model used for back-spatter prediction.
Open at journalHydrodynamics of back spatter by blunt bullet gunshot with a link to bloodstain pattern analysis. Phys. Rev. Fluids 2, 073906. The blunt-bullet model used for forward-spatter prediction.
Open at journalSummary
The peer-reviewed hydrodynamic models, applied to the prosecution's stated impact parameters, predict three independent observables: a dense back-spatter halo around the entry wound, a forward-spatter cone on the downstream backdrop, and visible bleeding within tens of milliseconds. None of the three are present in the recorded evidence.
The simplest explanation that accounts for all three null observations is that the wound mechanism was not what the prosecution claims. A localized internal energetic event — documented elsewhere in this site through dense optical flow, gas-release imaging, acoustic source localization, and shooter-position analysis — produces no high-velocity bullet wake through tissue and no major vascular jet, and would not be expected to produce any of the three predicted hydrodynamic signatures.
This page does not assert what did happen. It establishes what the physics requires if the prosecution's account is correct, and documents the failure of those requirements against the recorded evidence. The combination of three independent failed predictions is what carries the forensic weight.
The full Python pipeline above allows the prosecution's experts — or any independent expert — to verify these predictions, vary the input parameters, and report any conditions under which the three observables would be absent for a real high-velocity rifle round to a vascular target. The model parameters used here are the published values from the cited peer-reviewed work; no parameter has been adjusted to fit the desired conclusion.