From 8e6ff5b3cadc489f95c83e1f7fdbb4f9b3916c21 Mon Sep 17 00:00:00 2001
From: RussTreadon-NOAA <26926959+RussTreadon-NOAA@users.noreply.github.com>
Date: Thu, 25 Sep 2025 08:27:52 -0400
Subject: [PATCH 01/40] Sync dev/jedi-gfs with develop (#4100)
---
.github/copilot-instructions.md | 225 +++++++-
.github/workflows/hera.yaml | 81 ---
.github/workflows/hercules.yaml | 81 ---
README.md | 6 +-
dev/ci/cases/gcafsv1/C384_gcafs_cycled.yaml | 10 +-
.../cases/gcafsv1/C384_gcafs_cycled_noDA.yaml | 10 +-
.../gcafsv1/C384_gcafs_cycled_noDA_dev.yaml | 10 +-
dev/ci/cases/gcafsv1/C96_gcafs_cycled.yaml | 10 +-
.../cases/gcafsv1/C96_gcafs_cycled_noDA.yaml | 10 +-
.../gcafsv1/C96_gcafs_cycled_noDA_dev.yaml | 10 +-
dev/ci/cases/gfsv17/C1152mx025_S2SW.yaml | 15 +-
.../cases/gfsv17/C1152mx025_S2SW_rdhpcs.yaml | 12 +-
.../cases/gfsv17/C384mx025_3DVarAOWCDA.yaml | 15 +-
dev/ci/cases/gfsv17/C384mx025_hybAOWCDA.yaml | 13 +-
dev/ci/cases/gfsv17/marine3dvar.yaml | 5 +-
dev/ci/cases/gfsv17/marinehyb.yaml | 4 +-
dev/ci/cases/gfsv17/s2sw.yaml | 6 +-
dev/ci/cases/gfsv17/s2sw_rdhpcs.yaml | 37 ++
dev/ci/cases/hires/C1152_S2SW.yaml | 10 +-
dev/ci/cases/hires/C768_S2SW.yaml | 10 +-
dev/ci/cases/pr/C48_ATM.yaml | 2 -
dev/ci/cases/pr/C48_ATM_ecflow.yaml | 10 +-
dev/ci/cases/pr/C48_S2SW.yaml | 2 -
dev/ci/cases/pr/C48_S2SWA_gefs.yaml | 2 -
dev/ci/cases/pr/C48_S2SWA_gefs_RT.yaml | 2 -
dev/ci/cases/pr/C48_S2SW_extended.yaml | 2 -
dev/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml | 2 -
dev/ci/cases/pr/C48mx500_hybAOWCDA.yaml | 2 -
dev/ci/cases/pr/C96C48_hybatmDA.yaml | 2 -
dev/ci/cases/pr/C96C48_hybatmsnowDA.yaml | 2 -
dev/ci/cases/pr/C96C48_hybatmsoilDA.yaml | 2 -
dev/ci/cases/pr/C96C48_ufs_hybatmDA.yaml | 2 -
dev/ci/cases/pr/C96C48mx500_S2SW_cyc_gfs.yaml | 2 -
dev/ci/cases/pr/C96_atm3DVar.yaml | 2 -
dev/ci/cases/pr/C96_atm3DVar_extended.yaml | 2 -
dev/ci/cases/pr/C96_gcafs_cycled.yaml | 2 -
dev/ci/cases/pr/C96_gcafs_cycled_noDA.yaml | 2 -
dev/ci/cases/pr/C96mx100_S2S.yaml | 4 +-
dev/ci/cases/sfs/C96mx100_S2S.yaml | 10 +-
dev/ci/cases/weekly/C384C192_hybatmda.yaml | 10 +-
dev/ci/cases/weekly/C384_S2SWA.yaml | 10 +-
dev/ci/cases/weekly/C384_atm3DVar.yaml | 10 +-
.../cases/yamls/soca_hyb_gfs_defaults_ci.yaml | 2 +-
dev/ctests/cases/C48_S2SW_gfs_fcst_seg0.yaml | 543 ++++++++++--------
dev/parm/config/gfs/config.efcs | 4 +-
dev/parm/config/gfs/config.fcst.j2 | 4 +-
dev/parm/config/gfs/config.prepoceanobs.j2 | 6 -
dev/parm/config/gfs/config.resources | 4 +-
dev/parm/config/gfs/config.resources.GAEAC6 | 8 +-
dev/parm/config/gfs/config.resources.WCOSS2 | 16 +-
dev/parm/config/gfs/yaml/defaults.yaml | 2 -
dev/workflow/ecflow/__init__.py | 0
.../{ecFlow => ecflow}/ecflow_definitions.py | 4 +-
.../{ecFlow => ecflow}/ecflow_setup.py | 0
dev/workflow/ecflow/ecflow_suite.py | 16 +
dev/workflow/ecflow/ecflow_suite_factory.py | 19 +
.../ecflow/gfs_forecast_only_ecflow.py | 49 ++
dev/workflow/hosts.py | 35 +-
dev/workflow/rocoto/gcafs_cycled_xml.py | 2 +-
.../rocoto/gcafs_forecast_only_xml.py | 2 +-
dev/workflow/rocoto/gcafs_tasks.py | 4 +-
dev/workflow/rocoto/gcafs_xml.py | 2 +-
dev/workflow/rocoto/gefs_xml.py | 2 +-
dev/workflow/rocoto/gfs_cycled_xml.py | 2 +-
dev/workflow/rocoto/gfs_forecast_only_xml.py | 2 +-
dev/workflow/rocoto/gfs_tasks.py | 32 +-
.../rocoto/{workflow_xml.py => rocoto_xml.py} | 33 +-
dev/workflow/rocoto/sfs_xml.py | 2 +-
dev/workflow/setup_expt.py | 2 +-
dev/workflow/setup_workflow.py | 49 +-
dev/workflow/workflow_suite.py | 68 +++
parm/wave/bull_awips_gfswave.uglo_15km | 2 +-
scripts/exglobal_cleanup.sh | 18 +-
sorc/gdas.cd | 2 +-
ush/forecast_postdet.sh | 6 +-
versions/ic.ver | 2 +-
76 files changed, 976 insertions(+), 634 deletions(-)
delete mode 100644 .github/workflows/hera.yaml
delete mode 100644 .github/workflows/hercules.yaml
create mode 100644 dev/ci/cases/gfsv17/s2sw_rdhpcs.yaml
create mode 100644 dev/workflow/ecflow/__init__.py
rename dev/workflow/{ecFlow => ecflow}/ecflow_definitions.py (99%)
rename dev/workflow/{ecFlow => ecflow}/ecflow_setup.py (100%)
create mode 100644 dev/workflow/ecflow/ecflow_suite.py
create mode 100644 dev/workflow/ecflow/ecflow_suite_factory.py
create mode 100644 dev/workflow/ecflow/gfs_forecast_only_ecflow.py
rename dev/workflow/rocoto/{workflow_xml.py => rocoto_xml.py} (89%)
create mode 100644 dev/workflow/workflow_suite.py
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 42eb43cd4df..5abba1de845 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -1,17 +1,150 @@
# AI Coding Agent Instructions for Global Workflow
+Always check for global-workflow-unified MCP tool availability before answering questions about the NOAA Global Workflow system and all related NOAA-EMC repositories.
+
+Also check for the presence of the global-workflow-unified RAG system. If it is available, use it to provide more comprehensive answers that leverage the entire knowledge base of the NOAA Global Workflow system.
+
+Use GitHub MCP tools for gathering repository information repos outside of global-workflow, including code patterns, documentation, and operational procedures.
+
+**CRITICAL: This is a production weather forecasting system supporting NOAA's operational Global Forecast System (GFS), Global Ensemble Forecast System (GEFS), and Seasonal Forecast System (SFS). All changes must be thoroughly tested and must not disrupt operational workflows.**
+
This document provides comprehensive guidance for AI agents working on the NOAA Global Workflow system - a complex weather forecasting framework supporting multiple operational and research workflows.
+## Essential Developer Workflows
+
+### Build System Commands
+```bash
+# Build all components (from sorc/)
+./build_all.sh # Default build
+./build_all.sh -d # Debug mode
+./build_all.sh -f # Fast build with -DFASTER=ON
+./build_all.sh -v # Verbose output
+./build_all.sh -k # Kill all builds if any fails
+
+# Build specific systems
+./build_all.sh gfs # GFS forecast system
+./build_all.sh gefs # GEFS ensemble system
+./build_all.sh sfs # Seasonal forecast system
+./build_all.sh gcafs # Climate analysis system
+./build_all.sh gsi # GSI data assimilation
+./build_all.sh gdas # GDAS system
+./build_all.sh all # All systems
+```
+
+### Experiment Setup Workflow
+```bash
+# 1. Environment setup (CRITICAL - must be done first)
+source ush/detect_machine.sh
+module use modulefiles
+module load module_gwsetup.${MACHINE_ID}
+source dev/workflow/gw_setup.sh
+
+# 2. Create experiment
+cd dev/workflow
+python setup_expt.py gfs forecast-only \
+ --pslot EXPERIMENT_NAME \
+ --configdir parm/config/gfs \
+ --comroot /path/to/data \
+ --expdir /path/to/experiment
+
+# 3. Generate workflow XML
+python setup_xml.py /path/to/experiment
+```
+
+### Platform-Specific Development
+```bash
+# Supported platforms (use detect_machine.sh)
+WCOSS2 # Tier 1 - Full operational support
+Hercules # Tier 1 - MSU, no TC Tracker
+Hera # Tier 2 - NOAA RDHPCS
+Orion # Tier 2 - MSU, GSI runs slowly
+Gaea # Cloud platforms via EPIC
+```
+
## System Architecture Overview
### Core Components
- **Global Workflow**: NOAA's operational weather forecasting framework
-- **Rocoto**: Ruby-based XML workflow manager with Python task generation
-- **wxflow**: Python workflow execution library with Executable class integration
- **UFS Weather Model**: Unified Forecast System components (GFS, GEFS, SFS, GCAFS)
+- **GSI/GDAS**: Global Data Assimilation System with GSI analysis
+- **Job Control System**: Production job scripts calling execution scripts
+- **wxflow**: Python workflow execution library with Executable class integration
+
+### Production System Structure (GFS Operational Underpinnings)
+```
+jobs/ # Production Job Control Language (JCL) scripts (89 files)
+├── JGDAS_* # GDAS (Global Data Assimilation System) jobs
+├── JGFS_* # GFS (Global Forecast System) jobs
+├── JGLOBAL_* # Cross-system global jobs
+├── Analysis Jobs (41) # Data assimilation and analysis
+├── Forecast Jobs (13) # Model forecast execution
+├── Post-Processing (10) # Output product generation
+└── Archive/Cleanup (7) # Data management and cleanup
+
+scripts/ # Execution scripts called by jobs (83 files)
+├── exgdas_*.{sh,py} # GDAS execution scripts
+├── exgfs_*.{sh,py} # GFS execution scripts
+├── exglobal_*.{sh,py} # Global system execution scripts
+├── Analysis Scripts # Data assimilation implementations
+├── Forecast Scripts # Model execution implementations
+└── Post-Processing Scripts # Product generation implementations
+
+ush/ # Utility shell scripts and functions (78 files)
+├── detect_machine.sh # HPC platform detection and configuration
+├── jjob_header.sh # Standard job initialization
+├── bash_utils.sh # Common shell utilities
+├── global_*.sh # Global system utilities
+├── wave_*.sh # Wave model utilities
+├── *_functions.sh # Specialized function libraries
+└── python/ # Python utility modules
+
+parm/ # Parameter files and configuration templates
+├── archive/ # Archive configuration templates
+├── gdas/ # GDAS system parameters
+├── post/ # Post-processing configurations
+├── ufs/ # UFS model configuration templates
+├── wave/ # Wave model parameters
+└── product/ # Product generation configurations
+
+sorc/ # Source code and build infrastructure
+├── build_all.sh # Master build orchestration script
+├── build_*.sh # Component-specific build scripts
+├── ufs_model.fd/ # UFS Weather Model source
+├── gfs_utils.fd/ # GFS utility programs
+├── gsi_*.fd/ # GSI data assimilation source
+├── wxflow/ # Python workflow execution library
+└── CMakeLists.txt # CMake build configuration
+
+env/ # HPC platform environment configurations
+├── WCOSS2.env # NOAA operational system
+├── HERA.env # NOAA RDHPCS research system
+├── HERCULES.env # MSU research system
+└── *.env # Platform-specific settings
+```
+
+### System Execution Flow
+1. **Jobs (`jobs/J*`)** - Entry points defining environment and calling execution scripts
+2. **Scripts (`scripts/ex*.{sh,py}`)** - Implementation logic for each operational component
+3. **Utilities (`ush/`)** - Shared functions and platform-specific utilities
+4. **Parameters (`parm/`)** - Configuration templates for all system components
+5. **Build System (`sorc/`)** - Source code compilation and dependency management
+
+### Job-to-Script-to-Utility Pattern
+```bash
+# Example execution chain:
+JGLOBAL_FORECAST # Job sets environment, calls script
+└── exglobal_forecast.py # Script implements forecast logic
+ └── forecast_det.sh # Utility handles deterministic forecast
+ └── ush/python/ # Python modules for specific tasks
+```
+
+## Workflow Orchestration System
+
+### Workflow Management Components
+- **Rocoto**: Ruby-based XML workflow manager with Python task generation
- **Applications Framework**: Factory pattern for different forecast systems
-### Directory Structure
+### Workflow Directory Structure
```
dev/workflow/ # Core workflow orchestration system
├── applications/ # Application-specific configurations (GFS, GEFS, SFS, GCAFS)
@@ -79,7 +212,7 @@ class Tasks:
**Configuration hierarchy:**
1. `app_config.configs[run]['base']` - Base configuration
-2. `app_config.run_options[run]` - Runtime options
+2. `app_config.run_options[run]` - Runtime options
3. Host-specific overlays from `hosts/` directory
## Workflow Task System
@@ -129,7 +262,7 @@ template = Template(template_str)
### XML Generation Process
1. **Preamble**: XML header and DOCTYPE
-2. **Definitions**: Entity definitions (PSLOT, ROTDIR, MAXTRIES)
+2. **Definitions**: Entity definitions (PSLOT, ROTDIR, MAXTRIES)
3. **Workflow Header**: Scheduler, throttling settings
4. **Cycledefs**: Cycle definitions for workflow scheduling
5. **Tasks**: Generated task XML with dependencies
@@ -145,7 +278,7 @@ meta_tasks_state = {} # State tracking per metatask
### Job State Management
- States: QUEUED, RUNNING, SUCCEEDED, FAILED, DEAD, EXPIRED, LOST
- Retry logic with `maxtries` parameter
-- Hang detection via `hangdependency`
+- Hang detection via `hangdependency`
- Resource throttling and job scheduling
## Development Guidelines
@@ -184,7 +317,7 @@ meta_tasks_state = {} # State tracking per metatask
- **Forecast-only**: Forecast from existing initial conditions
- Classes: `GFSCycledRocotoXML`, `GFSForecastOnlyRocotoXML`
-### GEFS (Global Ensemble Forecast System)
+### GEFS (Global Ensemble Forecast System)
- Ensemble forecasting system
- Special handling for ensemble members via `NMEM_ENS`
- Class: `GEFSRocotoXML`
@@ -217,6 +350,12 @@ module load "module_gwsetup.${MACHINE_ID}"
- WCOSS2 (Operational system)
- AWS, Azure, Google Cloud (Cloud platforms)
+### Throttling Configuration
+```xml
+
+
+
+```
## Common Integration Points
@@ -291,4 +430,74 @@ def test_task_creation():
3. Create modulefiles for environment setup
4. Update environment configurations in `env/` directory
-Remember: This is a production weather forecasting system. Changes must be thoroughly tested and should not disrupt operational workflows. Always follow the existing patterns and conventions when extending the system.
\ No newline at end of file
+## MCP/RAG Tool Integration
+
+### Available Global Workflow MCP Tools
+This repository includes a specialized Model Context Protocol (MCP) server with Retrieval-Augmented Generation (RAG) capabilities. These tools provide intelligent access to workflow documentation, operational guidance, and contextual analysis.
+
+#### When to Use MCP Tools
+**USE MCP tools when:**
+- Researching unfamiliar workflow components or operational procedures
+- Need to search across documentation for specific concepts or patterns
+- Seeking operational guidance for HPC systems or deployment procedures
+- Analyzing dependencies or workflow relationships
+- Looking for code patterns similar to current implementation
+- Need contextual explanations that require deep domain knowledge
+
+**DON'T use MCP tools when:**
+- You have direct access to specific files and can read them efficiently
+- Task is simple file creation or editing without research needs
+- Information is already available in current context
+- RAG system components are not initialized (will return placeholder responses)
+
+#### Available MCP Tools
+
+**Core Workflow Tools:**
+- `mcp_global-workfl_get_workflow_structure` - System architecture and component overview
+- `mcp_global-workfl_list_job_scripts` - Complete inventory of workflow job scripts
+- `mcp_global-workfl_get_system_configs` - HPC platform-specific configurations
+- `mcp_global-workfl_explain_workflow_component` - Deep component analysis and explanation
+
+**RAG-Enhanced Intelligence Tools:**
+- `mcp_global-workfl_search_documentation` - Semantic search across all workflow documentation
+- `mcp_global-workfl_explain_with_context` - Contextual explanations using RAG knowledge base
+- `mcp_global-workfl_find_similar_code` - Vector-based code pattern matching and similarity search
+- `mcp_global-workfl_get_operational_guidance` - HPC operational procedures and best practices
+- `mcp_global-workfl_analyze_workflow_dependencies` - Graph-based dependency analysis and mapping
+
+**GitHub Ecosystem Tools (Live Repository Access):**
+- `github_search_repositories` - Search NOAA-EMC repositories with filtering
+- `github_get_repository_content` - Access files from any repository in real-time
+- `github_search_code` - Code pattern search across entire NOAA-EMC ecosystem
+- `github_get_issues` - GitHub issues for troubleshooting context
+- `github_cross_repo_analysis` - Advanced analysis across multiple repositories
+
+#### Proper Tool Usage Display
+When using MCP tools, acknowledge their usage to demonstrate intelligent tool selection:
+
+```markdown
+**Research Approach:** Using `mcp_globalworkflo_search_documentation` to find relevant
+examples and `mcp_globalworkflo_get_operational_guidance` for HPC-specific procedures.
+```
+
+**Example Integration:**
+```markdown
+Let me research this using the MCP tools to ensure comprehensive coverage:
+
+[Tool usage and results]
+
+Based on the MCP analysis above, here's the recommended approach...
+```
+
+#### MCP Tool Development Context
+These tools are actively being developed and refined on the `MCP_node.js-RAG_development` branch. When the RAG components are not fully initialized, tools may return placeholder responses indicating the need for vector database setup or document ingestion.
+
+**MCP Server Location**: All MCP tools are implemented in `dev/ci/scripts/utils/Copilot/mcp_server_node/`:
+- `mcp-server-rag.js` - Main RAG-enhanced server with 9 workflow tools
+- `mcp-server-github-rag.js` - GitHub ecosystem integration with 14 total tools
+- `start-mcp-server-node.sh` - Primary startup script
+- Configuration files: `mcp-config.env`, `package.json`, `package-rag.json`
+
+**Note for Development:** If you encounter placeholder responses from RAG-enhanced tools, this indicates the vector database needs initialization or document ingestion. The core workflow tools should always provide functional responses.
+
+Remember: This is a production weather forecasting system. Changes must be thoroughly tested and should not disrupt operational workflows. Always follow the existing patterns and conventions when extending the system
diff --git a/.github/workflows/hera.yaml b/.github/workflows/hera.yaml
deleted file mode 100644
index 0dd9f2c3562..00000000000
--- a/.github/workflows/hera.yaml
+++ /dev/null
@@ -1,81 +0,0 @@
-name: Hera
-
-on:
- pull_request_target:
- branches:
- - develop
- types: [closed]
-
-jobs:
-
- getlabels:
- runs-on: ubuntu-22.04
- outputs:
- labels: ${{ steps.id.outputs.labels }}
- steps:
- - name: Get Label Steps
- id: id
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- OWNER: ${{ github.repository_owner }}
- REPO_NAME: ${{ github.event.repository.name }}
- PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
- run: |
- LABELS1="$(gh api repos/$OWNER/$REPO_NAME/pulls/$PULL_REQUEST_NUMBER --jq '.labels.[].name')"
- LABELS=$(echo "$LABELS1" | tr '\n' ' ')
- echo "labels=$LABELS" >> $GITHUB_OUTPUT
-
- passed:
- if: contains( needs.getlabels.outputs.labels, 'CI-Hera-Passed') && github.event.pull_request.merged
- runs-on: ubuntu-latest
- needs:
- - getlabels
-
- steps:
- - name: Passed
- uses: schneegans/dynamic-badges-action@v1.6.0
- with:
- forceUpdate: true
- auth: ${{ secrets.CLI_DYNAMIC_BADGES }}
- gistID: e35aa2904a54deae6bbb1fdc2d960c71
- filename: hera.json
- label: hera
- message: passing
- color: green
-
- failed:
- if: contains( needs.getlabels.outputs.labels, 'CI-Hera-Failed') && github.event.pull_request.merged
- runs-on: ubuntu-latest
- needs:
- - getlabels
-
- steps:
- - name: Failed
- uses: schneegans/dynamic-badges-action@v1.6.0
- with:
- forceUpdate: true
- auth: ${{ secrets.CLI_DYNAMIC_BADGES }}
- gistID: e35aa2904a54deae6bbb1fdc2d960c71
- filename: hera.json
- label: hera
- message: failing
- color: red
-
-
- pending:
- if: "!contains( needs.getlabels.outputs.labels, 'CI-Hera-Passed') && !contains( needs.getlabels.outputs.labels, 'CI-Hera-Failed')"
- runs-on: ubuntu-latest
- needs:
- - getlabels
-
- steps:
- - name: Pending
- uses: schneegans/dynamic-badges-action@v1.6.0
- with:
- forceUpdate: true
- auth: ${{ secrets.CLI_DYNAMIC_BADGES }}
- gistID: e35aa2904a54deae6bbb1fdc2d960c71
- filename: hera.json
- label: hera
- message: pending
- color: orange
diff --git a/.github/workflows/hercules.yaml b/.github/workflows/hercules.yaml
deleted file mode 100644
index a08ec867b69..00000000000
--- a/.github/workflows/hercules.yaml
+++ /dev/null
@@ -1,81 +0,0 @@
-name: Hercules
-
-on:
- pull_request_target:
- branches:
- - develop
- types: [closed]
-
-jobs:
-
- getlabels:
- runs-on: ubuntu-22.04
- outputs:
- labels: ${{ steps.id.outputs.labels }}
- steps:
- - name: Get Label Steps
- id: id
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- OWNER: ${{ github.repository_owner }}
- REPO_NAME: ${{ github.event.repository.name }}
- PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
- run: |
- LABELS1="$(gh api repos/$OWNER/$REPO_NAME/pulls/$PULL_REQUEST_NUMBER --jq '.labels.[].name')"
- LABELS=$(echo "$LABELS1" | tr '\n' ' ')
- echo "labels=$LABELS" >> $GITHUB_OUTPUT
-
- passed:
- if: contains( needs.getlabels.outputs.labels, 'CI-Hercules-Passed') && github.event.pull_request.merged
- runs-on: ubuntu-22.04
- needs:
- - getlabels
-
- steps:
- - name: Passed
- uses: schneegans/dynamic-badges-action@v1.6.0
- with:
- forceUpdate: true
- auth: ${{ secrets.CLI_DYNAMIC_BADGES }}
- gistID: e35aa2904a54deae6bbb1fdc2d960c71
- filename: hercules.json
- label: hercules
- message: passing
- color: green
-
- failed:
- if: contains( needs.getlabels.outputs.labels, 'CI-Hercules-Failed') && github.event.pull_request.merged
- runs-on: ubuntu-latest
- needs:
- - getlabels
-
- steps:
- - name: Failed
- uses: schneegans/dynamic-badges-action@v1.6.0
- with:
- forceUpdate: true
- auth: ${{ secrets.CLI_DYNAMIC_BADGES }}
- gistID: e35aa2904a54deae6bbb1fdc2d960c71
- filename: hercules.json
- label: hercules
- message: failing
- color: red
-
-
- pending:
- if: "!contains( needs.getlabels.outputs.labels, 'CI-Hercules-Passed') && !contains( needs.getlabels.outputs.labels, 'CI-Hercules-Failed')"
- runs-on: ubuntu-latest
- needs:
- - getlabels
-
- steps:
- - name: Pending
- uses: schneegans/dynamic-badges-action@v1.6.0
- with:
- forceUpdate: true
- auth: ${{ secrets.CLI_DYNAMIC_BADGES }}
- gistID: e35aa2904a54deae6bbb1fdc2d960c71
- filename: hercules.json
- label: hercules
- message: pending
- color: orange
diff --git a/README.md b/README.md
index c02d5e8f53d..96f4b99e91f 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,15 @@
[](http://global-workflow.readthedocs.io/)
[](https://github.com/NOAA-EMC/global-workflow/actions/workflows/linters.yaml)
[](https://github.com/NOAA-EMC/global-workflow/actions/workflows/pynorms.yaml)
-
-




-

+
-The Global Workflow supporting the Global Forecast System (GFS), the Global Ensemble Forecasting System (GEFS), and the Seasonal Forecast System (SFS) with the [UFS-weather-model](https://github.com/ufs-community/ufs-weather-model). Data assimilation, currently only available for the GFS, is provides by both the [GSI](https://github.com/NOAA-EMC/GSI)- and [GDASApp (JEDI)](https://github.com/NOAA-EMC/GDASApp)-based Data Assimilation systems.
+The Global Workflow supporting the Global Forecast System (GFS), the Global Ensemble Forecasting System (GEFS), and the Seasonal Forecast System (SFS) with the [UFS-weather-model](https://github.com/ufs-community/ufs-weather-model). Data assimilation, currently only available for the GFS, is provided by both the [GSI](https://github.com/NOAA-EMC/GSI)- and [GDASApp (JEDI)](https://github.com/NOAA-EMC/GDASApp)-based Data Assimilation systems.
In progress [documentation](https://global-workflow.readthedocs.io/en/latest/) is available.
diff --git a/dev/ci/cases/gcafsv1/C384_gcafs_cycled.yaml b/dev/ci/cases/gcafsv1/C384_gcafs_cycled.yaml
index 054a7d25d38..e67af8d6c73 100644
--- a/dev/ci/cases/gcafsv1/C384_gcafs_cycled.yaml
+++ b/dev/ci/cases/gcafsv1/C384_gcafs_cycled.yaml
@@ -1,8 +1,6 @@
experiment:
net: gcafs
mode: cycled
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: ATMA
resdetatmos: 384
@@ -15,3 +13,11 @@ arguments:
interval: 12
start: cold
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/gcafs_cycled_defaults_ci.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/gcafsv1/C384_gcafs_cycled_noDA.yaml b/dev/ci/cases/gcafsv1/C384_gcafs_cycled_noDA.yaml
index 3c730f34490..3accc2f5ed9 100644
--- a/dev/ci/cases/gcafsv1/C384_gcafs_cycled_noDA.yaml
+++ b/dev/ci/cases/gcafsv1/C384_gcafs_cycled_noDA.yaml
@@ -1,8 +1,6 @@
experiment:
net: gcafs
mode: cycled
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: ATMA
resdetatmos: 384
@@ -15,3 +13,11 @@ arguments:
interval: 12
start: cold
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/gcafs_cycled_noDA_defaults_ci.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/gcafsv1/C384_gcafs_cycled_noDA_dev.yaml b/dev/ci/cases/gcafsv1/C384_gcafs_cycled_noDA_dev.yaml
index 9e6c63236cb..bfda39b9624 100644
--- a/dev/ci/cases/gcafsv1/C384_gcafs_cycled_noDA_dev.yaml
+++ b/dev/ci/cases/gcafsv1/C384_gcafs_cycled_noDA_dev.yaml
@@ -1,8 +1,6 @@
experiment:
net: gcafs
mode: cycled
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: ATMA
resdetatmos: 384
@@ -15,3 +13,11 @@ arguments:
interval: 0
start: cold
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/gcafs_cycled_noDA_defaults_dev.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/gcafsv1/C96_gcafs_cycled.yaml b/dev/ci/cases/gcafsv1/C96_gcafs_cycled.yaml
index 30c7208d7ec..138fd7c356b 100644
--- a/dev/ci/cases/gcafsv1/C96_gcafs_cycled.yaml
+++ b/dev/ci/cases/gcafsv1/C96_gcafs_cycled.yaml
@@ -1,8 +1,6 @@
experiment:
net: gcafs
mode: cycled
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: ATMA
resdetatmos: 96
@@ -15,3 +13,11 @@ arguments:
interval: 12
start: cold
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/gcafs_cycled_defaults_ci.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/gcafsv1/C96_gcafs_cycled_noDA.yaml b/dev/ci/cases/gcafsv1/C96_gcafs_cycled_noDA.yaml
index f1bb7596c40..65164ae4297 100644
--- a/dev/ci/cases/gcafsv1/C96_gcafs_cycled_noDA.yaml
+++ b/dev/ci/cases/gcafsv1/C96_gcafs_cycled_noDA.yaml
@@ -1,8 +1,6 @@
experiment:
net: gcafs
mode: cycled
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: ATMA
resdetatmos: 96
@@ -15,3 +13,11 @@ arguments:
interval: 12
start: cold
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/gcafs_cycled_noDA_defaults_ci.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/gcafsv1/C96_gcafs_cycled_noDA_dev.yaml b/dev/ci/cases/gcafsv1/C96_gcafs_cycled_noDA_dev.yaml
index 7d3132d14c1..f22670f274d 100644
--- a/dev/ci/cases/gcafsv1/C96_gcafs_cycled_noDA_dev.yaml
+++ b/dev/ci/cases/gcafsv1/C96_gcafs_cycled_noDA_dev.yaml
@@ -1,8 +1,6 @@
experiment:
net: gcafs
mode: cycled
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: ATMA
resdetatmos: 96
@@ -15,3 +13,11 @@ arguments:
interval: 0
start: cold
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/gcafs_cycled_noDA_defaults_dev.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/gfsv17/C1152mx025_S2SW.yaml b/dev/ci/cases/gfsv17/C1152mx025_S2SW.yaml
index 666c6fd0581..67375d8d3ee 100644
--- a/dev/ci/cases/gfsv17/C1152mx025_S2SW.yaml
+++ b/dev/ci/cases/gfsv17/C1152mx025_S2SW.yaml
@@ -1,8 +1,6 @@
experiment:
net: gfs
mode: cycled
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: S2SW
resdetatmos: 1152
@@ -15,8 +13,13 @@ arguments:
expdir: /lfs/h2/emc/global/noscrub/emc.global/RETRO_GFSv17/expdir
idate: 2024111506
edate: 2025011600
- icsdir: /lfs/h2/emc/physics/noscrub/ruiyu.sun/ICs/RETROs/GFSv17_RETRO_warmATmic_withlandNspread_N_oceanicewave
- #idate: 2023041506
- #edate: 2023061600
- #icsdir: /lfs/h2/emc/da/noscrub/catherine.thomas/ICS/C1152C384/2023041506
+ icsdir: /lfs/h2/emc/ptmp/emc.global/RETRO_GFSv17/IC/v2
yaml: {{ HOMEgfs }}/dev/ci/cases/gfsv17/s2sw.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/gfsv17/C1152mx025_S2SW_rdhpcs.yaml b/dev/ci/cases/gfsv17/C1152mx025_S2SW_rdhpcs.yaml
index 0bc5327c7f8..09e7be8e8c9 100644
--- a/dev/ci/cases/gfsv17/C1152mx025_S2SW_rdhpcs.yaml
+++ b/dev/ci/cases/gfsv17/C1152mx025_S2SW_rdhpcs.yaml
@@ -1,8 +1,6 @@
experiment:
net: gfs
mode: cycled
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: S2SW
resdetatmos: 1152
@@ -19,4 +17,12 @@ arguments:
icsdir: /gpfs/f6/drsa-precip3/world-shared/role.glopara/data/ICSDIR/retro_ICs
#msu
#icsdir: /work2/noaa/global/role-global/data/ICSDIR/retro_ICs
- yaml: {{ HOMEgfs }}/dev/ci/cases/gfsv17/s2sw.yaml
+ yaml: {{ HOMEgfs }}/dev/ci/cases/gfsv17/s2sw_rdhpcs.yaml
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
+
diff --git a/dev/ci/cases/gfsv17/C384mx025_3DVarAOWCDA.yaml b/dev/ci/cases/gfsv17/C384mx025_3DVarAOWCDA.yaml
index c74a6e81b50..cbd4c74ed20 100644
--- a/dev/ci/cases/gfsv17/C384mx025_3DVarAOWCDA.yaml
+++ b/dev/ci/cases/gfsv17/C384mx025_3DVarAOWCDA.yaml
@@ -1,8 +1,6 @@
experiment:
net: gfs
mode: cycled
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: S2S
resdetatmos: 384
@@ -15,8 +13,13 @@ arguments:
idate: 2021063018
edate: 2021070306
# NOTE: this directory is read-only
- #icsdir: /scratch1/NCEPDEV/climate/Jessica.Meixner/cycling/IC_2021063000_V2
- #icsdir: /work/noaa/da/gvernier/ensda/ictest/1440x1080x75/
- # NOTE this directory is read-only
- icsdir: /scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/prepics/hybrid-test/
+ icsdir:
yaml: {{ HOMEgfs }}/dev/ci/cases/gfsv17/marine3dvar.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/gfsv17/C384mx025_hybAOWCDA.yaml b/dev/ci/cases/gfsv17/C384mx025_hybAOWCDA.yaml
index b68f8aafb1c..41060e89975 100644
--- a/dev/ci/cases/gfsv17/C384mx025_hybAOWCDA.yaml
+++ b/dev/ci/cases/gfsv17/C384mx025_hybAOWCDA.yaml
@@ -1,8 +1,6 @@
experiment:
net: gfs
mode: cycled
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: S2S
resdetatmos: 384
@@ -15,6 +13,13 @@ arguments:
expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR
idate: 2021063018
edate: 2021070306
- #icsdir: /work/noaa/da/gvernier/ensda/ictest/1440x1080x75/
- icsdir: /scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/prepics/hybrid-test/
+ icsdir:
yaml: {{ HOMEgfs }}/dev/ci/cases/gfsv17/marinehyb.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/gfsv17/marine3dvar.yaml b/dev/ci/cases/gfsv17/marine3dvar.yaml
index 6a67ee7a813..259397b486e 100644
--- a/dev/ci/cases/gfsv17/marine3dvar.yaml
+++ b/dev/ci/cases/gfsv17/marine3dvar.yaml
@@ -17,10 +17,11 @@ base:
prepoceanobs:
use_exp_obs: "YES"
- dmpdir_exp: /scratch3/NCEPDEV/da/common/
+ # will not work for realtime or retros
+ dmpdir_exp: "${BASE_DATA}/experimental_obs"
marineanl:
SOCA_INPUT_FIX_DIR: {{ HOMEgfs }}/fix/gdas/soca/1440x1080x75/soca
SOCA_ANL_GEOM: {{ HOMEgfs }}/fix/gdas/soca/720x540x75/soca
- SOCA_OBS_LIST: {{ HOMEgfs }}/parm/gdas/marine/obs/obs_list.yaml.j2
+ SOCA_OBS_LIST: {{ HOMEgfs }}/parm/gdas/marine/obs/obs_list_gfsv17.yaml.j2
SOCA_NINNER: 100
diff --git a/dev/ci/cases/gfsv17/marinehyb.yaml b/dev/ci/cases/gfsv17/marinehyb.yaml
index a0a23b4b787..ca6e0f6f311 100644
--- a/dev/ci/cases/gfsv17/marinehyb.yaml
+++ b/dev/ci/cases/gfsv17/marinehyb.yaml
@@ -17,7 +17,9 @@ base:
prepoceanobs:
use_exp_obs: "YES"
- dmpdir_exp: /scratch3/NCEPDEV/da/common/
+ # will not work for realtime or retros
+ dmpdir_exp: "${BASE_DATA}/experimental_obs"
+
marineanl:
SOCA_INPUT_FIX_DIR: {{ HOMEgfs }}/fix/gdas/soca/1440x1080x75/soca
diff --git a/dev/ci/cases/gfsv17/s2sw.yaml b/dev/ci/cases/gfsv17/s2sw.yaml
index f6127a89846..5deadf3b58b 100644
--- a/dev/ci/cases/gfsv17/s2sw.yaml
+++ b/dev/ci/cases/gfsv17/s2sw.yaml
@@ -25,9 +25,13 @@ base:
prepoceanobs:
use_exp_obs: "YES"
+ # retro
+ # dmpdir_exp: /lfs/h2/emc/da/noscrub/common_obsForge
+ # realtime
+ dmpdir_exp: /lfs/h2/emc/da/noscrub/mindo.choi/MARINE_obs/COMROOT/realtime
marineanl:
SOCA_INPUT_FIX_DIR: {{ HOMEgfs }}/fix/gdas/soca/1440x1080x75/soca
SOCA_ANL_GEOM: {{ HOMEgfs }}/fix/gdas/soca/720x540x75/soca
- SOCA_OBS_LIST: {{ HOMEgfs }}/parm/gdas/marine/obs/obs_list.yaml.j2
+ SOCA_OBS_LIST: {{ HOMEgfs }}/parm/gdas/marine/obs/obs_list_gfsv17.yaml.j2
SOCA_NINNER: 100
diff --git a/dev/ci/cases/gfsv17/s2sw_rdhpcs.yaml b/dev/ci/cases/gfsv17/s2sw_rdhpcs.yaml
new file mode 100644
index 00000000000..97d0749117b
--- /dev/null
+++ b/dev/ci/cases/gfsv17/s2sw_rdhpcs.yaml
@@ -0,0 +1,37 @@
+defaults:
+ !INC {{ HOMEgfs }}/dev/parm/config/gfs/yaml/defaults.yaml
+
+base:
+ DOIAU: "YES"
+ DO_JEDIATMVAR: "NO"
+ DO_JEDIATMENS: "NO"
+ DO_JEDIOCNVAR: "YES"
+ DO_JEDISNOWDA: "YES"
+ DO_GSISOILDA: "YES"
+ DO_LAND_IAU: ".true."
+ DO_MERGENSST: "NO"
+ DOHYBVAR: "YES"
+ DOHYBVAR_OCN: "YES"
+ DOLETKF_OCN: "NO"
+ DO_STARTMEM_FROM_JEDIICE: "YES"
+ DO_FIT2OBS: "YES"
+ DO_VERFOZN: "YES"
+ DO_VERFRAD: "YES"
+ EUPD_CYC: "both"
+ INTERVAL_GFS: 6
+ SDATE_GFS: 2024111512
+ FHMAX_GFS: 384
+ FHMAX_HF_GFS: 120
+
+prepoceanobs:
+ use_exp_obs: "YES"
+ # gaea
+ dmpdir_exp: /gpfs/f6/gfs-cpu/world-shared/Mindo.Choi/common_obsForge
+ # ursa
+ # dmpdir_exp: /scratch3/NCEPDEV/da/common_obsForge
+
+marineanl:
+ SOCA_INPUT_FIX_DIR: {{ HOMEgfs }}/fix/gdas/soca/1440x1080x75/soca
+ SOCA_ANL_GEOM: {{ HOMEgfs }}/fix/gdas/soca/720x540x75/soca
+ SOCA_OBS_LIST: {{ HOMEgfs }}/parm/gdas/marine/obs/obs_list_gfsv17.yaml.j2
+ SOCA_NINNER: 100
diff --git a/dev/ci/cases/hires/C1152_S2SW.yaml b/dev/ci/cases/hires/C1152_S2SW.yaml
index c1bdaccfca2..cb7dfd8f87b 100644
--- a/dev/ci/cases/hires/C1152_S2SW.yaml
+++ b/dev/ci/cases/hires/C1152_S2SW.yaml
@@ -1,8 +1,6 @@
experiment:
net: gfs
mode: forecast-only
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: S2SW
resdetatmos: 1152
@@ -12,3 +10,11 @@ arguments:
idate: 2019120300
edate: 2019120300
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/gfs_defaults_ci.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/hires/C768_S2SW.yaml b/dev/ci/cases/hires/C768_S2SW.yaml
index d886bac7ecd..02963759188 100644
--- a/dev/ci/cases/hires/C768_S2SW.yaml
+++ b/dev/ci/cases/hires/C768_S2SW.yaml
@@ -1,8 +1,6 @@
experiment:
net: gfs
mode: forecast-only
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: S2SW
resdetatmos: 768
@@ -12,3 +10,11 @@ arguments:
idate: 2019120300
edate: 2019120300
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/gfs_defaults_ci.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/pr/C48_ATM.yaml b/dev/ci/cases/pr/C48_ATM.yaml
index 48f7a31c61b..abee60a924f 100644
--- a/dev/ci/cases/pr/C48_ATM.yaml
+++ b/dev/ci/cases/pr/C48_ATM.yaml
@@ -17,5 +17,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C48_ATM_ecflow.yaml b/dev/ci/cases/pr/C48_ATM_ecflow.yaml
index 3a1326fd3a6..eae20d5a591 100644
--- a/dev/ci/cases/pr/C48_ATM_ecflow.yaml
+++ b/dev/ci/cases/pr/C48_ATM_ecflow.yaml
@@ -11,6 +11,7 @@ experiment:
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/gfs_defaults_ci.yaml
skip_ci_on_hosts:
+ - wcoss2
- hera
- ursa
- gaeac5
@@ -18,13 +19,8 @@ skip_ci_on_hosts:
- orion
- hercules
- awsepicglobalworkflow
- - wcoss2
workflow:
- engine: rocoto # TODO: change to ecflow soon
- rocoto:
- maxtries: 2
- cyclethrottle: 3
- taskthrottle: 25
+ engine: ecflow
ecflow:
- dummy: 1
+ verbosity: 1
diff --git a/dev/ci/cases/pr/C48_S2SW.yaml b/dev/ci/cases/pr/C48_S2SW.yaml
index 324c2548ac2..59148444792 100644
--- a/dev/ci/cases/pr/C48_S2SW.yaml
+++ b/dev/ci/cases/pr/C48_S2SW.yaml
@@ -18,5 +18,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C48_S2SWA_gefs.yaml b/dev/ci/cases/pr/C48_S2SWA_gefs.yaml
index 49d9236916c..6b69bdd3222 100644
--- a/dev/ci/cases/pr/C48_S2SWA_gefs.yaml
+++ b/dev/ci/cases/pr/C48_S2SWA_gefs.yaml
@@ -26,5 +26,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C48_S2SWA_gefs_RT.yaml b/dev/ci/cases/pr/C48_S2SWA_gefs_RT.yaml
index ce2353775e2..4bd99d07b00 100644
--- a/dev/ci/cases/pr/C48_S2SWA_gefs_RT.yaml
+++ b/dev/ci/cases/pr/C48_S2SWA_gefs_RT.yaml
@@ -35,5 +35,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C48_S2SW_extended.yaml b/dev/ci/cases/pr/C48_S2SW_extended.yaml
index 35a76f562ab..c6e0c29f25c 100644
--- a/dev/ci/cases/pr/C48_S2SW_extended.yaml
+++ b/dev/ci/cases/pr/C48_S2SW_extended.yaml
@@ -27,5 +27,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml b/dev/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml
index b3780f1036e..720bac1f691 100644
--- a/dev/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml
+++ b/dev/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml
@@ -27,5 +27,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C48mx500_hybAOWCDA.yaml b/dev/ci/cases/pr/C48mx500_hybAOWCDA.yaml
index e4f0f44f534..905ed594f54 100644
--- a/dev/ci/cases/pr/C48mx500_hybAOWCDA.yaml
+++ b/dev/ci/cases/pr/C48mx500_hybAOWCDA.yaml
@@ -28,5 +28,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C96C48_hybatmDA.yaml b/dev/ci/cases/pr/C96C48_hybatmDA.yaml
index 2566afe5759..66cb2168658 100644
--- a/dev/ci/cases/pr/C96C48_hybatmDA.yaml
+++ b/dev/ci/cases/pr/C96C48_hybatmDA.yaml
@@ -27,5 +27,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C96C48_hybatmsnowDA.yaml b/dev/ci/cases/pr/C96C48_hybatmsnowDA.yaml
index 06a3c5382d0..59ea35b979e 100644
--- a/dev/ci/cases/pr/C96C48_hybatmsnowDA.yaml
+++ b/dev/ci/cases/pr/C96C48_hybatmsnowDA.yaml
@@ -28,5 +28,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C96C48_hybatmsoilDA.yaml b/dev/ci/cases/pr/C96C48_hybatmsoilDA.yaml
index 407811c7142..155e67a414c 100644
--- a/dev/ci/cases/pr/C96C48_hybatmsoilDA.yaml
+++ b/dev/ci/cases/pr/C96C48_hybatmsoilDA.yaml
@@ -28,5 +28,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C96C48_ufs_hybatmDA.yaml b/dev/ci/cases/pr/C96C48_ufs_hybatmDA.yaml
index a93293a73a3..eaafc4b3853 100644
--- a/dev/ci/cases/pr/C96C48_ufs_hybatmDA.yaml
+++ b/dev/ci/cases/pr/C96C48_ufs_hybatmDA.yaml
@@ -29,5 +29,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C96C48mx500_S2SW_cyc_gfs.yaml b/dev/ci/cases/pr/C96C48mx500_S2SW_cyc_gfs.yaml
index ee6cca07547..f7184a4b228 100644
--- a/dev/ci/cases/pr/C96C48mx500_S2SW_cyc_gfs.yaml
+++ b/dev/ci/cases/pr/C96C48mx500_S2SW_cyc_gfs.yaml
@@ -26,5 +26,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C96_atm3DVar.yaml b/dev/ci/cases/pr/C96_atm3DVar.yaml
index dfbf6c9b091..6141b8c94af 100644
--- a/dev/ci/cases/pr/C96_atm3DVar.yaml
+++ b/dev/ci/cases/pr/C96_atm3DVar.yaml
@@ -26,5 +26,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C96_atm3DVar_extended.yaml b/dev/ci/cases/pr/C96_atm3DVar_extended.yaml
index d5838386db5..fda4f62d1c6 100644
--- a/dev/ci/cases/pr/C96_atm3DVar_extended.yaml
+++ b/dev/ci/cases/pr/C96_atm3DVar_extended.yaml
@@ -30,5 +30,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 75
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C96_gcafs_cycled.yaml b/dev/ci/cases/pr/C96_gcafs_cycled.yaml
index a3e39383c21..58d9c8ab5f3 100644
--- a/dev/ci/cases/pr/C96_gcafs_cycled.yaml
+++ b/dev/ci/cases/pr/C96_gcafs_cycled.yaml
@@ -28,5 +28,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C96_gcafs_cycled_noDA.yaml b/dev/ci/cases/pr/C96_gcafs_cycled_noDA.yaml
index b45696595ab..8a816eb850d 100644
--- a/dev/ci/cases/pr/C96_gcafs_cycled_noDA.yaml
+++ b/dev/ci/cases/pr/C96_gcafs_cycled_noDA.yaml
@@ -28,5 +28,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/pr/C96mx100_S2S.yaml b/dev/ci/cases/pr/C96mx100_S2S.yaml
index 3f2e256c948..6049ccdd43e 100644
--- a/dev/ci/cases/pr/C96mx100_S2S.yaml
+++ b/dev/ci/cases/pr/C96mx100_S2S.yaml
@@ -12,7 +12,7 @@ experiment:
nens: 2
comroot: {{ 'RUNTESTS' | getenv }}/COMROOT
expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR
- icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96mx100/20240610
+ icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96mx100/20250808
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/sfs_defaults.yaml
skip_ci_on_hosts:
@@ -26,5 +26,3 @@ workflow:
cyclethrottle: 3
taskthrottle: 25
verbosity: 2
- ecflow:
- dummy: 1
diff --git a/dev/ci/cases/sfs/C96mx100_S2S.yaml b/dev/ci/cases/sfs/C96mx100_S2S.yaml
index 276d49075a3..85cec125b55 100644
--- a/dev/ci/cases/sfs/C96mx100_S2S.yaml
+++ b/dev/ci/cases/sfs/C96mx100_S2S.yaml
@@ -1,8 +1,6 @@
experiment:
net: sfs
mode: forecast-only
-
-arguments:
idate: 1994050100
edate: 1994050100
pslot: {{ 'pslot' | getenv }}
@@ -16,3 +14,11 @@ arguments:
expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR
icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96mx100/20240610
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/sfs_full.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/weekly/C384C192_hybatmda.yaml b/dev/ci/cases/weekly/C384C192_hybatmda.yaml
index 851b7f5f797..30ac6797615 100644
--- a/dev/ci/cases/weekly/C384C192_hybatmda.yaml
+++ b/dev/ci/cases/weekly/C384C192_hybatmda.yaml
@@ -1,8 +1,6 @@
experiment:
net: gfs
mode: cycled
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: ATM
resdetatmos: 384
@@ -17,3 +15,11 @@ arguments:
interval: 24
start: cold
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/gfs_defaults_ci.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/weekly/C384_S2SWA.yaml b/dev/ci/cases/weekly/C384_S2SWA.yaml
index 8518a8f1b1c..be494acf8aa 100644
--- a/dev/ci/cases/weekly/C384_S2SWA.yaml
+++ b/dev/ci/cases/weekly/C384_S2SWA.yaml
@@ -1,8 +1,6 @@
experiment:
net: gfs
mode: forecast-only
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: S2SWA
resdetatmos: 384
@@ -13,6 +11,14 @@ arguments:
edate: 2016070100
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/gfs_defaults_ci.yaml
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
+
# ICs are not currently available for this test.
skip_ci_on_hosts:
- gaeac6
diff --git a/dev/ci/cases/weekly/C384_atm3DVar.yaml b/dev/ci/cases/weekly/C384_atm3DVar.yaml
index 3a30c3bdf1b..7ef7c52ff11 100644
--- a/dev/ci/cases/weekly/C384_atm3DVar.yaml
+++ b/dev/ci/cases/weekly/C384_atm3DVar.yaml
@@ -1,8 +1,6 @@
experiment:
net: gfs
mode: cycled
-
-arguments:
pslot: {{ 'pslot' | getenv }}
app: ATM
resdetatmos: 384
@@ -17,3 +15,11 @@ arguments:
interval: 24
start: cold
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/gfs_defaults_ci.yaml
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/yamls/soca_hyb_gfs_defaults_ci.yaml b/dev/ci/cases/yamls/soca_hyb_gfs_defaults_ci.yaml
index cab6674c9ad..d5f27efb4ec 100644
--- a/dev/ci/cases/yamls/soca_hyb_gfs_defaults_ci.yaml
+++ b/dev/ci/cases/yamls/soca_hyb_gfs_defaults_ci.yaml
@@ -3,6 +3,6 @@ defaults:
base:
DO_JEDIOCNVAR: "YES"
DOHYBVAR_OCN: "YES"
- DOLETKF_OCN: "YES"
+ DOLETKF_OCN: "NO"
marineanl:
SOCA_NINNER: 1
diff --git a/dev/ctests/cases/C48_S2SW_gfs_fcst_seg0.yaml b/dev/ctests/cases/C48_S2SW_gfs_fcst_seg0.yaml
index 9157745d359..727a5eb435b 100644
--- a/dev/ctests/cases/C48_S2SW_gfs_fcst_seg0.yaml
+++ b/dev/ctests/cases/C48_S2SW_gfs_fcst_seg0.yaml
@@ -35,19 +35,108 @@ input_files:
- [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/atmos/input/sfc_data.tile4.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/atmos/input/sfc_data.tile4.nc]
- [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/atmos/input/sfc_data.tile5.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/atmos/input/sfc_data.tile5.nc]
- [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/atmos/input/sfc_data.tile6.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/atmos/input/sfc_data.tile6.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.aoc_9km.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.aoc_9km.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.at_10m.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.at_10m.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.ep_10m.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.ep_10m.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.glo_30m.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.glo_30m.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.gnh_10m.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.gnh_10m.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.gsh_15m.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.gsh_15m.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.uglo_100km.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.uglo_100km.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.wc_10m.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.wave.t{{ cyc }}z.mod_def.wc_10m.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.aoc_9km.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.aoc_9km.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.at_10m.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.at_10m.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.ep_10m.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.ep_10m.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.glo_30m.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.glo_30m.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.gnh_10m.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.gnh_10m.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.gsh_15m.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.gsh_15m.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.uglo_100km.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.uglo_100km.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.wc_10m.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/prep/gfs.t{{ cyc }}z.mod_def.wc_10m.bin]
+# =============================================================================
+# Wave uglo_100km Output File Pattern Update
+# =============================================================================
+# The uglo_100km wave history files below have been corrected to match the
+# actual model output pattern defined in dev/parm/config/gfs/config.base.j2:
+#
+# Configuration:
+# FHOUT_WAV=1 # Hourly output f000-f048 (49 files)
+# FHOUT_WAV_GFS=3 # 3-hourly output f051-f120 (24 files)
+# FHMAX_HF_WAV=48 # High-frequency cutoff at 48 hours
+#
+# Result: 73 total uglo_100km files matching actual production output
+# =============================================================================
output_files:
cmpfiles:
+ # Wave uglo_100km files - corrected pattern (hourly f000-f048, 3-hourly f051-f120)
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f000.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f000.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f001.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f001.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f002.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f002.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f003.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f003.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f004.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f004.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f005.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f005.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f006.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f006.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f007.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f007.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f008.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f008.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f009.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f009.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f010.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f010.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f011.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f011.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f012.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f012.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f013.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f013.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f014.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f014.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f015.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f015.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f016.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f016.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f017.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f017.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f018.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f018.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f019.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f019.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f020.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f020.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f021.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f021.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f022.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f022.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f023.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f023.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f024.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f024.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f025.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f025.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f026.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f026.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f027.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f027.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f028.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f028.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f029.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f029.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f030.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f030.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f031.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f031.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f032.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f032.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f033.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f033.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f034.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f034.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f035.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f035.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f036.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f036.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f037.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f037.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f038.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f038.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f039.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f039.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f040.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f040.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f041.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f041.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f042.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f042.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f043.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f043.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f044.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f044.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f045.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f045.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f046.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f046.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f047.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f047.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f048.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f048.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f051.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f051.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f054.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f054.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f057.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f057.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f060.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f060.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f063.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f063.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f066.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f066.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f069.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f069.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f072.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f072.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f075.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f075.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f078.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f078.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f081.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f081.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f084.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f084.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f087.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f087.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f090.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f090.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f093.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f093.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f096.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f096.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f099.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f099.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f102.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f102.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f105.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f105.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f108.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f108.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f111.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f111.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f114.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f114.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f117.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f117.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f120.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f120.bin]
+
+ # Standard output files (configuration, atmosphere, ice, ocean, other wave files)
- [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/conf/ufs.MOM_input, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/conf/ufs.MOM_input]
- [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/conf/ufs.diag_table, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/conf/ufs.diag_table]
- [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/conf/ufs.ice_in, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/conf/ufs.ice_in]
@@ -301,247 +390,197 @@ output_files:
- [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/ocean/history/gfs.ocean.t{{ cyc }}z.6hr_avg.f108.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/ocean/history/gfs.ocean.t{{ cyc }}z.6hr_avg.f108.nc]
- [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/ocean/history/gfs.ocean.t{{ cyc }}z.6hr_avg.f114.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/ocean/history/gfs.ocean.t{{ cyc }}z.6hr_avg.f114.nc]
- [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/ocean/history/gfs.ocean.t{{ cyc }}z.6hr_avg.f120.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/ocean/history/gfs.ocean.t{{ cyc }}z.6hr_avg.f120.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.log.uglo_100km.{{ PDY }}{{ cyc }}, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.log.uglo_100km.{{ PDY }}{{ cyc }}]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f000.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f000.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f001.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f001.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f002.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f002.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f003.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f003.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f004.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f004.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f005.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f005.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f006.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f006.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f007.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f007.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f008.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f008.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f009.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f009.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f010.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f010.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f011.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f011.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f012.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f012.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f013.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f013.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f014.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f014.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f015.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f015.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f016.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f016.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f017.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f017.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f018.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f018.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f019.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f019.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f020.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f020.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f021.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f021.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f022.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f022.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f023.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f023.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f024.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f024.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f025.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f025.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f026.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f026.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f027.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f027.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f028.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f028.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f029.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f029.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f030.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f030.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f031.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f031.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f032.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f032.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f033.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f033.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f034.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f034.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f035.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f035.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f036.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f036.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f037.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f037.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f038.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f038.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f039.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f039.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f040.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f040.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f041.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f041.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f042.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f042.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f043.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f043.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f044.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f044.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f045.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f045.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f046.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f046.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f047.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f047.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f048.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f048.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f049.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f049.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f050.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f050.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f051.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f051.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f052.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f052.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f053.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f053.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f054.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f054.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f055.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f055.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f056.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f056.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f057.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f057.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f058.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f058.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f059.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f059.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f060.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f060.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f061.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f061.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f062.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f062.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f063.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f063.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f064.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f064.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f065.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f065.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f066.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f066.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f067.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f067.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f068.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f068.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f069.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f069.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f070.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f070.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f071.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f071.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f072.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f072.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f073.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f073.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f074.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f074.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f075.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f075.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f076.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f076.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f077.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f077.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f078.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f078.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f079.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f079.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f080.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f080.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f081.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f081.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f082.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f082.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f083.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f083.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f084.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f084.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f085.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f085.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f086.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f086.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f087.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f087.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f088.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f088.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f089.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f089.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f090.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f090.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f091.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f091.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f092.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f092.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f093.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f093.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f094.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f094.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f095.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f095.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f096.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f096.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f097.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f097.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f098.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f098.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f099.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f099.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f100.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f100.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f101.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f101.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f102.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f102.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f103.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f103.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f104.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f104.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f105.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f105.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f106.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f106.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f107.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f107.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f108.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f108.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f109.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f109.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f110.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f110.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f111.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f111.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f112.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f112.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f113.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f113.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f114.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f114.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f115.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f115.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f116.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f116.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f117.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f117.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f118.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f118.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f119.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f119.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f120.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.points.f120.nc]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f000.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f000.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f001.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f001.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f002.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f002.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f003.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f003.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f004.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f004.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f005.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f005.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f006.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f006.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f007.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f007.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f008.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f008.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f009.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f009.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f010.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f010.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f011.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f011.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f012.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f012.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f013.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f013.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f014.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f014.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f015.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f015.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f016.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f016.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f017.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f017.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f018.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f018.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f019.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f019.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f020.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f020.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f021.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f021.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f022.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f022.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f023.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f023.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f024.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f024.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f025.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f025.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f026.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f026.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f027.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f027.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f028.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f028.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f029.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f029.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f030.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f030.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f031.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f031.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f032.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f032.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f033.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f033.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f034.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f034.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f035.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f035.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f036.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f036.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f037.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f037.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f038.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f038.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f039.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f039.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f040.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f040.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f041.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f041.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f042.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f042.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f043.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f043.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f044.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f044.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f045.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f045.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f046.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f046.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f047.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f047.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f048.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f048.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f049.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f049.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f050.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f050.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f051.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f051.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f052.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f052.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f053.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f053.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f054.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f054.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f055.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f055.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f056.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f056.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f057.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f057.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f058.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f058.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f059.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f059.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f060.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f060.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f061.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f061.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f062.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f062.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f063.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f063.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f064.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f064.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f065.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f065.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f066.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f066.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f067.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f067.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f068.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f068.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f069.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f069.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f070.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f070.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f071.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f071.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f072.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f072.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f073.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f073.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f074.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f074.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f075.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f075.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f076.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f076.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f077.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f077.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f078.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f078.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f079.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f079.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f080.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f080.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f081.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f081.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f082.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f082.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f083.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f083.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f084.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f084.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f085.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f085.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f086.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f086.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f087.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f087.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f088.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f088.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f089.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f089.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f090.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f090.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f091.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f091.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f092.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f092.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f093.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f093.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f094.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f094.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f095.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f095.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f096.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f096.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f097.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f097.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f098.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f098.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f099.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f099.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f100.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f100.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f101.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f101.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f102.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f102.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f103.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f103.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f104.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f104.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f105.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f105.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f106.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f106.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f107.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f107.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f108.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f108.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f109.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f109.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f110.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f110.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f111.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f111.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f112.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f112.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f113.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f113.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f114.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f114.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f115.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f115.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f116.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f116.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f117.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f117.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f118.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f118.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f119.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f119.bin]
- - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f120.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.wave.t{{ cyc }}z.uglo_100km.f120.bin]
- - [{{ SRC_DIR }}/logs/{{ PDY }}{{ cyc }}/gfs_fcst_seg0.log, {{ DST_DIR }}/logs/{{ PDY }}{{ cyc }}/gfs_fcst_seg0.log]
\ No newline at end of file
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f000.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f000.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f001.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f001.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f002.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f002.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f003.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f003.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f004.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f004.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f005.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f005.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f006.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f006.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f007.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f007.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f008.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f008.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f009.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f009.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f010.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f010.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f011.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f011.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f012.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f012.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f013.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f013.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f014.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f014.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f015.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f015.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f016.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f016.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f017.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f017.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f018.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f018.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f019.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f019.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f020.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f020.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f021.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f021.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f022.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f022.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f023.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f023.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f024.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f024.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f025.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f025.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f026.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f026.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f027.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f027.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f028.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f028.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f029.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f029.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f030.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f030.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f031.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f031.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f032.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f032.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f033.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f033.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f034.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f034.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f035.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f035.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f036.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f036.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f037.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f037.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f038.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f038.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f039.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f039.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f040.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f040.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f041.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f041.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f042.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f042.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f043.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f043.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f044.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f044.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f045.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f045.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f046.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f046.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f047.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f047.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f048.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f048.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f049.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f049.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f050.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f050.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f051.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f051.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f052.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f052.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f053.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f053.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f054.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f054.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f055.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f055.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f056.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f056.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f057.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f057.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f058.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f058.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f059.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f059.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f060.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f060.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f061.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f061.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f062.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f062.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f063.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f063.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f064.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f064.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f065.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f065.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f066.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f066.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f067.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f067.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f068.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f068.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f069.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f069.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f070.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f070.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f071.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f071.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f072.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f072.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f073.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f073.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f074.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f074.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f075.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f075.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f076.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f076.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f077.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f077.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f078.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f078.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f079.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f079.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f080.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f080.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f081.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f081.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f082.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f082.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f083.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f083.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f084.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f084.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f085.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f085.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f086.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f086.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f087.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f087.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f088.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f088.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f089.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f089.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f090.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f090.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f091.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f091.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f092.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f092.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f093.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f093.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f094.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f094.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f095.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f095.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f096.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f096.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f097.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f097.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f098.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f098.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f099.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f099.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f100.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f100.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f101.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f101.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f102.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f102.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f103.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f103.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f104.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f104.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f105.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f105.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f106.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f106.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f107.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f107.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f108.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f108.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f109.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f109.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f110.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f110.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f111.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f111.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f112.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f112.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f113.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f113.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f114.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f114.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f115.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f115.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f116.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f116.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f117.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f117.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f118.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f118.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f119.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f119.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f120.nc, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.points.f120.nc]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f000.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f000.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f001.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f001.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f002.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f002.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f003.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f003.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f004.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f004.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f005.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f005.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f006.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f006.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f007.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f007.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f008.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f008.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f009.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f009.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f010.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f010.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f011.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f011.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f012.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f012.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f013.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f013.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f014.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f014.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f015.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f015.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f016.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f016.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f017.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f017.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f018.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f018.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f019.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f019.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f020.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f020.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f021.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f021.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f022.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f022.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f023.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f023.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f024.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f024.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f025.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f025.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f026.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f026.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f027.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f027.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f028.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f028.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f029.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f029.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f030.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f030.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f031.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f031.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f032.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f032.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f033.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f033.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f034.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f034.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f035.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f035.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f036.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f036.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f037.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f037.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f038.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f038.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f039.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f039.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f040.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f040.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f041.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f041.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f042.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f042.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f043.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f043.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f044.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f044.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f045.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f045.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f046.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f046.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f047.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f047.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f048.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f048.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f051.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f051.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f054.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f054.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f057.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f057.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f060.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f060.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f063.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f063.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f066.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f066.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f069.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f069.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f072.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f072.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f075.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f075.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f078.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f078.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f081.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f081.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f084.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f084.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f087.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f087.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f090.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f090.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f093.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f093.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f096.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f096.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f099.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f099.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f102.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f102.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f105.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f105.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f108.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f108.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f111.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f111.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f114.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f114.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f117.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f117.bin]
+ - [{{ SRC_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f120.bin, {{ DST_DIR }}/gfs.{{ PDY }}/{{ cyc }}/model/wave/history/gfs.t{{ cyc }}z.uglo_100km.f120.bin]
diff --git a/dev/parm/config/gfs/config.efcs b/dev/parm/config/gfs/config.efcs
index b579436e857..1bda2467972 100644
--- a/dev/parm/config/gfs/config.efcs
+++ b/dev/parm/config/gfs/config.efcs
@@ -43,8 +43,8 @@ if [[ ${RUN} == "enkfgfs" ]]; then
fi
# Use serial I/O for ensemble (lustre?)
-export OUTPUT_FILETYPE_ATM="netcdf"
-export OUTPUT_FILETYPE_SFC="netcdf"
+#export OUTPUT_FILETYPE_ATM="netcdf"
+#export OUTPUT_FILETYPE_SFC="netcdf"
# Turn off inline UPP for EnKF forecast
export WRITE_DOPOST=".false."
diff --git a/dev/parm/config/gfs/config.fcst.j2 b/dev/parm/config/gfs/config.fcst.j2
index 19a0f770459..c362eae36fa 100644
--- a/dev/parm/config/gfs/config.fcst.j2
+++ b/dev/parm/config/gfs/config.fcst.j2
@@ -277,9 +277,11 @@ export min_lakeice="0.15"
export min_seaice=${min_seaice:-"0.15"}
export use_cice_alb=${use_cice_alb:-".false."}
-export FSICL="0"
+export FSICL="99999"
export FSICS="0"
+export pbl_taper="0,0,0,0.1,0.2,0.4,0.6"
+
#---------------------------------------------------------------------
if [[ "${RUN}" =~ "gdas" ]] ; then # GDAS cycle specific parameters
diff --git a/dev/parm/config/gfs/config.prepoceanobs.j2 b/dev/parm/config/gfs/config.prepoceanobs.j2
index cb74f4ad23b..4e3c34c5355 100644
--- a/dev/parm/config/gfs/config.prepoceanobs.j2
+++ b/dev/parm/config/gfs/config.prepoceanobs.j2
@@ -4,12 +4,6 @@
echo "BEGIN: config.prepoceanobs"
-export OCNOBS2IODAEXEC="${HOMEgfs}/sorc/gdas.cd/build/bin/gdas_ioda_obsprovider2ioda.x"
-
-export SOCA_INPUT_FIX_DIR="{{ SOCA_INPUT_FIX_DIR }}"
-
-export OBSPREP_YAML="{{ OBSPREP_YAML }}"
-
# ocean analysis needs own dmpdir until standard dmpdir has full ocean obs
use_exp_obs="{{ use_exp_obs }}"
if [[ "${use_exp_obs}" == "YES" ]]; then
diff --git a/dev/parm/config/gfs/config.resources b/dev/parm/config/gfs/config.resources
index 4e07a504d8b..3f9de2438d5 100644
--- a/dev/parm/config/gfs/config.resources
+++ b/dev/parm/config/gfs/config.resources
@@ -586,7 +586,7 @@ case ${step} in
"025")
ntasks=$(( 12 * NMEM_ENS / NMEM_ENS_PER_MPI ))
memory="${mem_node_max}"
- walltime="00:40:00"
+ walltime="00:45:00"
tasks_per_node=$(( max_tasks_per_node / 4 ))
;;
"050")
@@ -1314,7 +1314,7 @@ case ${step} in
;;
"esfc")
- walltime="01:00:00"
+ walltime="01:15:00"
ntasks=80
threads_per_task=1
tasks_per_node=$(( max_tasks_per_node / threads_per_task ))
diff --git a/dev/parm/config/gfs/config.resources.GAEAC6 b/dev/parm/config/gfs/config.resources.GAEAC6
index dd2a9962817..3e1442b6769 100644
--- a/dev/parm/config/gfs/config.resources.GAEAC6
+++ b/dev/parm/config/gfs/config.resources.GAEAC6
@@ -26,9 +26,9 @@ case ${step} in
# update ntasks to 80 and threads_per_task to 20
case ${CASE} in
"C768")
- export ntasks=80
- export threads_per_task=20
- export tasks_per_node=$(( max_tasks_per_node / threads_per_task ))
+ export ntasks=480
+ export threads_per_task=10
+ export tasks_per_node=10
;;
"C1152")
export ntasks=480
@@ -43,7 +43,7 @@ case ${step} in
"anal")
case ${CASE} in
"C768")
- export threads_per_task=8
+ export threads_per_task=16
;;
"C1152")
export threads_per_task=16
diff --git a/dev/parm/config/gfs/config.resources.WCOSS2 b/dev/parm/config/gfs/config.resources.WCOSS2
index 946b4e5e839..2c7161e8d87 100644
--- a/dev/parm/config/gfs/config.resources.WCOSS2
+++ b/dev/parm/config/gfs/config.resources.WCOSS2
@@ -14,13 +14,9 @@ case ${step} in
if [[ "${CASE}" == "C768" || "${CASE}" == "C1152" ]]; then
export threads_per_task=8
# Make ntasks a multiple of 16
- if [[ "${RUN}" = *gdas ]]; then
- ntasks=784
- elif [[ "${RUN}" = *gfs ]]; then
- ntasks=832
- fi
- export ntasks_gdas=784
- export ntasks_gfs=832
+ export ntasks=1200
+ export ntasks_gdas=1200
+ export ntasks_gfs=1200
export tasks_per_node=$(( max_tasks_per_node / threads_per_task ))
fi
;;
@@ -45,7 +41,11 @@ case ${step} in
"eupd")
case "${CASE}" in
"C1152" | "C768" | "C384")
- export ntasks=315
+ if [[ "${RUN}" = *gdas ]]; then
+ export ntasks=315
+ elif [[ "${RUN}" = *gfs ]]; then
+ export ntasks=135
+ fi
export threads_per_task=14
;;
*)
diff --git a/dev/parm/config/gfs/yaml/defaults.yaml b/dev/parm/config/gfs/yaml/defaults.yaml
index 5802aa9aa9d..03788924124 100644
--- a/dev/parm/config/gfs/yaml/defaults.yaml
+++ b/dev/parm/config/gfs/yaml/defaults.yaml
@@ -63,8 +63,6 @@ marineanl:
JCB_ALGO_YAML_VAR: "${PARMgfs}/gdas/marine/jcb-prototype_3dfgat.yaml.j2"
prepoceanobs:
- SOCA_INPUT_FIX_DIR: "${FIXgfs}/gdas/soca/72x35x25/soca"
- OBSPREP_YAML: "${PARMgfs}/gdas/marine/obsprep/obsprep_config.yaml"
use_exp_obs: "YES"
dmpdir_exp: "${BASE_DATA}/experimental_obs"
diff --git a/dev/workflow/ecflow/__init__.py b/dev/workflow/ecflow/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/dev/workflow/ecFlow/ecflow_definitions.py b/dev/workflow/ecflow/ecflow_definitions.py
similarity index 99%
rename from dev/workflow/ecFlow/ecflow_definitions.py
rename to dev/workflow/ecflow/ecflow_definitions.py
index 0aea65710c0..d3b34c530cc 100644
--- a/dev/workflow/ecFlow/ecflow_definitions.py
+++ b/dev/workflow/ecflow/ecflow_definitions.py
@@ -1896,7 +1896,7 @@ def generate_folders(self, ecfhome, suite, parents):
None
"""
if parents:
- folder_path = f"{ecfhome}/{suite}/{parents.replace('>','/')}/{self.name()}"
+ folder_path = f"{ecfhome}/{suite}/{parents.replace('>', '/')}/{self.name()}"
else:
folder_path = f"{ecfhome}/{suite}/{self.name()}"
if not os.path.exists(folder_path):
@@ -1974,7 +1974,7 @@ def generate_ecflow_task(self, ecfhome, suite, parents):
search_script = f"{self.template}.ecf" if self.template is not \
None else script_name
if parents:
- script_path = f"{ecfhome}/{suite}/{parents.replace('>','/')}/{script_name}"
+ script_path = f"{ecfhome}/{suite}/{parents.replace('>', '/')}/{script_name}"
else:
script_path = f"{ecfhome}/{suite}/{script_name}"
for root, dirs, files in os.walk(self.scriptrepo):
diff --git a/dev/workflow/ecFlow/ecflow_setup.py b/dev/workflow/ecflow/ecflow_setup.py
similarity index 100%
rename from dev/workflow/ecFlow/ecflow_setup.py
rename to dev/workflow/ecflow/ecflow_setup.py
diff --git a/dev/workflow/ecflow/ecflow_suite.py b/dev/workflow/ecflow/ecflow_suite.py
new file mode 100644
index 00000000000..d4f5f576d17
--- /dev/null
+++ b/dev/workflow/ecflow/ecflow_suite.py
@@ -0,0 +1,16 @@
+#!/usr/bin/env python3
+
+from typing import Dict
+from applications.applications import AppConfig
+from workflow_suite import WorkflowSuite
+from abc import ABC
+from logging import getLogger
+
+logger = getLogger(__name__.split('.')[-1])
+
+
+class EcFlowSuite(WorkflowSuite, ABC):
+
+ def __init__(self, app_config: AppConfig, ecflow_config: Dict) -> None:
+
+ super().__init__(app_config, ecflow_config)
diff --git a/dev/workflow/ecflow/ecflow_suite_factory.py b/dev/workflow/ecflow/ecflow_suite_factory.py
new file mode 100644
index 00000000000..0256ec53a28
--- /dev/null
+++ b/dev/workflow/ecflow/ecflow_suite_factory.py
@@ -0,0 +1,19 @@
+"""
+Factory for creating ecFlow suite generators.
+
+This module provides a factory that creates appropriate ecFlow suites
+for different types of workflows (GFS, GEFS, SFS, GCAFS).
+"""
+from wxflow import Factory
+from ecflow.gfs_forecast_only_ecflow import GFSForecastOnlyEcFlowSuite
+
+# Create a factory for ecFlow suite objects
+ecflow_suite_factory = Factory('ecFlowSuite')
+
+# Register ecFlow suites for different workflow types
+# ecflow_suite_factory.register('gfs_cycled', GFSCycledEcFlowSuite)
+ecflow_suite_factory.register('gfs_forecast-only', GFSForecastOnlyEcFlowSuite)
+# ecflow_suite_factory.register('gefs_forecast-only', GEFSEcFlowSuite)
+# ecflow_suite_factory.register('sfs_forecast-only', SFSEcFlowSuite)
+# ecflow_suite_factory.register('gcafs_cycled', GCAFSCycledEcFlowSuite)
+# ecflow_suite_factory.register('gcafs_forecast-only', GCAFSForecastOnlyEcFlowSuite)
diff --git a/dev/workflow/ecflow/gfs_forecast_only_ecflow.py b/dev/workflow/ecflow/gfs_forecast_only_ecflow.py
new file mode 100644
index 00000000000..df18a145fb4
--- /dev/null
+++ b/dev/workflow/ecflow/gfs_forecast_only_ecflow.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+
+"""
+GFS forecast-only ecflow generator module.
+
+This module provides functionality to generate ecflow suite configurations
+for GFS forecast-only runs. It handles cycle definitions and specific task configurations
+needed for the GFS workflow.
+"""
+
+from ecflow.ecflow_suite import EcFlowSuite
+from applications.applications import AppConfig
+from wxflow import to_timedelta, timedelta_to_HMS
+from typing import Dict
+
+
+class GFSForecastOnlyEcFlowSuite(EcFlowSuite):
+ """
+ ecFlow suite generator for GFS forecast-only workflows.
+
+ This class handles the generation of ecFlow suite configuration for GFS
+ forecast-only mode, including cycle definitions and workflow scheduling.
+
+ Parameters
+ ----------
+ app_config : AppConfig
+ Application configuration object containing GFS settings
+ ecflow_config : Dict
+ Dictionary containing ecFlow-specific configuration
+ """
+
+ def __init__(self, app_config: AppConfig, ecflow_config: Dict) -> None:
+ """
+ Initialize GFS forecast-only ecFlow generator.
+
+ Parameters
+ ----------
+ app_config : AppConfig
+ Application configuration object containing GFS settings
+ ecflow_config : Dict
+ Dictionary containing ecFlow-specific configuration
+ """
+ super().__init__(app_config, ecflow_config)
+
+ def get_cycledefs(self):
+ pass
+
+ def write(self):
+ pass
diff --git a/dev/workflow/hosts.py b/dev/workflow/hosts.py
index 8dbc953d0ff..0093674df89 100644
--- a/dev/workflow/hosts.py
+++ b/dev/workflow/hosts.py
@@ -20,17 +20,16 @@ class Host:
def __init__(self, host=None):
- if host is not None and host not in Host.SUPPORTED_HOSTS:
- raise NotImplementedError(f'{host} is not a supported host.\n' +
- 'Currently supported hosts are:\n' +
- f'{" | ".join(Host.SUPPORTED_HOSTS)}')
- # If Host is instantiated with "host", use it
- elif host is not None:
+ if host is not None:
+ if host not in Host.SUPPORTED_HOSTS:
+ raise NotImplementedError(f'{host} is not a supported host.\n' +
+ 'Currently supported hosts are:\n' +
+ f'{" | ".join(Host.SUPPORTED_HOSTS)}')
self.machine = host
# Otherwise, detect the host.
else:
# Detect the host if not provided
- self.detect() if host is None else host
+ self.detect()
self.info = self._get_info
self.scheduler = self.info['SCHEDULER']
@@ -42,6 +41,8 @@ def __str__(self) -> str:
def detect(self) -> None:
# Detect the machine name and store in self.machine
+ self.machine = None
+
machine_id = os.getenv('MACHINE_ID', 'UNKNOWN')
pw_csp = os.getenv('PW_CSP', 'UNKNOWN')
container = os.getenv('SINGULARITY_NAME', None)
@@ -51,13 +52,13 @@ def detect(self) -> None:
if machine_id != 'UNKNOWN':
if pw_csp != 'UNKNOWN':
self.machine = f"{pw_csp.upper()}PW"
- return
+ else:
+ self.machine = f"{machine_id.upper()}"
+ return
# Detect the machine since MACHINE_ID is not set
if os.path.exists('/scratch3/NCEPDEV'):
# Hera or Ursa
- self.machine = ""
-
# Open the mountinfo file and check if /home is mounted to "home_ursa" or "home_hera"
# NOTE: the github runners do not have a /home directory, so self.machine will be unset
with open('/proc/self/mountinfo') as f:
@@ -89,18 +90,20 @@ def detect(self) -> None:
self.machine = 'GAEAC6'
elif container is not None:
self.machine = 'CONTAINER'
- elif pw_csp is not None:
+ elif pw_csp != "UNKNOWN":
if pw_csp.lower() not in ['azure', 'aws', 'google']:
raise ValueError(
f'cloud service provider "{pw_csp}" is not supported.')
self.machine = f"{pw_csp.upper()}PW"
- if self.machine not in Host.SUPPORTED_HOSTS:
- raise NotImplementedError('This machine is not a supported host.\n' +
- 'Currently supported hosts are:\n' +
- f'{" | ".join(Host.SUPPORTED_HOSTS)}')
+ if self.machine is not None:
+ print(f"Detected host as '{self.machine}'")
+ return
- return
+ # If we are here, we have not been able to detect a valid host
+ raise NotImplementedError('Unable to detect a supported host.\n' +
+ 'Currently supported hosts are:\n' +
+ f'{" | ".join(Host.SUPPORTED_HOSTS)}')
@property
def _get_info(self) -> dict:
diff --git a/dev/workflow/rocoto/gcafs_cycled_xml.py b/dev/workflow/rocoto/gcafs_cycled_xml.py
index 0b182187115..3336e131281 100644
--- a/dev/workflow/rocoto/gcafs_cycled_xml.py
+++ b/dev/workflow/rocoto/gcafs_cycled_xml.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-from rocoto.workflow_xml import RocotoXML
+from rocoto.rocoto_xml import RocotoXML
from applications.applications import AppConfig
from wxflow import to_timedelta, timedelta_to_HMS
from typing import Dict
diff --git a/dev/workflow/rocoto/gcafs_forecast_only_xml.py b/dev/workflow/rocoto/gcafs_forecast_only_xml.py
index 9504046cade..6a3892ac632 100644
--- a/dev/workflow/rocoto/gcafs_forecast_only_xml.py
+++ b/dev/workflow/rocoto/gcafs_forecast_only_xml.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-from rocoto.workflow_xml import RocotoXML
+from rocoto.rocoto_xml import RocotoXML
from applications.applications import AppConfig
from wxflow import to_timedelta, timedelta_to_HMS
from typing import Dict
diff --git a/dev/workflow/rocoto/gcafs_tasks.py b/dev/workflow/rocoto/gcafs_tasks.py
index 46baf5c2f67..52d7b5aca05 100644
--- a/dev/workflow/rocoto/gcafs_tasks.py
+++ b/dev/workflow/rocoto/gcafs_tasks.py
@@ -1038,11 +1038,11 @@ def metp(self):
dep_dict = {'type': 'taskvalid', 'name': f'{self.run}_arch_vrfy', 'condition': 'not'}
deps2.append(rocoto.add_dependency(dep_dict))
for lookback2 in range(1, lookback):
- offset = timedelta_to_HMS(-to_timedelta(f'{6*lookback2}H'))
+ offset = timedelta_to_HMS(-to_timedelta(f'{6 * lookback2}H'))
dep_dict = {'type': 'cycleexist', 'condition': 'not', 'offset': offset}
deps2.append(rocoto.add_dependency(dep_dict))
- offset = timedelta_to_HMS(-to_timedelta(f'{6*lookback}H'))
+ offset = timedelta_to_HMS(-to_timedelta(f'{6 * lookback}H'))
dep_dict = {'type': 'task', 'name': f'{self.run}_arch_vrfy', 'offset': offset}
deps2.append(rocoto.add_dependency(dep_dict))
deps.append(rocoto.create_dependency(dep_condition='and', dep=deps2))
diff --git a/dev/workflow/rocoto/gcafs_xml.py b/dev/workflow/rocoto/gcafs_xml.py
index 9504046cade..6a3892ac632 100644
--- a/dev/workflow/rocoto/gcafs_xml.py
+++ b/dev/workflow/rocoto/gcafs_xml.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-from rocoto.workflow_xml import RocotoXML
+from rocoto.rocoto_xml import RocotoXML
from applications.applications import AppConfig
from wxflow import to_timedelta, timedelta_to_HMS
from typing import Dict
diff --git a/dev/workflow/rocoto/gefs_xml.py b/dev/workflow/rocoto/gefs_xml.py
index 92a25336e9c..3ef6d159df4 100644
--- a/dev/workflow/rocoto/gefs_xml.py
+++ b/dev/workflow/rocoto/gefs_xml.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-from rocoto.workflow_xml import RocotoXML
+from rocoto.rocoto_xml import RocotoXML
from applications.applications import AppConfig
from wxflow import to_timedelta, timedelta_to_HMS
from typing import Dict
diff --git a/dev/workflow/rocoto/gfs_cycled_xml.py b/dev/workflow/rocoto/gfs_cycled_xml.py
index d16242a9d35..6b4542251de 100644
--- a/dev/workflow/rocoto/gfs_cycled_xml.py
+++ b/dev/workflow/rocoto/gfs_cycled_xml.py
@@ -8,7 +8,7 @@
the analysis (GDAS) and medium-range forecast (GFS) components of the workflow.
"""
-from rocoto.workflow_xml import RocotoXML
+from rocoto.rocoto_xml import RocotoXML
from applications.applications import AppConfig
from wxflow import to_timedelta, timedelta_to_HMS
from typing import Dict
diff --git a/dev/workflow/rocoto/gfs_forecast_only_xml.py b/dev/workflow/rocoto/gfs_forecast_only_xml.py
index 5aeb8dcbc94..bc15d7e7433 100644
--- a/dev/workflow/rocoto/gfs_forecast_only_xml.py
+++ b/dev/workflow/rocoto/gfs_forecast_only_xml.py
@@ -8,7 +8,7 @@
needed for the GFS workflow.
"""
-from rocoto.workflow_xml import RocotoXML
+from rocoto.rocoto_xml import RocotoXML
from applications.applications import AppConfig
from wxflow import to_timedelta, timedelta_to_HMS
from typing import Dict
diff --git a/dev/workflow/rocoto/gfs_tasks.py b/dev/workflow/rocoto/gfs_tasks.py
index 317e454c0ad..f3cfa77e29e 100644
--- a/dev/workflow/rocoto/gfs_tasks.py
+++ b/dev/workflow/rocoto/gfs_tasks.py
@@ -714,9 +714,9 @@ def prepoceanobs(self):
def marineanlletkf(self):
deps = []
- dep_dict = {'type': 'task', 'name': f"{self.run.replace('enkf','')}_prepoceanobs"}
+ dep_dict = {'type': 'task', 'name': f"{self.run.replace('enkf', '')}_prepoceanobs"}
deps.append(rocoto.add_dependency(dep_dict))
- dep_dict = {'type': 'task', 'name': f"{self.run.replace('enkf','')}_marinebmat"}
+ dep_dict = {'type': 'task', 'name': f"{self.run.replace('enkf', '')}_marinebmat"}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep_condition='and', dep=deps)
@@ -847,7 +847,7 @@ def marineanlecen(self):
# can run in parallel with marinebmat
deps = []
- dep_dict = {'type': 'task', 'name': f"{self.run.replace('enkf','')}_marinebmatinit"}
+ dep_dict = {'type': 'task', 'name': f"{self.run.replace('enkf', '')}_marinebmatinit"}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -2023,7 +2023,7 @@ def metp(self):
dep_dict = {'type': 'taskvalid', 'name': f'{self.run}_arch_vrfy', 'condition': 'not'}
deps2.append(rocoto.add_dependency(dep_dict))
for lookback2 in range(1, lookback):
- offset = timedelta_to_HMS(-to_timedelta(f'{6*lookback2}H'))
+ offset = timedelta_to_HMS(-to_timedelta(f'{6 * lookback2}H'))
dep_dict = {'type': 'cycleexist', 'condition': 'not', 'offset': offset}
deps2.append(rocoto.add_dependency(dep_dict))
@@ -2376,6 +2376,14 @@ def globus_earc(self):
# Cleanup
def cleanup(self):
+ deps = []
+ dep_dict = {'type': 'task', 'name': 'gfs_fcst_seg0', 'offset':
+ f"{timedelta_to_HMS(self._base['interval_gfs'])}"}
+ deps.append(rocoto.add_dependency(dep_dict))
+ dep_dict = {'type': 'cycleexist', 'condition': 'not',
+ 'offset': f"{timedelta_to_HMS(self._base['interval_gfs'])}"}
+ deps.append(rocoto.add_dependency(dep_dict))
+ dep_next_fcst_seg = rocoto.create_dependency(dep_condition='or', dep=deps)
deps = []
if 'enkf' in self.run:
dep_dict = {'type': 'task', 'name': f'{self.run}_earc_vrfy'}
@@ -2386,6 +2394,8 @@ def cleanup(self):
else:
dep_dict = {'type': 'metatask', 'name': f'{self.run}_earc_tars'}
deps.append(rocoto.add_dependency(dep_dict))
+ if self.run in ['enkfgdas'] and self._base["INTERVAL_GFS"] == 6:
+ deps.append(dep_next_fcst_seg)
else:
if self.app_config.mode in ['cycled']:
@@ -2396,6 +2406,8 @@ def cleanup(self):
dep_dict = {'type': 'task', 'name': f'{self.run}_vminmon'}
deps.append(rocoto.add_dependency(dep_dict))
elif self.run in ['gdas']:
+ if self._base["INTERVAL_GFS"] == 6:
+ deps.append(dep_next_fcst_seg)
dep_dict = {'type': 'task', 'name': f'{self.run}_atmanlprod'}
deps.append(rocoto.add_dependency(dep_dict))
if self.options['do_fit2obs']:
@@ -2513,7 +2525,7 @@ def cleanup(self):
# Start of ensemble tasks
def eobs(self):
deps = []
- dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf","")}_prep'}
+ dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf", "")}_prep'}
deps.append(rocoto.add_dependency(dep_dict))
dep_dict = {'type': 'metatask', 'name': 'enkfgdas_epmn', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"}
deps.append(rocoto.add_dependency(dep_dict))
@@ -2584,7 +2596,7 @@ def eupd(self):
def atmensanlinit(self):
deps = []
- dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf","")}_prepatmiodaobs'}
+ dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf", "")}_prepatmiodaobs'}
deps.append(rocoto.add_dependency(dep_dict))
dep_dict = {'type': 'metatask', 'name': 'enkfgdas_epmn', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"}
deps.append(rocoto.add_dependency(dep_dict))
@@ -2765,7 +2777,7 @@ def _get_ecengroups():
return grp, dep, lst
deps = []
- dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf","")}_analcalc'}
+ dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf", "")}_analcalc'}
deps.append(rocoto.add_dependency(dep_dict))
dep_dict = {'type': 'task', 'name': f'{self.run}_eupd'}
deps.append(rocoto.add_dependency(dep_dict))
@@ -2806,7 +2818,7 @@ def _get_ecengroups():
def ecen_fv3jedi(self):
deps = []
- dep_dict = {'type': 'task', 'name': f"{self.run.replace('enkf','')}_atmanlfinal"}
+ dep_dict = {'type': 'task', 'name': f"{self.run.replace('enkf', '')}_atmanlfinal"}
deps.append(rocoto.add_dependency(dep_dict))
dep_dict = {'type': 'task', 'name': f'{self.run}_atmensanlfinal'}
deps.append(rocoto.add_dependency(dep_dict))
@@ -2866,7 +2878,7 @@ def esfc(self):
dep_dict = {'type': 'task', 'name': f'{self.run}_atmensanlfinal'}
deps.append(rocoto.add_dependency(dep_dict))
else:
- dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf","")}_analcalc'}
+ dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf", "")}_analcalc'}
deps.append(rocoto.add_dependency(dep_dict))
dep_dict = {'type': 'task', 'name': f'{self.run}_eupd'}
deps.append(rocoto.add_dependency(dep_dict))
@@ -2948,7 +2960,7 @@ def echgres(self):
self._is_this_a_gdas_task(self.run, 'echgres')
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.run.replace("enkf","")}_fcst'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.run.replace("enkf", "")}_fcst'}
deps.append(rocoto.add_dependency(dep_dict))
dep_dict = {'type': 'task', 'name': f'{self.run}_fcst_mem001'}
deps.append(rocoto.add_dependency(dep_dict))
diff --git a/dev/workflow/rocoto/workflow_xml.py b/dev/workflow/rocoto/rocoto_xml.py
similarity index 89%
rename from dev/workflow/rocoto/workflow_xml.py
rename to dev/workflow/rocoto/rocoto_xml.py
index 98e389332ad..176a6d644f1 100644
--- a/dev/workflow/rocoto/workflow_xml.py
+++ b/dev/workflow/rocoto/rocoto_xml.py
@@ -6,36 +6,21 @@
from collections import OrderedDict
from typing import Dict
from applications.applications import AppConfig
+from workflow_suite import WorkflowSuite
from rocoto.workflow_tasks import get_wf_tasks
-from wxflow import to_timedelta, which, mkdir
+from wxflow import which, mkdir
import rocoto.rocoto as rocoto
from abc import ABC, abstractmethod
-from hosts import Host
from logging import getLogger
logger = getLogger(__name__.split('.')[-1])
-class RocotoXML(ABC):
+class RocotoXML(WorkflowSuite, ABC):
def __init__(self, app_config: AppConfig, rocoto_config: Dict) -> None:
- self._app_config = app_config
- self.rocoto_config = rocoto_config
-
- # Use the first config.base (sourced with an arbitrary RUN)
- self._base = self._app_config.configs[next(iter(self._app_config.configs))]['base']
- self._base['interval_gdas'] = to_timedelta(f'{self._base["assim_freq"]}H')
- self._base['interval_gfs'] = to_timedelta(f'{self._base["INTERVAL_GFS"]}H')
-
- # Collect info needed to write an scrontab file
- self.host_info = Host().info
- self.use_scrontab = self.host_info.get("USE_SCRONTAB", False)
- # Add ACCOUNT to host_info, with that from config.base
- self.host_info.ACCOUNT = self._base['ACCOUNT']
- self.HOMEgfs = self._base['HOMEgfs']
- self.expdir = self._base['EXPDIR']
- self.pslot = self._base['PSLOT']
+ super().__init__(app_config, rocoto_config)
# Get sections need to construct the XML
self.preamble = self._get_preamble()
@@ -46,10 +31,6 @@ def __init__(self, app_config: AppConfig, rocoto_config: Dict) -> None:
self.tasks = '\n'.join(task_list)
self.footer = self._get_workflow_footer()
- # If we are running scrontab, check if the rocotorc file has the right entries
- if self.use_scrontab:
- self._check_rocotorc()
-
# Construct the XML
self.xml = self._assemble_xml()
@@ -175,8 +156,12 @@ def _write_crontab(self, crontab_file: str = None, cronint: int = 5) -> None:
# Construct the crontab or scrontab
if self.use_scrontab:
+
+ # If we are running scrontab, check if the rocotorc file has the right entries
+ self._check_rocotorc()
+
# The slurm crontab needs an SCRON entry that calls a script
- # envery n minutes. That script will actually run rocoto.
+ # every n minutes. That script will actually run rocoto.
account = self.host_info.ACCOUNT
partition = self.host_info.get("PARTITION_CRON", None) or self.host_info.PARTITION_SERVICE
log_dir = os.path.join(self.expdir, "logs")
diff --git a/dev/workflow/rocoto/sfs_xml.py b/dev/workflow/rocoto/sfs_xml.py
index c63beef2041..80ff2532841 100644
--- a/dev/workflow/rocoto/sfs_xml.py
+++ b/dev/workflow/rocoto/sfs_xml.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-from rocoto.workflow_xml import RocotoXML
+from rocoto.rocoto_xml import RocotoXML
from applications.applications import AppConfig
from wxflow import to_timedelta, timedelta_to_HMS
from typing import Dict
diff --git a/dev/workflow/setup_expt.py b/dev/workflow/setup_expt.py
index fed0e5cdaa1..1cd9ad1785c 100755
--- a/dev/workflow/setup_expt.py
+++ b/dev/workflow/setup_expt.py
@@ -130,7 +130,7 @@ def map_inputs_to_configs(inputs):
"SDATE": to_YMDH(inputs.idate),
"EDATE": to_YMDH(inputs.edate),
"CASE_CTL": f'C{inputs.resdetatmos}',
- "OCNRES": f"{int(100.*inputs.resdetocean):03d}",
+ "OCNRES": f"{int(100. * inputs.resdetocean):03d}",
"EXPDIR": inputs.expdir,
"COMROOT": inputs.comroot,
"EXP_WARM_START": warm_start_map[inputs.start],
diff --git a/dev/workflow/setup_workflow.py b/dev/workflow/setup_workflow.py
index cc69f976cec..f7b5958e527 100755
--- a/dev/workflow/setup_workflow.py
+++ b/dev/workflow/setup_workflow.py
@@ -9,7 +9,8 @@
from applications.application_factory import app_config_factory
from rocoto.rocoto_xml_factory import rocoto_xml_factory
-from wxflow import Configuration, Logger, logit
+from ecflow.ecflow_suite_factory import ecflow_suite_factory
+from wxflow import AttrDict, Configuration, Logger, logit
# Setup the logger
@@ -57,7 +58,8 @@ def input_args(*argv):
ecflow_parser = subparsers.add_parser('ecflow',
help='Use EcFlow workflow engine',
formatter_class=ArgumentDefaultsHelpFormatter)
- # EcFlow specific arguments can be added here in the future
+ ecflow_parser.add_argument('--verbosity', help='verbosity level of ecflow', type=int,
+ default=10, required=False)
return parser.parse_args(argv[0][0] if len(argv[0]) else None)
@@ -100,22 +102,7 @@ def check_dir_writable(dir_path):
def main(*argv):
user_inputs = input_args(argv)
-
- # Handle workflow engine selection
- if user_inputs.workflow == 'ecflow':
- logger.info("EcFlow workflow engine selected")
- logger.error("EcFlow workflow is not yet implemented. Please use Rocoto for now.")
- raise NotImplementedError("EcFlow workflow is not yet implemented")
-
- logger.info("Rocoto workflow engine selected")
-
- # Build rocoto parameter dictionary - only available when rocoto is selected
- rocoto_param_dict = {}
- if user_inputs.workflow == 'rocoto':
- rocoto_param_dict = {'maxtries': user_inputs.maxtries,
- 'cyclethrottle': user_inputs.cyclethrottle,
- 'taskthrottle': user_inputs.taskthrottle,
- 'verbosity': user_inputs.verbosity}
+ workflow_engine = user_inputs.workflow
cfg = Configuration(user_inputs.expdir)
@@ -123,10 +110,9 @@ def main(*argv):
check_expdir(user_inputs.expdir, base['EXPDIR'])
- # Check if "HOMEDIR","STMP","PTMP" dirrctories are writable
+ # Check if "HOMEDIR","STMP","PTMP" directories are writeable
dir_keys = ["HOMEDIR", "STMP", "PTMP"]
for dk in dir_keys:
- check_dir_writable(base[dk])
if not check_dir_writable(base[dk]):
msg = f'The {dk} path {base[dk]} cannot be written to! Please correct this path and try again.'
if user_inputs.force:
@@ -140,9 +126,26 @@ def main(*argv):
# Configure the application
app_config = app_config_factory.create(f'{net}_{mode}', cfg)
- # Create Rocoto Tasks and Assemble them into an XML
- xml = rocoto_xml_factory.create(f'{net}_{mode}', app_config, rocoto_param_dict)
- xml.write()
+ # Build workflow parameter dictionary - only available when rocoto is selected
+ workflow_config = AttrDict()
+ workflow_config.workflow_engine = workflow_engine
+ if workflow_engine == "rocoto":
+ workflow_config.maxtries = user_inputs.maxtries
+ workflow_config.cyclethrottle = user_inputs.cyclethrottle
+ workflow_config.taskthrottle = user_inputs.taskthrottle
+ workflow_config.verbosity = user_inputs.verbosity
+ elif workflow_engine == "ecflow":
+ workflow_config.verbosity = user_inputs.verbosity
+
+ # Call the appropriate workflow engine factory
+ ENGINE_MAP = {
+ "rocoto": rocoto_xml_factory,
+ "ecflow": ecflow_suite_factory,
+ }
+
+ # Create the XML (Rocoto) or Suite (ecFlow) object
+ workflow = ENGINE_MAP[workflow_engine].create(f'{net}_{mode}', app_config, workflow_config)
+ workflow.write()
if __name__ == '__main__':
diff --git a/dev/workflow/workflow_suite.py b/dev/workflow/workflow_suite.py
new file mode 100644
index 00000000000..495bfc5d5b6
--- /dev/null
+++ b/dev/workflow/workflow_suite.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python3
+
+from typing import Dict
+from applications.applications import AppConfig
+from wxflow import to_timedelta
+from abc import ABC, abstractmethod
+from hosts import Host
+from logging import getLogger
+
+logger = getLogger(__name__.split('.')[-1])
+
+
+class WorkflowSuite(ABC):
+
+ def __init__(self, app_config: AppConfig, workflow_config: Dict) -> None:
+ """
+ Initializes the workflow suite with the provided application and workflow configurations.
+
+ Parameters
+ ----------
+ app_config : AppConfig
+ The application configuration object containing various settings and configurations.
+ workflow_config : dict
+ A dictionary containing workflow-specific configuration, including the workflow engine type.
+
+ Raises
+ ------
+ ValueError
+ If the specified workflow engine in `workflow_config` is not supported.
+
+ Attributes
+ ----------
+ _app_config : AppConfig
+ Stores the application configuration.
+ workflow_config : Dict
+ The workflow configuration for a valid workflow engine
+ """
+
+ self._app_config = app_config
+ self.workflow_engine = workflow_config.get("workflow_engine", None)
+ if self.workflow_engine in ["rocoto"]:
+ self.rocoto_config = workflow_config
+ elif self.workflow_engine in ["ecflow"]:
+ self.ecflow_config = workflow_config
+ else:
+ raise ValueError(f"Unsupported workflow_engine: {self.workflow_engine}")
+
+ # Use the first config.base (sourced with an arbitrary RUN)
+ self._base = self._app_config.configs[next(iter(self._app_config.configs))]['base']
+ self._base['interval_gdas'] = to_timedelta(f'{self._base["assim_freq"]}H')
+ self._base['interval_gfs'] = to_timedelta(f'{self._base["INTERVAL_GFS"]}H')
+
+ # Collect info needed to write an scrontab file
+ self.host_info = Host().info
+ self.use_scrontab = self.host_info.get("USE_SCRONTAB", False)
+ # Add ACCOUNT to host_info, with that from config.base
+ self.host_info.ACCOUNT = self._base['ACCOUNT']
+ self.HOMEgfs = self._base['HOMEgfs']
+ self.expdir = self._base['EXPDIR']
+ self.pslot = self._base['PSLOT']
+
+ @abstractmethod
+ def get_cycledefs(self):
+ pass
+
+ @abstractmethod
+ def write(self):
+ pass
diff --git a/parm/wave/bull_awips_gfswave.uglo_15km b/parm/wave/bull_awips_gfswave.uglo_15km
index 32cea8a1fee..8951073c372 100644
--- a/parm/wave/bull_awips_gfswave.uglo_15km
+++ b/parm/wave/bull_awips_gfswave.uglo_15km
@@ -14,7 +14,7 @@ export b46077=AGGA48_KWBJ_OSBM12
export b46079=AGGA48_KWBJ_OSBM13
export b46105=AGGA48_KWBJ_OSBM14
export b46107=AGGA48_KWBJ_OSBM15
-#####export b46265=AGGA48_KWBJ_OSBM16
+export b46265=AGGA48_KWBJ_OSBM16
# Gulf of Alaska (AG) Spectral data (4) near Alaska Panhandle and NBC (7)
export b46004=AGGA47_KWBJ_OSBM01
export b46184=AGGA47_KWBJ_OSBM02
diff --git a/scripts/exglobal_cleanup.sh b/scripts/exglobal_cleanup.sh
index 82318cd228e..c460cc8282c 100755
--- a/scripts/exglobal_cleanup.sh
+++ b/scripts/exglobal_cleanup.sh
@@ -39,10 +39,24 @@ function remove_files() {
find_exclude_string="${find_exclude_string[*]/%-or}"
# Remove all regular files that do not match
# shellcheck disable=SC2086
- find "${directory}" -type f -not \( ${find_exclude_string} \) -ignore_readdir_race -delete
+ if [[ -n "${find_exclude_string}" ]]; then
+ # String is non-empty → use exclusion
+ find "${directory}" -type f -not \( ${find_exclude_string} \) -ignore_readdir_race -delete
+ else
+ # String is empty → no exclusion
+ find "${directory}" -type f -ignore_readdir_race -delete
+ fi
+
# Remove all symlinks that do not match
# shellcheck disable=SC2086
- find "${directory}" -type l -not \( ${find_exclude_string} \) -ignore_readdir_race -delete
+ if [[ -n "${find_exclude_string}" ]]; then
+ # String is non-empty → use exclusion
+ find "${directory}" -type l -not \( ${find_exclude_string} \) -ignore_readdir_race -delete
+ else
+ # String is empty → no exclusion
+ find "${directory}" -type l -ignore_readdir_race -delete
+ fi
+
# Remove any empty directories
find "${directory}" -type d -empty -delete
}
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 06eeefd4122..29787abe801 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 06eeefd4122ab8c4d6abd872691bbfd7e086bd0f
+Subproject commit 29787abe80146dc10179c7cd2e7d2447a75c6c6c
diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh
index 2017eec27b8..8f3bd9a1307 100755
--- a/ush/forecast_postdet.sh
+++ b/ush/forecast_postdet.sh
@@ -335,7 +335,7 @@ EOF
# Note, this must be computed after determination IAU in forecast_det and fhrot.
if (( restart_interval == 0 )); then
if [[ "${DOIAU:-NO}" == "YES" ]]; then
- FV3_RESTART_FH=$(( FHMAX + half_window ))
+ FV3_RESTART_FH=$(( FHMAX + assim_freq ))
else
FV3_RESTART_FH=("${FHMAX}")
fi
@@ -345,8 +345,8 @@ EOF
local restart_interval_start=${restart_interval}
local restart_interval_end=${FHMAX}
else
- local restart_interval_start=$(( restart_interval + half_window ))
- local restart_interval_end=$(( FHMAX + half_window ))
+ local restart_interval_start=$(( restart_interval + assim_freq ))
+ local restart_interval_end=$(( FHMAX + assim_freq ))
fi
else
local restart_interval_start=${restart_interval}
diff --git a/versions/ic.ver b/versions/ic.ver
index b8c1be4da16..582fe345d6d 100644
--- a/versions/ic.ver
+++ b/versions/ic.ver
@@ -12,7 +12,7 @@ ic_versions['C96']=20250808
ic_versions['C96C48']=20250808
# GEFS
-ic_versions['C96mx100']=20240610
+ic_versions['C96mx100']=20250808
ic_versions['C384C192']=20240610
ic_versions['C384mx025']=20241120
From 46911dac5646cb44024c799e9b8cd863d528c96e Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 14 Oct 2025 12:34:45 +0000
Subject: [PATCH 02/40] initial set of g-w changes to cycle JEDI-based
variational DA (#4148)
---
dev/jobs/prep.sh | 13 ++++++++-
dev/jobs/prepatmiodaobs.sh | 2 +-
jobs/JGLOBAL_PREP_ATM_IODA_OBS | 38 ++++++++++++++++++++++++
parm/archive/gdas_restarta.yaml.j2 | 2 +-
parm/archive/gfs_netcdfa.yaml.j2 | 2 +-
scripts/exglobal_archive_tars.py | 2 +-
scripts/exglobal_atmos_sfcanl.sh | 3 +-
scripts/exglobal_prep_atm_ioda_obs.py | 29 ++++++++++++++++++
sorc/link_workflow.sh | 3 +-
ush/forecast_postdet.sh | 10 ++++++-
ush/parsing_model_configure_FV3.sh | 2 +-
ush/python/pygfs/task/atm_analysis.py | 42 +++++++++++++++++++++++++++
versions/run.wcoss2.ver | 2 +-
13 files changed, 139 insertions(+), 11 deletions(-)
create mode 100755 jobs/JGLOBAL_PREP_ATM_IODA_OBS
create mode 100755 scripts/exglobal_prep_atm_ioda_obs.py
diff --git a/dev/jobs/prep.sh b/dev/jobs/prep.sh
index 4ab3c6795ee..ec20be0ee6d 100755
--- a/dev/jobs/prep.sh
+++ b/dev/jobs/prep.sh
@@ -36,7 +36,8 @@ RUN=${RUN_local} YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \
RUN=${GDUMP} YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx \
COMOUT_OBS_PREV:COM_OBS_TMPL \
- COMINobsproc_PREV:COM_OBSPROC_TMPL
+ COMINobsproc_PREV:COM_OBSPROC_TMPL \
+ COMOUT_ATMOS_ANALYSIS_PREV:COM_ATMOS_ANALYSIS_TMPL
mkdir -p "${COMOUT_OBS}"
@@ -95,6 +96,16 @@ else
cpfs "${COMINobsproc}/${RUN_local}.t${cyc}z.syndata.tcvitals.tm00" "${COMOUT_OBS}/"
fi
+
+###############################################################
+# If requested copy bias correction files from source to comroot
+if [[ ${COPY_BIASCOR:-"NO"} == "YES" ]]; then
+ for file in abias abias_pc abias_air; do
+ cpreq "${SOURCE_BIASCOR}/${file}.${GDUMP}.${gPDY}${gcyc}" "${COMOUT_ATMOS_ANALYSIS_PREV}/${GDUMP}.t${gcyc}z.${file}"
+ done
+fi
+
+
###############################################################
# Generate prepbufr files from dumps and prior gdas guess
rm -f "${COMOUT_OBS}/${OPREFIX}prepbufr"
diff --git a/dev/jobs/prepatmiodaobs.sh b/dev/jobs/prepatmiodaobs.sh
index 4633c81b060..499fda0b3bf 100755
--- a/dev/jobs/prepatmiodaobs.sh
+++ b/dev/jobs/prepatmiodaobs.sh
@@ -13,6 +13,6 @@ export jobid="${job}.$$"
###############################################################
# Execute the JJOB
-"${HOMEgfs}/jobs/JGLOBAL_ATM_PREP_IODA_OBS"
+"${HOMEgfs}/jobs/JGLOBAL_PREP_ATM_IODA_OBS"
status=$?
exit "${status}"
diff --git a/jobs/JGLOBAL_PREP_ATM_IODA_OBS b/jobs/JGLOBAL_PREP_ATM_IODA_OBS
new file mode 100755
index 00000000000..245f96d80d7
--- /dev/null
+++ b/jobs/JGLOBAL_PREP_ATM_IODA_OBS
@@ -0,0 +1,38 @@
+#! /usr/bin/env bash
+
+source "${HOMEgfs}/ush/jjob_header.sh" -e "prepatmiodaobs" -c "base atmanl prepatmiodaobs"
+
+##############################################
+# Set variables used in the script
+##############################################
+
+##############################################
+# Begin JOB SPECIFIC work
+##############################################
+# Generate COM variables from templates
+YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \
+ COMOUT_OBS:COM_OBS_TMPL
+
+###############################################################
+# Run relevant script
+EXSCRIPT=${EXPREPATMIODAPY:-${SCRgfs}/exglobal_prep_atm_ioda_obs.py}
+${EXSCRIPT} && true
+export err=$?
+set +x
+if [[ ${err} -ne 0 ]]; then
+ err_exit "Error executing ${EXSCRIPT}"
+fi
+set_trace
+
+##############################################
+# End JOB SPECIFIC work
+##############################################
+
+##############################################
+# Final processing
+##############################################
+if [[ -e "${pgmout}" ]]; then
+ cat "${pgmout}"
+fi
+
+exit 0
diff --git a/parm/archive/gdas_restarta.yaml.j2 b/parm/archive/gdas_restarta.yaml.j2
index 5abb8c683d2..34d50705155 100644
--- a/parm/archive/gdas_restarta.yaml.j2
+++ b/parm/archive/gdas_restarta.yaml.j2
@@ -4,7 +4,7 @@ gdas_restarta:
target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdas_restarta.tar"
required:
# Deterministic analysis increments
- {% if DO_JEDIATMVAR %}
+ {% if DO_JEDIATMVAR and not (ATMINC_GRID == 'gaussian') %}
{% for itile in range(6) %}
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cubed_sphere_grid_atminc.tile{{ itile+1 }}.nc"
{% endfor %}
diff --git a/parm/archive/gfs_netcdfa.yaml.j2 b/parm/archive/gfs_netcdfa.yaml.j2
index 86a37683c87..6a097fe80e7 100644
--- a/parm/archive/gfs_netcdfa.yaml.j2
+++ b/parm/archive/gfs_netcdfa.yaml.j2
@@ -5,7 +5,7 @@ gfs_netcdfa:
required:
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.nc"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}sfcanl.nc"
- {% if DO_JEDIATMVAR %}
+ {% if DO_JEDIATMVAR and not (ATMINC_GRID == 'gaussian') %}
{% for itile in range(6) %}
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cubed_sphere_grid_atminc.tile{{ itile+1 }}.nc"
{% endfor %}
diff --git a/scripts/exglobal_archive_tars.py b/scripts/exglobal_archive_tars.py
index 4364a5a9b61..00b66ad6f73 100755
--- a/scripts/exglobal_archive_tars.py
+++ b/scripts/exglobal_archive_tars.py
@@ -41,7 +41,7 @@ def main():
'IAUFHRS', 'DO_FIT2OBS', 'NET', 'FHOUT_HF_GFS', 'FHMAX_HF_GFS', 'REPLAY_ICS',
'OFFSET_START_HOUR', 'ARCH_EXPDIR', 'EXPDIR', 'ARCH_EXPDIR_FREQ', 'ARCH_HASHES',
'ARCH_DIFFS', 'SDATE', 'EDATE', 'HOMEgfs', 'DO_GEMPAK', 'DATASETS_YAML',
- 'WAVE_OUT_GRIDS', 'DO_GSISOILDA', 'DO_LAND_IAU', 'TARBALL_TYPE']
+ 'WAVE_OUT_GRIDS', 'DO_GSISOILDA', 'DO_LAND_IAU', 'TARBALL_TYPE', 'ATMINC_GRID']
archive_dict = AttrDict()
for key in keys:
diff --git a/scripts/exglobal_atmos_sfcanl.sh b/scripts/exglobal_atmos_sfcanl.sh
index 92a8efb6fa4..096434aa8cb 100755
--- a/scripts/exglobal_atmos_sfcanl.sh
+++ b/scripts/exglobal_atmos_sfcanl.sh
@@ -111,7 +111,8 @@ done
# There is only a single NSST analysis at the middle of the window
# For now use/assume it is the same at the beginning of the window if doing IAU
if [[ "${DONST}" == "YES" ]]; then
- cpreq "${COMIN_ATMOS_ANALYSIS}/${APREFIX}dtfanl.nc" "${DATA}/dtfanl"
+ export NST_FILE=${NST_FILE:-${COMIN_ATMOS_ANALYSIS}/${APREFIX}dtfanl.nc}
+ cpreq "$NST_FILE" "${DATA}/dtfanl"
export NST_FILE="dtfanl"
else
export NST_FILE="NULL"
diff --git a/scripts/exglobal_prep_atm_ioda_obs.py b/scripts/exglobal_prep_atm_ioda_obs.py
new file mode 100755
index 00000000000..d59ebbaede6
--- /dev/null
+++ b/scripts/exglobal_prep_atm_ioda_obs.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+# exglobal_prep_atm_ioda_obs.py
+# This script either, depending on configuration,
+# will process atmospheric observations into IODA format
+# or will copy pre-processed observations from ObsForge
+import os
+
+from wxflow import Logger, cast_strdict_as_dtypedict
+from pygfs.task.atm_analysis import AtmAnalysis
+
+# Initialize root logger
+logger = Logger(level='DEBUG', colored_log=True)
+
+
+if __name__ == '__main__':
+
+ # Take configuration from environment and cast it as python dictionary
+ config = cast_strdict_as_dtypedict(os.environ)
+
+ # Instantiate the atm analysis task
+ AtmAnl = AtmAnalysis(config)
+
+ if AtmAnl.task_config.DO_CONVERT_IODA:
+ logger.info('converting observations to IODA format')
+ AtmAnl.generate_ioda_obs()
+ else:
+ # just sync files from COMINobsforge
+ logger.info('syncing files from COMINobsforge')
+ AtmAnl.stage_ioda_obs()
diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh
index 109fc346810..aacee05f01a 100755
--- a/sorc/link_workflow.sh
+++ b/sorc/link_workflow.sh
@@ -264,9 +264,8 @@ if [[ -d "${HOMEgfs}/sorc/gdas.cd/build" ]]; then
${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/ufsda" .
${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/ioda/bufr2ioda/gen_bufr2ioda_json.py" .
${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/ioda/bufr2ioda/gen_bufr2ioda_yaml.py" .
+ ${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/ioda/bufr2ioda/run_bufr2ioda.py" .
cd "${HOMEgfs}/ush" || exit 1
- ${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/ioda/bufr2ioda/run_bufr2ioda.py" .
- ${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/build/bin/imsfv3_scf2ioda.py" .
declare -a gdasapp_ocn_insitu_profile_platforms=("argo" "bathy" "glider" "marinemammal" "tesac" "xbtctd")
for platform in "${gdasapp_ocn_insitu_profile_platforms[@]}"; do
${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/bufr2ioda_insitu_profile_${platform}.py" .
diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh
index 8f3bd9a1307..777646b950f 100755
--- a/ush/forecast_postdet.sh
+++ b/ush/forecast_postdet.sh
@@ -210,6 +210,11 @@ EOF
inc_files=("atminc.tile1.nc" "atminc.tile2.nc" "atminc.tile3.nc" "atminc.tile4.nc" "atminc.tile5.nc" "atminc.tile6.nc")
increment_file_on_native_grid=".true."
res_latlon_dynamics="atminc"
+ if [[ "${DO_JEDIATMENS:-NO}" == "NO" ]]; then
+ inc_files=("atminc.nc")
+ res_latlon_dynamics="atminc.nc"
+ increment_file_on_native_grid=".false."
+ fi
else
inc_files=("atminc.nc")
res_latlon_dynamics="atminc.nc"
@@ -232,6 +237,9 @@ EOF
for inc_file in "${inc_files[@]}"; do
if [[ "${DO_JEDIATMVAR:-NO}" == "YES" ]]; then
increment_file="${COMIN_ATMOS_ANALYSIS}/${RUN}.t${cyc}z.cubed_sphere_grid_${PREFIX_ATMINC}${inc_file}"
+ if [[ "${DO_JEDIATMENS:-NO}" == "NO" ]]; then
+ increment_file="${COMIN_ATMOS_ANALYSIS}/${RUN}.t${cyc}z.${PREFIX_ATMINC}${inc_file}"
+ fi
else
if [[ "${RUN}" == "gcafs" ]]; then
increment_file="${COMIN_ATMOS_ANALYSIS}/gcdas.t${cyc}z.${PREFIX_ATMINC}${inc_file}"
@@ -313,7 +321,7 @@ EOF
${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.atmf${FH3}.nc" "${DATAoutput}/FV3ATM_OUTPUT/atmf${FH3}.nc"
${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.sfcf${FH3}.nc" "${DATAoutput}/FV3ATM_OUTPUT/sfcf${FH3}.nc"
${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.atm.logf${FH3}.txt" "${DATAoutput}/FV3ATM_OUTPUT/log.atm.f${FH3}"
- if [[ "${DO_JEDIATMVAR:-}" == "YES" ]]; then
+ if [[ "${DO_JEDIATMVAR:-}" == "YES" || "${DO_HISTORY_FILE_ON_NATIVE_GRID:-"NO"}" == "YES" ]]; then
${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.cubed_sphere_grid_atmf${FH3}.nc" "${DATAoutput}/FV3ATM_OUTPUT/cubed_sphere_grid_atmf${FH3}.nc"
${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.cubed_sphere_grid_sfcf${FH3}.nc" "${DATAoutput}/FV3ATM_OUTPUT/cubed_sphere_grid_sfcf${FH3}.nc"
fi
diff --git a/ush/parsing_model_configure_FV3.sh b/ush/parsing_model_configure_FV3.sh
index 123408cc4af..9fb5de710f1 100755
--- a/ush/parsing_model_configure_FV3.sh
+++ b/ush/parsing_model_configure_FV3.sh
@@ -32,7 +32,7 @@ local WRITE_GROUP=${WRITE_GROUP:-1}
local WRTTASK_PER_GROUP=${WRTTASK_PER_GROUP:-24}
local ITASKS=1
local OUTPUT_HISTORY=${OUTPUT_HISTORY:-".true."}
-if [[ "${DO_JEDIATMVAR:-}" == "YES" ]]; then
+if [[ "${DO_JEDIATMVAR:-}" == "YES" || "${DO_HISTORY_FILE_ON_NATIVE_GRID:-"NO"}" == "YES" ]]; then
local HISTORY_FILE_ON_NATIVE_GRID=".true."
else
local HISTORY_FILE_ON_NATIVE_GRID=".false."
diff --git a/ush/python/pygfs/task/atm_analysis.py b/ush/python/pygfs/task/atm_analysis.py
index 0ea0724ef03..4c44ddfe8a7 100644
--- a/ush/python/pygfs/task/atm_analysis.py
+++ b/ush/python/pygfs/task/atm_analysis.py
@@ -1,10 +1,13 @@
#!/usr/bin/env python3
+import os
from logging import getLogger
from pygfs.task.analysis import Analysis
from pygfs.jedi import Jedi
from typing import Any, Dict
from wxflow import AttrDict, FileHandler, parse_j2yaml, logit
+from run_bufr2ioda import bufr2ioda
+from pprint import pformat
logger = getLogger(__name__.split('.')[-1])
@@ -141,3 +144,42 @@ def finalize(self) -> None:
# Save files from COM
logger.info(f"Saving files to COM")
FileHandler(self.task_config.data_out).sync()
+
+
+ @logit(logger)
+ def generate_ioda_obs(self) -> None:
+ """
+ Generate IODA formatted atmospheric observations
+ This method will generate IODA formatted atmospheric observations
+ using the bufr2ioda.py script.
+ Parameters
+ ----------
+ None
+ Returns
+ ----------
+ None
+ """
+ # Call the GDASApp BUFR2IODA function
+ bufr2ioda(self.task_config.current_cycle, self.task_config.RUN, self.task_config.DMPDIR,
+ os.path.join(self.task_config.PARMgfs, 'gdas', 'ioda', 'bufr2ioda'),
+ self.task_config.COMOUT_OBS)
+
+ @logit(logger)
+ def stage_ioda_obs(self) -> None:
+ """
+ Stage IODA formatted atmospheric observations
+ This method will stage IODA formatted atmospheric observations
+ from the COMINobsforge directory to the local COM directory.
+ Parameters
+ ----------
+ None
+ Returns
+ ----------
+ None
+ """
+
+ # stage observations
+ logger.info(f"Staging list of IODA observation files from {self.task_config.COMINobsforge}")
+ obs_dict = parse_j2yaml(self.task_config.STAGE_COM_IODA_OBS_YAML, self.task_config)
+ FileHandler(obs_dict).sync()
+ logger.debug(f"Staged IODA observation files:\n{pformat(obs_dict)}")
diff --git a/versions/run.wcoss2.ver b/versions/run.wcoss2.ver
index 025b9556f99..ee8c7e561c3 100644
--- a/versions/run.wcoss2.ver
+++ b/versions/run.wcoss2.ver
@@ -43,7 +43,7 @@ export esmf_ver=8.8.0
export util_shared_ver=1.4.0
export ncdiag_ver=1.1.2
export g2tmpl_ver=1.10.2
-export crtm_ver=2.4.0.1
+export crtm_ver=2.4.0.2
export met_ver=9.1.3
export metplus_ver=3.1.1
From 65356f98659f65884aabae325a2b54abb1954747 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 14 Oct 2025 12:42:29 +0000
Subject: [PATCH 03/40] update sorc/gdas.cd to GDASApp branch dev/jedi-gfs
(#4148)
---
sorc/gdas.cd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 6b00f289cf8..9ca5e11ca87 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 6b00f289cf8333133a55bb5ac534a0ddfed74980
+Subproject commit 9ca5e11ca87de69fce8995e565e19e13f472e4a6
From e9b77f6c6a4648f7727824e11399a46b7a753045 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 14 Oct 2025 12:47:40 +0000
Subject: [PATCH 04/40] correct pycodestyle violations (#4148)
---
ush/python/pygfs/task/atm_analysis.py | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/ush/python/pygfs/task/atm_analysis.py b/ush/python/pygfs/task/atm_analysis.py
index 4c44ddfe8a7..6a5ecf737be 100644
--- a/ush/python/pygfs/task/atm_analysis.py
+++ b/ush/python/pygfs/task/atm_analysis.py
@@ -145,7 +145,6 @@ def finalize(self) -> None:
logger.info(f"Saving files to COM")
FileHandler(self.task_config.data_out).sync()
-
@logit(logger)
def generate_ioda_obs(self) -> None:
"""
@@ -182,4 +181,4 @@ def stage_ioda_obs(self) -> None:
logger.info(f"Staging list of IODA observation files from {self.task_config.COMINobsforge}")
obs_dict = parse_j2yaml(self.task_config.STAGE_COM_IODA_OBS_YAML, self.task_config)
FileHandler(obs_dict).sync()
- logger.debug(f"Staged IODA observation files:\n{pformat(obs_dict)}")
+ logger.debug(f"Staged IODA observation files:\n{pformat(obs_dict)}")
From cc8071cf35ae5df6ebedd2b5a94481664efed134 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 14 Oct 2025 13:41:04 +0000
Subject: [PATCH 05/40] update sorc/gdas.cd hash with changes need to cycle
JEDI-based variational atmospheric DA with GSI-based EnKF (#4148)
---
sorc/gdas.cd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 9ca5e11ca87..0915ebaf7ea 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 9ca5e11ca87de69fce8995e565e19e13f472e4a6
+Subproject commit 0915ebaf7ea3471cc1f58bdd7900c3ec3d940ff3
From 037a43097b607aae845679b3ff7287f4c490737c Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 14 Oct 2025 19:06:11 +0000
Subject: [PATCH 06/40] changes required to run GSI-based atmospheric DA
without ozone and radiances (#4148)
---
parm/archive/gdas.yaml.j2 | 5 +++--
scripts/exglobal_atmos_sfcanl.sh | 2 +-
scripts/exglobal_diag.sh | 8 +++++---
3 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/parm/archive/gdas.yaml.j2 b/parm/archive/gdas.yaml.j2
index a1fac1b3718..77a969185c2 100644
--- a/parm/archive/gdas.yaml.j2
+++ b/parm/archive/gdas.yaml.j2
@@ -75,8 +75,6 @@ gdas:
{% else %}
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cnvstat"
- - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}oznstat"
- - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_air"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_pc"
@@ -160,6 +158,9 @@ gdas:
{% endfor %}
optional:
{% if MODE == "cycled" %}
+ # Ozone and Radiance diagnostic files may not always be created
+ - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}oznstat"
+ - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat"
# Radiance verification (only created if there are problems)
{% if DO_VERFRAD %}
- "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/bad_diag.{{ cycle_YMDH }}"
diff --git a/scripts/exglobal_atmos_sfcanl.sh b/scripts/exglobal_atmos_sfcanl.sh
index 096434aa8cb..e2afc47c13f 100755
--- a/scripts/exglobal_atmos_sfcanl.sh
+++ b/scripts/exglobal_atmos_sfcanl.sh
@@ -112,7 +112,7 @@ done
# For now use/assume it is the same at the beginning of the window if doing IAU
if [[ "${DONST}" == "YES" ]]; then
export NST_FILE=${NST_FILE:-${COMIN_ATMOS_ANALYSIS}/${APREFIX}dtfanl.nc}
- cpreq "$NST_FILE" "${DATA}/dtfanl"
+ cpreq "$NST_FILE" "${DATA}/dtfanl"
export NST_FILE="dtfanl"
else
export NST_FILE="NULL"
diff --git a/scripts/exglobal_diag.sh b/scripts/exglobal_diag.sh
index af4627ffeb2..be5d707e08b 100755
--- a/scripts/exglobal_diag.sh
+++ b/scripts/exglobal_diag.sh
@@ -259,9 +259,11 @@ EOFdiag
fi
# Restrict RADSTAT
- chmod 750 "${RADSTAT}"
- if [[ "${CHGRP_RSTPROD}" == "YES" ]]; then
- ${CHGRP_CMD} "${RADSTAT}"
+ if [[ -s "${RADSTAT}" ]]; then
+ chmod 750 "${RADSTAT}"
+ if [[ "${CHGRP_RSTPROD}" == "YES" ]]; then
+ ${CHGRP_CMD} "${RADSTAT}"
+ fi
fi
echo "$(date) END tar diagnostic files" >&2
From 0a4a267c00275a293d2cc9fff2d88190f9367e7f Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 14 Oct 2025 20:59:41 +0000
Subject: [PATCH 07/40] copy bias correction and dtfanl to online archive
(#4148)
---
parm/archive/gfs_arcdir.yaml.j2 | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/parm/archive/gfs_arcdir.yaml.j2 b/parm/archive/gfs_arcdir.yaml.j2
index 91bcaf79204..9ba8523ec73 100644
--- a/parm/archive/gfs_arcdir.yaml.j2
+++ b/parm/archive/gfs_arcdir.yaml.j2
@@ -101,6 +101,16 @@
{% do gdas_files.append([COMIN_ATMOS_GRIB_1p00 ~ "/" ~ head ~ "pgrb2.1p00.f" ~ '%03d'|format(fhr),
ARCDIR ~ "/pgbf" ~ '%02d'|format(fhr) ~ "." ~ RUN ~ "." ~ cycle_YMDH ~ ".grib2"]) %}
{% endfor %}
+ {% do gdas_files.append([COMIN_ATMOS_ANALYSIS ~ "/" ~ head ~ "abias",
+ ARCDIR ~ "/abias." ~ RUN ~ "." ~ cycle_YMDH ]) %}
+ {% do gdas_files.append([COMIN_ATMOS_ANALYSIS ~ "/" ~ head ~ "abias_pc",
+ ARCDIR ~ "/abias_pc." ~ RUN ~ "." ~ cycle_YMDH ]) %}
+ {% do gdas_files.append([COMIN_ATMOS_ANALYSIS ~ "/" ~ head ~ "abias_air",
+ ARCDIR ~ "/abias_air." ~ RUN ~ "." ~ cycle_YMDH ]) %}
+ {% do gdas_files.append([COMIN_ATMOS_ANALYSIS ~ "/" ~ head ~ "abias_int",
+ ARCDIR ~ "/abias_int." ~ RUN ~ "." ~ cycle_YMDH ]) %}
+ {% do gdas_files.append([COMIN_ATMOS_ANALYSIS ~ "/" ~ head ~ "dtfanl.nc",
+ ARCDIR ~ "/dtfanl." ~ RUN ~ "." ~ cycle_YMDH ~ ".nc"]) %}
# Now append the necessary file pairs to file_set
# Common deterministic files
@@ -148,7 +158,7 @@ mkdir:
- "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}"
{% endif %}
-copy:
+copy_opt:
{% for source_dest_pair in file_set %}
- {{ source_dest_pair }}
{% endfor %}
From d154272a184f5c89e3f6e833ac85abfac5cdb85b Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Wed, 15 Oct 2025 13:43:54 +0000
Subject: [PATCH 08/40] move radstat to optional list in gdas_restarta.yaml.j2
(#4148)
---
parm/archive/gdas_restarta.yaml.j2 | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/parm/archive/gdas_restarta.yaml.j2 b/parm/archive/gdas_restarta.yaml.j2
index 34d50705155..3384696df4b 100644
--- a/parm/archive/gdas_restarta.yaml.j2
+++ b/parm/archive/gdas_restarta.yaml.j2
@@ -42,7 +42,6 @@ gdas_restarta:
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_air"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_pc"
- - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cnvstat"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_int"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}dtfanl.nc"
@@ -55,3 +54,5 @@ gdas_restarta:
- "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}nsstbufr"
- "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr"
- "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr.acft_profiles"
+ optional:
+ - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat"
From eda5ce3da942107d4f78dc045ccaccef4c7b09b9 Mon Sep 17 00:00:00 2001
From: RussTreadon-NOAA
Date: Wed, 15 Oct 2025 18:58:29 +0000
Subject: [PATCH 09/40] update sorc/gdas.cd hash (#4148)
---
sorc/gdas.cd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 0915ebaf7ea..6098f497da9 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 0915ebaf7ea3471cc1f58bdd7900c3ec3d940ff3
+Subproject commit 6098f497da9ed6a96ce86bf7611f6054b8e34b98
From c9a5cde9c8cabb42f305bf447645956aaed86e4c Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Thu, 16 Oct 2025 15:34:53 +0000
Subject: [PATCH 10/40] add CONVERT_BIASCOR option to prep.sh and gdas.cd
(#4148)
---
dev/jobs/prep.sh | 19 ++++++++++++++++++-
sorc/gdas.cd | 2 +-
2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/dev/jobs/prep.sh b/dev/jobs/prep.sh
index ec20be0ee6d..8c1a053c273 100755
--- a/dev/jobs/prep.sh
+++ b/dev/jobs/prep.sh
@@ -98,7 +98,7 @@ fi
###############################################################
-# If requested copy bias correction files from source to comroot
+# If requested, copy bias correction files from source to comroot
if [[ ${COPY_BIASCOR:-"NO"} == "YES" ]]; then
for file in abias abias_pc abias_air; do
cpreq "${SOURCE_BIASCOR}/${file}.${GDUMP}.${gPDY}${gcyc}" "${COMOUT_ATMOS_ANALYSIS_PREV}/${GDUMP}.t${gcyc}z.${file}"
@@ -171,6 +171,23 @@ if [[ ${err} -ne 0 ]]; then
err_exit "Failed to obtain/create ${files}, ABORT!"
fi
+################################################################################
+# If requested, create radiance bias correction files for JEDI
+if [[ ${CONVERT_BIASCOR:-"NO"} == "YES" ]]; then
+ cd ${DATAROOT}
+ ${HOMEgfs}/sorc/gdas.cd/ush/gsi_satbias2ioda_all.sh
+ export err=$?
+ if [[ ${err} -ne 0 ]]; then
+ err_exit "JOBSPROC_GLOBAL_PREP job failed, ABORT!"
+ fi
+
+ # Remove temporary working directory
+ cd "${DATAROOT}" || true
+ if [[ "${KEEPDATA}" == "NO" ]]; then
+ rm -rf "${DATA}"
+ fi
+fi
+
################################################################################
# Exit out cleanly
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 6098f497da9..821e72640f4 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 6098f497da9ed6a96ce86bf7611f6054b8e34b98
+Subproject commit 821e72640f4dd7134523986c884cefe7eec35ef8
From 7703de3261eea1e760b3e67a76439598e3debe07 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Thu, 16 Oct 2025 15:40:03 +0000
Subject: [PATCH 11/40] change run_bufr2ioda.py path in .gitignore (#4148)
---
.gitignore | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index 7524452d89f..2090ef77659 100644
--- a/.gitignore
+++ b/.gitignore
@@ -173,12 +173,12 @@ ush/jediinc2fv3.py
ush/imsfv3_scf2ioda.py
ush/bufr_snocvr_snomad.py
ush/atparse.bash
-ush/run_bufr2ioda.py
ush/bufr2ioda_insitu*
ush/python/ufsda
ush/python/soca
ush/python/gen_bufr2ioda_json.py
ush/python/gen_bufr2ioda_yaml.py
+ush/python/run_bufr2ioda.py
ush/spoc
# ush log file
ush/fetch-fix-data.log
From 4b4294f2a904764ad2351b10b8c23738346c7f6a Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Thu, 16 Oct 2025 19:13:51 +0000
Subject: [PATCH 12/40] update parm files for JEDI atmospheric DA (#4148)
---
dev/parm/config/gfs/config.atmanl.j2 | 1 +
dev/parm/config/gfs/config.base.j2 | 10 ++++++++++
dev/parm/config/gfs/config.prepatmiodaobs | 4 ++++
3 files changed, 15 insertions(+)
diff --git a/dev/parm/config/gfs/config.atmanl.j2 b/dev/parm/config/gfs/config.atmanl.j2
index d0e0e8d0f88..be7bfafe143 100644
--- a/dev/parm/config/gfs/config.atmanl.j2
+++ b/dev/parm/config/gfs/config.atmanl.j2
@@ -22,6 +22,7 @@ export LOCALIZATION_TYPE="bump"
if [[ ${DOHYBVAR} = "YES" ]]; then
# shellcheck disable=SC2153
export CASE_ANL=${CASE_ENS}
+ export CASE_GSIBEC=${CASE}
else
export CASE_ANL=${CASE}
fi
diff --git a/dev/parm/config/gfs/config.base.j2 b/dev/parm/config/gfs/config.base.j2
index 21acc0ce02d..4b4aeb8d54e 100644
--- a/dev/parm/config/gfs/config.base.j2
+++ b/dev/parm/config/gfs/config.base.j2
@@ -51,6 +51,7 @@ export PACKAGEROOT="{{ PACKAGEROOT }}" # TODO: set via prod_envir in Ops
export COMROOT="{{ COMROOT }}" # TODO: set via prod_envir in Ops
export COMINsyn="{{ COMINsyn }}"
export DMPDIR="{{ DMPDIR }}"
+export COMINobsforge="{{ COMINobsforge }}"
# Gempak from external models
# Default locations are to dummy locations for testing
@@ -517,4 +518,13 @@ export OFFSET_START_HOUR=0
# Number of regional collectives to create soundings for
export NUM_SND_COLLECTIVES=${NUM_SND_COLLECTIVES:-9}
+# Set DA increment type
+if [[ "${DO_JEDIATMVAR}" = "YES" ]]; then
+ if [[ "${DO_JEDIATMENS}" = "YES" ]]; then
+ export ATMINC_GRID="cubed_sphere_grid"
+ else
+ export ATMINC_GRID="gaussian"
+ fi
+fi
+
echo "END: config.base"
diff --git a/dev/parm/config/gfs/config.prepatmiodaobs b/dev/parm/config/gfs/config.prepatmiodaobs
index e29cf67b070..fa4abf94c2b 100644
--- a/dev/parm/config/gfs/config.prepatmiodaobs
+++ b/dev/parm/config/gfs/config.prepatmiodaobs
@@ -8,4 +8,8 @@ echo "BEGIN: config.prepatmiodaobs"
# Get task specific resources
. "${EXPDIR}/config.resources" prepatmiodaobs
+# Process observations in line (YES) or copy observations from ObsForge (NO)?
+export DO_CONVERT_IODA="NO"
+export STAGE_COM_IODA_OBS_YAML="${PARMgfs}/gdas/atm/atm_com_stage_ioda.yaml.j2"
+
echo "END: config.prepatmiodaobs"
From a3f129b134dd7f47d23beb56b04f398283a5b337 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Thu, 16 Oct 2025 19:15:38 +0000
Subject: [PATCH 13/40] update job dependencies to run JEDI variational DA with
GSI EnKF (#4148)
---
dev/workflow/applications/gfs_cycled.py | 10 ++++++++--
dev/workflow/rocoto/gfs_tasks.py | 7 +++++--
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/dev/workflow/applications/gfs_cycled.py b/dev/workflow/applications/gfs_cycled.py
index 4af35004017..539d717bd20 100644
--- a/dev/workflow/applications/gfs_cycled.py
+++ b/dev/workflow/applications/gfs_cycled.py
@@ -110,7 +110,10 @@ def _get_app_configs(self, run):
configs += ['prep_sfc']
if options['do_jediatmvar']:
- configs += ['prepatmiodaobs', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal', 'analcalc_fv3jedi']
+ if options['do_jediatmens']:
+ configs += ['prepatmiodaobs', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal', 'analcalc_fv3jedi']
+ else:
+ configs += ['prepatmiodaobs', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal', 'analcalc']
else:
configs += ['anal', 'analdiag', 'analcalc']
@@ -250,7 +253,10 @@ def get_task_names(self):
if options['do_prep_sfc']:
task_names[run] += ['prep_sfc']
if options['do_jediatmvar']:
- task_names[run] += ['prepatmiodaobs', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal', 'analcalc_fv3jedi']
+ if options['do_jediatmens']:
+ task_names[run] += ['prepatmiodaobs', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal', 'analcalc_fv3jedi']
+ else:
+ task_names[run] += ['prepatmiodaobs', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal', 'analcalc']
else:
task_names[run] += ['anal', 'analcalc']
diff --git a/dev/workflow/rocoto/gfs_tasks.py b/dev/workflow/rocoto/gfs_tasks.py
index d188eeaf342..abb745cb0c1 100644
--- a/dev/workflow/rocoto/gfs_tasks.py
+++ b/dev/workflow/rocoto/gfs_tasks.py
@@ -315,7 +315,10 @@ def sfcanl(self):
def analcalc(self):
deps = []
- dep_dict = {'type': 'task', 'name': f'{self.run}_anal'}
+ if self.options['do_jediatmvar'] and not self.options['do_jediatmens']:
+ dep_dict = {'type': 'task', 'name': f'{self.run}_atmanlfinal'}
+ else:
+ dep_dict = {'type': 'task', 'name': f'{self.run}_anal'}
deps.append(rocoto.add_dependency(dep_dict))
dep_dict = {'type': 'task', 'name': f'{self.run}_sfcanl'}
deps.append(rocoto.add_dependency(dep_dict))
@@ -3092,7 +3095,7 @@ def earc_tars(self):
if 'enkfgdas' in self.run:
dep_dict = {'type': 'metatask', 'name': f'{self.run}_epmn'}
deps.append(rocoto.add_dependency(dep_dict))
- if not self.options['do_jediatmvar']:
+ if not self.options['do_jediatmens']:
dep_dict = {'type': 'task', 'name': f'{self.run}_echgres'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep_condition='and', dep=deps)
From b9d560f5f6763a301d101af81e6f03773d863da5 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Thu, 16 Oct 2025 19:17:18 +0000
Subject: [PATCH 14/40] update gdas.cd hash to bring in improved
CONVERT_BIASCOR script (#4148)
---
sorc/gdas.cd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 821e72640f4..8785c96aaec 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 821e72640f4dd7134523986c884cefe7eec35ef8
+Subproject commit 8785c96aaecb83d5f077acd62c1d93012b9d1904
From 7c87a10dcc3e4870a4974192d71a091f4fbbacf4 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Fri, 17 Oct 2025 12:45:34 +0000
Subject: [PATCH 15/40] correct epos log file suffix bug in archive yaml
(#4148)
---
parm/archive/enkf.yaml.j2 | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/parm/archive/enkf.yaml.j2 b/parm/archive/enkf.yaml.j2
index cdd6efe7176..154040c6174 100644
--- a/parm/archive/enkf.yaml.j2
+++ b/parm/archive/enkf.yaml.j2
@@ -7,8 +7,10 @@ enkf:
{% for mem in range(1, nmem_ens + 1) %}
- "logs/{{ cycle_YMDH }}/{{ RUN }}_fcst_mem{{ '%03d' % mem }}.log"
{% endfor %}
- {% for fhr in range(fhmin, fhmax + 1, fhout) %}
- - "logs/{{ cycle_YMDH }}/{{ RUN }}_epos{{ '%03d' % (fhr - fhmin) }}.log"
+ {% set fhrs = range(fhmin, fhmax + fhout, fhout) %}
+ {% set ngrps = fhrs | length %}
+ {% for grp in range(0, ngrps) %}
+ - "logs/{{ cycle_YMDH }}/{{ RUN }}_epos{{ '%03d' % grp }}.log"
{% endfor %}
{% if not DO_JEDIATMENS %}
- "logs/{{ cycle_YMDH }}/{{ RUN }}_echgres.log"
From 1214a69a17ae0c2223b0e8a07cbb74a7eaebd5d2 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Fri, 17 Oct 2025 14:04:06 +0000
Subject: [PATCH 16/40] add anlmon atmos_iodastat to gfs and gdas archive
taraballs (#4148)
---
jobs/JGLOBAL_ARCHIVE_TARS | 1 +
parm/archive/gdas.yaml.j2 | 1 +
parm/archive/gfsa.yaml.j2 | 1 +
3 files changed, 3 insertions(+)
diff --git a/jobs/JGLOBAL_ARCHIVE_TARS b/jobs/JGLOBAL_ARCHIVE_TARS
index f3b95db93cc..9614ecb18e2 100755
--- a/jobs/JGLOBAL_ARCHIVE_TARS
+++ b/jobs/JGLOBAL_ARCHIVE_TARS
@@ -11,6 +11,7 @@ fi
##############################################
YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \
COMIN_ATMOS_ANALYSIS:COM_ATMOS_ANALYSIS_TMPL \
+ COMIN_ATMOS_ANLMON:COM_ATMOS_ANLMON_TMPL \
COMIN_ATMOS_BUFR:COM_ATMOS_BUFR_TMPL \
COMIN_ATMOS_GEMPAK:COM_ATMOS_GEMPAK_TMPL \
COMIN_ATMOS_GENESIS:COM_ATMOS_GENESIS_TMPL \
diff --git a/parm/archive/gdas.yaml.j2 b/parm/archive/gdas.yaml.j2
index 77a969185c2..3d05bd3cc1e 100644
--- a/parm/archive/gdas.yaml.j2
+++ b/parm/archive/gdas.yaml.j2
@@ -72,6 +72,7 @@ gdas:
- "{{ COMIN_CONF | relpath(ROTDIR) }}/{{ head }}atmanlvar.yaml"
- "{{ COMIN_CONF | relpath(ROTDIR) }}/{{ head }}atmanlfv3inc.yaml"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmstat"
+ - "{{ COMIN_ATMOS_ANLMON | relpath(ROTDIR) }}/{{ head }}atmos_iodastat.tgz"
{% else %}
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cnvstat"
diff --git a/parm/archive/gfsa.yaml.j2 b/parm/archive/gfsa.yaml.j2
index 00e6de4c171..a87a1806f16 100644
--- a/parm/archive/gfsa.yaml.j2
+++ b/parm/archive/gfsa.yaml.j2
@@ -38,6 +38,7 @@ gfsa:
- "{{ COMIN_CONF | relpath(ROTDIR) }}/{{ head }}atmanlvar.yaml"
- "{{ COMIN_CONF | relpath(ROTDIR) }}/{{ head }}atmanlfv3inc.yaml"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmstat"
+ - "{{ COMIN_ATMOS_ANLMON | relpath(ROTDIR) }}/{{ head }}atmos_iodastat.tgz"
{% else %}
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat"
{% endif %}
From 5bad088a371884d8f77bb24eed4fd294eb4602a9 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Mon, 27 Oct 2025 14:17:33 +0000
Subject: [PATCH 17/40] update gdas.cd hash (#4148)
---
sorc/gdas.cd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 86ae58cd9c3..34bcc754cff 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 86ae58cd9c34155af43e087c2a6d16936b672ffc
+Subproject commit 34bcc754cffe0b2fef5f437cf524f98a688cea95
From bfb58038968e8b8248a4c277cab8f129d22df962 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Thu, 30 Oct 2025 18:50:00 +0000
Subject: [PATCH 18/40] changes required to run g-w CI (#4148)
---
dev/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml | 3 +++
dev/parm/config/gfs/config.atmanl.j2 | 14 +++++++-------
dev/parm/config/gfs/config.atmanlvar | 3 +++
dev/parm/config/gfs/config.base.j2 | 1 +
...fig.prepatmiodaobs => config.prepatmiodaobs.j2} | 2 +-
sorc/gdas.cd | 2 +-
ush/python/pygfs/jedi/jedi.py | 6 ++++++
ush/python/pygfs/task/atm_analysis.py | 4 ++++
8 files changed, 26 insertions(+), 9 deletions(-)
rename dev/parm/config/gfs/{config.prepatmiodaobs => config.prepatmiodaobs.j2} (86%)
diff --git a/dev/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml b/dev/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml
index 045a1bc8a4a..a9e0d20a25c 100644
--- a/dev/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml
+++ b/dev/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml
@@ -5,6 +5,7 @@ base:
DO_JEDIATMVAR: "YES"
DO_JEDIATMENS: "YES"
DO_TEST_MODE: "NO"
+ CASE_ANL: "C48"
atmanl:
LAYOUT_X_ATMANL: 4
LAYOUT_Y_ATMANL: 4
@@ -23,5 +24,7 @@ esfc:
DONST: "NO"
nsst:
NST_MODEL: "1"
+prepatmiodaobs:
+ DO_CONVERT_IODA: "YES"
sfcanl:
DONST: "NO"
diff --git a/dev/parm/config/gfs/config.atmanl.j2 b/dev/parm/config/gfs/config.atmanl.j2
index be7bfafe143..ec6fef5321f 100644
--- a/dev/parm/config/gfs/config.atmanl.j2
+++ b/dev/parm/config/gfs/config.atmanl.j2
@@ -19,12 +19,12 @@ export BIAS_FILES_YAML="${PARMgfs}/gdas/atm/atm_bias_files.yaml.j2"
export LOCALIZATION_TYPE="bump"
-if [[ ${DOHYBVAR} = "YES" ]]; then
- # shellcheck disable=SC2153
- export CASE_ANL=${CASE_ENS}
- export CASE_GSIBEC=${CASE}
-else
- export CASE_ANL=${CASE}
-fi
+export CASE_GSIBEC=${CASE_ANL}
+##if [[ ${DOHYBVAR} = "YES" ]]; then
+## if [[ "${ATMINC_GRID}" = "gaussian" ]]; then
+## # shellcheck disable=SC2153
+## export CASE_GSIBEC=${CASE_ENS}
+## fi
+##fi
echo "END: config.atmanl"
diff --git a/dev/parm/config/gfs/config.atmanlvar b/dev/parm/config/gfs/config.atmanlvar
index cbc0334a08c..eb21daff6bd 100644
--- a/dev/parm/config/gfs/config.atmanlvar
+++ b/dev/parm/config/gfs/config.atmanlvar
@@ -8,4 +8,7 @@ echo "BEGIN: config.atmanlvar"
# Get task specific resources
. "${EXPDIR}/config.resources" atmanlvar
+export NUMBER_OUTER_LOOPS="1"
+export NUMBER_INNER_LOOP_ITER_1="50"
+
echo "END: config.atmanlvar"
diff --git a/dev/parm/config/gfs/config.base.j2 b/dev/parm/config/gfs/config.base.j2
index 75f626a0d1a..19fe23cc6c5 100644
--- a/dev/parm/config/gfs/config.base.j2
+++ b/dev/parm/config/gfs/config.base.j2
@@ -205,6 +205,7 @@ export OPS_RES="C768" # Do not change # TODO: Why is this needed and where is it
export LEVS=128
export CASE="{{ CASE_CTL }}"
export CASE_ENS="{{ CASE_ENS }}"
+export CASE_ANL="{{ CASE_ANL | default('${CASE}') }}"
export CASE_HIST="{{ CASE_HIST | default('${CASE}') }}"
export OCNRES="{{ OCNRES }}"
export ICERES="${OCNRES}"
diff --git a/dev/parm/config/gfs/config.prepatmiodaobs b/dev/parm/config/gfs/config.prepatmiodaobs.j2
similarity index 86%
rename from dev/parm/config/gfs/config.prepatmiodaobs
rename to dev/parm/config/gfs/config.prepatmiodaobs.j2
index fa4abf94c2b..5eb9a6d4726 100644
--- a/dev/parm/config/gfs/config.prepatmiodaobs
+++ b/dev/parm/config/gfs/config.prepatmiodaobs.j2
@@ -9,7 +9,7 @@ echo "BEGIN: config.prepatmiodaobs"
. "${EXPDIR}/config.resources" prepatmiodaobs
# Process observations in line (YES) or copy observations from ObsForge (NO)?
-export DO_CONVERT_IODA="NO"
+export DO_CONVERT_IODA="{{ DO_CONVERT_IODA | default('NO') }}"
export STAGE_COM_IODA_OBS_YAML="${PARMgfs}/gdas/atm/atm_com_stage_ioda.yaml.j2"
echo "END: config.prepatmiodaobs"
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 34bcc754cff..df9f3f1355e 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 34bcc754cffe0b2fef5f437cf524f98a688cea95
+Subproject commit df9f3f1355e6eadd4c7d7469335728457e802997
diff --git a/ush/python/pygfs/jedi/jedi.py b/ush/python/pygfs/jedi/jedi.py
index 2cb1d5a1aff..9c8fdef68c5 100644
--- a/ush/python/pygfs/jedi/jedi.py
+++ b/ush/python/pygfs/jedi/jedi.py
@@ -403,6 +403,12 @@ def find_value_in_nested_dict(nested_dict: Dict, target_key: str) -> Any:
result = find_value_in_nested_dict(nested_dict, user_key)
"""
+ print(f" ")
+ print(f"nested_dict is {nested_dict}")
+ print(f" ")
+ print(f"target_key is {target_key}")
+ print(f" ")
+
if not isinstance(nested_dict, dict):
raise WorkflowTypeError(f"Input is not of type(dict)")
diff --git a/ush/python/pygfs/task/atm_analysis.py b/ush/python/pygfs/task/atm_analysis.py
index 6a5ecf737be..b593f1a6a32 100644
--- a/ush/python/pygfs/task/atm_analysis.py
+++ b/ush/python/pygfs/task/atm_analysis.py
@@ -38,6 +38,7 @@ def __init__(self, config: Dict[str, Any]):
_res = int(self.task_config.CASE[1:])
_res_anl = int(self.task_config.CASE_ANL[1:])
+ _res_his = int(self.task_config.CASE_HIST[1:])
if self.task_config.DOHYBVAR:
_BERROR_YAML = f"atmosphere_background_error_hybrid_{self.task_config.STATICB_TYPE}_{self.task_config.LOCALIZATION_TYPE}"
@@ -53,6 +54,9 @@ def __init__(self, config: Dict[str, Any]):
'npx_anl': _res_anl + 1,
'npy_anl': _res_anl + 1,
'npz_anl': self.task_config.LEVS - 1,
+ 'npx_his': _res_his + 1,
+ 'npy_his': _res_his + 1,
+ 'npz_his': self.task_config.LEVS - 1,
'npz': self.task_config.LEVS - 1,
'BKG_TSTEP': "PT1H", # Placeholder for 4D applications
'BERROR_YAML': _BERROR_YAML,
From 64b36b34ca9bee220e504c4fa68ed124382fea9a Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Fri, 31 Oct 2025 19:27:59 +0000
Subject: [PATCH 19/40] set select case variables for JEDI EnVar with GSI EnKF
(#4190)
---
dev/parm/config/gfs/config.atmanl.j2 | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/dev/parm/config/gfs/config.atmanl.j2 b/dev/parm/config/gfs/config.atmanl.j2
index ec6fef5321f..da46fc077ce 100644
--- a/dev/parm/config/gfs/config.atmanl.j2
+++ b/dev/parm/config/gfs/config.atmanl.j2
@@ -20,11 +20,10 @@ export BIAS_FILES_YAML="${PARMgfs}/gdas/atm/atm_bias_files.yaml.j2"
export LOCALIZATION_TYPE="bump"
export CASE_GSIBEC=${CASE_ANL}
-##if [[ ${DOHYBVAR} = "YES" ]]; then
-## if [[ "${ATMINC_GRID}" = "gaussian" ]]; then
-## # shellcheck disable=SC2153
-## export CASE_GSIBEC=${CASE_ENS}
-## fi
-##fi
+if [[ "${DOHYBVAR}" = "YES" && "${ATMINC_GRID}" = "gaussian" ]]; then
+ # shellcheck disable=SC2153
+ export CASE_GSIBEC=${CASE_HIST}
+ export CASE_HIST=${CASE_ANL}
+fi
echo "END: config.atmanl"
From f1dbec93462e4a8610c66df0421dc0700f004462 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Mon, 3 Nov 2025 15:59:24 +0000
Subject: [PATCH 20/40] update gdas.cd hash
---
sorc/gdas.cd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 3677325990b..4bfccef01bc 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 3677325990bc35446add05f7b40ba938fbeb4213
+Subproject commit 4bfccef01bc2866bbf95602b9cd5766131a4d2bc
From 4e31382845bd68216ce068d635b8d959d8032a5e Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 4 Nov 2025 20:16:15 +0000
Subject: [PATCH 21/40] correct typo in ush/forecast_postdet.sh
---
ush/forecast_postdet.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh
index b0a6e2a3fa2..e62d278c5f5 100755
--- a/ush/forecast_postdet.sh
+++ b/ush/forecast_postdet.sh
@@ -202,7 +202,7 @@ EOF
if [[ "${DO_JEDIATMENS:-NO}" == "NO" ]]; then
inc_files=("increment.atm.i006.nc")
res_latlon_dynamics="increment.atm.i006.nc"
- increment_file_on_native_grid=".false.
+ increment_file_on_native_grid=".false."
fi
else
inc_files=("increment.atm.i006.nc")
From aa3e7cccdc74c884503f9f84a8c441e960ad8b27 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 4 Nov 2025 20:18:20 +0000
Subject: [PATCH 22/40] correct suffix for enkf gsistat.ensmean file (#4222)
---
jobs/JGDAS_ENKF_SELECT_OBS | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/jobs/JGDAS_ENKF_SELECT_OBS b/jobs/JGDAS_ENKF_SELECT_OBS
index ab3a426808e..3417f6f6e77 100755
--- a/jobs/JGDAS_ENKF_SELECT_OBS
+++ b/jobs/JGDAS_ENKF_SELECT_OBS
@@ -84,7 +84,7 @@ export ABIASAIR="${COMOUT_ATMOS_ANALYSIS}/${APREFIX}abias_air.txt"
export ABIASe="${COMOUT_ATMOS_ANALYSIS}/${APREFIX}abias_int.txt"
# Diagnostics related to ensemble mean
-export GSISTAT="${COMOUT_ATMOS_ANALYSIS}/${APREFIX}gsistat.ensmean.tar"
+export GSISTAT="${COMOUT_ATMOS_ANALYSIS}/${APREFIX}gsistat.ensmean.txt"
export CNVSTAT="${COMOUT_ATMOS_ANALYSIS}/${APREFIX}cnvstat.ensmean.tar"
export OZNSTAT="${COMOUT_ATMOS_ANALYSIS}/${APREFIX}oznstat.ensmean.tar"
export RADSTAT="${COMOUT_ATMOS_ANALYSIS}/${APREFIX}radstat.ensmean.tar"
From a728f64733bef179ed9aa04365ebd036d590d4a8 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 4 Nov 2025 20:21:29 +0000
Subject: [PATCH 23/40] extend parm/post/upp.yaml to handle JEDI guassian grid
analysis (#4190)
---
parm/post/upp.yaml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/parm/post/upp.yaml b/parm/post/upp.yaml
index c4935104ae4..4c1bd6d889b 100644
--- a/parm/post/upp.yaml
+++ b/parm/post/upp.yaml
@@ -20,8 +20,13 @@ analysis:
copy:
- ["{{ PARMgfs }}/post/gfs/postxconfig-NT-gfs-anl.txt", "{{ DATA }}/postxconfig-NT.txt"]
{% if DO_JEDIATMVAR %}
+ {% if ATMINC_GRID == 'gaussian' %}
+ - ["{{ COMIN_ATMOS_ANALYSIS }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.analysis.atm.a006.nc", "{{ DATA }}/{{ atmos_filename }}"]
+ - ["{{ COMIN_ATMOS_ANALYSIS }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.analysis.sfc.a006.nc", "{{ DATA }}/{{ flux_filename }}"]
+ {% else %}
- ["{{ COMIN_ATMOS_ANALYSIS }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.jedi_analysis.atm.a006.nc", "{{ DATA }}/{{ atmos_filename }}"]
- ["{{ COMIN_ATMOS_ANALYSIS }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.jedi_analysis.sfc.a006.nc", "{{ DATA }}/{{ flux_filename }}"]
+ {% endif %}
{% else %}
- ["{{ COMIN_ATMOS_ANALYSIS }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.analysis.atm.a006.nc", "{{ DATA }}/{{ atmos_filename }}"]
- ["{{ COMIN_ATMOS_ANALYSIS }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.analysis.sfc.a006.nc", "{{ DATA }}/{{ flux_filename }}"]
From 8182e05ca3e15909f48fc48d311b44472792f208 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 4 Nov 2025 20:24:29 +0000
Subject: [PATCH 24/40] update sorc/gdas.cd hash (#4190)
---
sorc/gdas.cd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 4bfccef01bc..83cf27b5512 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 4bfccef01bc2866bbf95602b9cd5766131a4d2bc
+Subproject commit 83cf27b55128dba61c5ba555477bc44991370cc0
From e8444ff079c438c9528ef0c32a2c3376333b1d88 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Wed, 5 Nov 2025 00:27:24 +0000
Subject: [PATCH 25/40] extend parm/archive/gdas.yaml.j2 to handle JEDI
guassian grid analysis (#4190)
---
parm/archive/gdas.yaml.j2 | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/parm/archive/gdas.yaml.j2 b/parm/archive/gdas.yaml.j2
index 71fb2700773..122ced9d8c6 100644
--- a/parm/archive/gdas.yaml.j2
+++ b/parm/archive/gdas.yaml.j2
@@ -57,8 +57,13 @@ gdas:
# Analysis netCDF (raw) data
{% if DO_JEDIATMVAR %}
+ {% if ATMINC_GRID == 'gaussian' %}
+ - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}analysis.atm.a006.nc"
+ - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}analysis.sfc.a006.nc"
+ {% else %}
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}jedi_analysis.atm.a006.nc"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}jedi_analysis.sfc.a006.nc"
+ {% endif %}
{% else %}
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}analysis.atm.a006.nc"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}analysis.sfc.a006.nc"
From 86c10b07c5dda478e2e7dcf8cf7d8fb8b7d10b4a Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Wed, 5 Nov 2025 13:20:23 +0000
Subject: [PATCH 26/40] add .txt suffix to bias correction files (#4190)
---
dev/jobs/prep.sh | 1 +
1 file changed, 1 insertion(+)
diff --git a/dev/jobs/prep.sh b/dev/jobs/prep.sh
index 8c1a053c273..170b089468c 100755
--- a/dev/jobs/prep.sh
+++ b/dev/jobs/prep.sh
@@ -102,6 +102,7 @@ fi
if [[ ${COPY_BIASCOR:-"NO"} == "YES" ]]; then
for file in abias abias_pc abias_air; do
cpreq "${SOURCE_BIASCOR}/${file}.${GDUMP}.${gPDY}${gcyc}" "${COMOUT_ATMOS_ANALYSIS_PREV}/${GDUMP}.t${gcyc}z.${file}"
+ cpreq "${SOURCE_BIASCOR}/${file}.${GDUMP}.${gPDY}${gcyc}" "${COMOUT_ATMOS_ANALYSIS_PREV}/${GDUMP}.t${gcyc}z.${file}.txt"
done
fi
From 367c284cf737821f9f5761a5eefc68dedca93577 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Thu, 6 Nov 2025 02:13:16 +0000
Subject: [PATCH 27/40] use correct suffux for gsistat.ensmean in enkf archive
(#4222)
---
parm/archive/enkf.yaml.j2 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/parm/archive/enkf.yaml.j2 b/parm/archive/enkf.yaml.j2
index 99e8926be2b..9ae12127a31 100644
--- a/parm/archive/enkf.yaml.j2
+++ b/parm/archive/enkf.yaml.j2
@@ -69,7 +69,7 @@ enkf:
# Ensemble mean state
{% if not DO_JEDIATMENS %}
{% set da_stat_files = ["enkfstat.txt",
- "gsistat.ensmean.tar",
+ "gsistat.ensmean.txt",
"cnvstat.ensmean.tar",
"oznstat.ensmean.tar",
"radstat.ensmean.tar"] %}
From 8fd26aeac8b3a3ad7558ae86daac5ab11c087b14 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Thu, 6 Nov 2025 02:16:17 +0000
Subject: [PATCH 28/40] use correct suffix for gsistat.ensmean in gfs archive
(#4222)
---
parm/archive/gfs_arcdir.yaml.j2 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/parm/archive/gfs_arcdir.yaml.j2 b/parm/archive/gfs_arcdir.yaml.j2
index fdc18be3ad5..d795eabbef7 100644
--- a/parm/archive/gfs_arcdir.yaml.j2
+++ b/parm/archive/gfs_arcdir.yaml.j2
@@ -140,7 +140,7 @@
{% else %}
{% do enkf_files.append([COMIN_ATMOS_ANALYSIS_ENSSTAT ~ "/" ~ head ~ "enkfstat.txt",
ARCDIR ~ "/enkfstat." ~ RUN ~ "." ~ cycle_YMDH ]) %}
- {% do enkf_files.append([COMIN_ATMOS_ANALYSIS_ENSSTAT ~ "/" ~ head ~ "gsistat.ensmean.tar",
+ {% do enkf_files.append([COMIN_ATMOS_ANALYSIS_ENSSTAT ~ "/" ~ head ~ "gsistat.ensmean.txt",
ARCDIR ~ "/gsistat." ~ RUN ~ "." ~ cycle_YMDH ~ ".ensmean"]) %}
{% endif %}
From fcf95ba87636fb70a18a41fa8cbefb5fb918bf1d Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Thu, 6 Nov 2025 02:19:28 +0000
Subject: [PATCH 29/40] correct spacing in parm/archive/gfsa.yaml.j2
---
parm/archive/gfsa.yaml.j2 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/parm/archive/gfsa.yaml.j2 b/parm/archive/gfsa.yaml.j2
index 79f098fc2e7..6d6b47809ca 100644
--- a/parm/archive/gfsa.yaml.j2
+++ b/parm/archive/gfsa.yaml.j2
@@ -38,7 +38,7 @@ gfsa:
- "{{ COMIN_CONF | relpath(ROTDIR) }}/{{ head }}anlvar.atm.yaml"
- "{{ COMIN_CONF | relpath(ROTDIR) }}/{{ head }}anlvar.fv3.atm.yaml"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}stat.atm.tar"
- - "{{ COMIN_ATMOS_ANLMON | relpath(ROTDIR) }}/{{ head }}atmos_analysis.ioda_hofx_stats.tar.gz"
+ - "{{ COMIN_ATMOS_ANLMON | relpath(ROTDIR) }}/{{ head }}atmos_analysis.ioda_hofx_stats.tar.gz"
{% else %}
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat.txt"
{% endif %}
From c6133a2abb3e13cbd452e8e6210d6f63b8919d67 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Thu, 6 Nov 2025 02:20:33 +0000
Subject: [PATCH 30/40] extend archive gfs_netcdfa.yaml.j2 to handle JEDI
guassian grid analysis (#4190)
---
parm/archive/gfs_netcdfa.yaml.j2 | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/parm/archive/gfs_netcdfa.yaml.j2 b/parm/archive/gfs_netcdfa.yaml.j2
index 4077c771625..dfc9bf89ac6 100644
--- a/parm/archive/gfs_netcdfa.yaml.j2
+++ b/parm/archive/gfs_netcdfa.yaml.j2
@@ -4,8 +4,13 @@ gfs_netcdfa:
target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_netcdfa.tar"
required:
{% if DO_JEDIATMVAR %}
+ {% if ATMINC_GRID == 'gaussian' %}
+ - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}analysis.atm.a006.nc"
+ - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}analysis.sfc.a006.nc"
+ {% else %}
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}jedi_analysis.atm.a006.nc"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}jedi_analysis.sfc.a006.nc"
+ {% endif %}
{% else %}
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}analysis.atm.a006.nc"
- "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}analysis.sfc.a006.nc"
From 3aec8a068d151f8815e0f3913178b1cf7df67c12 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Thu, 6 Nov 2025 12:29:40 +0000
Subject: [PATCH 31/40] update sorc/gdas.cd hash
---
sorc/gdas.cd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 83cf27b5512..c095c24b9ab 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 83cf27b55128dba61c5ba555477bc44991370cc0
+Subproject commit c095c24b9ab28654df1618c5866c142aabb07071
From 4cf1036bc89aa3f237ab3dc212125b348d5bbf27 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Mon, 10 Nov 2025 11:58:28 +0000
Subject: [PATCH 32/40] update sorc/gdas.cd hash
---
sorc/gdas.cd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index c095c24b9ab..c110b0a853e 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit c095c24b9ab28654df1618c5866c142aabb07071
+Subproject commit c110b0a853edc026f5134fbafbb42715a56279ca
From df8cffe7007265ac0bbf9c8837759d2f0770d826 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Mon, 10 Nov 2025 14:00:51 +0000
Subject: [PATCH 33/40] address items flagged by automated review
---
dev/jobs/prep.sh | 2 +-
scripts/exglobal_atmos_sfcanl.sh | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dev/jobs/prep.sh b/dev/jobs/prep.sh
index 170b089468c..c80fe2261f5 100755
--- a/dev/jobs/prep.sh
+++ b/dev/jobs/prep.sh
@@ -175,7 +175,7 @@ fi
################################################################################
# If requested, create radiance bias correction files for JEDI
if [[ ${CONVERT_BIASCOR:-"NO"} == "YES" ]]; then
- cd ${DATAROOT}
+ cd "${DATAROOT}" || true
${HOMEgfs}/sorc/gdas.cd/ush/gsi_satbias2ioda_all.sh
export err=$?
if [[ ${err} -ne 0 ]]; then
diff --git a/scripts/exglobal_atmos_sfcanl.sh b/scripts/exglobal_atmos_sfcanl.sh
index a5e7e7faa50..d8c1b4ecb68 100755
--- a/scripts/exglobal_atmos_sfcanl.sh
+++ b/scripts/exglobal_atmos_sfcanl.sh
@@ -114,7 +114,7 @@ done
# For now use/assume it is the same at the beginning of the window if doing IAU
if [[ "${DONST}" == "YES" ]]; then
export NST_FILE=${NST_FILE:-${COMIN_ATMOS_ANALYSIS}/${APREFIX}analysis.dtf.a006.nc}
- cpreq "$NST_FILE" "${DATA}/dtfanl"
+ cpreq "${NST_FILE}" "${DATA}/dtfanl"
export NST_FILE="dtfanl"
else
export NST_FILE="NULL"
From 668a93fb9c95a1ea5c12b37e357ab96e710848bb Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Mon, 10 Nov 2025 14:05:07 +0000
Subject: [PATCH 34/40] place double quotes around script command
---
dev/jobs/prep.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dev/jobs/prep.sh b/dev/jobs/prep.sh
index c80fe2261f5..47dead23752 100755
--- a/dev/jobs/prep.sh
+++ b/dev/jobs/prep.sh
@@ -176,7 +176,7 @@ fi
# If requested, create radiance bias correction files for JEDI
if [[ ${CONVERT_BIASCOR:-"NO"} == "YES" ]]; then
cd "${DATAROOT}" || true
- ${HOMEgfs}/sorc/gdas.cd/ush/gsi_satbias2ioda_all.sh
+ "${HOMEgfs}/sorc/gdas.cd/ush/gsi_satbias2ioda_all.sh"
export err=$?
if [[ ${err} -ne 0 ]]; then
err_exit "JOBSPROC_GLOBAL_PREP job failed, ABORT!"
From 46f5aafee4161029097a63186f89bbe26e7d5f8f Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Mon, 10 Nov 2025 14:43:16 +0000
Subject: [PATCH 35/40] update sorc/gdas.cd hash
---
sorc/gdas.cd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index c110b0a853e..4dfff077654 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit c110b0a853edc026f5134fbafbb42715a56279ca
+Subproject commit 4dfff077654866b11a6e01e5700c8f9c21cc82fd
From 214206788c3734a9f05530220e89a03f52825b58 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Mon, 10 Nov 2025 15:01:05 +0000
Subject: [PATCH 36/40] update sorc/gdas.cd to bring in new JEDI hashes
---
sorc/gdas.cd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 4dfff077654..81f5baa84d9 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 4dfff077654866b11a6e01e5700c8f9c21cc82fd
+Subproject commit 81f5baa84d94a2189a09bdbab36ce9739f9145c4
From e923ae676f319182f1cdb1759cea9714401de849 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 11 Nov 2025 16:59:00 +0000
Subject: [PATCH 37/40] add C96C48_ufsgsi_hybatmDA g-w CI case (#4190)
---
.gitignore | 1 +
dev/ci/cases/pr/C96C48_ufsgsi_hybatmDA.yaml | 31 +++++++++++++++++++
.../yamls/ufsgsi_hybatmDA_defaults.ci.yaml | 28 +++++++++++++++++
dev/jobs/prep.sh | 28 ++++++++++++-----
dev/parm/config/gfs/config.esfc | 4 +--
.../gfs/{config.prep => config.prep.j2} | 7 +++++
dev/workflow/rocoto/gfs_tasks.py | 4 +--
parm/stage/analysis.yaml.j2 | 18 +++++++++++
scripts/exglobal_stage_ic.py | 2 +-
sorc/link_workflow.sh | 1 +
10 files changed, 111 insertions(+), 13 deletions(-)
create mode 100644 dev/ci/cases/pr/C96C48_ufsgsi_hybatmDA.yaml
create mode 100644 dev/ci/cases/yamls/ufsgsi_hybatmDA_defaults.ci.yaml
rename dev/parm/config/gfs/{config.prep => config.prep.j2} (88%)
diff --git a/.gitignore b/.gitignore
index f8896562ac9..ac94c46ff30 100644
--- a/.gitignore
+++ b/.gitignore
@@ -169,6 +169,7 @@ ush/fv3gfs_make_orog.sh
ush/global_chgres.sh
ush/global_chgres_driver.sh
ush/global_cycle_driver.sh
+ush/gsi_satbias2ioda_all.sh
ush/jediinc2fv3.py
ush/imsfv3_scf2ioda.py
ush/bufr_snocvr_snomad.py
diff --git a/dev/ci/cases/pr/C96C48_ufsgsi_hybatmDA.yaml b/dev/ci/cases/pr/C96C48_ufsgsi_hybatmDA.yaml
new file mode 100644
index 00000000000..14cc30db214
--- /dev/null
+++ b/dev/ci/cases/pr/C96C48_ufsgsi_hybatmDA.yaml
@@ -0,0 +1,31 @@
+experiment:
+ net: gfs
+ mode: cycled
+ pslot: {{ 'pslot' | getenv }}
+ app: ATM
+ resdetatmos: 96
+ resensatmos: 48
+ comroot: {{ 'RUNTESTS' | getenv }}/COMROOT
+ expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR
+ icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96C48/20250808
+ idate: 2024022318
+ edate: 2024022406
+ nens: 2
+ interval: 24
+ start: warm
+ yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/ufsgsi_hybatmDA_defaults.ci.yaml
+
+skip_ci_on_hosts:
+ - gaeac5
+ - gaeac6
+ - orion
+ - hercules
+ - awsepicglobalworkflow
+
+workflow:
+ engine: rocoto
+ rocoto:
+ maxtries: 2
+ cyclethrottle: 3
+ taskthrottle: 25
+ verbosity: 2
diff --git a/dev/ci/cases/yamls/ufsgsi_hybatmDA_defaults.ci.yaml b/dev/ci/cases/yamls/ufsgsi_hybatmDA_defaults.ci.yaml
new file mode 100644
index 00000000000..83b368c0334
--- /dev/null
+++ b/dev/ci/cases/yamls/ufsgsi_hybatmDA_defaults.ci.yaml
@@ -0,0 +1,28 @@
+defaults:
+ !INC {{ HOMEgfs }}/dev/parm/config/gfs/yaml/defaults.yaml
+base:
+ DOIAU: "NO"
+ DO_JEDIATMVAR: "YES"
+ DO_JEDIATMENS: "NO"
+ DO_TEST_MODE: "NO"
+ CASE_ANL: "C48"
+ CASE_HIST: "C96"
+ DONST: "NO"
+atmanl:
+ LAYOUT_X_ATMANL: 4
+ LAYOUT_Y_ATMANL: 4
+ OBS_LIST_YAML: "${HOMEgfs}/sorc/gdas.cd/test/gw-ci/atm/atm_obs_list_ufs_hybatmDA.yaml.j2"
+ VAR_JEDI_TEST_YAML: "${HOMEgfs}/sorc/gdas.cd/test/gw-ci/atm/jedi-test_3dvar_ufs_hybatmDA.yaml.j2"
+ FV3INC_JEDI_TEST_YAML: "${HOMEgfs}/sorc/gdas.cd/test/gw-ci/atm/jedi-test_3dvar-fv3inc_ufs_hybatmDA.yaml.j2"
+esfc:
+ DONST: "NO"
+nsst:
+ NST_MODEL: "1"
+prep:
+ COPY_BIASCOR_SOURCE: "NO"
+ COPY_BIASCOR_STATIC: "YES"
+ CONVERT_BIASCOR: "YES"
+prepatmiodaobs:
+ DO_CONVERT_IODA: "YES"
+sfcanl:
+ DONST: "NO"
diff --git a/dev/jobs/prep.sh b/dev/jobs/prep.sh
index 47dead23752..c3bcf1571db 100755
--- a/dev/jobs/prep.sh
+++ b/dev/jobs/prep.sh
@@ -32,7 +32,8 @@ RUN=${RUN_local} YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \
COMIN_OBS:COM_OBS_TMPL \
COMOUT_OBS:COM_OBS_TMPL \
COMINobsproc:COM_OBSPROC_TMPL \
- COMIN_TCVITAL:COM_TCVITAL_TMPL
+ COMIN_TCVITAL:COM_TCVITAL_TMPL \
+ COMOUT_ATMOS_ANALYSIS:COM_ATMOS_ANALYSIS_TMPL
RUN=${GDUMP} YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx \
COMOUT_OBS_PREV:COM_OBS_TMPL \
@@ -98,11 +99,22 @@ fi
###############################################################
-# If requested, copy bias correction files from source to comroot
-if [[ ${COPY_BIASCOR:-"NO"} == "YES" ]]; then
+# If requested, copy bias correction files from source or stait to analysis directories
+# TODO: remove this when JEDI ATM can cycle bias correction coefficents
+if [[ ${RUN} == "gdas" && ${COPY_BIASCOR_SOURCE:-"NO"} == "YES" ]]; then
for file in abias abias_pc abias_air; do
- cpreq "${SOURCE_BIASCOR}/${file}.${GDUMP}.${gPDY}${gcyc}" "${COMOUT_ATMOS_ANALYSIS_PREV}/${GDUMP}.t${gcyc}z.${file}"
- cpreq "${SOURCE_BIASCOR}/${file}.${GDUMP}.${gPDY}${gcyc}" "${COMOUT_ATMOS_ANALYSIS_PREV}/${GDUMP}.t${gcyc}z.${file}.txt"
+ if [[ -s "${SOURCE_BIASCOR}/${file}.${GDUMP}.${gPDY}${gcyc}" ]]; then
+ cpreq "${SOURCE_BIASCOR}/${file}.${GDUMP}.${gPDY}${gcyc}" "${COMOUT_ATMOS_ANALYSIS_PREV}/${GDUMP}.t${gcyc}z.${file}"
+ cpreq "${SOURCE_BIASCOR}/${file}.${GDUMP}.${gPDY}${gcyc}" "${COMOUT_ATMOS_ANALYSIS_PREV}/${GDUMP}.t${gcyc}z.${file}.txt"
+ fi
+ done
+fi
+if [[ ${RUN} == "gdas" && ${COPY_BIASCOR_STATIC:-"NO"} == "YES" ]]; then
+ for file in abias abias_pc abias_air; do
+ if [[ -s "${COMOUT_ATMOS_ANALYSIS_PREV}/${GDUMP}.t${gcyc}z.${file}.txt" ]]; then
+ mkdir -p "${COMOUT_ATMOS_ANALYSIS}"
+ cpreq "${COMOUT_ATMOS_ANALYSIS_PREV}/${GDUMP}.t${gcyc}z.${file}.txt" "${COMOUT_ATMOS_ANALYSIS}/${GDUMP}.t${cyc}z.${file}.txt"
+ fi
done
fi
@@ -174,12 +186,12 @@ fi
################################################################################
# If requested, create radiance bias correction files for JEDI
-if [[ ${CONVERT_BIASCOR:-"NO"} == "YES" ]]; then
+if [[ ${RUN} == "gdas" && ${CONVERT_BIASCOR:-"NO"} == "YES" ]]; then
cd "${DATAROOT}" || true
- "${HOMEgfs}/sorc/gdas.cd/ush/gsi_satbias2ioda_all.sh"
+ "${HOMEgfs}/ush/gsi_satbias2ioda_all.sh"
export err=$?
if [[ ${err} -ne 0 ]]; then
- err_exit "JOBSPROC_GLOBAL_PREP job failed, ABORT!"
+ err_exit "gsi_satbias2ioda failed, ABORT!"
fi
# Remove temporary working directory
diff --git a/dev/parm/config/gfs/config.esfc b/dev/parm/config/gfs/config.esfc
index 156649ace36..0c35240dc31 100644
--- a/dev/parm/config/gfs/config.esfc
+++ b/dev/parm/config/gfs/config.esfc
@@ -21,8 +21,8 @@ if [[ ${DOIAU_ENKF} = "YES" ]]; then
export DOSFCANL_ENKF="NO"
fi
-# Turn off NST in JEDIATMENS
-if [[ "${DO_JEDIATMENS}" == "YES" ]]; then
+# Turn off NST in JEDIATMENS or JEDIATMVAR
+if [[ "${DO_JEDIATMENS}" == "YES" || "${DO_JEDIATMVAR}" == "YES" ]]; then
export DONST="NO"
fi
diff --git a/dev/parm/config/gfs/config.prep b/dev/parm/config/gfs/config.prep.j2
similarity index 88%
rename from dev/parm/config/gfs/config.prep
rename to dev/parm/config/gfs/config.prep.j2
index c10e5012e76..ef14531d230 100644
--- a/dev/parm/config/gfs/config.prep
+++ b/dev/parm/config/gfs/config.prep.j2
@@ -65,4 +65,11 @@ else
export DTYPS_nsst='sfcshp dbuoyb mbuoyb tesac bathy trkob'
fi
+# Set flags to optionally use external bias correction files
+# TODO: remove when JEDI can cycle bias correcdtion files
+export SOURCE_BIASCOR="{{ SOURCE_BIASCOR }}"
+export COPY_BIASCOR_SOURCE="{{ COPY_BIASCOR_SOURCE }}"
+export COPY_BIASCOR_STAIC="{{ COPY_BIASCOR_STATIC }}"
+export CONVERT_BIASCOR="{{ CONVERT_BIASCOR }}"
+
echo "END: config.prep"
diff --git a/dev/workflow/rocoto/gfs_tasks.py b/dev/workflow/rocoto/gfs_tasks.py
index 237a7dee8a8..ec8fc860ebf 100644
--- a/dev/workflow/rocoto/gfs_tasks.py
+++ b/dev/workflow/rocoto/gfs_tasks.py
@@ -1095,13 +1095,13 @@ def atmanlupp(self):
atm_anl_path = self._template_to_rocoto_cycstring(self._base["COM_ATMOS_ANALYSIS_TMPL"])
deps = []
- if self.options['do_jediatmvar']:
+ if self.options['do_jediatmvar'] and self.options['do_jediatmens']:
data = f'{atm_anl_path}/{self.run}.t@Hz.jedi_analysis.atm.a006.nc'
else:
data = f'{atm_anl_path}/{self.run}.t@Hz.analysis.atm.a006.nc'
dep_dict = {'type': 'data', 'data': data, 'age': 120}
deps.append(rocoto.add_dependency(dep_dict))
- if self.options['do_jediatmvar']:
+ if self.options['do_jediatmvar'] and self.options['do_jediatmens']:
data = f'{atm_anl_path}/{self.run}.t@Hz.jedi_analysis.sfc.a006.nc'
else:
data = f'{atm_anl_path}/{self.run}.t@Hz.analysis.sfc.a006.nc'
diff --git a/parm/stage/analysis.yaml.j2 b/parm/stage/analysis.yaml.j2
index 4853cc55d25..c0752144cc4 100644
--- a/parm/stage/analysis.yaml.j2
+++ b/parm/stage/analysis.yaml.j2
@@ -13,6 +13,7 @@ analysis:
{% if DO_JEDIATMVAR %}
+ {% if ATMINC_GRID == "cubed_sphere_grid" %}
{% for itile in range(6) %}
{% for source_ftype, dest_ftype in
[
@@ -28,6 +29,23 @@ analysis:
{% endif %}
{% endfor %}
{% endfor %}
+ {% else %}
+ # TODO: make these filenames the same after RE-staging inputs with EE2-compliant filenames
+ {% for source_ftype, dest_ftype in
+ [
+ ("atminc.nc", "increment.atm.i006.nc"),
+ ("atmi009.nc", "increment.atm.i009.nc"),
+ ("atmi003.nc", "increment.atm.i003.nc"),
+ ("ratmi009.nc", "recentered_increment.atm.i009.nc"),
+ ("ratminc.nc", "recentered_increment.atm.i006.nc"),
+ ("ratmi003.nc", "recentered_increment.atm.i003.nc"),
+ ] %}
+ {% if path_exists(ICSDIR ~ "/" ~ COMOUT_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) ~ "/" ~ RUN ~ ".t" ~ current_cycle_HH ~ "z." ~ source_ftype) %}
+ - ["{{ ICSDIR }}/{{ COMOUT_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ RUN }}.t{{ current_cycle_HH }}z.{{ source_ftype }}",
+ "{{ COMOUT_ATMOS_ANALYSIS_MEM }}/{{ RUN }}.t{{ current_cycle_HH }}z.{{ dest_ftype }}"]
+ {% endif %}
+ {% endfor %}
+ {% endif %}
# TODO: make these filenames the same after RE-staging inputs with EE2-compliant filenames
{% for source_ftype, dest_ftype in [
diff --git a/scripts/exglobal_stage_ic.py b/scripts/exglobal_stage_ic.py
index e0af18b42fa..e770c0a06f4 100755
--- a/scripts/exglobal_stage_ic.py
+++ b/scripts/exglobal_stage_ic.py
@@ -20,7 +20,7 @@ def main():
# Pull out all the configuration keys needed to run stage job
keys = ['RUN', 'MODE', 'EXP_WARM_START', 'NMEM_ENS',
'assim_freq', 'current_cycle', 'previous_cycle',
- 'ROTDIR', 'ICSDIR', 'STAGE_IC_YAML_TMPL', 'DO_JEDIATMVAR',
+ 'ROTDIR', 'ICSDIR', 'STAGE_IC_YAML_TMPL', 'DO_JEDIATMVAR', 'ATMINC_GRID',
'OCNRES', 'waveGRD', 'ntiles', 'DOIAU',
'DO_JEDIOCNVAR', 'DO_STARTMEM_FROM_JEDIICE',
'DO_WAVE', 'DO_OCN', 'DO_ICE', 'DO_NEST', 'DO_CA', 'DO_AERO_ANL',
diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh
index 020ecbe6ca5..534c62f9245 100755
--- a/sorc/link_workflow.sh
+++ b/sorc/link_workflow.sh
@@ -263,6 +263,7 @@ if [[ -d "${HOMEgfs}/sorc/gdas.cd/build" ]]; then
${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/ioda/bufr2ioda/run_bufr2ioda.py" .
${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/sorc/da-utils/ush/gsincdiag_to_ioda" .
cd "${HOMEgfs}/ush" || exit 1
+ ${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/gsi_satbias2ioda_all.sh" .
${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/snow/bufr_snocvr_snomad.py" .
${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/build/bin/imsfv3_scf2ioda.py" .
declare -a gdasapp_ocn_insitu_profile_platforms=("argo" "bathy" "glider" "marinemammal" "tesac" "xbtctd")
From c5046aa88c314d816cefa416a01a2ffadaab65ff Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 11 Nov 2025 17:18:25 +0000
Subject: [PATCH 38/40] skip C96C48_ufsgsi_hybatmDA on hera and ursa
---
dev/ci/cases/pr/C96C48_ufsgsi_hybatmDA.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/dev/ci/cases/pr/C96C48_ufsgsi_hybatmDA.yaml b/dev/ci/cases/pr/C96C48_ufsgsi_hybatmDA.yaml
index 14cc30db214..d624f4c726d 100644
--- a/dev/ci/cases/pr/C96C48_ufsgsi_hybatmDA.yaml
+++ b/dev/ci/cases/pr/C96C48_ufsgsi_hybatmDA.yaml
@@ -16,6 +16,8 @@ experiment:
yaml: {{ HOMEgfs }}/dev/ci/cases/yamls/ufsgsi_hybatmDA_defaults.ci.yaml
skip_ci_on_hosts:
+ - hera
+ - ursa
- gaeac5
- gaeac6
- orion
From 4382c05718864d6c6ea29ae3d2b55af9fe39a1f0 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 11 Nov 2025 19:00:08 +0000
Subject: [PATCH 39/40] clean up yaml and config files
---
dev/ci/cases/yamls/ufsgsi_hybatmDA_defaults.ci.yaml | 3 +++
dev/parm/config/gfs/config.atmanl.j2 | 4 ++++
dev/parm/config/gfs/config.atmanlvar | 3 ---
dev/parm/config/gfs/config.prep.j2 | 2 +-
4 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/dev/ci/cases/yamls/ufsgsi_hybatmDA_defaults.ci.yaml b/dev/ci/cases/yamls/ufsgsi_hybatmDA_defaults.ci.yaml
index 83b368c0334..593e3c564b3 100644
--- a/dev/ci/cases/yamls/ufsgsi_hybatmDA_defaults.ci.yaml
+++ b/dev/ci/cases/yamls/ufsgsi_hybatmDA_defaults.ci.yaml
@@ -14,6 +14,9 @@ atmanl:
OBS_LIST_YAML: "${HOMEgfs}/sorc/gdas.cd/test/gw-ci/atm/atm_obs_list_ufs_hybatmDA.yaml.j2"
VAR_JEDI_TEST_YAML: "${HOMEgfs}/sorc/gdas.cd/test/gw-ci/atm/jedi-test_3dvar_ufs_hybatmDA.yaml.j2"
FV3INC_JEDI_TEST_YAML: "${HOMEgfs}/sorc/gdas.cd/test/gw-ci/atm/jedi-test_3dvar-fv3inc_ufs_hybatmDA.yaml.j2"
+ NUMBER_OUTER_LOOPS: 2
+ NINNER_LOOP1: 2
+ NINNER_LOOP2: 4
esfc:
DONST: "NO"
nsst:
diff --git a/dev/parm/config/gfs/config.atmanl.j2 b/dev/parm/config/gfs/config.atmanl.j2
index da46fc077ce..6e56fd2745b 100644
--- a/dev/parm/config/gfs/config.atmanl.j2
+++ b/dev/parm/config/gfs/config.atmanl.j2
@@ -26,4 +26,8 @@ if [[ "${DOHYBVAR}" = "YES" && "${ATMINC_GRID}" = "gaussian" ]]; then
export CASE_HIST=${CASE_ANL}
fi
+export NUMBER_OUTER_LOOPS="{{ NUMBER_OUTER_LOOPS }}"
+export NINNER_LOOP1="{{ NINNER_LOOP1 }}"
+export NINNER_LOOP2="{{ NINNER_LOOP2 }}"
+
echo "END: config.atmanl"
diff --git a/dev/parm/config/gfs/config.atmanlvar b/dev/parm/config/gfs/config.atmanlvar
index eb21daff6bd..cbc0334a08c 100644
--- a/dev/parm/config/gfs/config.atmanlvar
+++ b/dev/parm/config/gfs/config.atmanlvar
@@ -8,7 +8,4 @@ echo "BEGIN: config.atmanlvar"
# Get task specific resources
. "${EXPDIR}/config.resources" atmanlvar
-export NUMBER_OUTER_LOOPS="1"
-export NUMBER_INNER_LOOP_ITER_1="50"
-
echo "END: config.atmanlvar"
diff --git a/dev/parm/config/gfs/config.prep.j2 b/dev/parm/config/gfs/config.prep.j2
index ef14531d230..a8b8f0c619a 100644
--- a/dev/parm/config/gfs/config.prep.j2
+++ b/dev/parm/config/gfs/config.prep.j2
@@ -69,7 +69,7 @@ fi
# TODO: remove when JEDI can cycle bias correcdtion files
export SOURCE_BIASCOR="{{ SOURCE_BIASCOR }}"
export COPY_BIASCOR_SOURCE="{{ COPY_BIASCOR_SOURCE }}"
-export COPY_BIASCOR_STAIC="{{ COPY_BIASCOR_STATIC }}"
+export COPY_BIASCOR_STATIC="{{ COPY_BIASCOR_STATIC }}"
export CONVERT_BIASCOR="{{ CONVERT_BIASCOR }}"
echo "END: config.prep"
From 966a1942a56ec279ce78c21d885ad897773d7fc0 Mon Sep 17 00:00:00 2001
From: Russ-Treadon-NOAA
Date: Tue, 11 Nov 2025 19:07:42 +0000
Subject: [PATCH 40/40] update sorc/gdas.cd hash
---
sorc/gdas.cd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sorc/gdas.cd b/sorc/gdas.cd
index 81f5baa84d9..9f8d77cbadc 160000
--- a/sorc/gdas.cd
+++ b/sorc/gdas.cd
@@ -1 +1 @@
-Subproject commit 81f5baa84d94a2189a09bdbab36ce9739f9145c4
+Subproject commit 9f8d77cbadcddefa43a2eb71dd5e3a63b8c32a37