# Sarovara (सरोवर, lake): glacial lake and outburst-flood watch

Status: in development (registered in `dashboard/modules.json`, group Hazards). Real public data; nothing simulated.

- Console: `/dashboard/sarovara/` (watchlist board), `/dashboard/sarovara/lake.html?id=<lake id>` (one lake), `/dashboard/sarovara/methods.html` (methods)
- Product page: `/products/sarovara.html`
- Pipeline: `pipeline/trinetra/sarovara/`; exports in `dashboard/data/sarovara/`; tests in `tests/test_sarovara.py`

Sarovara is advisory. It flags conditions at glacial lakes; it does not detect or forecast outburst floods, and its watch level is a heuristic. Official warnings come from the Central Water Commission (CWC), NDMA, IMD, the National Center for Seismology (NCS) for earthquakes, state disaster management authorities and district administrations; in Nepal, DHM and NDRRMA.

## What it is

For 38 glacial lakes in India or upstream of it, Sarovara:

1. measures open-water area in the latest clear Sentinel-2 scene of the last 90 days, with a standard uncertainty, and renders the image with the detected shoreline;
2. compares it with two published inventories and with a scene from the same season in 2019 to 2021 measured the same way, and classes the lake as growing, stable or shrinking from the cleanest evidence;
3. scores three triggers at the lake: earthquakes of M4 and above within 100 km in 30 days (USGS), heavy rain and warm spells (Open-Meteo, adjusted to the lake's elevation);
4. combines triggers and documented hazard into a watch level (normal, watch, warning) and orders the board by a 0 to 100 monitoring priority;
5. for 20 lakes, lists towns downstream with river distance and an approximate flood-wave time, calibrated on the October 2023 Teesta flood.

## Problem

On the night of 3 to 4 October 2023, about 14.7 million m³ of frozen moraine collapsed into South Lhonak lake in North Sikkim; about 50 million m³ of water was released and damage was recorded along 385 km of the Teesta (Sattar et al. 2025; Petley 2025). The front reached Chungthang, 62 km downstream, about 2 h 17 min after the collapse, and the CWC gauge at Mekhliganj peaked about 15.8 h after it (SANDRP 2023, from CWC readings).

In 2026 a suspected outburst from a lake in Tibet sent a flood down Nepal's Bhote Koshi and Trishuli on 26 August, and a flash flood without reported heavy rain hit the Budhi Gandaki on 11 October; both rivers reach Bihar as the Gandak. Sikkim's 2026 assessment lists 40 high-hazard lakes, 16 at the highest risk (PTI, 4 Sep 2026). Most of these lakes sit above 4,500 m, freeze for half the year and are seen mainly from orbit.

## Users and the decision each makes

- State disaster management authorities and district administrations: which lakes need a field visit, a sensor or a drill, and when.
- CWC and IMD liaison officers: an independent second look between their own surveys.
- Glacial lake risk-reduction programme teams: which lakes are changing.
- Valley communities and volunteers: roughly how much time the towns below a lake might have.

## The watchlist

Built once by hand (selection notes in `pipeline/trinetra/sarovara/watchlist.py`):

1. Candidates: inventory lakes of at least 0.1 km² in Sikkim, Arunachal Pradesh, Uttarakhand, Himachal Pradesh, Ladakh and Nepal, and in Tibet catchments draining into Nepal (Koshi, Gandaki, Karnali, which reach Bihar and Uttar Pradesh), into Arunachal Pradesh, or into the Sutlej above Himachal Pradesh.
2. Documented hazard first: lakes named by the 2023 South Lhonak studies, ICIMOD and UNDP (2020), Sikkim's 2026 assessment (as reported by PTI), the 2024 Sikkim expedition (EastMojo), Uttarakhand's Vasudhara Tal early-warning system (ANI, Oct 2026) and the Geepang Gath reports (The Tribune, citing IISc researchers), wherever the lake could be matched to an inventory outline. Four lakes on Sikkim's high-risk list (Tenchungkha, Lachen Khangtse, Lachung Khangtse, La Tsho) have no published coordinates or OpenStreetMap entry and are not on the list.
3. Remaining places by area and growth per region, after checking location and type. Left out: plateau and tectonic lakes not fed by glaciers (Tso Kar, Tso Moriri), lakes on or next to the Line of Actual Control, and lakes in areas of disputed administration.

Regions on 21 Oct 2026: Sikkim (Teesta) 7, Arunachal Pradesh 5, Tibet draining to Arunachal Pradesh 2, Uttarakhand 4, Himachal Pradesh and the Sutlej 3, Ladakh 3, Nepal 7, Tibet draining to Nepal and Bihar 7. Tiers: 21 documented hazard, 13 large or growing, 4 other.

Names come from the cited literature, ICIMOD (2020) or OpenStreetMap; otherwise a descriptive name or ICIMOD's lake code, and the lake page says which. Vasudhara Tal's identification is a probable match by basin and elevation, and the page says so.

## Data

| Source | Use | Licence | Fetch |
|---|---|---|---|
| Glacial Lake Observatory inventory v1.02, Zenodo record 19370146 (Rawlins et al.; ESSD 2026) | Annual outlines 2017 to 2024 with area uncertainty, Nepal and transboundary catchments | CC BY 4.0 | Two GeoPackages, downloaded once, MD5-checked |
| High Mountain Asia glacial lake inventory, Zenodo record 17948783 (Kumar and Vijay 2025) | Outlines for 2016-17 and 2022-24 (median composites) | CC BY 4.0 | .dbf and .shx once, then one HTTP range request per lake on the 136 to 166 MB .shp |
| Sentinel-2 L2A, Microsoft Planetary Computer STAC API and Data API | Scenes over each lake; B02, B03, B04, B08 and SCL pixel windows on the 10 m grid | Copernicus data, free and open | One STAC search per period for all lakes; one Data API window per lake and scene, cached |
| USGS FDSN event service | M4.0+ earthquakes, last 30 days, 25.5 to 37° N, 74 to 99° E | Public domain | One request |
| Open-Meteo forecast API | Hourly temperature, precipitation, freezing level; past 31 days, next 4; at each lake's elevation | CC BY 4.0 | One request for all 38 lakes |
| OpenStreetMap (Nominatim, Overpass) | Lake names, location checks, positions of downstream towns | ODbL 1.0 | Curation step, checked 21 Oct 2026 |
| Curated sources | Documented hazards, recorded outbursts, 2023 Teesta timings | Cited | By hand, each linked where used |

## Method

The methods page (`/dashboard/sarovara/methods.html`) carries the full text with formulas and links; the thresholds table there is read from the export.

### Water area

1. Scenes: current period the last 90 days, `eo:cloud_cover < 20`, with a second pass under 60% for lakes left without a usable scene; baseline 15 Sep to 30 Nov of the earliest year from 2019 to 2021 with a usable scene under 50%. Up to 8 acquisitions per lake are tried newest first for the current scene and 3 per baseline year, closest in day of year; overlapping tiles of one overpass count as one acquisition.
2. Window: inventory outline padded by max(400 m, half the lake's size) on the scene's UTM grid, widened once if water reaches the edge.
3. Reflectance = (DN − offset) / 10000, offset 1000 for processing baseline 04.00 and later (ESA).
4. NDWI = (B03 − B08) / (B03 + B08) (McFeeters 1996). Threshold by Otsu (1979) on pixels in and around the outline, clamped to 0.10 to 0.40, else 0.20. Bright pixels (green > 0.45 with NDWI < 0.35) are snow or ice. SCL water with green and NIR < 0.03 counts as dark deep water.
5. Morphological opening, 8-connected bodies within 20 m of the outline kept, trimmed pixels restored, holes up to 4 pixels filled.
6. σ = √(σ_b² + σ_t²), with σ_b = 0.5 × shoreline pixels × 100 m² and σ_t = 0.5 × |A(t − 0.05) − A(t + 0.05)|.
7. Screening. Rejected: cloud (SCL 8 to 10, not over detected water) over > 5% of the outline, missing data > 1%, no open water, snow or ice > 30%. Flagged (kept, marked fair): snow or ice > 10%, shadow > 20%, water at the window edge, water beyond the outline > 25% of its area, open water < 60% of the outline, σ > 25% of the area. Current scenes: open water < 75% of the outline is flagged, or rejected if cloud or shadow is on the lake.

The 75% current-scene check was added on 21 Oct 2026 after Vasudhara Tal's 22 Sep 2026 scene measured 0.61 of its outline with no snow, ice or cloud detected: the image shows separate pools where the 2019 scene and the inventory show one lake. Clean current scenes on that run measured 0.91 to 1.07 of their outlines. The scene stays on the page with its flag; it no longer sets the growth class, which falls back to the inventory trend (+10.1% a year).

Thumbnails: true colour (B04, B03, B02) of the same window, averaged to 10 to 40 m per pixel, detected water in cyan and inventory outline in gold drawn into the pixels, indexed-colour PNG under 60 KB, rendered with numpy and zlib only. Detected shorelines for the map are traced along pixel edges (crack following, one ring per counted water body) and simplified to 8 m.

### Growth

- Inventory trend: weighted least squares (weights 1/σ²) on GLO annual areas, GLO outliers excluded, standard error the larger of model and residual estimates; two-epoch rate for HMA with SE = √(σ₁² + σ₂²) / Δt.
- Against the inventory: current Sentinel-2 area minus the latest inventory area (different methods; least reliable).
- Same season: current against the 2019 to 2021 autumn scene, both re-measured at each scene's threshold (`threshold_robust`).
- Significant when |Δ| > 2σ_Δ, σ_Δ = √(σ_new² + σ_old²). Class from the first available of: same season (both scenes clean, threshold-robust), inventory trend, against the inventory.

### Triggers (heuristics)

- Earthquake: active for any M4.0+ within 100 km in 30 days; strong for M5.0+ within 50 km or M6.0+ within 100 km. Great-circle distance, mean Earth radius 6,371.0088 km.
- Rain: rolling 24-hour totals over the 72 hours before and after the analysis time. Active at 64.5 mm in 24 h (IMD heavy) or 100 mm in 72 h; strong at 115.6 mm in 24 h (IMD very heavy) or 200 mm in 72 h. IMD's categories apply to station totals; here they are applied to model values.
- Warm spell: next-72-hour mean minus previous-30-day mean; active at ≥ 3 °C with a maximum above 0 °C on 2 of the next 3 days; strong at ≥ 5 °C on all 3. Rain falling while the freezing level is above the lake and positive degree-days are shown, not scored.

### Tier, level, priority

- Tier A documented hazard (past outburst, official or ICIMOD listing, published study); B large or growing (≥ 0.5 km² or significant growth); C other.
- Level: normal (no trigger), watch (any trigger), warning (a strong trigger at tier A or B, or two triggers at tier A), unknown (no trigger data). Tier C stops at watch.
- Priority = documented (40 outburst, 35 listing, 30 study) + area (30 × min(1, log₁₀(A/0.1)/log₁₀ 50) for A > 0.1 km²) + growth (30 × min(1, g/5% a year) if significant and positive).

### Downstream towns

Hand-curated routes for 20 lakes, towns in downstream order from OpenStreetMap place nodes; towns and villages only, never infrastructure; a route stops at a reservoir (Bhilangana at Ghansali).

- River distance = 1.1 × Σ great-circle distances between successive points. Calibrated on Sattar, Goswami and Kulkarni (2019): Lachen 46 km and Chungthang 62.35 km below South Lhonak; the formula gives 44 and 63 km.
- Travel time from two wave speeds: mountain 30 km/h fast, 12 km/h slow; plains 15 and 8 km/h. The 2023 front took 2.3 h to Chungthang (27 km/h); the fast case gives 2.1 h. Gauge peaks lagged the fast case further down (Melli 5.8 h observed against 4.4 h; Mekhliganj 15.8 h against 10.8 h), because peaks trail the front and the wave spreads.
- Expect about 20% error in distance, more on long reaches without a town (Jubing to Chatara is underestimated). For awareness and drills, never evacuation timing.

## Outputs

`dashboard/data/sarovara/` (113 files, 2.9 MB on 21 Oct 2026; largest JSON 70 KB, largest PNG 60 KB):

- `watchlist.json`: board rows (level, reasons, tier, priority, area and uncertainty, scene date and quality, baseline quality, changes and significance, growth class and basis, triggers, first town, sparkline series), counts, regions, recorded outbursts with sources, every threshold (`rules`), Sentinel-2 periods, `as_of` times per source.
- `lakes/<id>.json`: one lake: inventory record and citation, outline and detected shoreline rings, current and baseline observations with every screening fraction, area series, growth evidence including threshold checks, tier and priority components, triggers, hourly weather for 72 h either side, nearby earthquakes, documented hazards with sources, downstream route, scenes rejected.
- `quakes.json`: M4+ events in the region with nearest lake and lakes within 100 km.
- `thumbs/<id>-now.png`, `thumbs/<id>-then.png`.
- `manifest.json`: sources with retrieval times, files with rows and bytes, network calls by host, stale flag and errors.

Times are UTC with `Z`; the pages show IST. Nothing is simulated (`"simulated": false` throughout).

## Pipeline

```
cd pipeline
python3 -m trinetra.sarovara run              # fetch, compute, export
python3 -m trinetra.sarovara run --offline    # rebuild from pipeline/cache/sarovara/
python3 -m trinetra.sarovara run --only south-lhonak imja-tsho   # some lakes' files only
python3 -m trinetra.sarovara list
```

Dependencies: standard library, `httpx`, `numpy`, `scipy`. No imaging or GIS library: shapefile, dBase and GeoPackage readers, Albers and UTM projections, PNG encoding and boundary tracing are in the package and tested against PROJ reference values.

Network: per-host spacing (Zenodo 1.5 s, Planetary Computer 0.6 s, USGS and Open-Meteo 1 s), retries with backoff on errors, 429 and 5xx, timeouts of 10 s to connect and 30 s to read (60 s for the batched Open-Meteo call). Inventory files and pixel windows are immutable and never re-fetched, so a routine refresh makes about five calls (two STAC searches, USGS, Open-Meteo, plus windows for any new scenes). Building the cache from nothing fetched the inventory files, 8 STAC result pages and 169 pixel windows. A failed fetch falls back to the cached copy and marks the source stale; if the inventories cannot be read, the previous export is left untouched.

## Tests

`python3 -m pytest tests/test_sarovara.py -q` runs offline on recorded fixtures (`tests/fixtures/sarovara/`): file-format readers and projections against PROJ, NDWI and the offset, Otsu, rasterising, water masks (ponds, streams, turbid and dark lakes, cloud, ice, flags), boundary tracing, PNG encoding and size limits, scene parsing and selection, the current-scene review flag, the Teesta route against published distances and the 2023 arrival, route sanity, growth statistics, triggers on recorded USGS and Open-Meteo responses, tiers, levels and priority, and export assembly.

## Limits and failure modes

- No outburst detection or forecast. Collapses, ice avalanches and slow moraine failure leave little in earthquake or weather feeds; a lake can be at normal on the day it fails.
- Freezing and cloud: from October many lakes are rejected as frozen; the latest area can be up to 90 days old or fall back to the inventory (3 lakes on the evening run of 21 Oct 2026: Lower Barun, Lumding Tsho and the lake north of Anini).
- Missed water: thin grey ice and very turbid water can fall below the threshold without looking like snow; large cases are flagged.
- Small lakes: near 0.1 km² the shoreline term gives uncertainties of 10% or more.
- Inventories differ in method; the comparison against the inventory is used last.
- Model weather over steep terrain carries large errors; rain thresholds are station categories applied to model values.
- Travel times: no hydraulic model, channel geometry or attenuation.
- Basemap boundaries are the provider's drawing, not authoritative, and not presented as official Indian boundaries.

## Doctrine

- Places and conditions only: lakes, weather, earthquakes, towns. No data about people.
- Downstream lists name towns and villages; no dams, bridges or other infrastructure, and no vulnerability lists.
- Lakes in the Tibet Autonomous Region are shown only as natural hazards to the valleys below, in neutral language.
- Every number carries its source and retrieval time; flagged measurements are shown, never hidden.
- Advisory on every page, naming the agencies to follow.

## Next

- Sentinel-1 radar area for lakes under cloud or snow (the reason 3 lakes have no current scene).
- Lake-level time series from the GLO annual outlines for the HMA lakes, so every lake has a multi-year trend.
- Downstream routes for the remaining 18 lakes, reviewed with the state authorities.
- Bring in CWC's glacial lake monitoring reports where they can be read, as the official comparison.

## References

- Allen, S. K. et al. (2016). Lake outburst and debris flow disaster at Kedarnath, June 2013. Landslides 13. https://doi.org/10.1007/s10346-015-0584-3
- Bajracharya, S. R. et al. (2020). Inventory of glacial lakes and identification of potentially dangerous glacial lakes in the Koshi, Gandaki, and Karnali river basins of Nepal, the Tibet Autonomous Region of China, and India. ICIMOD and UNDP. https://nepal.un.org/sites/default/files/2020-10/Inventory_Glacial_Lakes_2020_Full2.pdf
- ESA (2021). Copernicus Sentinel-2: major products upgrade upcoming (processing baseline 04.00). https://sentinels.copernicus.eu/web/sentinel/-/copernicus-sentinel-2-major-products-upgrade-upcoming
- IMD, RSMC New Delhi (2024). National Bulletin No. 15 (24-hour rainfall categories). https://rsmcnewdelhi.imd.gov.in/uploads/archive/1/1_0cbf6a_15.National%20Bulletin%20No%2015-11th%20Sept2024_0830%20IST.pdf
- Kumar, R., Vijay, S. (2025). Inventory of Glacial Lakes in High Mountain Asia for 2016-2017 and 2022-2024. Zenodo. https://doi.org/10.5281/zenodo.17948783
- McFeeters, S. K. (1996). The use of the Normalized Difference Water Index (NDWI) in the delineation of open water features. International Journal of Remote Sensing 17(7). https://doi.org/10.1080/01431169608948714
- Otsu, N. (1979). A threshold selection method from gray-level histograms. IEEE Transactions on Systems, Man, and Cybernetics 9(1). https://doi.org/10.1109/TSMC.1979.4310076
- Petley, D. (2025). The 3-4 October 2023 Sikkim GLOF. The Landslide Blog, Eos. https://eos.org/thelandslideblog/sikkim-glof-october-2023
- Rawlins, L. et al. (2026). Glacial Lake Observatory. Earth System Science Data, https://doi.org/10.5194/essd-18-5143-2026; data https://zenodo.org/records/19370146
- SANDRP (2023). Oct 2023: CWC flood forecast fails during Teesta glacial floods. https://sandrp.in/2023/10/09/oct-2023-cwc-flood-forecast-fails-during-teesta-glacial-floods/
- Sattar, A., Goswami, A., Kulkarni, A. V. (2019). Hydrodynamic moraine-breach modeling and outburst flood routing: a hazard assessment of the South Lhonak lake, Sikkim. Science of the Total Environment 668. https://doi.org/10.1016/j.scitotenv.2019.02.388
- Sattar, A. et al. (2025). The Sikkim flood of October 2023: drivers, causes, and impacts of a multihazard cascade. Science. https://doi.org/10.1126/science.ads2659
- PTI via DT Next (4 Sep 2026). 40 high-hazard glacial lakes identified in Sikkim, 16 at highest risk of outburst. https://www.dtnext.in/news/national/40-high-hazard-glacial-lakes-identified-in-sikkim-16-at-highest-risk-of-outburst
- The Week (26 Aug 2026). What caused the Nepal flash flood. https://www.theweek.in/news/world/2026/08/26/what-caused-the-nepal-flash-flood-deluge-washes-away-village-near-tibet-border-in-rasuwa.html
- The Annapurna Express (11 Oct 2026). Nepal faces second major flash flood in one and a half months. https://theannapurnaexpress.com/story/67822/
