Skip to content

Commit

Permalink
Add ability to process ocean/ice products specific to GEFS (#2561)
Browse files Browse the repository at this point in the history
This PR begins to add the capability to produce GEFSv13 ocean and ice
products in the global-workflow according to stakeholder requirements.
The following features are added.

- An oceanice prod yaml file has been added to address the ocean and ice
products specific to GEFSv13.
- The rocoto dependencies and config.base for GEFS have also been
modified to allow for 24-hour averaged ocean and ice output.
- Various scripts have been modified to allow for ocean and ice output
frequencies of 24 hours.
- `FHOUT_OCNICE` has been split into two variables called `FHOUT_OCN`
and `FHOUT_ICE`. The same has been done for `FHOUT_OCNICE_GFS`.

Refs #1878
  • Loading branch information
EricSinsky-NOAA authored Jun 12, 2024
1 parent 6691e74 commit 15eaf35
Show file tree
Hide file tree
Showing 19 changed files with 216 additions and 32 deletions.
2 changes: 1 addition & 1 deletion parm/archive/gdasice.yaml.j2
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ gdasice:
target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasice.tar"
required:
- "{{ COM_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}ic.nc"
{% for fhr in range(FHOUT_OCNICE, FHMAX+1, FHOUT_OCNICE) %}
{% for fhr in range(FHOUT_ICE, FHMAX+1, FHOUT_ICE) %}
- "{{ COM_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}inst.f{{ '%03d' % fhr }}.nc"
{% endfor %}
- '{{ COM_CONF | relpath(ROTDIR) }}/ufs.ice_in'
2 changes: 1 addition & 1 deletion parm/archive/gdasocean.yaml.j2
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ gdasocean:
name: "GDASOCEAN"
target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasocean.tar"
required:
{% for fhr in range(FHMIN, FHMAX + 1, FHOUT_OCNICE) %}
{% for fhr in range(FHMIN, FHMAX + 1, FHOUT_OCN) %}
- "{{ COM_OCEAN_HISTORY | relpath(ROTDIR) }}/{{ head }}inst.f{{ '%03d' % fhr }}.nc"
{% endfor %}
- '{{ COM_CONF | relpath(ROTDIR) }}/ufs.MOM_input'
2 changes: 1 addition & 1 deletion parm/archive/ice_grib2.yaml.j2
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ ice_grib2:
target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ice_grib2.tar"
required:
# Ice forecast GRIB2 products
{% for fhr in range(FHOUT_OCNICE_GFS, FHMAX_GFS + FHOUT_OCNICE_GFS, FHOUT_OCNICE_GFS) %}
{% for fhr in range(FHOUT_ICE_GFS, FHMAX_GFS + FHOUT_ICE_GFS, FHOUT_ICE_GFS) %}
{% set fhr3 = '%03d' % fhr %}
{% if ICERES == 500 %}
- "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2"
Expand Down
2 changes: 1 addition & 1 deletion parm/archive/ocean_grib2.yaml.j2
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ ocean_grib2:
name: "OCEAN_GRIB2"
target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ocean_grib2.tar"
required:
{% for fhr in range(FHOUT_OCNICE_GFS, FHMAX_GFS + FHOUT_OCNICE_GFS, FHOUT_OCNICE_GFS) %}
{% for fhr in range(FHOUT_OCN_GFS, FHMAX_GFS + FHOUT_OCN_GFS, FHOUT_OCN_GFS) %}
{% set fhr3 = '%03d' % fhr %}
{% if OCNRES == 500 %}
- "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2"
Expand Down
10 changes: 9 additions & 1 deletion parm/config/gefs/config.base
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,13 @@ case "${APP}" in
;;
esac

# Output frequency of the forecast model (for cycling)
export FHMIN=0
export FHMAX=9
export FHOUT=3 # Will be changed to 1 in config.base if (DOHYBVAR set to NO and l4densvar set to false)
export FHOUT_OCN=3
export FHOUT_ICE=3

# GFS cycle info
export gfs_cyc=@gfs_cyc@ # 0: no GFS cycle, 1: 00Z only, 2: 00Z and 12Z only, 4: all 4 cycles.

Expand All @@ -230,7 +237,8 @@ export FHMAX_GFS=@FHMAX_GFS@
export FHOUT_GFS=6
export FHMAX_HF_GFS=0
export FHOUT_HF_GFS=1
export FHOUT_OCNICE_GFS=6
export FHOUT_OCN_GFS=6
export FHOUT_ICE_GFS=6
export FHMIN_WAV=0
export FHOUT_WAV=3
export FHMAX_HF_WAV=120
Expand Down
3 changes: 2 additions & 1 deletion parm/config/gefs/config.fcst
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ export FHMAX=${FHMAX_GFS}
export FHOUT=${FHOUT_GFS}
export FHMAX_HF=${FHMAX_HF_GFS}
export FHOUT_HF=${FHOUT_HF_GFS}
export FHOUT_OCNICE=${FHOUT_OCNICE_GFS}
export FHOUT_OCN=${FHOUT_OCN_GFS}
export FHOUT_ICE=${FHOUT_ICE_GFS}

# Get task specific resources
source "${EXPDIR}/config.resources" fcst
Expand Down
1 change: 0 additions & 1 deletion parm/config/gefs/config.oceanice_products

This file was deleted.

15 changes: 15 additions & 0 deletions parm/config/gefs/config.oceanice_products
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#! /usr/bin/env bash

########## config.oceanice_products ##########

echo "BEGIN: config.oceanice_products"

# Get task specific resources
source "${EXPDIR}/config.resources" oceanice_products

export OCEANICEPRODUCTS_CONFIG="${PARMgfs}/post/oceanice_products_gefs.yaml"

# No. of forecast hours to process in a single job
export NFHRS_PER_GROUP=3

echo "END: config.oceanice_products"
6 changes: 4 additions & 2 deletions parm/config/gfs/config.base
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,8 @@ fi
export FHMIN=0
export FHMAX=9
export FHOUT=3 # Will be changed to 1 in config.base if (DOHYBVAR set to NO and l4densvar set to false)
export FHOUT_OCNICE=3
export FHOUT_OCN=3
export FHOUT_ICE=3

# Cycle to run EnKF (set to BOTH for both gfs and gdas)
export EUPD_CYC="@EUPD_CYC@"
Expand All @@ -290,7 +291,8 @@ export FHMAX_GFS=@FHMAX_GFS@
export FHOUT_GFS=3 # Must be 6 for S2S until #1629 is addressed; 3 for ops
export FHMAX_HF_GFS=0
export FHOUT_HF_GFS=1
export FHOUT_OCNICE_GFS=6
export FHOUT_OCN_GFS=6
export FHOUT_ICE_GFS=6
export FHMIN_WAV=0
export FHOUT_WAV=3
export FHMAX_HF_WAV=120
Expand Down
3 changes: 2 additions & 1 deletion parm/config/gfs/config.fcst
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ case ${RUN} in
export FHOUT=${FHOUT_GFS}
export FHMAX_HF=${FHMAX_HF_GFS}
export FHOUT_HF=${FHOUT_HF_GFS}
export FHOUT_OCNICE=${FHOUT_OCNICE_GFS}
export FHOUT_OCN=${FHOUT_OCN_GFS}
export FHOUT_ICE=${FHOUT_ICE_GFS}
;;
*gdas)
export FHMAX_HF=0
Expand Down
73 changes: 73 additions & 0 deletions parm/post/oceanice_products_gefs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
ocnicepost:
executable: "ocnicepost.x"
namelist:
debug: False
fix_data:
mkdir:
- "{{ DATA }}"
copy:
- ["{{ EXECgfs }}/ocnicepost.x", "{{ DATA }}/"]
- ["{{ PARMgfs }}/post/ocnicepost.nml.jinja2", "{{ DATA }}/"]
- ["{{ PARMgfs }}/post/{{ component }}.csv", "{{ DATA }}/"]
- ["{{ FIXgfs }}/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Bu.to.Ct.bilinear.nc", "{{ DATA }}/"]
- ["{{ FIXgfs }}/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Cu.to.Ct.bilinear.nc", "{{ DATA }}/"]
- ["{{ FIXgfs }}/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Cv.to.Ct.bilinear.nc", "{{ DATA }}/"]
{% for grid in product_grids %}
- ["{{ FIXgfs }}/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Ct.to.rect.{{ grid }}.bilinear.nc", "{{ DATA }}/"]
- ["{{ FIXgfs }}/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Ct.to.rect.{{ grid }}.conserve.nc", "{{ DATA }}/"]
- ["{{ FIXgfs }}/mom6/post/template.global.{{ grid }}.gb2", "{{ DATA }}/"]
{% endfor %}

