jgfs_atmos_goesupp_master ecf (v17) Analysis - TerrenceMcGuinness-NOAA/global-workflow GitHub Wiki
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.
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.
#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| 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). |
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.
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_UPPSOURCESjjob_header.sh,jjob_standard_vars.sh,jjob_shell_setup.sh,set_strict.sh. - The ex-script is Python (
exglobal_atmos_upp.py), invoking thepygfs.task.upp.UPPclass from thewxflow/pygfsPython package.
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.
Uses the EE2-correct pattern: "${SCRglobal}/exglobal_atmos_upp.py" && true followed
by err_exit on non-zero status.
| 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. |
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).
-
Python-based UPP driver: v17 replaces the traditional shell ex-script with
exglobal_atmos_upp.pyusing thepygfs.task.upp.UPPclass fromwxflow. This is a major architectural shift from older develop-branch GEMPAK/UPP patterns. -
Shared J-Job:
JGLOBAL_ATMOS_UPPis reused across multiple ECF task families (jgfs_atmos_product_master,jgfs_atmos_goesupp_master, potentially others) — theUPP_RUNvariable 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 therunmodule set used by GEMPAK conversion tasks). -
Centralized module loading via
load_modules.sh. -
HOMEglobalshim bridges v17 naming to NCO.
| 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.
- 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-ragMCP (tenantgw_v17):trace_data_flow,get_change_impact,get_code_context.