# Anvesha (अन्वेषण, search): drift search areas for missing boats and people

Product spec and methods note. Owner: Anvesha module. Status: built, awaiting integrator review.

**A search planning aid. Advisory only.** The Indian Coast Guard coordinates every search at sea
through its Maritime Rescue Coordination Centres (MRCC Mumbai, Chennai and Sri Vijaya Puram).
Maritime search and rescue toll free: **1554** (Inmarsat-C code 43). Follow IMD and INCOIS warnings
and the state fisheries department.

## What it is

Anvesha estimates where a missing boat or person in the water may have drifted in the 72 hours after
the last known position (LKP). It drifts 500 to 2,000 possible histories of the object (particles) on
hourly surface currents and 10 m winds from Open-Meteo, with the wind-driven drift (leeway) that the
US Coast Guard measured for each kind of object, and reports the boxes that hold 50% and 90% of the
particles, a density map, where particles reach the shore, and a text a planner can send.

The model runs twice, identically: in Python (`pipeline/trinetra/anvesha/`, the reference) and in the
browser (`dashboard/anvesha/engine.js`), which fetches Open-Meteo directly so an operator's position
never reaches Trinetra. The test suite runs the browser engine under Node and compares it with Python
particle by particle.

| Surface | Path | Audience |
|---|---|---|
| Drift tool | `/dashboard/anvesha/` | Coast Guard centres, fisheries departments, district control rooms |
| Methods | `/dashboard/anvesha/methods.html` | anyone checking the work |
| Product page | `/products/anvesha.html` | partners, buyers, public |
| Pipeline | `cd pipeline && python3 -m trinetra.anvesha run` | builds the exports |
| Command-line case | `python3 -m trinetra.anvesha case --lat 16-06.0N --lon 082-15.0E --time "2026-10-21 05:30"` | operators without a browser; prints, writes nothing |

## The drift tool

One page, in reading order:

- **Case form** (left): last known position (decimal degrees or degrees and minutes, or a click on the
  map), time in IST with its UTC echo, uncertainty radius, release window, object class with its
  leeway at 10 m/s, and model settings (particles, forcing error level, seed). **Run drift** fetches
  forcing and runs in the tab; **Close case** wipes everything. Two simulated demo cases sit below.
- **Map** (right, kept in view while the form scrolls on wide screens): density, particles (adrift,
  ashore, stopped at the block edge), the 50% and 90% boxes or ellipses, the centre track and the LKP,
  with a timeline slider from +0 to +72 h, jump buttons for the five output times, and play. Cases are
  fitted at quarter zoom steps so the cloud fills the map.
- **Numbers for the selected hour:** centre drift and bearing, both box areas and sides, the share
  ashore, particles adrift or not yet adrift, and the time.
- **Search boxes** with corners in degrees and minutes, clockwise from the northernmost, and a copy
  button; **text to send** as SMS or full briefing.
- **Particle clouds** at +6, +12, +24, +48 and +72 h drawn on one scale from the coastline data, without
  map tiles, so they print and compare.
- **Charts over 72 hours:** box areas, centre distance from the LKP and the share ashore, with the
  selected hour marked; then **conditions at the LKP** (current and wind speed, and a six-hourly table
  of directions with their conventions).
- **Coast Guard contacts** for the position, **privacy**, and an **engine check** that compares the
  browser run with the Python export for demo cases.

Every result panel names its source and the forcing retrieval time; simulated cases carry the
Simulated chip in each. The toolbar pill starts as the shell's "Simulated data" (the page opens on a
demo); after a live run it shows the forcing time ("Forcing just now", and "Demo forcing" for a demo
reopened afterwards).

## Problem