nc2grib2:
script: "{{ USHgfs }}/oceanice_nc2grib2.sh"

ocean:
namelist:
ftype: "ocean"
maskvar: "temp"
sinvar: "sin_rot"
cosvar: "cos_rot"
angvar: ""
{% if model_grid == 'mx025' or model_grid == 'mx050' or model_grid == 'mx100' %}
ocean_levels: [5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 105, 115, 125, 135, 145, 155, 165, 175, 185, 195, 205, 215, 226, 241, 267, 309, 374, 467, 594, 757, 960, 1204, 1490, 1817, 2184, 2587, 3024, 3489, 3977, 4481]
{% elif model_grid == 'mx500' %}
ocean_levels: [5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 105, 115, 125, 135, 145, 155, 165, 175, 185, 195, 205, 215, 226, 241, 267]
{% endif %}
subset: ['SSH', 'SST', 'SSS', 'speed', 'MLD_003', 'latent', 'sensible', 'SW', 'LW', 'LwLatSens', 'Heat_PmE', 'SSU', 'SSV', 'taux', 'tauy', 'temp', 'so', 'uo', 'vo']
data_in:
copy:
- ["{{ COM_OCEAN_HISTORY }}/{{ RUN }}.ocean.t{{ current_cycle | strftime('%H') }}z.{{ interval }}hr_avg.f{{ '%03d' % forecast_hour }}.nc", "{{ DATA }}/ocean.nc"]
data_out:
mkdir:
- "{{ COM_OCEAN_NETCDF }}"
{% for grid in product_grids %}
- "{{ COM_OCEAN_GRIB }}/{{ grid }}"
{% endfor %}
copy:
- ["{{ DATA }}/ocean_subset.nc", "{{ COM_OCEAN_NETCDF }}/{{ RUN }}.ocean.t{{ current_cycle | strftime('%H') }}z.native.f{{ '%03d' % forecast_hour }}.nc"]
{% for grid in product_grids %}
- ["{{ DATA }}/ocean.{{ grid }}.nc", "{{ COM_OCEAN_NETCDF }}/{{ RUN }}.ocean.t{{ current_cycle | strftime('%H') }}z.{{ grid }}.f{{ '%03d' % forecast_hour }}.nc"]
{% endfor %}

