NOAA CPC NMME Phase 3 (NMME3) Operational User Manual


1. System Overview & Architecture

The National Multi-Model Ensemble Phase 3 (NMME3) operational system at NOAA Climate Prediction Center (CPC) automates the end-to-end ingestion, standardization, post-processing, and graphical product generation for subseasonal and seasonal climate forecasts.

flowchart TD subgraph DataRetrieval["1. Ingestion (Days 1–7)"] G_CFS["get_CFSv2.py"] G_CMC["get_CMC.py (CanESM5, GEM5.2)"] G_NCAR["get_CCSM4.py / get_CESM1.py"] G_NASA["get_NASA.py"] G_ECMWF["get_ECMWF.py (Days 6–7)"] end subgraph Formatting["2. Standardization"] R2NC["cron_read2nc.sh
(NMME_read2nc.py)"] end subgraph Processing["3. Core Diagnostics"] SOPS["run_nmme_single_ops.sh
(nmme-processing / nmme-export-enso)"] MOPS["run_nmme_multi_ops.sh
(Multi-Model Ensemble NMME)"] PROBS["driver_realtime_probs.sh
(Pacific Prob Calibrations)"] end subgraph Dissemination["4. Graphics & Dissemination"] PLOTS["MakeAllPlots.sh
(NMMEv3_plotting Suite)"] P_FIG["push_figs.sh & push_ftp.sh"] end DataRetrieval -->|Raw GRIB2 / NetCDF| Formatting Formatting -->|Standardized NetCDF /fcst/| Processing Processing -->|Anomalies / Probs / ENSO /stats/| Dissemination

1.1 Participating Forecast Models

Model Name Modeling Center Realtime Members Hindcast Members Hindcast Climatology Period
CanESM5 CCCma / ECCC (Canada) 20 20 1991–2020
CFSv2 NOAA / NCEP 24 24 1991–2020
GEM5.2_NEMO ECCC / RPN (Canada) 20 20 1991–2020
NASA_GEOS5v2 NASA / GMAO 10 4 1991–2020
NCAR_CCSM4 NCAR / University of Miami 10 10 1991–2020
NCAR_CESM1 NCAR 10 10 1991–2020
ECMWF ECMWF (Europe) 25 25 1991–2020
SFS_Beta / Beta1.1 NOAA / NCEP (Development) 31 11 1991–2020
GFDL_SPEAR NOAA / GFDL (Optional) 15 15 1991–2020

1.2 Forecast Variables

1.3 Climatology Baseline

The standard climatological normal across all models is 1991–2020 (CLIM_PERIOD = "1991_2020").


2. Environment Setup & Configuration

2.1 Key Environment Variables

Variable Description Operational Default Development Default
NMME_PROC Project root directory /cpc/nmme_dev/Projects/NMME3 Path to git repository clone
DATA_OUT Destination for forecast data and figures /cpc/nmme_dev/Projects/NMME3/output Specified in local_dev_paths.env
MODEL_REFORECASTS Path to reforecast / hindcast archives /cpc/model_reforecasts/ Specified in local_dev_paths.env

2.2 Python Environment

The operational system runs on a dedicated Conda virtual environment located at:

$NMME_PROC/venv_conda

To build or refresh the environment from scratch:

cd $NMME_PROC
make -f Makefile.ops

This automatically configures Python 3.11 with numpy, pandas, xarray, netcdf4, dask, scipy, cartopy, xesmf, pygrib, click, and installs the nmme-processing CLI suite in editable mode.

2.3 Local Development Overrides

For local offline testing, place overrides in $NMME_PROC/library/local_dev_paths.env (this file is ignored by Git):

NMME_PROC=/cpc/nmme_dev/Projects/NMME3
DATA_OUT=/cpc/nmme_dev/Projects/NMME3/output
MODEL_REFORECASTS=/cpc/model_reforecasts/

3. Operational Cron Jobs (cron.txt)

All operational cron entries are managed under /situation/bin/primary.sh PYTHON to ensure cluster primary failover compatibility.

3.1 Cron Schedule Summary Table

Crontab Entry Schedule (UTC) Executable Script Target Subsystem / Output
00 06 1-7 * *
00 18 1-7 * *
Daily at 06:00 & 18:00 UTC (Days 1–7) $NMME_PROC/scripts/cron_get_data.sh Fetches raw model forecasts; saves to $NMME_PROC/output/
30 06 1-7 * *
30 18 1-7 * *
Daily at 06:30 & 18:30 UTC (Days 1–7) $NMME_PROC/scripts/cron_read2nc.sh Standardizes GRIB2/NC to NetCDF; writes $DATA_OUT/{model}/fcst/
30 07 1-7 * *
30 19 1-7 * *
Daily at 07:30 & 19:30 UTC (Days 1–7) $NMME_PROC/scripts/nmme_processing/run_nmme_single_ops.sh Single-model deterministic & probabilistic anomalies, ENSO text
30 08 1-7 * *
30 20 1-7 * *
Daily at 08:30 & 20:30 UTC (Days 1–7) $NMME_PROC/scripts/nmme_processing/run_nmme_multi_ops.sh Multi-model ensemble (MME) forecasts & probabilities
00 08 7 * * Monthly on the 7th at 08:00 UTC $NMME_PROC/scripts/driver.sh Master release pipeline: runs single/multi ops, plotting & web sync
*/10 * * * * (Optional/Temp) Every 10 minutes $NMME_PROC/scripts/push_figs.sh Rsyncs generated figures to cpcrzdm web server

3.2 Cron Job Details

Job 1: Raw Data Retrieval (cron_get_data.sh)

Job 2: NetCDF Conversion (cron_read2nc.sh)

Job 3: Single-Model Real-Time Processing (run_nmme_single_ops.sh)

Job 4: Multi-Model Ensemble Processing (run_nmme_multi_ops.sh)

Job 5: Monthly Production Master Driver (driver.sh)


4. CLI Utilities Reference

The NMME3 suite provides three unified command-line entry points in the conda environment:

4.1 nmme-processing (Main Processing Engine)

Executes climatology, anomaly, and probabilistic calculations.

# General Syntax
nmme-processing -y <YYYY> -init <MM> -v <VAR> -m <MODEL> -o <OUTPUT_TYPE> [--force true/false]

Examples:

# 1. Run single-model deterministic anomalies
nmme-processing -y 2026 -init 07 -v tmp2m -m CFSv2 -o determ

# 2. Run MME probabilistic forecast
nmme-processing -y 2026 -init 07 -v prate -m NMME -o prob

# 3. Generate reference hindcast statistics (year not required)
nmme-processing -init 07 -v tmpsfc -m CanESM5 -o stats

4.2 nmme-check (I/O Status & Gatekeeper)

Verifies input readiness or confirms whether outputs are already complete.

# Check if all required raw inputs exist before running:
nmme-check input -m CFSv2 -v tmp2m -y 2026 -init 07

# Check if multi-model ensemble dependencies are satisfied:
nmme-check input -m NMME -v tmp2m -y 2026 -init 07 -o determ

# Verify if processing output is already complete:
nmme-check output -m CanESM5 -v prate -y 2026 -init 07 -o prob

4.3 nmme-export-enso (ENSO Index Export)

Extracts SST Nino indices (Nino 1.2, 3, 3.4, 4) from tmpsfc operational forecasts:

nmme-export-enso -m CFSv2 -init 07 -clim 1991_2020

5. Directory Structure & Conventions

$NMME_PROC/
├── config.py                     # Central configuration & Paths manager
├── Makefile.ops                  # Operational environment build & package install
├── cron.txt                      # Crontab schedule configuration
├── venv_conda/                   # Active Conda virtual environment
├── scripts/                      # Operational shell drivers & wrappers
│   ├── driver.sh                 # Master monthly production release script
│   ├── cron_get_data.sh          # Cron wrapper for data ingestion
│   ├── cron_read2nc.sh           # Cron wrapper for NetCDF standardization
│   ├── driver_realtime_probs.sh  # Pacific calibrated probabilities
│   ├── push_figs.sh              # Web server rsync script
│   ├── push_ftp.sh               # Anonymous FTP distribution script
│   ├── nmme_processing/          # Ops & rerun drivers for single/multi/stats
│   │   ├── run_nmme_single_ops.sh
│   │   ├── run_nmme_multi_ops.sh
│   │   ├── rerun_nmme_single_ops.sh
│   │   └── rerun_nmme_multi_ops.sh
│   └── NMMEv3_plotting/          # Graphics and plotting suite
│       ├── MakeAllPlots.sh       # Main batch plotting orchestrator
│       └── rerun_MakeAllPlots.sh # Plotting rerun script
├── source/                       # Core python modules
│   ├── NMME_config.py            # Model lists, variables, regional bounds
│   ├── NMME_read2nc.py           # GRIB2/NC to NetCDF standardization
│   ├── get_*.py                  # Automated model fetchers (CFSv2, CMC, NCAR, etc.)
│   └── nmme_processing/          # Python package source code
├── library/                      # Static reference files, shapefiles, masks
├── logs/                         # Execution logs
│   ├── retrieval/                # Fetch and NetCDF conversion logs
│   ├── nmme-processing/          # Single and multi-model operational logs
│   └── NMME/                     # Plotting and ensemble logs
└── output/                       # Operational output repository
    ├── {MODEL}/
    │   ├── fcst/{YYYYMM}0800/    # Standardized operational forecasts
    │   ├── anom/{YYYYMM}0800/    # Deterministic anomaly NetCDF files
    │   ├── prob/{YYYYMM}0800/    # Probabilistic forecast NetCDF files
    │   ├── stats/{MM}0100/       # Hindcast climatology means & standard deviations
    │   └── enso/                 # Plume data & tabular ENSO text indices
    └── figs/                     # PNG graphic maps, probabilities, and plumes

6. Plotting Pipeline (NMMEv3_plotting)

Graphics generation is triggered either automatically by driver.sh on Day 7, or manually via MakeAllPlots.sh.

# Usage:
cd $NMME_PROC/scripts/NMMEv3_plotting
./MakeAllPlots.sh <YYYY> <MM> [force]

# Example:
./MakeAllPlots.sh 2026 07 force

Generated Products:

  1. Standardized Anomalies (plotNMMEStdAnoms.py, plotNMMEStdAnoms_wSkillMask.py): Normalized by model climatological standard deviation.
  2. Deterministic Anomalies (plotNMMEanoms.py): Temperature ($^\circ\text{C}$), precipitation rate ($\text{mm/day}$), and SST anomalies.
  3. Probabilistic Maps (plotNMMEprobs.py, plotNMMEprobs_wDryMask.py): Tercile probabilities (Below, Normal, Above) with masked dry climatological areas.
  4. Regional Subsets:
  5. us (United States contiguous + Alaska)
  6. usapi (US-Affiliated Pacific Islands)
  7. South_America, Central_America_Caribbean, Africa, East_Asia, South_Asia, Global_land
  8. ENSO Plumes (NMME_plumes.py): Forecast plumes for Nino 3.4 SST index compared with OISST observations.

7. Manual Rerun & Backfill Procedures

When upstream model transfers are delayed, network connections timeout, or a reprocessing cycle is required:

7.1 Manual Data Fetching

cd $NMME_PROC/scripts
# Fetch data for a specific date (YYYYMMDD):
./cron_get_data.sh 20260706

# Standardize to NetCDF:
./cron_read2nc.sh 20260706

7.2 Rerunning Single-Model Calculations

To force re-calculation and overwrite existing files for month MM and year YYYY:

cd $NMME_PROC/scripts/nmme_processing
./rerun_nmme_single_ops.sh 07 2026

7.3 Rerunning Multi-Model Ensemble

After all constituent models have completed:

cd $NMME_PROC/scripts/nmme_processing
./rerun_nmme_multi_ops.sh 07 2026

7.4 Backfilling Pacific Calibrated Probabilities

cd $NMME_PROC/scripts
# Target specific cycle: YYYYMM
./driver_realtime_probs.sh 202607

7.5 Rerunning Plots

cd $NMME_PROC/scripts/NMMEv3_plotting
./rerun_MakeAllPlots.sh 2026 07

7.6 Re-syncing Web Graphics

cd $NMME_PROC/scripts
./push_figs.sh

8. Operational Troubleshooting & Checklists

8.1 Verification Commands

Before escalating issues, verify state using nmme-check:

# 1. Activate environment
conda activate $NMME_PROC/venv_conda

# 2. Check single-model input completeness:
nmme-check input -m ECMWF -v tmp2m -y 2026 -init 07

# 3. Check multi-model dependencies:
nmme-check input -m NMME -v tmp2m -y 2026 -init 07 -o determ

# 4. Check ENSO text file status (detects if padded with zeros):
nmme-check output -m CFSv2 -v tmpsfc -y 2026 -init 07 -o enso

8.2 Common Error Scenarios

Symptom Probable Cause Action
Dependencies for NMME missing One or more single models did not finish processing. Run nmme-check input -m NMME ... to identify which model is missing. Run rerun_nmme_single_ops.sh for that model.
ENSO rows are incomplete Real-time SST forecast not yet ingested on disk. Verify that raw NetCDF exists in $DATA_OUT/{model}/fcst/{YYYYMM}0800/. If not, run cron_get_data.sh and cron_read2nc.sh.
CRITICAL ERROR: NMME_PROC is missing Environment variable not exported in subshell. Ensure export NMME_PROC="/cpc/nmme_dev/Projects/NMME3" is present in ~/.bashrc or your execution environment.
Plotting job skipped Success phrase already logged in log file. Pass force flag to MakeAllPlots.sh <YYYY> <MM> force or remove logs in $NMME_PROC/logs/NMME/*.log.

9. Contacts & Escalation