CFS — Community Forcing Service¶
One asynchronous interface to 33 meteorological forcing products, returning a
canonical, CF-aligned xarray.Dataset.
Statement of need¶
Every gridded hydrological or land-surface modeling study begins by acquiring
meteorological forcing — precipitation, temperature, humidity, wind, pressure,
and radiation — and in practice this means bespoke scripting for each product.
ERA5 lives in a cloud-optimized Zarr store, NLDAS behind Earthdata-authenticated
OPeNDAP, CARRA behind the CDS API, GFS in S3 GRIB2 files read by byte-range;
each product has its own native variable names, units, accumulation conventions
(running totals, per-interval buckets, instantaneous rates), grid (regular
lat/lon, rotated pole, Lambert conformal), and authentication scheme. The
conversion that most often goes wrong — accumulated precipitation or radiation
to a flux — is reimplemented, slightly differently, in every group's scripts.
CFS replaces this per-product scripting with a single asynchronous interface:
every connector acquires its product, subsets it to a bounding box and time
range, and harmonizes it to one canonical, CF-aligned schema
(canonical-v1) in which precipitation and radiation are
always rates, never accumulations. CFS deliberately stops there: remapping to
catchments/HRUs and writing model-specific forcing files are left to modeling
frameworks (e.g. SYMFLUENCE), which is what keeps the service reusable across
them.
The community-data triad¶
CFS is the third member of a triad of focused data services:
| Service | Data | Returns |
|---|---|---|
| CAS | geospatial attributes (DEM, soil, land cover) | harmonized zonal statistics |
| CSFS | streamflow observations | harmonized station time series |
| CFS | meteorological forcing | canonical, subset xarray.Dataset |
What CFS does¶
upstream store ──▶ subset to bbox+time ──▶ harmonize to canonical ──▶ xr.Dataset
(Zarr/S3/…) cfs.subset.bbox cfs.subset.canonical │
▼
[ consumer: HRU remap + model schema ]
It deliberately does not:
- remap to HRUs / sub-basins,
- write model-specific forcing schemas (SUMMA, FUSE, mizuRoute, …),
- serialize monthly NetCDF chunks or handle HPC filesystem locking.
Those steps are model- and deployment-specific, so they stay in the consumer.
Features¶
- 33 connectors spanning global and regional reanalyses (ERA5/ERA5-Land,
MERRA-2, CARRA, CERRA, RDRS, BARRA2, CONUS404, NARR, WFDE5), analysis
products (AORC, NLDAS, HRRR, NWM operational, Daymet, gridMET,
nClimGrid-Daily, GLDAS, FLDAS), satellite/station precipitation and
temperature (CHIRPS, CHIRTS, GPM IMERG, PERSIANN-CDR, CMORPH, MSWEP,
EM-Earth, E-OBS), forecasts (GFS deterministic, GEFS ensemble with a
memberdimension), and climate projections (NEX-GDDP-CMIP6, NA-CORDEX). See the Provider Catalog. - Canonical harmonization to CF-aligned names and SI units — the canonical-v1 contract downstream frameworks code against.
- Subsetting for regular lat/lon grids (antimeridian-safe) and 2-D/projected grids (rotated pole, Lambert conformal).
- Reset-aware and bucket-aware de-accumulation of running-total and interval-bucket precipitation/radiation fields.
- Derived variables where a product lacks a canonical field (specific humidity from RH/T/P, Bolton 1980).
- Advisory range QC on every fetch, catching unit-conversion errors before they reach a model.
- Fetch guardrails (bbox-area and cell-count limits) enforced uniformly on the connector base class.
- Lazy by default — connectors return dask-backed datasets where the protocol allows, so the caller decides when to materialize.
- A CLI (
cfs providers/cfs products/cfs fetch) and an in-process Python API.
Where to next¶
- New here? Start with the Quick Start.
- Choosing a product? Browse the Provider Catalog.
- Consuming CFS output from a framework? Read the canonical-v1 specification — it is the normative output contract.
- Extending CFS? See the contributing guide and the API Reference.
Naming note¶
"CFS" also denotes NOAA's Climate Forecast System (CFSR/CFSv2), itself a
forcing product. If a CFSR connector is ever added it will use a disambiguated
slug (e.g. cfsr) to avoid collision with the service name.