ice:
namelist:
ftype: "ice"
maskvar: "tmask"
sinvar: ""
cosvar: ""
angvar: "ANGLET"
subset: ['hi_h', 'hs_h', 'aice_h', 'Tsfc_h', 'uvel_h', 'vvel_h', 'frzmlt_h', 'albsni_h', 'mlt_onset_h', 'frz_onset_h']
data_in:
copy:
- ["{{ COM_ICE_HISTORY }}/{{ RUN }}.ice.t{{ current_cycle | strftime('%H') }}z.{{ interval }}hr_avg.f{{ '%03d' % forecast_hour }}.nc", "{{ DATA }}/ice.nc"]
data_out:
mkdir:
- "{{ COM_ICE_NETCDF }}"
{% for grid in product_grids %}
- "{{ COM_ICE_GRIB }}/{{ grid }}"
{% endfor %}
copy:
- ["{{ DATA }}/ice_subset.nc", "{{ COM_ICE_NETCDF }}/{{ RUN }}.ice.t{{ current_cycle | strftime('%H') }}z.native.f{{ '%03d' % forecast_hour }}.nc"]
{% for grid in product_grids %}
- ["{{ DATA }}/ice.{{ grid }}.nc", "{{ COM_ICE_NETCDF }}/{{ RUN }}.ice.t{{ current_cycle | strftime('%H') }}z.{{ grid }}.f{{ '%03d' % forecast_hour }}.nc"]
{% endfor %}
2 changes: 1 addition & 1 deletion parm/ufs/fv3/diag_table
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"fv3_history", 0, "hours", 1, "hours", "time"
"fv3_history2d", 0, "hours", 1, "hours", "time"
"@[MOM6_OUTPUT_DIR]/ocn%4yr%2mo%2dy%2hr", @[FHOUT_OCNICE], "hours", 1, "hours", "time", @[FHOUT_OCNICE], "hours", "@[SYEAR] @[SMONTH] @[SDAY] @[CHOUR] 0 0"
"@[MOM6_OUTPUT_DIR]/ocn%4yr%2mo%2dy%2hr", @[FHOUT_OCN], "hours", 1, "hours", "time", @[FHOUT_OCN], "hours", "@[SYEAR] @[SMONTH] @[SDAY] @[CHOUR] 0 0"
"@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", 1, "days", 1, "days", "time", 1, "days", "@[SYEAR] @[SMONTH] @[SDAY] @[CHOUR] 0 0"

