jgfs_atmos_goesupp_master ecf (v17) Analysis - TerrenceMcGuinness-NOAA/global-workflow GitHub Wiki

jgfs_atmos_goesupp_master.ecf (GFS v17)

Branch / tenant: dev/gfs.v17 (gw_v17) Path: ecf/scripts/gfs/product/atmos/gempak/goesupp/jgfs_atmos_goesupp_master.ecf Analysis date: 2026-06-11 Method: AWS Bedrock AgentCore agentcore-mcp-rag MCP (graph traversal, GraphRAG, code-context) cross-checked against the on-disk v17 worktree.


Summary

jgfs_atmos_goesupp_master.ecf is the NCO production ecFlow task template that runs the Unified Post Processor (UPP) in "GOES supplemental" mode to generate simulated geostationary satellite imagery products from GFS forecast output. It is a _master template (deployed per forecast hour). Unlike the other GEMPAK .ecf files in the same family, this one calls the shared JGLOBAL_ATMOS_UPP J-Job with UPP_RUN="goes", driving the Python-based exglobal_atmos_upp.py workflow via pygfs.task.upp.UPP.


1. The script itself

#PBS -S /bin/bash
#PBS -N gfs_atmos_goesupp_%CYC%_f%FHR%
#PBS -j oe
#PBS -q %QUEUE%
#PBS -A %PROJ%-%PROJENVIR%
#PBS -l walltime=00:15:00
#PBS -l select=1:mpiprocs=1:ompthreads=1:ncpus=120:mem=500GB
#PBS -l place=vscatter:exclhost
#PBS -l debug=true

model=gfs
export cyc="%CYC%"
%include <head.h>
%include <envir-p1.h>

############################################################
# Load modules
############################################################
#TODO: load only the modules needed for each job
source ${HOMEgfs}/dev/ush/load_modules.sh upp

module list
export WGF="%WGF%"
export FHR3="%FHR%"
export FHR_LIST="%FHR_LIST%"
export FORECAST_HOUR="${FHR_LIST}"
export COMPONENT=${WGF}
export UPP_RUN="goes"
############################################################
# CALL executable job script here
############################################################
export CDATE=${PDY}${cyc}
export HOMEglobal=${HOMEgfs}

#### ${HOMEgfs}/dev/job_cards/rocoto/upp.sh
${HOMEgfs}/jobs/JGLOBAL_ATMOS_UPP
if [ $? -ne 0 ]; then
   ecflow_client --msg="***JOB ${ECF_NAME} ERROR RUNNING J-SCRIPT ***"
   ecflow_client --abort
   exit
fi

%include <tail.h>
%manual

%end

What each part does

Section Role
#PBS directives PBS Pro: 1 node, 120 cpus, 500 GB, exclusive host, 15-min wall. This is significantly heavier than other GEMPAK tasks — UPP GOES processing requires substantial memory for satellite simulation fields.
load_modules.sh upp Loads the UPP module set (not the general run set), providing the UPP executable and its NCEPLIBS/ESMF dependencies.
FORECAST_HOUR="${FHR_LIST}" Passes the forecast hour to the Python UPP driver.
UPP_RUN="goes" Key differentiator — tells JGLOBAL_ATMOS_UPP / exglobal_atmos_upp.py to process GOES simulated satellite imagery rather than the standard atmospheric products.
${HOMEgfs}/jobs/JGLOBAL_ATMOS_UPP Shared UPP J-Job (same job used by jgfs_atmos_product_master.ecf with different UPP_RUN values).

2. Why "_master" — the template mechanism

A single .ecf file backs per-forecast-hour ecFlow tasks. The ecFlow generator deploys it as jgfs_atmos_goesupp_f000.ecf, jgfs_atmos_goesupp_f003.ecf, etc. Each instance overrides FHR and FHR_LIST.


3. Execution chain

ecf/defs/gfs_prod.def : task jgfs_atmos_goesupp_fNNN
  +-- jgfs_atmos_goesupp_master.ecf            (PBS submit; deployed as *_fNNN.ecf)
       +-- ${HOMEgfs}/jobs/JGLOBAL_ATMOS_UPP   (J-Job, shared)
            +-- ${SCRglobal}/exglobal_atmos_upp.py   (Python driver)
                 +-- pygfs.task.upp.UPP   (wxflow-based UPP task class)
                      +-- UPP.initialize()  — copy static data to DATA/
                      +-- UPP.configure()   — prepare namelist, control file
                      +-- UPP.execute()     — run UPP binary via APRUN_UPP
                      +-- UPP.finalize()    — copy/index output GRIB2 master files