Eight fishers from B.R. Ambedkar Konaseema district, Andhra Pradesh, sailed from Odalarevu jetty at
10 a.m. on 3 August 2026. Phone contact ended at 11 a.m. and the boat was due back on 12 August. By 18
August Coast Guard vessels were searching and fishing boats from Kakinada, Bhairavapalem,
Visakhapatnam and Paradip had been alerted (PTI via Telangana Today, 18 August 2026,
https://telanganatoday.com/eight-ap-fishermen-missing-at-sea-since-august-3-search-operation-underway).

The search area grows every hour, and how it grows depends on the object. In a 10 m/s wind the wind
alone moves a person in the water about 9.6 cm/s relative to the water (4.5 nautical miles a day), a
small open boat 31.5 cm/s (15 NM a day) and a life raft without ballast 37 cm/s (17 NM a day), and
each may veer to either side of the wind (Allen 2005). Currents, winds and leeway data are public; the
work is in combining them correctly and quickly.

## Model

Each particle is one possible history of the object. Its velocity is

```
v      = (u_c + e_c) + DWL · d + CWL · r                        m/s
w'     = w + e_w;   U = |w'|;   d = w' / U;   r = (d_north, −d_east)
DWL    = ((a_d + eps_d/20) · U + (b_d + eps_d/2)) / 100           downwind leeway
CWL    = ((a_c + eps_c/20) · U + (b_c + eps_c/2)) / 100           crosswind leeway, + right of downwind
```

with `u_c` the surface current, `w` the 10 m wind, `a` in percent of U (cm/s per m/s), `b` and `eps` in
cm/s. `d` is the downwind unit vector and `r` the unit vector 90 degrees clockwise of it (to the right
when facing downwind).

Per-particle uncertainty:

- **Start position:** circular normal around the LKP with standard deviation r/2 for a stated
  uncertainty radius r, so 86.5% of particles start within r (Breivik and Allen 2008, section 3.3).
- **Start time:** uniform over an optional release window after the stated time ("drift began
  within"); a particle starts at the first 10 minute step at or after its release time.
- **Leeway coefficients:** one draw per particle for the whole run (Breivik and Allen 2008, eqs. 6 and
  7): `eps ~ N(0, S)` with S the regression's standard error; at 10 m/s the error splits equally
  between slope and offset. A downwind draw that would make the slope negative is redrawn, up to 8
  times, as in OpenDrift.
- **Side of the wind:** half the particles start right of downwind and half left; each switches side
  (jibes) with probability 4% per hour (Allen 2005), `P(jibe in dt) = 1 − (1 − 0.04)^(dt/1 h)`. A jibing
  particle uses the other side's crosswind fit and keeps its own standard-normal deviate.
- **Forcing errors (heuristic):** each vector component of the current and wind error is red noise,
  `e(t+dt) = phi · e(t) + sigma · sqrt(1 − phi²) · xi`, `phi = exp(−dt/tau)`, started from its
  stationary distribution. Levels: low 0.05 m/s and 1.0 m/s; standard (default) 0.10 m/s and 2.0 m/s;
  high 0.20 m/s and 3.0 m/s; tau 12 h for currents and 6 h for wind. These are of the order of published
  model errors but are not calibrated for Indian waters.

Integration is second-order Runge-Kutta (midpoint), `x(t+dt) = x + dt · v(t + dt/2, x + dt/2 · v(t, x))`,
with dt = 600 s (432 steps for 72 h), on a sphere of radius 6,371,008.8 m treated as locally flat over
one step. Errors and side are held fixed within a step.

**Stranding.** A particle whose next position falls on a land pixel stays at its last position in the
water and counts as ashore. The land mask rasterises Natural Earth 1:10m land and minor islands at
1/256 degree (about 430 m) by even-odd scanline fill at pixel centres, polygon by polygon. One that
would leave the 5 degree forcing block stops at its edge and is reported as outside.

**Random numbers.** mulberry32, used as a counter-based generator: the k-th uniform is a pure function
of `seed + (k + 1) · 0x6D2B79F5 mod 2³²`, computed with exact integer arithmetic in numpy and with
`Math.imul` in JavaScript, so the two engines draw identical numbers. Normals use the Box-Muller cosine
branch. Every quantity has a fixed address (slot × N + particle), so a particle's history does not
depend on which other particles are active. Demo seed 20261021.

### Direction conventions

| Field | Convention | To (u east, v north) |
|---|---|---|
| Open-Meteo `ocean_current_direction` | direction the water flows **towards**, degrees true | u = s sin θ, v = s cos θ |
| Open-Meteo `wind_direction_10m` | direction the wind blows **from**, degrees true | u = −s sin θ, v = −s cos θ |
| Crosswind leeway | positive to the right of downwind (Breivik et al. 2011) | r = (d_north, −d_east) |

Both APIs are asked for m/s (`wind_speed_unit=ms`), which gives currents to 0.01 m/s instead of 0.1
km/h. Time is stored and requested in UTC (unix seconds) and shown in IST (UTC+05:30).

### Leeway classes

Coefficients exactly as tabulated by the US Coast Guard in the SAROPS object list (Allen 2005) that
OpenDrift publishes as `OBJECTPROP.DAT` (updated 2011-08-25 by Ø. Breivik). Slopes in % of the 10 m
wind speed, offsets and standard errors S in cm/s.

| Code | Object | Down slope % | Down offset | Down S | Right slope | Right offset | Right S | Left slope | Left offset | Left S | At 10 m/s: down / right / left, cm/s |
|---|---|---|---|---|---|---|---|---|---|---|---|
| PIW-1 | Person in water, state unknown (mean values) | 0.96 | 0.00 | 12.00 | 0.54 | 0.00 | 9.40 | -0.54 | 0.00 | 9.40 | 9.6 / +5.4 / -5.4 |
| PIW-2 | Person in water, upright, buoyancy vest (PFD type III), conscious | 0.48 | 0.00 | 8.30 | 0.15 | 0.00 | 6.70 | -0.15 | 0.00 | 6.70 | 4.8 / +1.5 / -1.5 |
| PIW-6 | Person in water, deceased (face down) | 1.117 | +10.20 | 3.04 | 0.04 | +3.90 | 4.05 | -0.04 | -3.90 | 4.05 | 21.4 / +4.3 / -4.3 |
| SKIFF-1 | Small open boat with outboard (skiff, modified-V hull), proxy | 3.15 | 0.00 | 2.20 | 1.29 | 0.00 | 2.20 | -1.29 | 0.00 | 2.20 | 31.5 / +12.9 / -12.9 |
| SKIFF-2 | Skiff, V-hull | 2.87 | +3.98 | 3.33 | 0.32 | -2.93 | 2.53 | -0.62 | +1.03 | 3.05 | 32.7 / +0.3 / -5.2 |
| SKIFF-3 | Small boat, swamped or capsized | 1.65 | 0.00 | 3.10 | 0.39 | 0.00 | 2.90 | -0.39 | 0.00 | 2.90 | 16.5 / +3.9 / -3.9 |
| FISHING-VESSEL-1 | Fishing vessel, general (mean values), proxy | 2.47 | 0.00 | 12.00 | 2.76 | 0.00 | 9.40 | -2.76 | 0.00 | 9.40 | 24.7 / +27.6 / -27.6 |
| FISHING-VESSEL-6 | Fishing vessel, gill-netter with rear reel, proxy | 3.72 | -0.87 | 3.33 | 1.41 | +2.00 | 3.36 | -1.41 | -2.00 | 3.36 | 36.3 / +16.1 / -16.1 |
| LIFE-RAFT-DB-10 | Life raft, deep ballast, general (mean values) | 3.52 | -2.50 | 6.10 | 0.62 | -3.00 | 3.50 | -0.45 | -0.20 | 3.60 | 32.7 / +3.2 / -4.7 |
| LIFE-RAFT-DB-15 | Life raft, 4 to 14 person, deep ballast, canopy, with drogue | 1.91 | +0.90 | 1.60 | 0.78 | -3.60 | 3.60 | -0.47 | -0.10 | 3.90 | 20.0 / +4.2 / -4.8 |
| LIFE-RAFT-NB-1 | Life raft, no ballast, general (mean values) | 3.70 | 0.00 | 12.00 | 1.98 | 0.00 | 9.40 | -1.98 | 0.00 | 9.40 | 37.0 / +19.8 / -19.8 |
| FV-DEBRIS | Fishing vessel debris | 1.97 | 0.00 | 8.30 | 0.36 | 0.00 | 6.70 | -0.36 | 0.00 | 6.70 | 19.7 / +3.6 / -3.6 |
| SLDMB | Water-following drifter, no windage (current only) | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.0 / 0.0 / 0.0 |

No leeway field trials exist for Indian fishing craft (FRP boats with outboards, kattumaram, vallam,
mechanised trawlers and gill-netters). The three classes marked proxy are the closest published
classes; the general fishing vessel class has a wide error (12 cm/s) and gives a correspondingly large
area. Widen the search when the craft is unusual.

## Forcing

| Field | Request | Grid | Hours |
|---|---|---|---|
| Currents | Open-Meteo Marine `hourly=ocean_current_velocity,ocean_current_direction`, `cell_selection=sea` | 21 × 21 nodes at 0.125 + 0.25k degrees, ±2.5 degrees around the node nearest the LKP | LKP hour to +73 h (74 hourly values) |
| Winds | Open-Meteo Forecast `hourly=wind_speed_10m,wind_direction_10m` (best-match model) | the 0.5 degree lattice block covering the current block (11 × 11 or 11 × 12 nodes) | same |

The current lattice hits every third MeteoFrance SMOC cell centre ((k + 0.5)/12 degrees) exactly. SMOC
is the Copernicus Marine surface merged current: circulation, tides and wave Stokes drift at 1/12
degree. Both lattices are fixed to the globe, so a request names the area to about 15 km and never the
exact position. Sampling is bilinear in space and linear in time. Nodes with no sea value (inland) are
filled by repeated means of their valid 4-neighbours (Jacobi order south, north, west, east) so
interpolation near the coast never meets a hole.

Open-Meteo's free API is for non-commercial use, at most 600 calls a minute, 5,000 an hour and 10,000
a day, where a request for n locations counts as n calls. One case makes 2 HTTP requests that count as
at most 573 calls (441 current nodes and 121 or 132 wind nodes). The pipeline keeps a rolling
one-minute budget, uses explicit timeouts (connect 10 s, read 60 s for the large requests), retries
server errors with backoff, does not retry 429, and caches raw responses under
`pipeline/cache/anvesha/` (gitignored). An operational deployment needs an
Open-Meteo subscription or a self-hosted Open-Meteo, which is open source and can run on Indian soil.
Hindcasts are limited to the last 90 days (Open-Meteo keeps about 92 days of past forecasts).

## Search areas (heuristic)

All particles count wherever they are: adrift, ashore at their stranding point, or stopped at the
block edge.

- **Centre:** the mean position.
- **Boxes:** in a local equirectangular frame about the mean, the principal axes of the covariance give
  two directions with standard deviations s1 and s2. Each particle gets the box distance
  `max(|p|/s1, |q|/s2)`. With Q the P-quantile of those distances (the k-th smallest, k = ceil(P n)),
  the box with half-sides Q·s1 and Q·s2 holds at least P of the particles, whatever the cloud's shape.
  Half-sides get 2 m extra so rounding corners to 5 decimals never leaves the boundary particle out.
  Corners are listed clockwise from the northernmost, as IAMSAR search areas are described.
- **Ellipses:** the same construction with `(p/s1)² + (q/s2)²`; for a normal cloud they match the
  textbook containment ellipses (tested).
- **Radius:** the distance from the centre holding P of the particles (used in the SMS).
- **Density:** counts on a latitude-longitude grid whose cell is a round number of nautical miles,
  about 1/30 of the 90% box.
- **Shoreline:** the share of particles ashore, their centre and the radius holding 90% of them.

These areas say where the object may be. They are not a search plan: sweep width, probability of
detection and effort allocation belong to the MRCC under the IAMSAR Manual. When the cloud splits left
and right of the wind, a box can enclose an empty middle; the density map shows it.

## Text outputs

**SMS.** Two parts at most, in the GSM 03.38 basic alphabet (no degree sign; 153 characters a part),
positions in the NAVAREA style `16-06.0N 082-15.0E`, times in IST:

```
EXERCISE, SIMULATED CASE
DRIFT EST, ADVISORY: FISHING VESSEL
LKP 16-06.0N 082-15.0E 21OCT 0530 IST
+24H 22OCT 0530 IST
CENTRE 15-59.6N 081-45.7E, 50% WITHIN 8.6NM
90% BOX 16-16.1N 081-30.9E/15-59.2N 082-08.4E/15-43.2N 082-00.6E/16-00.0N 081-23.1E
MRCC CHENNAI 044-25395018 OR 1554
```

The shore line ("16% REACH SHORE") appears from 0.5% of particles. **Briefing:** every output time with
both boxes, drift distance and bearing, the shoreline, the forcing retrieval time and the coordinating
MRCC.

**Rounding.** Python's `round()` and `format()` send exact ties to even, JavaScript's `toFixed()` sends
them up, so 8.25 NM would read 8.2 in one engine and 8.3 in the other. Text and screen numbers instead
use `floor(|x| · 10^d + 0.5)` in integers (ties away from zero) in both engines. Percentages work on
basis points: whole percent from 1%, one decimal from 0.1%, two below, so one stranded particle in
1,000 reads 0.1%, never 0%.

## Contacts

Verified 21 Oct 2026 from the Indian Coast Guard's own pages:

| Centre | Number | Source |
|---|---|---|
| Maritime SAR, national | 1554 toll free; Inmarsat-C code 43 | Maritime Search & Rescue Bulletin, Vol 1 Issue 1 (Aug 2022), cover |
| MRCC Mumbai | +91 22 2438 8065, +91 22 2438 3146 | Contact Us (West), page updated 23 Aug 2026 |
| MRCC Chennai | +91 44 2539 5018 (Region East operations centre +91 44 2539 5016) | Bulletin, SAR points of contact; Contact Us (East), 23 Aug 2026 |
| MRCC Sri Vijaya Puram (Port Blair) | none listed on a reachable official page; call 1554 | SAR Organisation page |
| 31 sub-centres (MRSC) | numbers as printed in the bulletin | Bulletin, pp 15 to 18 |

The tool names the MRCC above the nearest sub-centre as the likely coordinator and lists the three
nearest sub-centres by straight-line distance from approximate town positions. Search responsibility
follows the search and rescue region boundaries, which the MRCC decides; the sorting is a convenience.

## Demo cases (simulated)

Both cases start at 00:00 UTC (05:30 IST) on the run date with invented positions, times and objects,
on Open-Meteo model currents and winds for those hours: analyses up to the retrieval time and forecasts
after it. Neither is a real incident, and the Konaseema case is not the boat missing since 3 August.
Results from the 21 Oct 2026 export (forcing retrieved 05:05 UTC):

| Case | LKP | Object | Radius, window | +24 h drift | +24 h 90% box | +72 h drift | +72 h 90% box | Ashore at +72 h |
|---|---|---|---|---|---|---|---|---|
| Off Konaseema, Bay of Bengal | 16.10 N 82.25 E, 23 NM off the Godavari delta | fishing vessel (general) | 2 NM, none | 28.9 NM on 257° | 706 NM² | 62.8 NM on 249° | 4,396 NM² | 16% |
| Palk Bay, north of Rameswaram | 9.60 N 79.35 E | person in water | 0.5 NM, 2 h | 6.2 NM on 188° | 346 NM² | 11.7 NM on 176° | 1,054 NM² | 27% |

In both, particles jibe 0.97 times a day on average (theory 144 × 0.68% = 0.98) and 95.3% jibe at
least once in 72 hours (theory 1 − 0.96⁷² = 94.7%).

## Privacy and doctrine

- The browser keeps the case in one in-memory variable. Nothing is written to localStorage,
  sessionStorage, cookies, IndexedDB or the URL. The console audit log records that a case ran or
  closed, with the object class and settings, never the position or time. Forcing requests use
  `cache: "no-store"`, `credentials: "omit"` and `referrerPolicy: "no-referrer"`.
- A position on land is refused before anything is fetched.
- **Close case** clears the form, results, map, frames, charts and text, and clears the clipboard if
  any case text was copied since the last close, even if a run finished after the copy.
- The command-line case prints its result and writes nothing to disk, not even its forcing.
- Events and conditions, never people: the object classes describe what is adrift; no names are taken
  or stored. The areas are never used to enforce a maritime boundary.

## Verification

`python3 -m pytest tests/test_anvesha.py -q` (offline, 106 tests) covers:

- geodesy and formatting: offsets, haversine, bearings, degree-minute formatting and parsing (decimal,
  hemisphere letters, NAVAREA hyphens, seconds), with rejection of malformed input;
- conventions: a current towards 090 moves east, a wind from 090 blows west, right of downwind is
  clockwise;
- random numbers: mulberry32 bit for bit against the JavaScript algorithm, slot independence, unit
  variance;
- leeway: the table as published, the eps/20 and eps/2 split, non-negative downwind slopes, crosswind
  branches by side, jibe probability per step;
- grids: SMOC-aligned lattices, Open-Meteo parsing and rejection of bad responses, gap filling,
  exact bilinear sampling of linear fields;
- integration on known fields: a uniform 0.5 m/s current moves every particle exactly 43.2 km in 24 h;
  in solid-body rotation the midpoint step keeps a particle on its 20 km circle to within 60 m over a
  full turn; leeway pushes downwind and splits left and right; particles strand and never enter land;
  release windows hold particles at the start; red-noise current errors reproduce the
  Ornstein-Uhlenbeck displacement variance; runs are deterministic for a seed;
- areas: principal axes of a rotated Gaussian, boxes and ellipses holding their share and matching
  theory, corner order, degenerate clouds;
- text: GSM-7 segment counting, IST formats, SMS length, half-up numbers and basis-point percentages
  in both engines;
- export end to end from cached fixtures, last-good-export retention when forcing is missing, the
  request plan, the product-page preview;
- **two engines, one answer:** under Node, `engine.js` reproduces the Python particles for both demo
  cases to within 1e-9 degrees (largest observed 1.6e-14, a few nanometres), with identical jibes,
  land pixels, statuses, SMS texts and briefing.

## Exports (`dashboard/data/anvesha/`)

| File | What | Size |
|---|---|---|
| `coast.json` | Natural Earth land and minor islands, 8 S to 28 N and 60 to 103 E, Douglas-Peucker 0.002 degrees, 4 dp | 210 KB |
| `leeway.json` | the 13 classes with coefficients, errors, SMS labels and the forcing-error levels | 7 KB |
| `contacts.json` | MRCC and MRSC numbers with sources | 6 KB |
| `case_konaseema.json`, `case_palk-bay.json` | SIMULATED cases: inputs, the forcing used, hourly statistics, particles and status at +6, +12, +24, +48 and +72 h, SMS and briefing | 407 and 374 KB |
| `cases.json` | index of demo cases with headline numbers | 1 KB |
| `preview.json` | 300 particles of the Konaseema case at +6, +24 and +72 h with boxes, track and coast, for the product page | 20 KB |
| `manifest.json` | provenance: sources with retrieval times, seed, files, methods, stale flags | 4 KB |

`python3 -m trinetra.anvesha run --offline` rebuilds every file from the cache and reproduces the
committed exports exactly apart from `generated_at`. A failed fetch keeps the last good case file and
marks it stale in the manifest.

## Limits and failure modes

- **Coastal currents are poorly resolved.** SMOC runs at about 9 km and Anvesha samples every 0.25
  degree. River plumes (Godavari, Krishna), estuaries, harbour approaches and the surf zone are missing.
- **Waves are only partly in.** SMOC includes Stokes drift and measured leeway already contains part of
  the wave effect (it is measured against water 0.3 to 1.0 m deep), so downwind drift may be slightly
  overstated in rough seas. Breaking waves, surf and refloating are not modelled.
- **Leeway fits extrapolate** outside the trial winds; calm and cyclonic conditions are uncertain.
- **No vessel behaviour:** no engine, anchor, sail or tow after the release time; no swamping mid-drift
  (run the swamped class as a second case).
- **Coastline at 1:10m:** small islands, reefs, mangroves and harbours may be missing; stranding is
  resolved to about 0.4 km.
- **One forcing realisation:** each run uses the latest forecast or analysis; past hours are model
  analyses, not observations. Rerun as forecasts update and as sightings narrow the area.
- **Horizon 72 hours.** A boat reported days late needs new runs from each sighting or debris find;
  Anvesha does not chain runs.
- **Edge of the block:** particles leaving the 5 degree block stop at its edge; the tool warns when more
  than 1% do.

## References

1. Allen, A. A. and Plourde, J. V. (1999). Review of Leeway: Field Experiments and Implementation. US
   Coast Guard R&D Center, CG-D-08-99. https://apps.dtic.mil/sti/pdfs/ADA366414.pdf
2. Allen, A. A. (2005). Leeway Divergence. US Coast Guard R&D Center, CG-D-05-05. NTIS ADA435435.
3. Breivik, Ø. and Allen, A. A. (2008). An operational search and rescue model for the Norwegian Sea
   and the North Sea. Journal of Marine Systems 69, 99 to 113. doi:10.1016/j.jmarsys.2007.02.010
4. Breivik, Ø., Allen, A. A., Maisondieu, C. and Roth, J. C. (2011). Wind-induced drift of objects at
   sea: the leeway field method. Applied Ocean Research 33, 100 to 109. doi:10.1016/j.apor.2011.01.005
5. Dagestad, K.-F., Röhrs, J., Breivik, Ø. and Ådlandsvik, B. (2018). OpenDrift v1.0. Geoscientific
   Model Development 11, 1405 to 1420. doi:10.5194/gmd-11-1405-2018. Leeway table:
   https://github.com/OpenDrift/opendrift/blob/master/opendrift/models/OBJECTPROP.DAT
6. E.U. Copernicus Marine Service, Global Ocean Physics Analysis and Forecast with SMOC.
   doi:10.48670/moi-00016
7. Open-Meteo Marine and Forecast APIs, https://open-meteo.com/en/docs/marine-weather-api and
   https://open-meteo.com/en/docs; terms https://open-meteo.com/en/pricing
8. Natural Earth 1:10m physical vectors, https://www.naturalearthdata.com/downloads/10m-physical-vectors/
9. Indian Coast Guard: National Maritime SAR Coordinating Authority; SAR Organisation; Contact Us
   (West, East); Maritime Search & Rescue Bulletin, Aug 2022.
   https://indiancoastguard.gov.in/sites/default/files/202209050604245756604MARITIME.pdf
10. IMO and ICAO, IAMSAR Manual, Volume II, Mission Co-ordination.