##############
Expand Down
2 changes: 1 addition & 1 deletion scripts/exglobal_archive.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def main():
'DO_JEDISNOWDA', 'LOCALARCH', 'REALTIME', 'ROTDIR', 'ARCH_WARMICFREQ',
'ARCH_FCSTICFREQ', 'ARCH_CYC', 'assim_freq', 'ARCDIR', 'SDATE',
'FHMIN_GFS', 'FHMAX_GFS', 'FHOUT_GFS', 'ARCH_GAUSSIAN', 'MODE',
'FHOUT_OCNICE', 'FHOUT_OCNICE_GFS', 'DO_BUFRSND', 'DOHYBVAR',
'FHOUT_OCN', 'FHOUT_ICE', 'FHOUT_OCN_GFS', 'FHOUT_ICE_GFS', 'DO_BUFRSND', 'DOHYBVAR',
'ARCH_GAUSSIAN_FHMAX', 'ARCH_GAUSSIAN_FHINC', 'ARCH_GAUSSIAN_FHINC',
'DOIAU', 'OCNRES', 'ICERES', 'NUM_SND_COLLECTIVES', 'FHOUT_WAV',
'FHOUT_HF_WAV', 'FHMAX_WAV', 'FHMAX_HF_WAV', 'FHMAX_WAV_GFS',
Expand Down
43 changes: 43 additions & 0 deletions ush/check_ice_netcdf.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#! /usr/bin/env bash

yyyy=${1?}
mm=${2?}
dd=${3?}
cyc=${4?}
fhr=${5?}
ROTDIR=${6?}
member=${7?}
FHOUT_ICE_GFS=${8?}