Confirmed via MCP graph (trace_data_flow, tenant gw_v17):

  • JGLOBAL_ATMOS_UPP SOURCES jjob_header.sh, jjob_standard_vars.sh, jjob_shell_setup.sh, set_strict.sh.
  • The ex-script is Python (exglobal_atmos_upp.py), invoking the pygfs.task.upp.UPP class from the wxflow/pygfs Python package.

4. What the J-Job actually produces

When UPP_RUN="goes", the UPP generates simulated GOES satellite imagery fields in GRIB2 master format:

Product Format Location
Simulated GOES brightness temperatures GRIB2 master ${COMOUT_ATMOS_MASTER}/
Simulated satellite imagery channels GRIB2 master ${COMOUT_ATMOS_MASTER}/

Input is read from ${COMIN_ATMOS_HISTORY} (model history files) and ${COMIN_ATMOS_ANALYSIS} (for surface fields). The upp_run config key controls which UPP YAML configuration and control files are selected.

Error handling

Uses the EE2-correct pattern: "${SCRglobal}/exglobal_atmos_upp.py" && true followed by err_exit on non-zero status.


5. Key environment variables

Variable Origin Meaning
UPP_RUN ECF script ("goes") Selects the GOES satellite simulation UPP configuration.
FORECAST_HOUR ECF script (${FHR_LIST}) Forecast hour for UPP processing.
WGF / COMPONENT suite edit Weather-Generating-Forecast component (atmos).
COMIN_ATMOS_HISTORY J-Job (declare -rx) Input COM dir for model history files.
COMIN_ATMOS_ANALYSIS J-Job (declare -rx) Input COM dir for analysis fields.
COMOUT_ATMOS_MASTER J-Job (declare -rx) Output COM dir for UPP master GRIB2 files.
APRUN_UPP config.upp MPI launch command for the UPP executable.

Configuration

The J-Job sources jjob_header.sh -e "upp" -c "base upp", loading:

  • config.base — fundamental paths and settings.
  • config.upp — UPP-specific settings (resources, APRUN, control file paths).

6. v17-specific notes

  • Python-based UPP driver: v17 replaces the traditional shell ex-script with exglobal_atmos_upp.py using the pygfs.task.upp.UPP class from wxflow. This is a major architectural shift from older develop-branch GEMPAK/UPP patterns.
  • Shared J-Job: JGLOBAL_ATMOS_UPP is reused across multiple ECF task families (jgfs_atmos_product_master, jgfs_atmos_goesupp_master, potentially others) — the UPP_RUN variable selects the processing mode.
  • Heavy resource requirements: 120 cpus, 500 GB, exclusive host placement — reflects the computational cost of satellite simulation fields at high resolution.
  • load_modules.sh upp: loads UPP-specific modules (different from the run module set used by GEMPAK conversion tasks).
  • Centralized module loading via load_modules.sh.
  • HOMEglobal shim bridges v17 naming to NCO.

7. Change-impact snapshot (from MCP, gw_v17)

Symbol Change type Risk Direct dependents
JGLOBAL_ATMOS_UPP behavior LOW (0.10) 0 (leaf per graph, but shared across multiple ECF families)
exglobal_atmos_upp.py signature MEDIUM Shared by all UPP_RUN variants

Note: although the graph shows 0 direct dependents for JGLOBAL_ATMOS_UPP, this J-Job is shared across multiple ECF task templates (jgfs_atmos_product_master, jgfs_atmos_goesupp_master, etc.). Changes to its behavior affect all UPP_RUN modes.


Sources

  • On-disk v17 worktree: ecf/scripts/gfs/product/atmos/gempak/goesupp/jgfs_atmos_goesupp_master.ecf, dev/jobs/JGLOBAL_ATMOS_UPP, dev/scripts/exglobal_atmos_upp.py.
  • agentcore-mcp-rag MCP (tenant gw_v17): trace_data_flow, get_change_impact, get_code_context.
⚠️ **GitHub.com Fallback** ⚠️