fhri=$((10#${fhr}))

#Will need to consider fhmin in the future to calculate the offset if we are to stick with this approach.
((offset = ( cyc ) % FHOUT_ICE_GFS))

if (( offset != 0 )); then
(( fhri = fhri - cyc ))
fhr3=$(printf %03i "${fhri}")
if (( fhri <= FHOUT_ICE_GFS )); then
(( interval = FHOUT_ICE_GFS - cyc ))
ncfile=${ROTDIR}/gefs.${yyyy}${mm}${dd}/${cyc}/mem${member}/model_data/ice/history/gefs.ice.t${cyc}z.${interval}hr_avg.f${fhr3}.nc
else
ncfile=${ROTDIR}/gefs.${yyyy}${mm}${dd}/${cyc}/mem${member}/model_data/ice/history/gefs.ice.t${cyc}z.${FHOUT_ICE_GFS}hr_avg.f${fhr3}.nc
fi
else
ncfile=${ROTDIR}/gefs.${yyyy}${mm}${dd}/${cyc}/mem${member}/model_data/ice/history/gefs.ice.t${cyc}z.${FHOUT_ICE_GFS}hr_avg.f${fhr}.nc
fi

#Check if netcdf file exists.
if [[ ! -f "${ncfile}" ]];then
rc=1
else
#Check if netcdf file is older than 2 minutes.
ncage="$(find "${ncfile}" -mmin -2)"
if [[ -n "${ncage}" ]]; then
rc=1
else
rc=0
fi
fi

exit "${rc}"
6 changes: 3 additions & 3 deletions ush/forecast_postdet.sh
Original file line number Diff line number Diff line change
Expand Up @@ -545,22 +545,22 @@ CICE_postdet() {

# Link CICE forecast output files from DATA/CICE_OUTPUT to COM
local source_file dest_file
for fhr in ${CICE_OUTPUT_FH}; do
fhr3=$(printf %03i "${fhr}")
for fhr in "${CICE_OUTPUT_FH[@]}"; do

if [[ -z ${last_fhr:-} ]]; then
last_fhr=${fhr}
continue
fi

fhr3=$(printf %03i "${fhr}")
(( interval = fhr - last_fhr ))

vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d%H)
seconds=$(to_seconds "${vdate:8:2}0000") # convert HHMMSS to seconds
vdatestr="${vdate:0:4}-${vdate:4:2}-${vdate:6:2}-${seconds}"

if [[ "${RUN}" =~ "gfs" || "${RUN}" =~ "gefs" ]]; then
source_file="iceh_$(printf "%0.2d" "${interval}")h.${vdatestr}.nc"
source_file="iceh_$(printf "%0.2d" "${FHOUT_ICE}")h.${vdatestr}.nc"
dest_file="${RUN}.ice.t${cyc}z.${interval}hr_avg.f${fhr3}.nc"
elif [[ "${RUN}" =~ "gdas" ]]; then
source_file="iceh_inst.${vdatestr}.nc"
Expand Down
12 changes: 10 additions & 2 deletions ush/forecast_predet.sh
Original file line number Diff line number Diff line change
Expand Up @@ -568,7 +568,15 @@ CICE_predet(){

# CICE does not have a concept of high frequency output like FV3
# Convert output settings into an explicit list for CICE
CICE_OUTPUT_FH=$(seq -s ' ' "${FHMIN}" "${FHOUT_OCNICE}" "${FHMAX}")
if (( $(( ( cyc + FHMIN ) % FHOUT_ICE )) == 0 )); then
# shellcheck disable=SC2312
mapfile -t CICE_OUTPUT_FH < <(seq "${FHMIN}" "${FHOUT_ICE}" "${FHMAX}") || exit 10
else
CICE_OUTPUT_FH=("${FHMIN}")
# shellcheck disable=SC2312
mapfile -t -O "${#CICE_OUTPUT_FH[@]}" CICE_OUTPUT_FH < <(seq "$(( FHMIN + $(( ( cyc + FHMIN ) % FHOUT_ICE )) ))" "${FHOUT_ICE}" "${FHMAX}") || exit 10
CICE_OUTPUT_FH+=("${FHMAX}")
fi

# Fix files
${NCP} "${FIXgfs}/cice/${ICERES}/${CICE_GRID}" "${DATA}/"
Expand All @@ -591,7 +599,7 @@ MOM6_predet(){

# MOM6 does not have a concept of high frequency output like FV3
# Convert output settings into an explicit list for MOM6
MOM6_OUTPUT_FH=$(seq -s ' ' "${FHMIN}" "${FHOUT_OCNICE}" "${FHMAX}")
MOM6_OUTPUT_FH=$(seq -s ' ' "${FHMIN}" "${FHOUT_OCN}" "${FHMAX}")

# If using stochastic parameterizations, create a seed that does not exceed the
# largest signed integer
Expand Down
2 changes: 1 addition & 1 deletion ush/parsing_namelists_CICE.sh
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ local CICE_RESTART_FORMAT="pnetcdf2"
local CICE_DUMPFREQ="y" # "h","d","m" or "y" for restarts at intervals of "hours", "days", "months" or "years"
local CICE_DUMPFREQ_N=10000 # Set this to a really large value, as cice, mom6 and cmeps restart interval is controlled by ufs.configure
local CICE_DIAGFREQ=$(( 86400 / DT_CICE )) # frequency of diagnostic output in timesteps, recommended for 1x per day
local CICE_HISTFREQ_N="0, 0, ${FHOUT_OCNICE}, 1, 1"
local CICE_HISTFREQ_N="0, 0, ${FHOUT_ICE}, 1, 1"
if [[ "${RUN}" =~ "gdas" ]]; then
local CICE_HIST_AVG=".false., .false., .false., .false., .false." # DA needs instantaneous
else
Expand Down
24 changes: 21 additions & 3 deletions ush/python/pygfs/task/oceanice_products.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,17 +58,35 @@ def __init__(self, config: Dict[str, Any]) -> None:

valid_datetime = add_to_datetime(self.runtime_config.current_cycle, to_timedelta(f"{self.config.FORECAST_HOUR}H"))

if self.config.COMPONENT == 'ice':
offset = int(self.runtime_config.current_cycle.strftime("%H")) % self.config.FHOUT_ICE_GFS
# For CICE cases where offset is not 0, forecast_hour needs to be adjusted based on the offset.
# TODO: Consider FHMIN when calculating offset.
if offset != 0:
forecast_hour = self.config.FORECAST_HOUR - int(self.runtime_config.current_cycle.strftime("%H"))
# For the first forecast hour, the interval may be different from the intervals of subsequent forecast hours
if forecast_hour <= self.config.FHOUT_ICE_GFS:
interval = self.config.FHOUT_ICE_GFS - int(self.runtime_config.current_cycle.strftime("%H"))
else:
interval = self.config.FHOUT_ICE_GFS
else:
forecast_hour = self.config.FORECAST_HOUR
interval = self.config.FHOUT_ICE_GFS
if self.config.COMPONENT == 'ocean':
forecast_hour = self.config.FORECAST_HOUR
interval = self.config.FHOUT_OCN_GFS

# TODO: This is a bit of a hack, but it works for now
# FIXME: find a better way to provide the averaging period
# This will be different for ocean and ice, so when they are made flexible, this will need to be addressed
avg_period = f"{self.config.FORECAST_HOUR-self.config.FHOUT_OCNICE_GFS:03d}-{self.config.FORECAST_HOUR:03d}"
avg_period = f"{forecast_hour-interval:03d}-{forecast_hour:03d}"

localdict = AttrDict(
{'component': self.config.COMPONENT,
'forecast_hour': self.config.FORECAST_HOUR,
'forecast_hour': forecast_hour,
'valid_datetime': valid_datetime,
'avg_period': avg_period,
'model_grid': model_grid,
'interval': interval,
'product_grids': self.VALID_PRODUCT_GRIDS[model_grid]}
)
self.task_config = AttrDict(**self.config, **self.runtime_config, **localdict)
Expand Down
Loading

0 comments on commit 15eaf35

Please sign in to comment.