From 248869346d58c5f5c1d39199f72f014b3032338a Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 17 Nov 2025 20:04:39 +0000 Subject: [PATCH 01/42] updates from HFIP MPAS 2025 parallel --- .gitignore | 1 + parm/wflow/archiving.yaml | 96 +++++++++++++ parm/wflow/scrubbing.yaml | 93 +++++++++++++ parm/wflow/tracker.yaml | 39 ++++++ scripts/archive_init.sh | 32 +++++ scripts/archive_mpassit.sh | 24 ++++ scripts/archive_tracker.sh | 11 ++ scripts/archive_upp.sh | 17 +++ scripts/run_tracker.sh | 268 +++++++++++++++++++++++++++++++++++++ ush/default_config.yaml | 33 +++++ 10 files changed, 614 insertions(+) create mode 100644 parm/wflow/archiving.yaml create mode 100644 parm/wflow/scrubbing.yaml create mode 100644 parm/wflow/tracker.yaml create mode 100755 scripts/archive_init.sh create mode 100755 scripts/archive_mpassit.sh create mode 100755 scripts/archive_tracker.sh create mode 100755 scripts/archive_upp.sh create mode 100755 scripts/run_tracker.sh diff --git a/.gitignore b/.gitignore index ea4f9a82..16355071 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ /include/ /lib/ __pycache__ +*~ \ No newline at end of file diff --git a/parm/wflow/archiving.yaml b/parm/wflow/archiving.yaml new file mode 100644 index 00000000..d6967856 --- /dev/null +++ b/parm/wflow/archiving.yaml @@ -0,0 +1,96 @@ +workflow: + tasks: + metatask_archive_mpassit: + var: + day: "{% for h in range(1,(forecast.mpas['length']+23)//24+2) %}{{ ' %d' % h }}{% endfor %}" + task_archive_mpassit_day#day#: + command: + cyclestr: + value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + cd {{ user.experiment_dir }} && + &MPAS_APP;/scripts/archive_mpassit.sh #day# @Y@m@d@H "$ARCHIVE_DIR"' + account: "{{ platform.account }}" + partition: "{{ platform.service_partition }}" + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H_day#day#.log' + walltime: "{{ archiving.mpassit.execution.walltime }}" + cores: 1 + envars: + ARCHIVE_DIR: + cyclestr: + value: '{{ user.hpss_archive_dir }}' + dependency: + metataskdep: + attrs: + metatask: post + + task_archive_upp: + command: + cyclestr: + value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + cd {{ user.experiment_dir }} && + &MPAS_APP;/scripts/archive_upp.sh @Y@m@d@H "$ARCHIVE_DIR"' + account: "{{ platform.account }}" + partition: "{{ platform.service_partition }}" + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' + walltime: "{{ archiving.upp.execution.walltime }}" + cores: 1 + envars: + ARCHIVE_DIR: + cyclestr: + value: '{{ user.hpss_archive_dir }}' + dependency: + metataskdep: + attrs: + metatask: post + + task_archive_tracker: + command: + cyclestr: + value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + cd {{ user.experiment_dir }} && + &MPAS_APP;/scripts/archive_tracker.sh @Y@m@d@H "$ARCHIVE_DIR"' + account: "{{ platform.account }}" + partition: "{{ platform.service_partition }}" + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' + walltime: "{{ archiving.tracker.execution.walltime }}" + cores: 1 + envars: + ARCHIVE_DIR: + cyclestr: + value: '{{ user.hpss_archive_dir }}' + dependency: + taskdep: + attrs: + task: tracker + + task_archive_init: + command: + cyclestr: + value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + cd {{ user.experiment_dir }} && + &MPAS_APP;/scripts/archive_init.sh @Y@m@d@H "$ARCHIVE_DIR"' + account: "{{ platform.account }}" + partition: "{{ platform.service_partition }}" + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' + walltime: "{{ archiving.init.execution.walltime }}" + cores: 1 + envars: + ARCHIVE_DIR: + cyclestr: + value: '{{ user.hpss_archive_dir }}' + dependency: + or: + taskdep: + attrs: + task: mpas + metataskdep: + attrs: + metatask: post diff --git a/parm/wflow/scrubbing.yaml b/parm/wflow/scrubbing.yaml new file mode 100644 index 00000000..eca7b04b --- /dev/null +++ b/parm/wflow/scrubbing.yaml @@ -0,0 +1,93 @@ +workflow: + tasks: + task_scrub_forecast: + command: 'set -xue ; cd "$SCRUB_PARENT" ; rm -f forecast/diag*nc forecast/history*nc forecast/restart*nc' + account: "{{ platform.account }}" + partition: "{{ platform.service_partition }}" + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' + walltime: "{{ scrubber.execution.walltime }}" + cores: !int "{{ scrubber.execution.cores }}" + envars: + SCRUB_PARENT: + cyclestr: + value: "{{ user.experiment_dir }}/@Y@m@d@H/" + dependency: + and: + taskdep: + attrs: + task: tracker + and: + metataskdep: + attrs: + metatask: post + taskdep: + attrs: + task: graphics + task_scrub_mpas_ics: + command: 'set -xue ; cd "$SCRUB_PARENT" ; rm -rf mpas_ics' + account: "{{ platform.account }}" + partition: "{{ platform.service_partition }}" + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' + walltime: "{{ scrubber.execution.walltime }}" + cores: !int "{{ scrubber.execution.cores }}" + envars: + SCRUB_PARENT: + cyclestr: + value: "{{ user.experiment_dir }}/@Y@m@d@H/" + dependency: + and: + taskdep_tracker: + attrs: + task: tracker + metataskdep_post: + attrs: + metatask: post + taskdep_graphics: + attrs: + task: graphics + task_scrub_mpassit: + command: 'set -xue ; cd "$SCRUB_PARENT" ; rm -rf mpassit' + account: "{{ platform.account }}" + partition: "{{ platform.service_partition }}" + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' + walltime: "{{ scrubber.execution.walltime }}" + cores: !int "{{ scrubber.execution.cores }}" + envars: + SCRUB_PARENT: + cyclestr: + value: "{{ user.experiment_dir }}/@Y@m@d@H/" + dependency: + and: + metataskdep_post: + attrs: + metatask: post + metataskdep_mpassit: + attrs: + metatask: archive_mpassit + task_scrub_init: + command: 'set -xue ; cd "$SCRUB_PARENT" ; rm -f forecast/*init*nc' + account: "{{ platform.account }}" + partition: "{{ platform.service_partition }}" + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' + walltime: "{{ scrubber.execution.walltime }}" + cores: !int "{{ scrubber.execution.cores }}" + envars: + SCRUB_PARENT: + cyclestr: + value: "{{ user.experiment_dir }}/@Y@m@d@H/" + dependency: + and: + metataskdep: + attrs: + metatask: post + taskdep: + attrs: + task: archive_init diff --git a/parm/wflow/tracker.yaml b/parm/wflow/tracker.yaml new file mode 100644 index 00000000..e6e75eb2 --- /dev/null +++ b/parm/wflow/tracker.yaml @@ -0,0 +1,39 @@ +workflow: + tasks: + task_tracker: + command: + cyclestr: + value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + cd {{ user.experiment_dir }}/@Y@m@d@H && + &MPAS_APP;/scripts/run_tracker.sh @Y@m@d@H' + account: "{{ platform.account }}" + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' + walltime: "{{ tracker.execution.batchargs.walltime }}" + nodes: "{{ tracker.execution.batchargs.nodes }}:ppn={{ tracker.execution.batchargs.tasks_per_node }}" + exclusive: "True" + partition: "{{ post.upp.execution.batchargs.partition }}" + envars: + TRACKER_DIR: + cyclestr: + value: '{{ tracker.execution.tracker_dir }}' + MPISERIAL: + cyclestr: + value: '{{ tracker.execution.mpiserial }}' + SYNDAT_PREFIX: + cyclestr: + value: '{{ tracker.execution.syndat_prefix }}' + MPICMD: + cyclestr: + value: '{{ tracker.execution.mpicmd }}' + FHOUR_STEP: + cyclestr: + value: '{{ tracker.execution.fhour_step }}' + FORECAST_LENGTH: + cyclestr: + value: '{{ forecast.mpas.length }}' + dependency: + metataskdep: + attrs: + metatask: post diff --git a/scripts/archive_init.sh b/scripts/archive_init.sh new file mode 100755 index 00000000..52727a72 --- /dev/null +++ b/scripts/archive_init.sh @@ -0,0 +1,32 @@ +#! /bin/bash + +set -xue + +YMDH=$1 +archive_dir=$2 + +pwd + +copy_to_hpss() { + local from="$1" + local to="$2" + local part="$to".part + + hsi put "$from" : "$part" + hsi mv -f "$part" "$to" +} + +# This file is too large for HTAR so we copy it to HPSS via an "hsi put" + +init_nc=$( ls -1 $YMDH/forecast/*init.nc | head -1 ) +init_nc_hpss="$archive_dir"/${YMDH}-$( basename ${init_nc} ) + +md5_nc="$init_nc".md5 +md5_nc_hpss="$init_nc_hpss".md5 + +md5sum "$init_nc" > "$md5_nc" + +copy_to_hpss "$init_nc" "$init_nc_hpss" +copy_to_hpss "$md5_nc" "$md5_nc_hpss" + +echo Normal completion. diff --git a/scripts/archive_mpassit.sh b/scripts/archive_mpassit.sh new file mode 100755 index 00000000..5520ad4f --- /dev/null +++ b/scripts/archive_mpassit.sh @@ -0,0 +1,24 @@ +#! /bin/bash + +set -xue + +day=$1 +YMDH=$2 +archive_dir=$3 + +skip_hours=$(( ( day - 1 ) * 24 )) + +YYYY=${YMDH:0:4} +MM=${YMDH:4:2} +DD=${YMDH:6:2} +HH=${YMDH:8:2} + +day_prefix=$( date +"MPAS-A_out.%Y-%m-%d" -d "${YYYY}-${MM}-${DD}t00:00:00 UTC+0 + $skip_hours hours" ) +archive_basename=${YMDH}-mpassit-$( date +"%Y%m%d" -d "${YYYY}-${MM}-${DD}t00:00:00 UTC+0 + $skip_hours hours" ).tar + +archive="$archive_dir/$archive_basename" +listing=$( ls -1 $YMDH/mpassit/*/"$day_prefix"* ) + +htar -hcpvf "$archive" $listing + +echo Normal completion. diff --git a/scripts/archive_tracker.sh b/scripts/archive_tracker.sh new file mode 100755 index 00000000..844a6891 --- /dev/null +++ b/scripts/archive_tracker.sh @@ -0,0 +1,11 @@ +#! /bin/bash + +set -xue + +YMDH=$1 +archive_dir=$2 + +archive="$archive_dir"/${YMDH}-tracker.tar +htar -hcpvf "$archive" $YMDH/tracker/* + +echo Normal completion. diff --git a/scripts/archive_upp.sh b/scripts/archive_upp.sh new file mode 100755 index 00000000..7532fa53 --- /dev/null +++ b/scripts/archive_upp.sh @@ -0,0 +1,17 @@ +#! /bin/bash + +set -xue + +YMDH=$1 +archive_dir=$2 + +archive="$archive_dir"/${YMDH}-upp.tar + +listing=$( + ls -1 $YMDH/upp/*/*GrbF* $YMDH/upp/*/itag \ + $YMDH/upp/000/*dat $YMDH/upp/000/*txt $YMDH/upp/000/*xml $YMDH/upp/000/params_grib2_tbl_new \ + ) + +htar -chpvf "$archive" $listing + +echo Normal completion. diff --git a/scripts/run_tracker.sh b/scripts/run_tracker.sh new file mode 100755 index 00000000..b77996bc --- /dev/null +++ b/scripts/run_tracker.sh @@ -0,0 +1,268 @@ +#! /bin/bash + +set -ue + +module purge +module use "$TRACKER_DIR/modulefiles" +module load ursa +module load wgrib2 +module load grib-util +module list + +set -x + +ymdh="$1" +mpas_upp=../upp +syndat_prefix="$SYNDAT_PREFIX" +fhour_start=0 +fhour_step="$FHOUR_STEP" +fhour_last="$FORECAST_LENGTH" +grid="-new_grid latlon -100:3333:0.03 -10:2666:0.03" +tracker="$TRACKER_DIR/exec/gettrk.x" +mpiserial="$MPISERIAL" +mpicmd="$MPICMD" + +rm -rf tracker +mkdir tracker +cd tracker + +#### + +ulimit -s unlimited + +CC=${ymdh:0:2} +YY=${ymdh:2:2} +MM=${ymdh:4:2} +DD=${ymdh:6:2} +HH=${ymdh:8:2} + +syndat=${syndat_prefix}.$CC$YY +if ( ! grep -E "^.....[0-49][0-9]L ......... $CC$YY$MM$DD $HH" $syndat > allvit ) ; then + echo "No Atlantic storms. There is nothing to track." + echo "Delivering an empty track." + cat /dev/null > mpas.trak.atcfunix + exit 0 +fi +ln -sf allvit tcvit_rsmc_storms.txt + +opts='-set_grib_type c2 -new_grid_winds grid -new_grid_vectors "UGRD:VGRD" -new_grid_interpolation neighbor' + +PARMlistp1="UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m a|VGRD:10 m a|ABSV:850|ABSV:700|MSLET|MSLP|MSLMA|mean sea|sea level" +PARMlistp2="HGT:900|HGT:850|HGT:800|HGT:750|HGT:700|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400" +PARMlistp3="HGT:350|HGT:300|HGT:250|HGT:200|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300|TMP:250|TMP:200" +PARMlist=${PARMlistp1}"|"${PARMlistp2}"|"${PARMlistp3} + +rm -f ../fort.15 # list of forecast minutes + +i=0 +for fhr in $( seq $fhour_start $fhour_step $fhour_last ) ; do + i=$(( i + 1 )) + fmin=$(( fhr * 60 )) + printf '%4d %5d\n' $i $fmin >> fort.15 + + grib2d=$( printf "%s/%03d/%s%02d" "$mpas_upp" $fhr "2DFLD.GrbF" $fhr ) + gribprs=$( printf "%s/%03d/%s%02d" "$mpas_upp" $fhr "PRSLEV.GrbF" $fhr ) + + if [[ ! -s "$grib2d" || ! -s "$gribprs" ]] ; then + echo "No file at time $fhr" 1>&2 + break + fi + + latlon2d=$( printf latlon_2d_%03d.grb2 $fhr ) + latlonprs=$( printf latlon_prs_%03d.grb2 $fhr ) + final=$( printf mpas.trak.all.$CC$YY$MM$DD$HH.f$( printf %05d $fmin ) ) + + echo wgrib2 -s $grib2d \| grep -E "'$PARMlist'" \| wgrib2 -i $grib2d $opts -new_grid latlon -100:3333:0.03 -10:2666:0.03 $latlon2d >> cmdfile1 + echo wgrib2 -s $gribprs \| grep -E "'$PARMlist'" \| wgrib2 -i $gribprs $opts -new_grid latlon -100:3333:0.03 -10:2666:0.03 $latlonprs >> cmdfile1 + + echo "cat $latlon2d $latlonprs > $final ; grb2index $final $final.ix" >> cmdfile2 +done + +# Subset the grib files: +time $mpicmd "$mpiserial" -m cmdfile1 < /dev/null + +# Merge 2d and pressure grib files. Generate index files. +time $mpicmd "$mpiserial" -m cmdfile2 < /dev/null + +rm -f latlon_2d* latlon_prs* + +cat< namelist.gettrk +&datein + inp%bcc = ${CC} + inp%byy = ${YY} + inp%bmm = ${MM} + inp%bdd = ${DD} + inp%bhh = ${HH} + inp%model = 17 + inp%modtyp = 'regional' + inp%lt_units = 'hours' + inp%file_seq = 'multi' + inp%nesttyp = 'fixed' +/ + +&atcfinfo + atcfnum = 81 + atcfname = 'MPAS' + atcfymdh = ${CC}${YY}${MM}${DD}${HH} + atcffreq = 100 +/ + +&trackerinfo + trkrinfo%eastbd = 3313, + trkrinfo%westbd = 20, + trkrinfo%northbd = 2646, + trkrinfo%southbd = 20, + trkrinfo%contint = 100.0 + trkrinfo%type = 'tracker' + trkrinfo%mslpthresh = 0.0015 + trkrinfo%use_backup_mslp_grad_check = 'y' + trkrinfo%v850thresh = 1.5 + trkrinfo%v850_qwc_thresh = 1.0 + trkrinfo%use_backup_850_vt_check = 'y' + trkrinfo%enable_timing = 1 + trkrinfo%gridtype = 'regional' + trkrinfo%want_oci = .true. + trkrinfo%out_vit = 'n' + trkrinfo%use_land_mask = 'y' + trkrinfo%read_separate_land_mask_file = 'n' + trkrinfo%inp_data_type = 'grib' + trkrinfo%gribver = 2 + trkrinfo%g2_jpdtn = 0 + trkrinfo%g2_mslp_parm_id = 198 + trkrinfo%g1_mslp_parm_id = 2 + trkrinfo%g1_sfcwind_lev_typ = 105 + trkrinfo%g1_sfcwind_lev_val = 10 + trkrinfo%max_mslp_850 = 400.0 +/ + +&phaseinfo + phaseflag = 'y' + phasescheme = 'both' + wcore_depth = 1.0 +/ + +&structinfo + structflag = 'n' + ikeflag = 'n' + radii_pctile = 95.0 + radii_free_pass_pctile = 67.0 + radii_width_thresh = 15.0 +/ + +&fnameinfo + gmodname = 'mpas' + rundescr = 'trak' + atcfdescr = 'all' +/ + +&cintinfo + contint_grid_bound_check = 50.0 +/ + +&waitinfo + use_waitfor = 'n' + use_per_fcst_command = 'n' +/ + +&netcdflist + netcdfinfo%num_netcdf_vars = , + netcdfinfo%netcdf_filename = '' + netcdfinfo%netcdf_lsmask_filename = '' + netcdfinfo%rv850name = '' + netcdfinfo%rv700name = '' + netcdfinfo%u850name = '' + netcdfinfo%v850name = '' + netcdfinfo%u700name = '' + netcdfinfo%v700name = '' + netcdfinfo%z850name = '' + netcdfinfo%z700name = '' + netcdfinfo%mslpname = '' + netcdfinfo%usfcname = '' + netcdfinfo%vsfcname = '' + netcdfinfo%u500name = '' + netcdfinfo%v500name = '' + netcdfinfo%u200name = '' + netcdfinfo%v200name = '' + netcdfinfo%tmean_300_500_name = '' + netcdfinfo%z500name = '' + netcdfinfo%z200name = '' + netcdfinfo%lmaskname = '' + netcdfinfo%z900name = '' + netcdfinfo%z800name = '' + netcdfinfo%z750name = '' + netcdfinfo%z650name = '' + netcdfinfo%z600name = '' + netcdfinfo%z550name = '' + netcdfinfo%z450name = '' + netcdfinfo%z400name = '' + netcdfinfo%z350name = '' + netcdfinfo%z300name = '' + netcdfinfo%time_name = '' + netcdfinfo%lon_name = '' + netcdfinfo%lat_name = '' + netcdfinfo%time_units = '' + netcdfinfo%sstname = '' + netcdfinfo%q850name = '' + netcdfinfo%rh1000name = '' + netcdfinfo%rh925name = '' + netcdfinfo%rh800name = '' + netcdfinfo%rh750name = '' + netcdfinfo%rh700name = '' + netcdfinfo%rh650name = '' + netcdfinfo%rh600name = '' + netcdfinfo%spfh1000name = '' + netcdfinfo%spfh925name = '' + netcdfinfo%spfh800name = '' + netcdfinfo%spfh750name = '' + netcdfinfo%spfh700name = '' + netcdfinfo%spfh650name = '' + netcdfinfo%spfh600name = '' + netcdfinfo%temp1000name = '' + netcdfinfo%temp925name = '' + netcdfinfo%temp800name = '' + netcdfinfo%temp750name = '' + netcdfinfo%temp700name = '' + netcdfinfo%temp650name = '' + netcdfinfo%temp600name = '' + netcdfinfo%omega500name = '' +/ + +&parmpreflist + user_wants_to_track_zeta700 = 'y' + user_wants_to_track_wcirc850 = 'y' + user_wants_to_track_wcirc700 = 'y' + user_wants_to_track_gph850 = 'y' + user_wants_to_track_gph700 = 'y' + user_wants_to_track_mslp = 'y' + user_wants_to_track_wcircsfc = 'y' + user_wants_to_track_zetasfc = 'y' + user_wants_to_track_thick500850 = 'n' + user_wants_to_track_thick200500 = 'n' + user_wants_to_track_thick200850 = 'n' + user_wants_to_track_zeta850 = 'y' +/ + +&verbose + verb = 3 + verb_g2 = 0 +/ + +&sheardiaginfo + shearflag = 'y' +/ + +&sstdiaginfo + sstflag = 'y' +/ + +&gendiaginfo + genflag = 'n' + gen_read_rh_fields = '' +/ +EOF + +time $mpicmd -n 1 "$tracker" < /dev/null 2>&1 | tee tracker.log + +cat fort.68 > mpas.trak.atcfunix + +echo Normal completion. diff --git a/ush/default_config.yaml b/ush/default_config.yaml index 2ddd055c..6d0f8ee5 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -445,6 +445,20 @@ post: nampgb: numx: 2 rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/{{ "%03d" % (leadtime.total_seconds() / 3600) }}' +tracker: + control_file: "{{ user.mpas_app }}/parm/upp/postxconfig-NT-rrfs_mpas.txt" + execution: + batchargs: + walltime: 00:12:00 + nodes: 1 + tasks_per_node: 32 + fhour_step: 6 + native: + - --exclusive + tracker_dir: /scratch3/BMC/wrfruc/Samuel.Trahan/mpashfip/tracker-hafs-211 + mpiserial: /scratch3/BMC/gsd-fv3-dev/role.rtgsd-fv3-dev/merge-hafs-and-gfs/mpiserial/mpiserial + syndat_prefix: /scratch3/HFIP/hwrfv3/noscrub/input/SYNDAT-PLUS/syndat_tcvitals + mpicmd: 'srun -l' graphics: # the graphics task calls a bash run script that runs pygraf execution: @@ -468,3 +482,22 @@ graphics: wait_between_output: 25 zip_file_path: "{{ user.experiment_dir }}/${CYCLE}/nclprd" +archiving: + mpassit: + execution: + walltime: 02:59:00 + upp: + execution: + walltime: 02:59:00 + tracker: + execution: + walltime: 00:29:00 + init: + execution: + walltime: 02:59:00 + +scrubber: + execution: + cores: 1 + walltime: 00:10:00 + rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}' From 0fc78c2fef71d933568c952394e55883315b3454 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 17 Nov 2025 20:13:21 +0000 Subject: [PATCH 02/42] simplify scrubbing dependencies --- parm/wflow/scrubbing.yaml | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/parm/wflow/scrubbing.yaml b/parm/wflow/scrubbing.yaml index eca7b04b..6325bf0f 100644 --- a/parm/wflow/scrubbing.yaml +++ b/parm/wflow/scrubbing.yaml @@ -14,17 +14,9 @@ workflow: cyclestr: value: "{{ user.experiment_dir }}/@Y@m@d@H/" dependency: - and: - taskdep: - attrs: - task: tracker - and: - metataskdep: - attrs: - metatask: post - taskdep: - attrs: - task: graphics + metataskdep: + attrs: + metatask: post task_scrub_mpas_ics: command: 'set -xue ; cd "$SCRUB_PARENT" ; rm -rf mpas_ics' account: "{{ platform.account }}" @@ -39,16 +31,9 @@ workflow: cyclestr: value: "{{ user.experiment_dir }}/@Y@m@d@H/" dependency: - and: - taskdep_tracker: - attrs: - task: tracker - metataskdep_post: - attrs: - metatask: post - taskdep_graphics: - attrs: - task: graphics + metataskdep_post: + attrs: + metatask: post task_scrub_mpassit: command: 'set -xue ; cd "$SCRUB_PARENT" ; rm -rf mpassit' account: "{{ platform.account }}" From fafeb0661adbf049a3e0e6a7e5d8b2707e10bef7 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 17 Nov 2025 20:23:25 +0000 Subject: [PATCH 03/42] move tracker archiving to its own yaml --- parm/wflow/archiving.yaml | 22 ---------------------- parm/wflow/archiving_tracker.yaml | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 22 deletions(-) create mode 100644 parm/wflow/archiving_tracker.yaml diff --git a/parm/wflow/archiving.yaml b/parm/wflow/archiving.yaml index d6967856..a6b0eb40 100644 --- a/parm/wflow/archiving.yaml +++ b/parm/wflow/archiving.yaml @@ -47,28 +47,6 @@ workflow: attrs: metatask: post - task_archive_tracker: - command: - cyclestr: - value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && - cd {{ user.experiment_dir }} && - &MPAS_APP;/scripts/archive_tracker.sh @Y@m@d@H "$ARCHIVE_DIR"' - account: "{{ platform.account }}" - partition: "{{ platform.service_partition }}" - join: - cyclestr: - value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' - walltime: "{{ archiving.tracker.execution.walltime }}" - cores: 1 - envars: - ARCHIVE_DIR: - cyclestr: - value: '{{ user.hpss_archive_dir }}' - dependency: - taskdep: - attrs: - task: tracker - task_archive_init: command: cyclestr: diff --git a/parm/wflow/archiving_tracker.yaml b/parm/wflow/archiving_tracker.yaml new file mode 100644 index 00000000..af6c1153 --- /dev/null +++ b/parm/wflow/archiving_tracker.yaml @@ -0,0 +1,23 @@ +workflow: + tasks: + task_archive_tracker: + command: + cyclestr: + value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + cd {{ user.experiment_dir }} && + &MPAS_APP;/scripts/archive_tracker.sh @Y@m@d@H "$ARCHIVE_DIR"' + account: "{{ platform.account }}" + partition: "{{ platform.service_partition }}" + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' + walltime: "{{ archiving.tracker.execution.walltime }}" + cores: 1 + envars: + ARCHIVE_DIR: + cyclestr: + value: '{{ user.hpss_archive_dir }}' + dependency: + taskdep: + attrs: + task: tracker From ba832e0906b70455ac8c9853f73b10e93c14473c Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 17 Nov 2025 20:30:31 +0000 Subject: [PATCH 04/42] remove tracker from this branch --- parm/wflow/archiving_tracker.yaml | 23 --- parm/wflow/tracker.yaml | 39 ----- scripts/archive_tracker.sh | 11 -- scripts/run_tracker.sh | 268 ------------------------------ ush/default_config.yaml | 17 -- 5 files changed, 358 deletions(-) delete mode 100644 parm/wflow/archiving_tracker.yaml delete mode 100644 parm/wflow/tracker.yaml delete mode 100755 scripts/archive_tracker.sh delete mode 100755 scripts/run_tracker.sh diff --git a/parm/wflow/archiving_tracker.yaml b/parm/wflow/archiving_tracker.yaml deleted file mode 100644 index af6c1153..00000000 --- a/parm/wflow/archiving_tracker.yaml +++ /dev/null @@ -1,23 +0,0 @@ -workflow: - tasks: - task_archive_tracker: - command: - cyclestr: - value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && - cd {{ user.experiment_dir }} && - &MPAS_APP;/scripts/archive_tracker.sh @Y@m@d@H "$ARCHIVE_DIR"' - account: "{{ platform.account }}" - partition: "{{ platform.service_partition }}" - join: - cyclestr: - value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' - walltime: "{{ archiving.tracker.execution.walltime }}" - cores: 1 - envars: - ARCHIVE_DIR: - cyclestr: - value: '{{ user.hpss_archive_dir }}' - dependency: - taskdep: - attrs: - task: tracker diff --git a/parm/wflow/tracker.yaml b/parm/wflow/tracker.yaml deleted file mode 100644 index e6e75eb2..00000000 --- a/parm/wflow/tracker.yaml +++ /dev/null @@ -1,39 +0,0 @@ -workflow: - tasks: - task_tracker: - command: - cyclestr: - value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && - cd {{ user.experiment_dir }}/@Y@m@d@H && - &MPAS_APP;/scripts/run_tracker.sh @Y@m@d@H' - account: "{{ platform.account }}" - join: - cyclestr: - value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' - walltime: "{{ tracker.execution.batchargs.walltime }}" - nodes: "{{ tracker.execution.batchargs.nodes }}:ppn={{ tracker.execution.batchargs.tasks_per_node }}" - exclusive: "True" - partition: "{{ post.upp.execution.batchargs.partition }}" - envars: - TRACKER_DIR: - cyclestr: - value: '{{ tracker.execution.tracker_dir }}' - MPISERIAL: - cyclestr: - value: '{{ tracker.execution.mpiserial }}' - SYNDAT_PREFIX: - cyclestr: - value: '{{ tracker.execution.syndat_prefix }}' - MPICMD: - cyclestr: - value: '{{ tracker.execution.mpicmd }}' - FHOUR_STEP: - cyclestr: - value: '{{ tracker.execution.fhour_step }}' - FORECAST_LENGTH: - cyclestr: - value: '{{ forecast.mpas.length }}' - dependency: - metataskdep: - attrs: - metatask: post diff --git a/scripts/archive_tracker.sh b/scripts/archive_tracker.sh deleted file mode 100755 index 844a6891..00000000 --- a/scripts/archive_tracker.sh +++ /dev/null @@ -1,11 +0,0 @@ -#! /bin/bash - -set -xue - -YMDH=$1 -archive_dir=$2 - -archive="$archive_dir"/${YMDH}-tracker.tar -htar -hcpvf "$archive" $YMDH/tracker/* - -echo Normal completion. diff --git a/scripts/run_tracker.sh b/scripts/run_tracker.sh deleted file mode 100755 index b77996bc..00000000 --- a/scripts/run_tracker.sh +++ /dev/null @@ -1,268 +0,0 @@ -#! /bin/bash - -set -ue - -module purge -module use "$TRACKER_DIR/modulefiles" -module load ursa -module load wgrib2 -module load grib-util -module list - -set -x - -ymdh="$1" -mpas_upp=../upp -syndat_prefix="$SYNDAT_PREFIX" -fhour_start=0 -fhour_step="$FHOUR_STEP" -fhour_last="$FORECAST_LENGTH" -grid="-new_grid latlon -100:3333:0.03 -10:2666:0.03" -tracker="$TRACKER_DIR/exec/gettrk.x" -mpiserial="$MPISERIAL" -mpicmd="$MPICMD" - -rm -rf tracker -mkdir tracker -cd tracker - -#### - -ulimit -s unlimited - -CC=${ymdh:0:2} -YY=${ymdh:2:2} -MM=${ymdh:4:2} -DD=${ymdh:6:2} -HH=${ymdh:8:2} - -syndat=${syndat_prefix}.$CC$YY -if ( ! grep -E "^.....[0-49][0-9]L ......... $CC$YY$MM$DD $HH" $syndat > allvit ) ; then - echo "No Atlantic storms. There is nothing to track." - echo "Delivering an empty track." - cat /dev/null > mpas.trak.atcfunix - exit 0 -fi -ln -sf allvit tcvit_rsmc_storms.txt - -opts='-set_grib_type c2 -new_grid_winds grid -new_grid_vectors "UGRD:VGRD" -new_grid_interpolation neighbor' - -PARMlistp1="UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m a|VGRD:10 m a|ABSV:850|ABSV:700|MSLET|MSLP|MSLMA|mean sea|sea level" -PARMlistp2="HGT:900|HGT:850|HGT:800|HGT:750|HGT:700|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400" -PARMlistp3="HGT:350|HGT:300|HGT:250|HGT:200|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300|TMP:250|TMP:200" -PARMlist=${PARMlistp1}"|"${PARMlistp2}"|"${PARMlistp3} - -rm -f ../fort.15 # list of forecast minutes - -i=0 -for fhr in $( seq $fhour_start $fhour_step $fhour_last ) ; do - i=$(( i + 1 )) - fmin=$(( fhr * 60 )) - printf '%4d %5d\n' $i $fmin >> fort.15 - - grib2d=$( printf "%s/%03d/%s%02d" "$mpas_upp" $fhr "2DFLD.GrbF" $fhr ) - gribprs=$( printf "%s/%03d/%s%02d" "$mpas_upp" $fhr "PRSLEV.GrbF" $fhr ) - - if [[ ! -s "$grib2d" || ! -s "$gribprs" ]] ; then - echo "No file at time $fhr" 1>&2 - break - fi - - latlon2d=$( printf latlon_2d_%03d.grb2 $fhr ) - latlonprs=$( printf latlon_prs_%03d.grb2 $fhr ) - final=$( printf mpas.trak.all.$CC$YY$MM$DD$HH.f$( printf %05d $fmin ) ) - - echo wgrib2 -s $grib2d \| grep -E "'$PARMlist'" \| wgrib2 -i $grib2d $opts -new_grid latlon -100:3333:0.03 -10:2666:0.03 $latlon2d >> cmdfile1 - echo wgrib2 -s $gribprs \| grep -E "'$PARMlist'" \| wgrib2 -i $gribprs $opts -new_grid latlon -100:3333:0.03 -10:2666:0.03 $latlonprs >> cmdfile1 - - echo "cat $latlon2d $latlonprs > $final ; grb2index $final $final.ix" >> cmdfile2 -done - -# Subset the grib files: -time $mpicmd "$mpiserial" -m cmdfile1 < /dev/null - -# Merge 2d and pressure grib files. Generate index files. -time $mpicmd "$mpiserial" -m cmdfile2 < /dev/null - -rm -f latlon_2d* latlon_prs* - -cat< namelist.gettrk -&datein - inp%bcc = ${CC} - inp%byy = ${YY} - inp%bmm = ${MM} - inp%bdd = ${DD} - inp%bhh = ${HH} - inp%model = 17 - inp%modtyp = 'regional' - inp%lt_units = 'hours' - inp%file_seq = 'multi' - inp%nesttyp = 'fixed' -/ - -&atcfinfo - atcfnum = 81 - atcfname = 'MPAS' - atcfymdh = ${CC}${YY}${MM}${DD}${HH} - atcffreq = 100 -/ - -&trackerinfo - trkrinfo%eastbd = 3313, - trkrinfo%westbd = 20, - trkrinfo%northbd = 2646, - trkrinfo%southbd = 20, - trkrinfo%contint = 100.0 - trkrinfo%type = 'tracker' - trkrinfo%mslpthresh = 0.0015 - trkrinfo%use_backup_mslp_grad_check = 'y' - trkrinfo%v850thresh = 1.5 - trkrinfo%v850_qwc_thresh = 1.0 - trkrinfo%use_backup_850_vt_check = 'y' - trkrinfo%enable_timing = 1 - trkrinfo%gridtype = 'regional' - trkrinfo%want_oci = .true. - trkrinfo%out_vit = 'n' - trkrinfo%use_land_mask = 'y' - trkrinfo%read_separate_land_mask_file = 'n' - trkrinfo%inp_data_type = 'grib' - trkrinfo%gribver = 2 - trkrinfo%g2_jpdtn = 0 - trkrinfo%g2_mslp_parm_id = 198 - trkrinfo%g1_mslp_parm_id = 2 - trkrinfo%g1_sfcwind_lev_typ = 105 - trkrinfo%g1_sfcwind_lev_val = 10 - trkrinfo%max_mslp_850 = 400.0 -/ - -&phaseinfo - phaseflag = 'y' - phasescheme = 'both' - wcore_depth = 1.0 -/ - -&structinfo - structflag = 'n' - ikeflag = 'n' - radii_pctile = 95.0 - radii_free_pass_pctile = 67.0 - radii_width_thresh = 15.0 -/ - -&fnameinfo - gmodname = 'mpas' - rundescr = 'trak' - atcfdescr = 'all' -/ - -&cintinfo - contint_grid_bound_check = 50.0 -/ - -&waitinfo - use_waitfor = 'n' - use_per_fcst_command = 'n' -/ - -&netcdflist - netcdfinfo%num_netcdf_vars = , - netcdfinfo%netcdf_filename = '' - netcdfinfo%netcdf_lsmask_filename = '' - netcdfinfo%rv850name = '' - netcdfinfo%rv700name = '' - netcdfinfo%u850name = '' - netcdfinfo%v850name = '' - netcdfinfo%u700name = '' - netcdfinfo%v700name = '' - netcdfinfo%z850name = '' - netcdfinfo%z700name = '' - netcdfinfo%mslpname = '' - netcdfinfo%usfcname = '' - netcdfinfo%vsfcname = '' - netcdfinfo%u500name = '' - netcdfinfo%v500name = '' - netcdfinfo%u200name = '' - netcdfinfo%v200name = '' - netcdfinfo%tmean_300_500_name = '' - netcdfinfo%z500name = '' - netcdfinfo%z200name = '' - netcdfinfo%lmaskname = '' - netcdfinfo%z900name = '' - netcdfinfo%z800name = '' - netcdfinfo%z750name = '' - netcdfinfo%z650name = '' - netcdfinfo%z600name = '' - netcdfinfo%z550name = '' - netcdfinfo%z450name = '' - netcdfinfo%z400name = '' - netcdfinfo%z350name = '' - netcdfinfo%z300name = '' - netcdfinfo%time_name = '' - netcdfinfo%lon_name = '' - netcdfinfo%lat_name = '' - netcdfinfo%time_units = '' - netcdfinfo%sstname = '' - netcdfinfo%q850name = '' - netcdfinfo%rh1000name = '' - netcdfinfo%rh925name = '' - netcdfinfo%rh800name = '' - netcdfinfo%rh750name = '' - netcdfinfo%rh700name = '' - netcdfinfo%rh650name = '' - netcdfinfo%rh600name = '' - netcdfinfo%spfh1000name = '' - netcdfinfo%spfh925name = '' - netcdfinfo%spfh800name = '' - netcdfinfo%spfh750name = '' - netcdfinfo%spfh700name = '' - netcdfinfo%spfh650name = '' - netcdfinfo%spfh600name = '' - netcdfinfo%temp1000name = '' - netcdfinfo%temp925name = '' - netcdfinfo%temp800name = '' - netcdfinfo%temp750name = '' - netcdfinfo%temp700name = '' - netcdfinfo%temp650name = '' - netcdfinfo%temp600name = '' - netcdfinfo%omega500name = '' -/ - -&parmpreflist - user_wants_to_track_zeta700 = 'y' - user_wants_to_track_wcirc850 = 'y' - user_wants_to_track_wcirc700 = 'y' - user_wants_to_track_gph850 = 'y' - user_wants_to_track_gph700 = 'y' - user_wants_to_track_mslp = 'y' - user_wants_to_track_wcircsfc = 'y' - user_wants_to_track_zetasfc = 'y' - user_wants_to_track_thick500850 = 'n' - user_wants_to_track_thick200500 = 'n' - user_wants_to_track_thick200850 = 'n' - user_wants_to_track_zeta850 = 'y' -/ - -&verbose - verb = 3 - verb_g2 = 0 -/ - -&sheardiaginfo - shearflag = 'y' -/ - -&sstdiaginfo - sstflag = 'y' -/ - -&gendiaginfo - genflag = 'n' - gen_read_rh_fields = '' -/ -EOF - -time $mpicmd -n 1 "$tracker" < /dev/null 2>&1 | tee tracker.log - -cat fort.68 > mpas.trak.atcfunix - -echo Normal completion. diff --git a/ush/default_config.yaml b/ush/default_config.yaml index 6d0f8ee5..a822156e 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -445,20 +445,6 @@ post: nampgb: numx: 2 rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/{{ "%03d" % (leadtime.total_seconds() / 3600) }}' -tracker: - control_file: "{{ user.mpas_app }}/parm/upp/postxconfig-NT-rrfs_mpas.txt" - execution: - batchargs: - walltime: 00:12:00 - nodes: 1 - tasks_per_node: 32 - fhour_step: 6 - native: - - --exclusive - tracker_dir: /scratch3/BMC/wrfruc/Samuel.Trahan/mpashfip/tracker-hafs-211 - mpiserial: /scratch3/BMC/gsd-fv3-dev/role.rtgsd-fv3-dev/merge-hafs-and-gfs/mpiserial/mpiserial - syndat_prefix: /scratch3/HFIP/hwrfv3/noscrub/input/SYNDAT-PLUS/syndat_tcvitals - mpicmd: 'srun -l' graphics: # the graphics task calls a bash run script that runs pygraf execution: @@ -489,9 +475,6 @@ archiving: upp: execution: walltime: 02:59:00 - tracker: - execution: - walltime: 00:29:00 init: execution: walltime: 02:59:00 From 12111805a91447eba1a0060a57f5565acfe0c7c5 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Fri, 21 Nov 2025 18:48:15 +0000 Subject: [PATCH 05/42] a few changes missing from prior commit --- parm/wflow/post.yaml | 4 ++-- ush/default_config.yaml | 3 +++ ush/output_is_available_for.sh | 20 ++++++++++++++++++++ ush/workflows/hfip_2025.yaml | 2 ++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100755 ush/output_is_available_for.sh diff --git a/parm/wflow/post.yaml b/parm/wflow/post.yaml index 7b2c841e..01f40214 100644 --- a/parm/wflow/post.yaml +++ b/parm/wflow/post.yaml @@ -37,12 +37,12 @@ workflow: taskdep: attrs: task: mpas - sh_find_files: + sh_output_is_available_for: attrs: shell: /bin/bash command: cyclestr: - value: 'fh=$((10##fhr# + 6 )) ; timestamp=$(date -d "@H:@M:@S @Y-@m-@d +$fh hour" "+%F_%T" ) ; find {{ user.experiment_dir }}/@Y@m@d@H/forecast/[dh]*.${timestamp}.nc 2>/dev/null | test $(wc -l) == 2' + value: '{{ user.mpas_app }}/ush/output_is_available_for.sh {{ user.experiment_dir }}/@Y@m@d@H/forecast @Y-@m-@d_@H:00:00 #fhr# {{ post.output_frequency_check }}' task_upp_#fhr#: command: diff --git a/ush/default_config.yaml b/ush/default_config.yaml index a822156e..b1ddb453 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -337,6 +337,9 @@ forecast: account: '{{ platform.account }}' scheduler: '{{ platform.scheduler }}' post: + # The output_frequency_check is for the dependency of the first job in the post metatask. + # The post won't submit until it sees output this many forecast hours after the time to process. + output_frequency_check: "{{ user.forecast.output_interval }}" # combined_files is a simple tasks that concatenates grib files. Please see # parm/wflow/post.yaml for information on the task. compbined_files: diff --git a/ush/output_is_available_for.sh b/ush/output_is_available_for.sh new file mode 100755 index 00000000..48eb6e90 --- /dev/null +++ b/ush/output_is_available_for.sh @@ -0,0 +1,20 @@ +#! /bin/bash + +forecast_dir="$1" +start_time="$2" +lead_time="$3" +add_to_lead_time="$4" + +eval "check_time=\$(( 10#\$lead_time + 10#\$add_to_lead_time ))" + +# 2025-08-22t00:00:00 UTC+0 +s="$start_time" +start_posix="${s:0:4}-${s:5:2}-${s:8:2}t${s:11:2}:${s:14:2}:${s:17:2} UTC+0" + +# 2025-08-23_06.00.00 +valid_time_posix=$( date +"%Y-%m-%d_%H.%M.%S" -d "$start_posix + $check_time hours" ) + +history="$forecast_dir/history.$valid_time_posix.nc" +diag="$forecast_dir/diag.$valid_time_posix.nc" + +exec test -s "$history" -a -s "$diag" diff --git a/ush/workflows/hfip_2025.yaml b/ush/workflows/hfip_2025.yaml index 14d23e87..ca496960 100644 --- a/ush/workflows/hfip_2025.yaml +++ b/ush/workflows/hfip_2025.yaml @@ -8,6 +8,8 @@ user: - cold_start.yaml - post.yaml - graphics.yaml + - scrubbing.yaml + - archiving.yaml workflow: tasks: From c0bd1565e53af3a89001b546ee86be4684fbaf8d Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Fri, 21 Nov 2025 21:38:14 +0000 Subject: [PATCH 06/42] add gfs path on ursa --- parm/machines/ursa.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/parm/machines/ursa.yaml b/parm/machines/ursa.yaml index 98ba3182..3282ee94 100644 --- a/parm/machines/ursa.yaml +++ b/parm/machines/ursa.yaml @@ -7,6 +7,10 @@ platform: geog_data: global: /scratch2/BMC/wrfruc/talcott/mpas/global/static/geog/ service_partition: u1-service + data: + gfs: + path: /public/data/grids/gfs/0p25deg/grib2 + file_templates: '@y@j@H00{{ "%04d" % fcst_hr }}' create_ics: mpas_init: execution: From 61cae6ffc9f04f4f0dd048f7e912407acd0410b4 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Sat, 22 Nov 2025 00:11:49 +0000 Subject: [PATCH 07/42] corrections taken from real-time runs --- ush/workflows/hfip_2025.yaml | 24 +++++++++++++++++++----- ush/workflows/hfip_resources.yaml | 10 ++++++---- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/ush/workflows/hfip_2025.yaml b/ush/workflows/hfip_2025.yaml index ca496960..0c876e3f 100644 --- a/ush/workflows/hfip_2025.yaml +++ b/ush/workflows/hfip_2025.yaml @@ -3,6 +3,7 @@ user: - prepare_grib_ics.ungrib - create_ics.mpas_init - forecast.mpas + - post.upp mesh_label: x5.8060930 workflow_blocks: - cold_start.yaml @@ -17,6 +18,8 @@ workflow: task_ungrib_lbcs: !remove task_mpas_lbcs: !remove task_mpas: + cores: !remove + nodes: "{{ forecast.mpas.execution.batchargs.nodes }}:ppn={{ forecast.mpas.execution.batchargs.tasks_per_node }}" dependency: taskdep: attrs: @@ -30,12 +33,12 @@ workflow: create_ics: mpas_init: &mpas_init files_to_copy: - QNWFA_QNIFA_SIGMA_MONTHLY.dat: "{{ platform.hrrr_fix }}/../QNWFA_QNIFA_SIGMA_MONTHLY.dat" stream_list.atmosphere.diag_ugwp: "{{ user.mpas_app }}/parm/mpas/hfip_2025/stream_list.atmosphere.diag_ugwp" stream_list.atmosphere.diagnostics: "{{ user.mpas_app }}/parm/mpas/hfip_2025/stream_list.atmosphere.diagnostics" stream_list.atmosphere.output: "{{ user.mpas_app }}/parm/mpas/hfip_2025/stream_list.atmosphere.output" stream_list.atmosphere.surface: "{{ user.mpas_app }}/parm/mpas/hfip_2025/stream_list.atmosphere.surface" files_to_link: + QNWFA_QNIFA_SIGMA_MONTHLY.dat: "{{ platform.hrrr_fix }}/../QNWFA_QNIFA_SIGMA_MONTHLY.dat" "{{ user.mesh_label }}.ugwp_oro_data.nc": "{{ platform.hrrr_fix }}/{{ user.mesh_label }}.ugwp_oro_data.nc" namelist: update_values: @@ -63,8 +66,9 @@ forecast: stream_list.atmosphere.surface: "{{ user.mpas_app }}/parm/mpas/hfip_2025/stream_list.atmosphere.surface" files_to_link: CCN_ACTIVATE.BIN: !remove + QNWFA_QNIFA_SIGMA_MONTHLY.dat: "{{ platform.hrrr_fix }}/../QNWFA_QNIFA_SIGMA_MONTHLY.dat" "{{ user.mesh_label }}.ugwp_oro_data.nc": "{{ platform.hrrr_fix }}/{{ user.mesh_label }}.ugwp_oro_data.nc" - "NoahmpTable.TBL": "{{ user.mpas_app }}/src/MPAS-Model/NoahmpTable.TBL" + # switching to noah - "NoahmpTable.TBL": "{{ user.mpas_app }}/src/MPAS-Model/NoahmpTable.TBL" namelist: update_values: nhyd_model: @@ -79,7 +83,7 @@ forecast: config_rayleigh_damp_u_timescale_days: 2.5 io: config_pio_num_iotasks: 64 - config_pio_stride: 125 + config_pio_stride: 150 limited_area: config_apply_lbcs: false physics: @@ -89,12 +93,14 @@ forecast: config_gvf_update: true config_convection_scheme: cu_grell_freitas config_tempo_ml_nc_pbl: true - config_lsm_scheme: sf_noahmp + config_lsm_scheme: sf_noah num_soil_layers: 4 - config_gfl_sub3d: 1 physics_lsm_noahmp: config_noahmp_iopt_crs: 2 config_noahmp_iopt_stc: 3 + printout: + config_print_global_minmax_vel: false + config_print_detailed_minmax_vel: false streams: ugwp_oro_data_in: filename_template: "{{ user.mesh_label }}.ugwp_oro_data.nc" @@ -113,6 +119,14 @@ forecast: output_interval: 06:00:00 files: - stream_list.atmosphere.diag_ugwp + restart: + mutable: false + type: "input;output" + filename_template: "restart.$Y-$M-$D_$h.$m.$s.nc" + io_type: "pnetcdf,cdf5" + input_interval: initial_only + output_interval: "06:00:00" + clobber_mode: overwrite surface: !remove lbc_in: !remove diff --git a/ush/workflows/hfip_resources.yaml b/ush/workflows/hfip_resources.yaml index b717cb82..d7a6c092 100644 --- a/ush/workflows/hfip_resources.yaml +++ b/ush/workflows/hfip_resources.yaml @@ -4,14 +4,16 @@ create_ics: execution: batchargs: cores: 1200 - walltime: "00:03:00" + walltime: "00:10:00" forecast: mpas: execution: batchargs: - cores: 8000 - walltime: "8:00:00" + nodes: 64 + tasks_per_node: 150 + cores: 9600 + walltime: "5:10:00" post: mpassit: @@ -19,4 +21,4 @@ post: batchargs: nodes: 24 cores: 1200 - walltime: "00:07:00" + walltime: "00:15:00" From 6d9c3a7fb93ae4ca4eb2c4f655858cee8b8bd81e Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Sat, 22 Nov 2025 12:47:12 +0000 Subject: [PATCH 08/42] default 12 hour length of hfip 2025 forecast --- ush/workflows/hfip_2025.yaml | 4 ++-- ush/workflows/hfip_resources.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ush/workflows/hfip_2025.yaml b/ush/workflows/hfip_2025.yaml index 0c876e3f..e7a52c4c 100644 --- a/ush/workflows/hfip_2025.yaml +++ b/ush/workflows/hfip_2025.yaml @@ -58,7 +58,7 @@ create_ics: forecast: mpas: domain: global - length: 120 + length: 12 files_to_copy: stream_list.atmosphere.diag_ugwp: "{{ user.mpas_app }}/parm/mpas/hfip_2025/stream_list.atmosphere.diag_ugwp" stream_list.atmosphere.diagnostics: "{{ user.mpas_app }}/parm/mpas/hfip_2025/stream_list.atmosphere.diagnostics" @@ -125,7 +125,7 @@ forecast: filename_template: "restart.$Y-$M-$D_$h.$m.$s.nc" io_type: "pnetcdf,cdf5" input_interval: initial_only - output_interval: "06:00:00" + output_interval: "1_00:00:00" clobber_mode: overwrite surface: !remove lbc_in: !remove diff --git a/ush/workflows/hfip_resources.yaml b/ush/workflows/hfip_resources.yaml index d7a6c092..f9fa96f5 100644 --- a/ush/workflows/hfip_resources.yaml +++ b/ush/workflows/hfip_resources.yaml @@ -13,7 +13,7 @@ forecast: nodes: 64 tasks_per_node: 150 cores: 9600 - walltime: "5:10:00" + walltime: "1:10:00" post: mpassit: From a9fe72f9d61432339681bcd2749f79809078dcbd Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Sat, 22 Nov 2025 12:47:45 +0000 Subject: [PATCH 09/42] make archive target dir if it does not exist yet --- scripts/archive_init.sh | 3 +++ scripts/archive_mpassit.sh | 3 +++ scripts/archive_upp.sh | 3 +++ 3 files changed, 9 insertions(+) diff --git a/scripts/archive_init.sh b/scripts/archive_init.sh index 52727a72..1f265859 100755 --- a/scripts/archive_init.sh +++ b/scripts/archive_init.sh @@ -16,6 +16,9 @@ copy_to_hpss() { hsi mv -f "$part" "$to" } +sleep $(( RANDOM / 30000 )).$(( RANDOM % 10000 )) +hsi mkdir "$archive_dir" || true + # This file is too large for HTAR so we copy it to HPSS via an "hsi put" init_nc=$( ls -1 $YMDH/forecast/*init.nc | head -1 ) diff --git a/scripts/archive_mpassit.sh b/scripts/archive_mpassit.sh index 5520ad4f..7236df93 100755 --- a/scripts/archive_mpassit.sh +++ b/scripts/archive_mpassit.sh @@ -19,6 +19,9 @@ archive_basename=${YMDH}-mpassit-$( date +"%Y%m%d" -d "${YYYY}-${MM}-${DD}t00:00 archive="$archive_dir/$archive_basename" listing=$( ls -1 $YMDH/mpassit/*/"$day_prefix"* ) +sleep $(( RANDOM / 30000 )).$(( RANDOM % 10000 )) +hsi mkdir "$archive_dir" || true + htar -hcpvf "$archive" $listing echo Normal completion. diff --git a/scripts/archive_upp.sh b/scripts/archive_upp.sh index 7532fa53..a1147fdb 100755 --- a/scripts/archive_upp.sh +++ b/scripts/archive_upp.sh @@ -5,6 +5,9 @@ set -xue YMDH=$1 archive_dir=$2 +sleep $(( RANDOM / 30000 )).$(( RANDOM % 10000 )) +hsi mkdir "$archive_dir" || true + archive="$archive_dir"/${YMDH}-upp.tar listing=$( From ea117649af4d87e9ff8652401edc15efd0a7844c Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Sat, 22 Nov 2025 12:48:56 +0000 Subject: [PATCH 10/42] make archive target dir if it does not exist yet --- scripts/archive_init.sh | 2 +- scripts/archive_mpassit.sh | 2 +- scripts/archive_upp.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/archive_init.sh b/scripts/archive_init.sh index 1f265859..4e68d846 100755 --- a/scripts/archive_init.sh +++ b/scripts/archive_init.sh @@ -17,7 +17,7 @@ copy_to_hpss() { } sleep $(( RANDOM / 30000 )).$(( RANDOM % 10000 )) -hsi mkdir "$archive_dir" || true +hsi mkdir -p "$archive_dir" || true # This file is too large for HTAR so we copy it to HPSS via an "hsi put" diff --git a/scripts/archive_mpassit.sh b/scripts/archive_mpassit.sh index 7236df93..850044af 100755 --- a/scripts/archive_mpassit.sh +++ b/scripts/archive_mpassit.sh @@ -20,7 +20,7 @@ archive="$archive_dir/$archive_basename" listing=$( ls -1 $YMDH/mpassit/*/"$day_prefix"* ) sleep $(( RANDOM / 30000 )).$(( RANDOM % 10000 )) -hsi mkdir "$archive_dir" || true +hsi mkdir -p "$archive_dir" || true htar -hcpvf "$archive" $listing diff --git a/scripts/archive_upp.sh b/scripts/archive_upp.sh index a1147fdb..3e785542 100755 --- a/scripts/archive_upp.sh +++ b/scripts/archive_upp.sh @@ -6,7 +6,7 @@ YMDH=$1 archive_dir=$2 sleep $(( RANDOM / 30000 )).$(( RANDOM % 10000 )) -hsi mkdir "$archive_dir" || true +hsi mkdir -p "$archive_dir" || true archive="$archive_dir"/${YMDH}-upp.tar From 9b862a6eb225636805c4f80a9c6a2e819c07a41e Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Sat, 22 Nov 2025 13:10:38 +0000 Subject: [PATCH 11/42] do not override forecast length in hfip_2025.yaml --- ush/workflows/hfip_2025.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/ush/workflows/hfip_2025.yaml b/ush/workflows/hfip_2025.yaml index e7a52c4c..eee34e3d 100644 --- a/ush/workflows/hfip_2025.yaml +++ b/ush/workflows/hfip_2025.yaml @@ -58,7 +58,6 @@ create_ics: forecast: mpas: domain: global - length: 12 files_to_copy: stream_list.atmosphere.diag_ugwp: "{{ user.mpas_app }}/parm/mpas/hfip_2025/stream_list.atmosphere.diag_ugwp" stream_list.atmosphere.diagnostics: "{{ user.mpas_app }}/parm/mpas/hfip_2025/stream_list.atmosphere.diagnostics" From 892a1e337c29e79c159748137c00811f58708b4c Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Sat, 22 Nov 2025 13:15:29 +0000 Subject: [PATCH 12/42] only archive mpassit on days with data to archive --- scripts/archive_mpassit.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/archive_mpassit.sh b/scripts/archive_mpassit.sh index 850044af..863d4f71 100755 --- a/scripts/archive_mpassit.sh +++ b/scripts/archive_mpassit.sh @@ -17,7 +17,15 @@ day_prefix=$( date +"MPAS-A_out.%Y-%m-%d" -d "${YYYY}-${MM}-${DD}t00:00:00 UTC+0 archive_basename=${YMDH}-mpassit-$( date +"%Y%m%d" -d "${YYYY}-${MM}-${DD}t00:00:00 UTC+0 + $skip_hours hours" ).tar archive="$archive_dir/$archive_basename" + +set +e listing=$( ls -1 $YMDH/mpassit/*/"$day_prefix"* ) +set -e + +if [[ "${listing:-Q}" == Q ]] ; then + echo "No files to archive for day $day_prefix this cycle" + exit 0 +fi sleep $(( RANDOM / 30000 )).$(( RANDOM % 10000 )) hsi mkdir -p "$archive_dir" || true From a46f6cc077312026353036183c967136a73aa8c5 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 24 Nov 2025 19:48:11 +0000 Subject: [PATCH 13/42] do not modify driver validation blocks in hfip parallel --- ush/workflows/hfip_2025.yaml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ush/workflows/hfip_2025.yaml b/ush/workflows/hfip_2025.yaml index eee34e3d..f4f9d4a2 100644 --- a/ush/workflows/hfip_2025.yaml +++ b/ush/workflows/hfip_2025.yaml @@ -1,9 +1,4 @@ user: - driver_validation_blocks: - - prepare_grib_ics.ungrib - - create_ics.mpas_init - - forecast.mpas - - post.upp mesh_label: x5.8060930 workflow_blocks: - cold_start.yaml From 60462e121771d06f9981286b00c834f58fd44137 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 24 Nov 2025 19:48:36 +0000 Subject: [PATCH 14/42] calculate ungrib start, step, stop at runtime --- ush/default_config.yaml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/ush/default_config.yaml b/ush/default_config.yaml index b1ddb453..b004c9de 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -7,8 +7,6 @@ user: cycle_frequency: 12 driver_validation_blocks: - - prepare_grib_ics.ungrib - - prepare_grib_lbcs.ungrib - create_ics.mpas_init - create_lbcs.mpas_init - forecast.mpas @@ -50,6 +48,9 @@ get_lbcs_data: walltime: 00:20:00 rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/{{ user.lbcs.external_model }}' prepare_grib_ics: + zero: 0 + duration_int: !int "{{ zero }}" + duration_timedelta: !timedelta "{{ duration_int }}" # ungrib settings follow UW Tools driver YAML ungrib: execution: @@ -61,12 +62,12 @@ prepare_grib_ics: - source {{ user.mpas_app }}/load_wflow_modules.sh {{ user.platform }} - conda activate ungrib executable: ungrib - gribfiles: [ do not edit ] - start: !datetime '{{ user.first_cycle }}' - step: !timedelta 6 - stop: !datetime '{{ user.first_cycle }}' rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/ungrib_ics' vtable: /path/to/user/vtable + gribfiles: [ do not edit ] + start: !datetime '{{ cycle }}' + step: !int '{{ user.lbcs.interval_hours }}' + stop: !datetime '{{ cycle + prepare_grib_ics.duration_timedelta }}' platform: account: '{{ platform.account }}' scheduler: '{{ platform.scheduler }}' @@ -76,6 +77,8 @@ prepare_grib_ics: grid_specs: "lambert:266:25.000000 234.862000:2000:3000.000000 18.281000:1450:3000.000000" grid_vectors: "UGRD:VGRD:USTM:VSTM:VUCSH:VVCSH" prepare_grib_lbcs: + duration_int: !int "{{ forecast.mpas.length }}" + duration_timedelta: !timedelta "{{ duration_int }}" # ungrib settings follow UW Tools driver YAML ungrib: execution: @@ -88,9 +91,9 @@ prepare_grib_lbcs: - conda activate ungrib executable: ungrib gribfiles: [ do not edit ] - start: !datetime '{{ user.first_cycle }}' - step: 6 - stop: !datetime '{{ user.last_cycle }}' + start: !datetime '{{ cycle }}' + step: !int '{{ user.lbcs.interval_hours }}' + stop: !datetime '{{ cycle + prepare_grib_lbcs.duration_timedelta }}' rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/ungrib_lbcs' vtable: /path/to/user/vtable platform: From 785ebc7400d5768b80a3b899f9292e76283f6bce Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 24 Nov 2025 20:48:34 +0000 Subject: [PATCH 15/42] document archiving and scrubbing --- docs/sections/user_guide/build_run.rst | 47 ++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/docs/sections/user_guide/build_run.rst b/docs/sections/user_guide/build_run.rst index bf151ca0..adaf724e 100644 --- a/docs/sections/user_guide/build_run.rst +++ b/docs/sections/user_guide/build_run.rst @@ -127,3 +127,50 @@ Post-Processing --------------- ``MPASSIT`` and ``UPP`` are included as submodules on Jet and Hera. Configure them via the user YAML using the same nested structure as above. + +Archiving and Scrubbing +----------------------- + +For any experiment of non-trivial size, automatically scrubbing the data is a good practice. +Presently, archiving and scrubbing must be used at the same time; this may be changed in a future release. +The reason scrubbing can't be run alone is that the workflow has no way to determine when you're +done with the data, except by archiving it. + +To enable both archiving and scrubbing, add these lines: + +.. code-block: yaml + user: + hpss_archive_dir: /a/path/on/hpss + workflow_blocks: + - archiving.yaml + - scrubbing.yaml + + +You must replace ``/a/path/on/hpss`` with a valid path on an HPSS archiving system. +The scripts will use ``hsi`` and ``htar`` to write the data. If the directory doesn't exist, +the scripts will try to create it. + +Archives are split by purpose. In these scripts, ``{CYCLE_YMDH}`` corresponds to the cycle date and time in ten digits; November 14, 2025 at 18:00 UTC would be 2025091418. The ``{FORECAST_YMD}` corresponds to the forecast date as eight digits; November 14, 2025 would be 20250914. + +- ``{CYCLE_YMDH}-upp.tar`` - All grib files output by UPP and all small control files input to it. Excludes the combined grib since that is simply the concatenation of UPP output. +- ``{CYCLE_YMDH}-mpassit-{FORECAST_YMD}.tar`` - All mpassit files from forecast lead times on a given day. This is split by day because of limitations of HTAR. +- ``init*.nc`` - Not an archive; it is copied directly due to limitations of HTAR. This is the initial state from the forecast directory. +- ``init*.nc.md5`` - An md5sum of the init file. + +Archiving (see ``parm/wflow/archiving.yaml``) is split into one job per archive: + +- task ``archive_upp`` - archives UPP output to ``{CYCLE_YMDH}-upp.tar`` +- metatask of ``archive_mpassit_dayN`` - archives mpassit output to ``{CYCLE_YMDH}-mpassit-{FORECAST_YMD}.tar`` +- task ``archive_init`` - archives the init file from the forecast directory and calculates its md5sum + +Scrubbing (see ``parm/wflow/scrubbing.yaml``) is split by file purpose: + +- task ``scrub_forecast`` - Deletes all diag, history, and restart files from the forecast directory. +- task ``scrub_mpas_ics`` - Deltes the mpas_ics directory. +- task ``scrub_mpassit`` - Deletes the mpassit directories. +- task ``scrub_init`` - Deletes the init file from the forecast directory. + +To disable certain archiving or scrubbing steps, we recommend you edit the relevant file to disable them. +These are ``parm/wflow/archiving.yaml`` for archiving and ``parm/wflow/scrubbing.yaml`` for scrubbing. +It is possible to achieve this through ``!remove`` statements, but the dependencies for scrubbing will +not update if an archiving step is removed. \ No newline at end of file From c3e5b941812377ded22de285a403a7013287fcd4 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 24 Nov 2025 21:08:06 +0000 Subject: [PATCH 16/42] revert ungrib fix --- ush/default_config.yaml | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/ush/default_config.yaml b/ush/default_config.yaml index b004c9de..33127e0c 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -7,6 +7,8 @@ user: cycle_frequency: 12 driver_validation_blocks: + - prepare_grib_ics.ungrib + - prepare_grib_lbcs.ungrib - create_ics.mpas_init - create_lbcs.mpas_init - forecast.mpas @@ -48,9 +50,6 @@ get_lbcs_data: walltime: 00:20:00 rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/{{ user.lbcs.external_model }}' prepare_grib_ics: - zero: 0 - duration_int: !int "{{ zero }}" - duration_timedelta: !timedelta "{{ duration_int }}" # ungrib settings follow UW Tools driver YAML ungrib: execution: @@ -65,9 +64,9 @@ prepare_grib_ics: rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/ungrib_ics' vtable: /path/to/user/vtable gribfiles: [ do not edit ] - start: !datetime '{{ cycle }}' - step: !int '{{ user.lbcs.interval_hours }}' - stop: !datetime '{{ cycle + prepare_grib_ics.duration_timedelta }}' + start: !datetime '{{ user.first_cycle }}' + step: !timedelta 6 + stop: !datetime '{{ user.first_cycle }}' platform: account: '{{ platform.account }}' scheduler: '{{ platform.scheduler }}' @@ -77,8 +76,6 @@ prepare_grib_ics: grid_specs: "lambert:266:25.000000 234.862000:2000:3000.000000 18.281000:1450:3000.000000" grid_vectors: "UGRD:VGRD:USTM:VSTM:VUCSH:VVCSH" prepare_grib_lbcs: - duration_int: !int "{{ forecast.mpas.length }}" - duration_timedelta: !timedelta "{{ duration_int }}" # ungrib settings follow UW Tools driver YAML ungrib: execution: @@ -91,9 +88,9 @@ prepare_grib_lbcs: - conda activate ungrib executable: ungrib gribfiles: [ do not edit ] - start: !datetime '{{ cycle }}' - step: !int '{{ user.lbcs.interval_hours }}' - stop: !datetime '{{ cycle + prepare_grib_lbcs.duration_timedelta }}' + start: !datetime '{{ user.first_cycle }}' + step: 6 + stop: !datetime '{{ user.last_cycle }}' rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/ungrib_lbcs' vtable: /path/to/user/vtable platform: From d0a58a3a6aab281679f02a7170ae3fbe74103f71 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 24 Nov 2025 21:26:53 +0000 Subject: [PATCH 17/42] merge PR #98 with ungrib fix --- environment.yml | 3 ++- ush/default_config.yaml | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/environment.yml b/environment.yml index 06db17a5..02ba9fa3 100644 --- a/environment.yml +++ b/environment.yml @@ -3,6 +3,7 @@ channels: - conda-forge - ufs-community dependencies: - - metis ==5.1.0.* + - iotaa==1.3.* + - metis==5.1.0.* - pydantic==2.11.* - uwtools==2.9.* diff --git a/ush/default_config.yaml b/ush/default_config.yaml index 33127e0c..751fcd23 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -27,6 +27,7 @@ user: offset_hours: 0 forecast: output_interval: 6 + length: !timedelta "{{ forecast.mpas.length }}" mesh_label: hrrrv5 platform: big_computer workflow_blocks: @@ -64,9 +65,9 @@ prepare_grib_ics: rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/ungrib_ics' vtable: /path/to/user/vtable gribfiles: [ do not edit ] - start: !datetime '{{ user.first_cycle }}' + start: !datetime '{{ cycle }}' step: !timedelta 6 - stop: !datetime '{{ user.first_cycle }}' + stop: !datetime '{{ cycle }}' platform: account: '{{ platform.account }}' scheduler: '{{ platform.scheduler }}' @@ -88,9 +89,9 @@ prepare_grib_lbcs: - conda activate ungrib executable: ungrib gribfiles: [ do not edit ] - start: !datetime '{{ user.first_cycle }}' + start: !datetime '{{ cycle }}' step: 6 - stop: !datetime '{{ user.last_cycle }}' + stop: !datetime '{{ cycle + user.forecast.length }}' rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/ungrib_lbcs' vtable: /path/to/user/vtable platform: From 1e3a42df6e0db8627ab1919e6731bccfcc0537c2 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 24 Nov 2025 21:48:33 +0000 Subject: [PATCH 18/42] revert accidental change --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 16355071..ea4f9a82 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,3 @@ /include/ /lib/ __pycache__ -*~ \ No newline at end of file From cc577070eba9532f1b9360a42873d774b863605c Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 24 Nov 2025 22:03:46 +0000 Subject: [PATCH 19/42] delete unneeded comment --- ush/workflows/hfip_2025.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/ush/workflows/hfip_2025.yaml b/ush/workflows/hfip_2025.yaml index f4f9d4a2..68bdd8b3 100644 --- a/ush/workflows/hfip_2025.yaml +++ b/ush/workflows/hfip_2025.yaml @@ -62,7 +62,6 @@ forecast: CCN_ACTIVATE.BIN: !remove QNWFA_QNIFA_SIGMA_MONTHLY.dat: "{{ platform.hrrr_fix }}/../QNWFA_QNIFA_SIGMA_MONTHLY.dat" "{{ user.mesh_label }}.ugwp_oro_data.nc": "{{ platform.hrrr_fix }}/{{ user.mesh_label }}.ugwp_oro_data.nc" - # switching to noah - "NoahmpTable.TBL": "{{ user.mpas_app }}/src/MPAS-Model/NoahmpTable.TBL" namelist: update_values: nhyd_model: From b2c5303d8d98e8e4f25a35a44a9945185b866447 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 24 Nov 2025 22:18:16 +0000 Subject: [PATCH 20/42] better documentation of disabling scrubber & archiver steps --- docs/sections/user_guide/build_run.rst | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/sections/user_guide/build_run.rst b/docs/sections/user_guide/build_run.rst index adaf724e..49aad9e4 100644 --- a/docs/sections/user_guide/build_run.rst +++ b/docs/sections/user_guide/build_run.rst @@ -170,7 +170,13 @@ Scrubbing (see ``parm/wflow/scrubbing.yaml``) is split by file purpose: - task ``scrub_mpassit`` - Deletes the mpassit directories. - task ``scrub_init`` - Deletes the init file from the forecast directory. -To disable certain archiving or scrubbing steps, we recommend you edit the relevant file to disable them. -These are ``parm/wflow/archiving.yaml`` for archiving and ``parm/wflow/scrubbing.yaml`` for scrubbing. -It is possible to achieve this through ``!remove`` statements, but the dependencies for scrubbing will -not update if an archiving step is removed. \ No newline at end of file +To disable scrubbing steps, use the ``!remove`` feature. For example, this disables scrubbing the forecast directory: + +.. code-block: yaml + workflow: + tasks: + task_scrub_forecast: !remove + +See ``parm/wflow/scrubbing.yaml`` for a list of tasks. + +Removing archiving steps has two steps. First, use ``!remove`` to remove tasks (see ``parm/wflow/archiving.yaml`` for a list). Then edit ``parm/wflow/scrubbing.yaml`` to remove any dependencies on the task. From bb3cb11daae2d9e2e0d340e49266de2dd610b85d Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Tue, 25 Nov 2025 12:50:06 +0000 Subject: [PATCH 21/42] New default cycles of hfip_2025: two days of Hurricane Erin --- ush/workflows/hfip_2025.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ush/workflows/hfip_2025.yaml b/ush/workflows/hfip_2025.yaml index 68bdd8b3..5b498ed9 100644 --- a/ush/workflows/hfip_2025.yaml +++ b/ush/workflows/hfip_2025.yaml @@ -6,6 +6,8 @@ user: - graphics.yaml - scrubbing.yaml - archiving.yaml + first_cycle: !!timestamp 2025-08-14T00:00:00 + last_cycle: !!timestamp 2025-08-15T00:00:00 workflow: tasks: From b6ad085db365f80ca1c0490de134a46012c5443e Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Tue, 25 Nov 2025 12:50:25 +0000 Subject: [PATCH 22/42] remove unneeded sleeps --- scripts/archive_init.sh | 1 - scripts/archive_mpassit.sh | 1 - scripts/archive_upp.sh | 1 - 3 files changed, 3 deletions(-) diff --git a/scripts/archive_init.sh b/scripts/archive_init.sh index 4e68d846..92b844ed 100755 --- a/scripts/archive_init.sh +++ b/scripts/archive_init.sh @@ -16,7 +16,6 @@ copy_to_hpss() { hsi mv -f "$part" "$to" } -sleep $(( RANDOM / 30000 )).$(( RANDOM % 10000 )) hsi mkdir -p "$archive_dir" || true # This file is too large for HTAR so we copy it to HPSS via an "hsi put" diff --git a/scripts/archive_mpassit.sh b/scripts/archive_mpassit.sh index 863d4f71..54fac5e7 100755 --- a/scripts/archive_mpassit.sh +++ b/scripts/archive_mpassit.sh @@ -27,7 +27,6 @@ if [[ "${listing:-Q}" == Q ]] ; then exit 0 fi -sleep $(( RANDOM / 30000 )).$(( RANDOM % 10000 )) hsi mkdir -p "$archive_dir" || true htar -hcpvf "$archive" $listing diff --git a/scripts/archive_upp.sh b/scripts/archive_upp.sh index 3e785542..cb49f2bb 100755 --- a/scripts/archive_upp.sh +++ b/scripts/archive_upp.sh @@ -5,7 +5,6 @@ set -xue YMDH=$1 archive_dir=$2 -sleep $(( RANDOM / 30000 )).$(( RANDOM % 10000 )) hsi mkdir -p "$archive_dir" || true archive="$archive_dir"/${YMDH}-upp.tar From 146dff71c9340c1465e04cbff54f41a64a5e1a03 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Tue, 25 Nov 2025 12:50:50 +0000 Subject: [PATCH 23/42] remove some environment variables --- parm/wflow/archiving.yaml | 20 +++++--------------- parm/wflow/scrubbing.yaml | 32 ++++++++++++-------------------- 2 files changed, 17 insertions(+), 35 deletions(-) diff --git a/parm/wflow/archiving.yaml b/parm/wflow/archiving.yaml index a6b0eb40..317229ad 100644 --- a/parm/wflow/archiving.yaml +++ b/parm/wflow/archiving.yaml @@ -1,4 +1,6 @@ workflow: + entities: + ARCHIVE_DIR: '{{ user.hpss_archive_dir }}' tasks: metatask_archive_mpassit: var: @@ -8,7 +10,7 @@ workflow: cyclestr: value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && cd {{ user.experiment_dir }} && - &MPAS_APP;/scripts/archive_mpassit.sh #day# @Y@m@d@H "$ARCHIVE_DIR"' + &MPAS_APP;/scripts/archive_mpassit.sh #day# @Y@m@d@H "&ARCHIVE_DIR;"' account: "{{ platform.account }}" partition: "{{ platform.service_partition }}" join: @@ -16,10 +18,6 @@ workflow: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H_day#day#.log' walltime: "{{ archiving.mpassit.execution.walltime }}" cores: 1 - envars: - ARCHIVE_DIR: - cyclestr: - value: '{{ user.hpss_archive_dir }}' dependency: metataskdep: attrs: @@ -30,7 +28,7 @@ workflow: cyclestr: value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && cd {{ user.experiment_dir }} && - &MPAS_APP;/scripts/archive_upp.sh @Y@m@d@H "$ARCHIVE_DIR"' + &MPAS_APP;/scripts/archive_upp.sh @Y@m@d@H "&ARCHIVE_DIR;"' account: "{{ platform.account }}" partition: "{{ platform.service_partition }}" join: @@ -38,10 +36,6 @@ workflow: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' walltime: "{{ archiving.upp.execution.walltime }}" cores: 1 - envars: - ARCHIVE_DIR: - cyclestr: - value: '{{ user.hpss_archive_dir }}' dependency: metataskdep: attrs: @@ -52,7 +46,7 @@ workflow: cyclestr: value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && cd {{ user.experiment_dir }} && - &MPAS_APP;/scripts/archive_init.sh @Y@m@d@H "$ARCHIVE_DIR"' + &MPAS_APP;/scripts/archive_init.sh @Y@m@d@H "&ARCHIVE_DIR;"' account: "{{ platform.account }}" partition: "{{ platform.service_partition }}" join: @@ -60,10 +54,6 @@ workflow: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' walltime: "{{ archiving.init.execution.walltime }}" cores: 1 - envars: - ARCHIVE_DIR: - cyclestr: - value: '{{ user.hpss_archive_dir }}' dependency: or: taskdep: diff --git a/parm/wflow/scrubbing.yaml b/parm/wflow/scrubbing.yaml index 6325bf0f..e73492fa 100644 --- a/parm/wflow/scrubbing.yaml +++ b/parm/wflow/scrubbing.yaml @@ -1,7 +1,9 @@ workflow: tasks: task_scrub_forecast: - command: 'set -xue ; cd "$SCRUB_PARENT" ; rm -f forecast/diag*nc forecast/history*nc forecast/restart*nc' + command: + cyclestr: + value: 'set -xue ; rm -f "{{ user.experiment_dir }}/@Y@m@d@H/forecast"/{diag,history,restart}*nc' account: "{{ platform.account }}" partition: "{{ platform.service_partition }}" join: @@ -9,16 +11,14 @@ workflow: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' walltime: "{{ scrubber.execution.walltime }}" cores: !int "{{ scrubber.execution.cores }}" - envars: - SCRUB_PARENT: - cyclestr: - value: "{{ user.experiment_dir }}/@Y@m@d@H/" dependency: metataskdep: attrs: metatask: post task_scrub_mpas_ics: - command: 'set -xue ; cd "$SCRUB_PARENT" ; rm -rf mpas_ics' + command: + cyclestr: + value: 'set -xue ; rm -rf "{{ user.experiment_dir }}/@Y@m@d@H/mpas_ics"' account: "{{ platform.account }}" partition: "{{ platform.service_partition }}" join: @@ -26,16 +26,14 @@ workflow: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' walltime: "{{ scrubber.execution.walltime }}" cores: !int "{{ scrubber.execution.cores }}" - envars: - SCRUB_PARENT: - cyclestr: - value: "{{ user.experiment_dir }}/@Y@m@d@H/" dependency: metataskdep_post: attrs: metatask: post task_scrub_mpassit: - command: 'set -xue ; cd "$SCRUB_PARENT" ; rm -rf mpassit' + command: + cyclestr: + value: 'set -xue ; rm -rf "{{ user.experiment_dir }}/@Y@m@d@H/mpassit"' account: "{{ platform.account }}" partition: "{{ platform.service_partition }}" join: @@ -43,10 +41,6 @@ workflow: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' walltime: "{{ scrubber.execution.walltime }}" cores: !int "{{ scrubber.execution.cores }}" - envars: - SCRUB_PARENT: - cyclestr: - value: "{{ user.experiment_dir }}/@Y@m@d@H/" dependency: and: metataskdep_post: @@ -56,7 +50,9 @@ workflow: attrs: metatask: archive_mpassit task_scrub_init: - command: 'set -xue ; cd "$SCRUB_PARENT" ; rm -f forecast/*init*nc' + command: + cyclestr: + value: 'set -xue ; rm -rf "{{ user.experiment_dir }}/@Y@m@d@H/forecast"/*init*nc' account: "{{ platform.account }}" partition: "{{ platform.service_partition }}" join: @@ -64,10 +60,6 @@ workflow: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' walltime: "{{ scrubber.execution.walltime }}" cores: !int "{{ scrubber.execution.cores }}" - envars: - SCRUB_PARENT: - cyclestr: - value: "{{ user.experiment_dir }}/@Y@m@d@H/" dependency: and: metataskdep: From 083da3e5d0f730f8b46eb09b2a7d65d33edf219e Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Tue, 25 Nov 2025 17:58:11 +0000 Subject: [PATCH 24/42] put the tracker scripts back in --- parm/wflow/archiving_tracker.yaml | 19 +++ parm/wflow/tracker.yaml | 39 +++++ scripts/archive_tracker.sh | 11 ++ scripts/run_tracker.sh | 268 ++++++++++++++++++++++++++++++ ush/default_config.yaml | 17 ++ 5 files changed, 354 insertions(+) create mode 100644 parm/wflow/archiving_tracker.yaml create mode 100644 parm/wflow/tracker.yaml create mode 100755 scripts/archive_tracker.sh create mode 100755 scripts/run_tracker.sh diff --git a/parm/wflow/archiving_tracker.yaml b/parm/wflow/archiving_tracker.yaml new file mode 100644 index 00000000..5092cd2e --- /dev/null +++ b/parm/wflow/archiving_tracker.yaml @@ -0,0 +1,19 @@ +workflow: + tasks: + task_archive_tracker: + command: + cyclestr: + value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + cd {{ user.experiment_dir }} && + &MPAS_APP;/scripts/archive_tracker.sh @Y@m@d@H "&ARCHIVE_DIR;"' + account: "{{ platform.account }}" + partition: "{{ platform.service_partition }}" + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' + walltime: "{{ archiving.tracker.execution.walltime }}" + cores: 1 + dependency: + taskdep: + attrs: + task: tracker diff --git a/parm/wflow/tracker.yaml b/parm/wflow/tracker.yaml new file mode 100644 index 00000000..e6e75eb2 --- /dev/null +++ b/parm/wflow/tracker.yaml @@ -0,0 +1,39 @@ +workflow: + tasks: + task_tracker: + command: + cyclestr: + value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + cd {{ user.experiment_dir }}/@Y@m@d@H && + &MPAS_APP;/scripts/run_tracker.sh @Y@m@d@H' + account: "{{ platform.account }}" + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' + walltime: "{{ tracker.execution.batchargs.walltime }}" + nodes: "{{ tracker.execution.batchargs.nodes }}:ppn={{ tracker.execution.batchargs.tasks_per_node }}" + exclusive: "True" + partition: "{{ post.upp.execution.batchargs.partition }}" + envars: + TRACKER_DIR: + cyclestr: + value: '{{ tracker.execution.tracker_dir }}' + MPISERIAL: + cyclestr: + value: '{{ tracker.execution.mpiserial }}' + SYNDAT_PREFIX: + cyclestr: + value: '{{ tracker.execution.syndat_prefix }}' + MPICMD: + cyclestr: + value: '{{ tracker.execution.mpicmd }}' + FHOUR_STEP: + cyclestr: + value: '{{ tracker.execution.fhour_step }}' + FORECAST_LENGTH: + cyclestr: + value: '{{ forecast.mpas.length }}' + dependency: + metataskdep: + attrs: + metatask: post diff --git a/scripts/archive_tracker.sh b/scripts/archive_tracker.sh new file mode 100755 index 00000000..844a6891 --- /dev/null +++ b/scripts/archive_tracker.sh @@ -0,0 +1,11 @@ +#! /bin/bash + +set -xue + +YMDH=$1 +archive_dir=$2 + +archive="$archive_dir"/${YMDH}-tracker.tar +htar -hcpvf "$archive" $YMDH/tracker/* + +echo Normal completion. diff --git a/scripts/run_tracker.sh b/scripts/run_tracker.sh new file mode 100755 index 00000000..b77996bc --- /dev/null +++ b/scripts/run_tracker.sh @@ -0,0 +1,268 @@ +#! /bin/bash + +set -ue + +module purge +module use "$TRACKER_DIR/modulefiles" +module load ursa +module load wgrib2 +module load grib-util +module list + +set -x + +ymdh="$1" +mpas_upp=../upp +syndat_prefix="$SYNDAT_PREFIX" +fhour_start=0 +fhour_step="$FHOUR_STEP" +fhour_last="$FORECAST_LENGTH" +grid="-new_grid latlon -100:3333:0.03 -10:2666:0.03" +tracker="$TRACKER_DIR/exec/gettrk.x" +mpiserial="$MPISERIAL" +mpicmd="$MPICMD" + +rm -rf tracker +mkdir tracker +cd tracker + +#### + +ulimit -s unlimited + +CC=${ymdh:0:2} +YY=${ymdh:2:2} +MM=${ymdh:4:2} +DD=${ymdh:6:2} +HH=${ymdh:8:2} + +syndat=${syndat_prefix}.$CC$YY +if ( ! grep -E "^.....[0-49][0-9]L ......... $CC$YY$MM$DD $HH" $syndat > allvit ) ; then + echo "No Atlantic storms. There is nothing to track." + echo "Delivering an empty track." + cat /dev/null > mpas.trak.atcfunix + exit 0 +fi +ln -sf allvit tcvit_rsmc_storms.txt + +opts='-set_grib_type c2 -new_grid_winds grid -new_grid_vectors "UGRD:VGRD" -new_grid_interpolation neighbor' + +PARMlistp1="UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m a|VGRD:10 m a|ABSV:850|ABSV:700|MSLET|MSLP|MSLMA|mean sea|sea level" +PARMlistp2="HGT:900|HGT:850|HGT:800|HGT:750|HGT:700|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400" +PARMlistp3="HGT:350|HGT:300|HGT:250|HGT:200|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300|TMP:250|TMP:200" +PARMlist=${PARMlistp1}"|"${PARMlistp2}"|"${PARMlistp3} + +rm -f ../fort.15 # list of forecast minutes + +i=0 +for fhr in $( seq $fhour_start $fhour_step $fhour_last ) ; do + i=$(( i + 1 )) + fmin=$(( fhr * 60 )) + printf '%4d %5d\n' $i $fmin >> fort.15 + + grib2d=$( printf "%s/%03d/%s%02d" "$mpas_upp" $fhr "2DFLD.GrbF" $fhr ) + gribprs=$( printf "%s/%03d/%s%02d" "$mpas_upp" $fhr "PRSLEV.GrbF" $fhr ) + + if [[ ! -s "$grib2d" || ! -s "$gribprs" ]] ; then + echo "No file at time $fhr" 1>&2 + break + fi + + latlon2d=$( printf latlon_2d_%03d.grb2 $fhr ) + latlonprs=$( printf latlon_prs_%03d.grb2 $fhr ) + final=$( printf mpas.trak.all.$CC$YY$MM$DD$HH.f$( printf %05d $fmin ) ) + + echo wgrib2 -s $grib2d \| grep -E "'$PARMlist'" \| wgrib2 -i $grib2d $opts -new_grid latlon -100:3333:0.03 -10:2666:0.03 $latlon2d >> cmdfile1 + echo wgrib2 -s $gribprs \| grep -E "'$PARMlist'" \| wgrib2 -i $gribprs $opts -new_grid latlon -100:3333:0.03 -10:2666:0.03 $latlonprs >> cmdfile1 + + echo "cat $latlon2d $latlonprs > $final ; grb2index $final $final.ix" >> cmdfile2 +done + +# Subset the grib files: +time $mpicmd "$mpiserial" -m cmdfile1 < /dev/null + +# Merge 2d and pressure grib files. Generate index files. +time $mpicmd "$mpiserial" -m cmdfile2 < /dev/null + +rm -f latlon_2d* latlon_prs* + +cat< namelist.gettrk +&datein + inp%bcc = ${CC} + inp%byy = ${YY} + inp%bmm = ${MM} + inp%bdd = ${DD} + inp%bhh = ${HH} + inp%model = 17 + inp%modtyp = 'regional' + inp%lt_units = 'hours' + inp%file_seq = 'multi' + inp%nesttyp = 'fixed' +/ + +&atcfinfo + atcfnum = 81 + atcfname = 'MPAS' + atcfymdh = ${CC}${YY}${MM}${DD}${HH} + atcffreq = 100 +/ + +&trackerinfo + trkrinfo%eastbd = 3313, + trkrinfo%westbd = 20, + trkrinfo%northbd = 2646, + trkrinfo%southbd = 20, + trkrinfo%contint = 100.0 + trkrinfo%type = 'tracker' + trkrinfo%mslpthresh = 0.0015 + trkrinfo%use_backup_mslp_grad_check = 'y' + trkrinfo%v850thresh = 1.5 + trkrinfo%v850_qwc_thresh = 1.0 + trkrinfo%use_backup_850_vt_check = 'y' + trkrinfo%enable_timing = 1 + trkrinfo%gridtype = 'regional' + trkrinfo%want_oci = .true. + trkrinfo%out_vit = 'n' + trkrinfo%use_land_mask = 'y' + trkrinfo%read_separate_land_mask_file = 'n' + trkrinfo%inp_data_type = 'grib' + trkrinfo%gribver = 2 + trkrinfo%g2_jpdtn = 0 + trkrinfo%g2_mslp_parm_id = 198 + trkrinfo%g1_mslp_parm_id = 2 + trkrinfo%g1_sfcwind_lev_typ = 105 + trkrinfo%g1_sfcwind_lev_val = 10 + trkrinfo%max_mslp_850 = 400.0 +/ + +&phaseinfo + phaseflag = 'y' + phasescheme = 'both' + wcore_depth = 1.0 +/ + +&structinfo + structflag = 'n' + ikeflag = 'n' + radii_pctile = 95.0 + radii_free_pass_pctile = 67.0 + radii_width_thresh = 15.0 +/ + +&fnameinfo + gmodname = 'mpas' + rundescr = 'trak' + atcfdescr = 'all' +/ + +&cintinfo + contint_grid_bound_check = 50.0 +/ + +&waitinfo + use_waitfor = 'n' + use_per_fcst_command = 'n' +/ + +&netcdflist + netcdfinfo%num_netcdf_vars = , + netcdfinfo%netcdf_filename = '' + netcdfinfo%netcdf_lsmask_filename = '' + netcdfinfo%rv850name = '' + netcdfinfo%rv700name = '' + netcdfinfo%u850name = '' + netcdfinfo%v850name = '' + netcdfinfo%u700name = '' + netcdfinfo%v700name = '' + netcdfinfo%z850name = '' + netcdfinfo%z700name = '' + netcdfinfo%mslpname = '' + netcdfinfo%usfcname = '' + netcdfinfo%vsfcname = '' + netcdfinfo%u500name = '' + netcdfinfo%v500name = '' + netcdfinfo%u200name = '' + netcdfinfo%v200name = '' + netcdfinfo%tmean_300_500_name = '' + netcdfinfo%z500name = '' + netcdfinfo%z200name = '' + netcdfinfo%lmaskname = '' + netcdfinfo%z900name = '' + netcdfinfo%z800name = '' + netcdfinfo%z750name = '' + netcdfinfo%z650name = '' + netcdfinfo%z600name = '' + netcdfinfo%z550name = '' + netcdfinfo%z450name = '' + netcdfinfo%z400name = '' + netcdfinfo%z350name = '' + netcdfinfo%z300name = '' + netcdfinfo%time_name = '' + netcdfinfo%lon_name = '' + netcdfinfo%lat_name = '' + netcdfinfo%time_units = '' + netcdfinfo%sstname = '' + netcdfinfo%q850name = '' + netcdfinfo%rh1000name = '' + netcdfinfo%rh925name = '' + netcdfinfo%rh800name = '' + netcdfinfo%rh750name = '' + netcdfinfo%rh700name = '' + netcdfinfo%rh650name = '' + netcdfinfo%rh600name = '' + netcdfinfo%spfh1000name = '' + netcdfinfo%spfh925name = '' + netcdfinfo%spfh800name = '' + netcdfinfo%spfh750name = '' + netcdfinfo%spfh700name = '' + netcdfinfo%spfh650name = '' + netcdfinfo%spfh600name = '' + netcdfinfo%temp1000name = '' + netcdfinfo%temp925name = '' + netcdfinfo%temp800name = '' + netcdfinfo%temp750name = '' + netcdfinfo%temp700name = '' + netcdfinfo%temp650name = '' + netcdfinfo%temp600name = '' + netcdfinfo%omega500name = '' +/ + +&parmpreflist + user_wants_to_track_zeta700 = 'y' + user_wants_to_track_wcirc850 = 'y' + user_wants_to_track_wcirc700 = 'y' + user_wants_to_track_gph850 = 'y' + user_wants_to_track_gph700 = 'y' + user_wants_to_track_mslp = 'y' + user_wants_to_track_wcircsfc = 'y' + user_wants_to_track_zetasfc = 'y' + user_wants_to_track_thick500850 = 'n' + user_wants_to_track_thick200500 = 'n' + user_wants_to_track_thick200850 = 'n' + user_wants_to_track_zeta850 = 'y' +/ + +&verbose + verb = 3 + verb_g2 = 0 +/ + +&sheardiaginfo + shearflag = 'y' +/ + +&sstdiaginfo + sstflag = 'y' +/ + +&gendiaginfo + genflag = 'n' + gen_read_rh_fields = '' +/ +EOF + +time $mpicmd -n 1 "$tracker" < /dev/null 2>&1 | tee tracker.log + +cat fort.68 > mpas.trak.atcfunix + +echo Normal completion. diff --git a/ush/default_config.yaml b/ush/default_config.yaml index 7f2b0695..fac87b09 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -449,6 +449,20 @@ post: nampgb: numx: 2 rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/{{ "%03d" % (leadtime.total_seconds() / 3600) }}' +tracker: + control_file: "{{ user.mpas_app }}/parm/upp/postxconfig-NT-rrfs_mpas.txt" + execution: + batchargs: + walltime: 00:12:00 + nodes: 1 + tasks_per_node: 32 + fhour_step: 6 + native: + - --exclusive + tracker_dir: /scratch3/BMC/wrfruc/Samuel.Trahan/mpashfip/tracker-hafs-211 + mpiserial: /scratch3/BMC/gsd-fv3-dev/role.rtgsd-fv3-dev/merge-hafs-and-gfs/mpiserial/mpiserial + syndat_prefix: /scratch3/HFIP/hwrfv3/noscrub/input/SYNDAT-PLUS/syndat_tcvitals + mpicmd: 'srun -l' graphics: # the graphics task calls a bash run script that runs pygraf execution: @@ -479,6 +493,9 @@ archiving: upp: execution: walltime: 02:59:00 + tracker: + execution: + walltime: 00:29:00 init: execution: walltime: 02:59:00 From 3a56ef8b2243ca644cc149a25028ea94a8649240 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Tue, 25 Nov 2025 19:21:32 +0000 Subject: [PATCH 25/42] Use hafs-community for tracker, branch feature/hafsv2p2_baseline --- .gitmodules | 4 ++++ src/GFDL-VortexTracker | 1 + 2 files changed, 5 insertions(+) create mode 160000 src/GFDL-VortexTracker diff --git a/.gitmodules b/.gitmodules index a45d4201..ea6c492f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,7 @@ [submodule "ush/pygraf"] path = ush/pygraf url = https://github.com/NOAA-GSL/pygraf.git +[submodule "src/GFDL-VortexTracker"] + path = src/GFDL-VortexTracker + url = https://github.com/hafs-community/gfdl-tracker + branch = feature/hafsv2p2_baseline diff --git a/src/GFDL-VortexTracker b/src/GFDL-VortexTracker new file mode 160000 index 00000000..3c15fb92 --- /dev/null +++ b/src/GFDL-VortexTracker @@ -0,0 +1 @@ +Subproject commit 3c15fb92144bac7e1796e0fe4aa866996b71f075 From 6225783f28ae19e7a11879568d998a9b7cd518e1 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Tue, 25 Nov 2025 19:59:47 +0000 Subject: [PATCH 26/42] remove envars from tracker job in yaml --- parm/wflow/tracker.yaml | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/parm/wflow/tracker.yaml b/parm/wflow/tracker.yaml index e6e75eb2..3b072c42 100644 --- a/parm/wflow/tracker.yaml +++ b/parm/wflow/tracker.yaml @@ -3,8 +3,14 @@ workflow: task_tracker: command: cyclestr: - value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && - cd {{ user.experiment_dir }}/@Y@m@d@H && + value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + cd {{ user.experiment_dir }}/@Y@m@d@H && + /usr/bin/env TRACKER_DIR="&MPAS_APP;" + MPISERIAL="{{ tracker.execution.mpiserial }}" + SYNDAT_PREFIX="{{ tracker.execution.syndat_prefix }}" + MPICMD="{{ tracker.execution.mpicmd }} + FHOUR_STEP="{{ tracker.execution.fhour_step }}" + FORECAST_LENGTH="{{ forecast.mpas.length }}" &MPAS_APP;/scripts/run_tracker.sh @Y@m@d@H' account: "{{ platform.account }}" join: @@ -14,25 +20,6 @@ workflow: nodes: "{{ tracker.execution.batchargs.nodes }}:ppn={{ tracker.execution.batchargs.tasks_per_node }}" exclusive: "True" partition: "{{ post.upp.execution.batchargs.partition }}" - envars: - TRACKER_DIR: - cyclestr: - value: '{{ tracker.execution.tracker_dir }}' - MPISERIAL: - cyclestr: - value: '{{ tracker.execution.mpiserial }}' - SYNDAT_PREFIX: - cyclestr: - value: '{{ tracker.execution.syndat_prefix }}' - MPICMD: - cyclestr: - value: '{{ tracker.execution.mpicmd }}' - FHOUR_STEP: - cyclestr: - value: '{{ tracker.execution.fhour_step }}' - FORECAST_LENGTH: - cyclestr: - value: '{{ forecast.mpas.length }}' dependency: metataskdep: attrs: From dd920781dee3411aeb18867065657d7d7588beb1 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Tue, 25 Nov 2025 20:05:10 +0000 Subject: [PATCH 27/42] build.sh builds the tracker --- build.sh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/build.sh b/build.sh index 237b0468..e40169bd 100755 --- a/build.sh +++ b/build.sh @@ -146,6 +146,21 @@ install_upp () { ) } +install_tracker () { + echo "=> Building the GFDL Vortex Tracker" + ( + cd "$MPAS_APP_DIR/src/GFDL-VortexTracker/src/" + if [[ "$DEBUG" == false ]] ; then + export BUILD_TYPE=Release + else + export BUILD_TYPE=Debug + fi + ./build_all_cmake.sh + mkdir "$MPAS_APP_DIR/exec" + cp -v ../exec/*.x "$MPAS_APP_DIR/exec/." + ) +} + prepare_conda () { install_conda test $CONDA_ONLY == true && exit 0 @@ -304,4 +319,5 @@ install_mpas init_atmosphere install_mpas atmosphere install_mpassit install_upp +install_tracker echo "=> Ready" From 9367c6698296b2a6f909f567b004a2bf3f98a433 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Tue, 25 Nov 2025 21:03:04 +0000 Subject: [PATCH 28/42] address reviewer comments --- parm/wflow/archiving.yaml | 8 ++++---- parm/wflow/post.yaml | 2 +- ush/default_config.yaml | 8 ++++---- ush/output_is_available_for.sh | 6 +----- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/parm/wflow/archiving.yaml b/parm/wflow/archiving.yaml index 317229ad..ffc1a41a 100644 --- a/parm/wflow/archiving.yaml +++ b/parm/wflow/archiving.yaml @@ -4,7 +4,7 @@ workflow: tasks: metatask_archive_mpassit: var: - day: "{% for h in range(1,(forecast.mpas['length']+23)//24+2) %}{{ ' %d' % h }}{% endfor %}" + day: "{% for h in range(1,(forecast.mpas.length+23)//24+2) %}{{ ' %d' % h }}{% endfor %}" task_archive_mpassit_day#day#: command: cyclestr: @@ -17,7 +17,7 @@ workflow: cyclestr: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H_day#day#.log' walltime: "{{ archiving.mpassit.execution.walltime }}" - cores: 1 + cores: !int "{{ archiving.mpassit.execution.cores }}" dependency: metataskdep: attrs: @@ -35,7 +35,7 @@ workflow: cyclestr: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' walltime: "{{ archiving.upp.execution.walltime }}" - cores: 1 + cores: !int "{{ archiving.upp.execution.cores }}" dependency: metataskdep: attrs: @@ -53,7 +53,7 @@ workflow: cyclestr: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' walltime: "{{ archiving.init.execution.walltime }}" - cores: 1 + cores: !int "{{ archiving.init.execution.cores }}" dependency: or: taskdep: diff --git a/parm/wflow/post.yaml b/parm/wflow/post.yaml index 01f40214..7a3f2f01 100644 --- a/parm/wflow/post.yaml +++ b/parm/wflow/post.yaml @@ -42,7 +42,7 @@ workflow: shell: /bin/bash command: cyclestr: - value: '{{ user.mpas_app }}/ush/output_is_available_for.sh {{ user.experiment_dir }}/@Y@m@d@H/forecast @Y-@m-@d_@H:00:00 #fhr# {{ post.output_frequency_check }}' + value: '{{ user.mpas_app }}/ush/output_is_available_for.sh {{ user.experiment_dir }}/@Y@m@d@H/forecast @Y-@m-@d_@H:00:00 #fhr# {{ user.forecast.output_interval }}' task_upp_#fhr#: command: diff --git a/ush/default_config.yaml b/ush/default_config.yaml index 7f2b0695..ddd5c64e 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -338,9 +338,6 @@ forecast: account: '{{ platform.account }}' scheduler: '{{ platform.scheduler }}' post: - # The output_frequency_check is for the dependency of the first job in the post metatask. - # The post won't submit until it sees output this many forecast hours after the time to process. - output_frequency_check: "{{ user.forecast.output_interval }}" # combined_files is a simple tasks that concatenates grib files. Please see # parm/wflow/post.yaml for information on the task. compbined_files: @@ -476,15 +473,18 @@ archiving: mpassit: execution: walltime: 02:59:00 + cores: 1 upp: execution: walltime: 02:59:00 + cores: 1 init: execution: walltime: 02:59:00 + cores: 1 scrubber: execution: cores: 1 walltime: 00:10:00 - rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}' + diff --git a/ush/output_is_available_for.sh b/ush/output_is_available_for.sh index 48eb6e90..f461a8c0 100755 --- a/ush/output_is_available_for.sh +++ b/ush/output_is_available_for.sh @@ -7,12 +7,8 @@ add_to_lead_time="$4" eval "check_time=\$(( 10#\$lead_time + 10#\$add_to_lead_time ))" -# 2025-08-22t00:00:00 UTC+0 -s="$start_time" -start_posix="${s:0:4}-${s:5:2}-${s:8:2}t${s:11:2}:${s:14:2}:${s:17:2} UTC+0" - # 2025-08-23_06.00.00 -valid_time_posix=$( date +"%Y-%m-%d_%H.%M.%S" -d "$start_posix + $check_time hours" ) +valid_time_posix=$( date +"%Y-%m-%d_%H.%M.%S" -d "$start_time UTC+0 + $check_time hours" ) history="$forecast_dir/history.$valid_time_posix.nc" diag="$forecast_dir/diag.$valid_time_posix.nc" From ae66f5a726bfa518e549bb6f30acc47e9a55d891 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Tue, 25 Nov 2025 21:09:29 +0000 Subject: [PATCH 29/42] revert changes to output_is_available_for.sh --- ush/output_is_available_for.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ush/output_is_available_for.sh b/ush/output_is_available_for.sh index f461a8c0..48eb6e90 100755 --- a/ush/output_is_available_for.sh +++ b/ush/output_is_available_for.sh @@ -7,8 +7,12 @@ add_to_lead_time="$4" eval "check_time=\$(( 10#\$lead_time + 10#\$add_to_lead_time ))" +# 2025-08-22t00:00:00 UTC+0 +s="$start_time" +start_posix="${s:0:4}-${s:5:2}-${s:8:2}t${s:11:2}:${s:14:2}:${s:17:2} UTC+0" + # 2025-08-23_06.00.00 -valid_time_posix=$( date +"%Y-%m-%d_%H.%M.%S" -d "$start_time UTC+0 + $check_time hours" ) +valid_time_posix=$( date +"%Y-%m-%d_%H.%M.%S" -d "$start_posix + $check_time hours" ) history="$forecast_dir/history.$valid_time_posix.nc" diag="$forecast_dir/diag.$valid_time_posix.nc" From 351f83a7960afb2dc52d94ecd00da856a00c3636 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Tue, 25 Nov 2025 21:17:13 +0000 Subject: [PATCH 30/42] build.sh: install_tracker failed making an existing directory --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index e40169bd..b11e0828 100755 --- a/build.sh +++ b/build.sh @@ -156,7 +156,7 @@ install_tracker () { export BUILD_TYPE=Debug fi ./build_all_cmake.sh - mkdir "$MPAS_APP_DIR/exec" + test -d "$MPAS_APP_DIR/exec" || mkdir "$MPAS_APP_DIR/exec" cp -v ../exec/*.x "$MPAS_APP_DIR/exec/." ) } From 795c78fe9582ffdf01a7d1aa1a96caaf529d3afe Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Tue, 2 Dec 2025 01:40:24 +0000 Subject: [PATCH 31/42] get it to a quasi-working state after removing mpiserial --- parm/machines/hera.yaml | 1 + parm/machines/hercules.yaml | 1 + parm/machines/jet.yaml | 1 + parm/machines/ursa.yaml | 2 + parm/wflow/tracker.yaml | 43 ++++++++++++---- scripts/run_latlon_regrid.sh | 62 +++++++++++++++++++++++ scripts/run_tracker.sh | 97 +++++++++++++----------------------- ush/default_config.yaml | 17 +++---- ush/workflows/hfip_2025.yaml | 2 + 9 files changed, 146 insertions(+), 80 deletions(-) create mode 100755 scripts/run_latlon_regrid.sh diff --git a/parm/machines/hera.yaml b/parm/machines/hera.yaml index 70f86ef1..37ba1e01 100644 --- a/parm/machines/hera.yaml +++ b/parm/machines/hera.yaml @@ -3,6 +3,7 @@ data: platform: crtm_dir: /contrib/spack-stack/spack-stack-1.6.0/envs/unified-env-rocky8/install/intel/2021.5.0/crtm-fix-2.4.0.1_emc-zvwtu3t/fix scheduler: slurm + mpicmd: "srun -l" hrrr_fix: /scratch3/BMC/gsd-fv3-dev/mpas_dev/fix forecast: mpas: diff --git a/parm/machines/hercules.yaml b/parm/machines/hercules.yaml index 04b8c782..2b8abd69 100644 --- a/parm/machines/hercules.yaml +++ b/parm/machines/hercules.yaml @@ -2,6 +2,7 @@ data: mesh_files: /work/noaa/gsd-hpcs/charrop/mpas/mpas-dev/test-mesh platform: scheduler: slurm + mpicmd: "srun -l" forecast: mpas: execution: diff --git a/parm/machines/jet.yaml b/parm/machines/jet.yaml index e9f18cea..ae1b8497 100644 --- a/parm/machines/jet.yaml +++ b/parm/machines/jet.yaml @@ -2,6 +2,7 @@ data: mesh_files: "{{ platform.hrrr_fix }}" platform: scheduler: slurm + mpicmd: "srun -l" crtm_dir: /misc/contrib/spack-stack/spack-stack-1.6.0/envs/unified-env-rocky8/install/intel/2021.5.0/crtm-fix-2.4.0.1_emc-bscege4/fix geog_data: global: /lfs5/BMC/wrfruc/Michael.Barlage/mpas/data/mpas_static diff --git a/parm/machines/ursa.yaml b/parm/machines/ursa.yaml index 3282ee94..d21105b3 100644 --- a/parm/machines/ursa.yaml +++ b/parm/machines/ursa.yaml @@ -3,7 +3,9 @@ data: platform: crtm_dir: /contrib/spack-stack/spack-stack-1.9.1/envs/ue-oneapi-2024.2.1/install/oneapi/2024.2.1/crtm-fix-2.4.0.1_emc-t5jym6r/fix hrrr_fix: /scratch3/BMC/wrfruc/cholt/MPAS-Model/fix + syndat_prefix: /scratch3/HFIP/hwrfv3/noscrub/input/SYNDAT-PLUS/syndat_tcvitals scheduler: slurm + mpicmd: "srun -l" geog_data: global: /scratch2/BMC/wrfruc/talcott/mpas/global/static/geog/ service_partition: u1-service diff --git a/parm/wflow/tracker.yaml b/parm/wflow/tracker.yaml index 3b072c42..2ce6fb2d 100644 --- a/parm/wflow/tracker.yaml +++ b/parm/wflow/tracker.yaml @@ -1,26 +1,51 @@ workflow: tasks: + metatask_latlon_regrid: + var: + fhr: "{% for h in range(0, forecast.mpas['length'] + 1, 6) %}{{ ' %03d' % h }}{% endfor %}" + task_latlon_regrid_#fhr#: + command: + cyclestr: + value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + cd {{ user.experiment_dir }}/@Y@m@d@H && + "&MPAS_APP;/scripts/run_latlon_regrid.sh" + @Y@m@d@H + "{{ platform.mpicmd }}" + "#fhr#" + "{{ latlon_regrid.new_grid }}" + "&MPAS_APP;"' + join: + cyclestr: + value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' + walltime: "{{ latlon_regrid.execution.batchargs.walltime }}" + cores: !int "{{ latlon_regrid.execution.batchargs.cores }}" + partition: "{{ post.upp.execution.batchargs.partition }}" + account: "{{ platform.account }}" + dependency: + taskdep: + attrs: + task: upp_#fhr# task_tracker: command: cyclestr: value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && cd {{ user.experiment_dir }}/@Y@m@d@H && - /usr/bin/env TRACKER_DIR="&MPAS_APP;" - MPISERIAL="{{ tracker.execution.mpiserial }}" - SYNDAT_PREFIX="{{ tracker.execution.syndat_prefix }}" - MPICMD="{{ tracker.execution.mpicmd }} - FHOUR_STEP="{{ tracker.execution.fhour_step }}" - FORECAST_LENGTH="{{ forecast.mpas.length }}" - &MPAS_APP;/scripts/run_tracker.sh @Y@m@d@H' + &MPAS_APP;/scripts/run_tracker.sh + @Y@m@d@H + "{{ platform.syndat_prefix }}" + "{{ platform.mpicmd }}" + "{{ user.forecast.output_interval }}" + "{{ forecast.mpas.length }}" + "&MPAS_APP;"' account: "{{ platform.account }}" join: cyclestr: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' walltime: "{{ tracker.execution.batchargs.walltime }}" nodes: "{{ tracker.execution.batchargs.nodes }}:ppn={{ tracker.execution.batchargs.tasks_per_node }}" - exclusive: "True" + exclusive: "{{ tracker.execution.batchargs.exclusive }}" partition: "{{ post.upp.execution.batchargs.partition }}" dependency: metataskdep: attrs: - metatask: post + metatask: latlon_regrid diff --git a/scripts/run_latlon_regrid.sh b/scripts/run_latlon_regrid.sh new file mode 100755 index 00000000..966ce6fe --- /dev/null +++ b/scripts/run_latlon_regrid.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +set -uex + +ymdh="$1" +mpicmd="$2" +fhr=$(( "10#$3" )) +#new_grid="latlon -100:3333:0.03 -10:2666:0.03" +new_grid="$4" +mpas_app="$5" + +set +x +module purge +module use "$mpas_app/src/GFDL-VortexTracker/modulefiles" +module load ursa +module load wgrib2 +module load grib-util +module list +set -x + +mkdir tracker || true +cd tracker + +cc=${ymdh:0:2} +yy=${ymdh:2:2} +mm=${ymdh:4:2} +dd=${ymdh:6:2} +hh=${ymdh:8:2} + +mpas_upp=../upp/ + +opts='-set_grib_type c2 -new_grid_winds grid -new_grid_vectors "UGRD:VGRD" -new_grid_interpolation neighbor' + +PARMlistp1="UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m a|VGRD:10 m a|ABSV:850|ABSV:700|MSLET|MSLP|MSLMA|mean sea|sea level" +PARMlistp2="HGT:900|HGT:850|HGT:800|HGT:750|HGT:700|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400" +PARMlistp3="HGT:350|HGT:300|HGT:250|HGT:200|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300|TMP:250|TMP:200" +PARMlist="${PARMlistp1}|${PARMlistp2}|${PARMlistp3}" + +fmin=$(( fhr * 60 )) +grib2d=$( printf "%s/%03d/%s%02d" "$mpas_upp" $fhr "2DFLD.GrbF" $fhr ) +gribprs=$( printf "%s/%03d/%s%02d" "$mpas_upp" $fhr "PRSLEV.GrbF" $fhr ) + +if [[ ! -s "$grib2d" || ! -s "$gribprs" ]] ; then + echo "No file at time $fhr" 1>&2 + exit 2 +fi + +latlon2d=$( printf latlon_2d_%03d.grb2 $fhr ) +latlonprs=$( printf latlon_prs_%03d.grb2 $fhr ) +final=$( printf "mpas.trak.all.%s.f%05d" "$cc$yy$mm$dd$hh" "$fmin" ) + +wgrib2 -s "$grib2d" | grep -E "$PARMlist" > "$latlon2d.i" +$mpicmd -n 1 wgrib2 -i "$grib2d" $opts -new_grid $new_grid "$latlon2d" < "$latlon2d.i" + +wgrib2 -s "$gribprs" | grep -E "$PARMlist" > "$latlonprs.i" +$mpicmd -n 1 wgrib2 -i "$gribprs" $opts -new_grid $new_grid "$latlonprs" < "$latlonprs.i" + +cat "$latlon2d" "$latlonprs" > "$final" +grb2index "$final" "$final.ix" + +#rm -f "$latlon2d" +#rm -f "$latlonprs" diff --git a/scripts/run_tracker.sh b/scripts/run_tracker.sh index b77996bc..dd636ddd 100755 --- a/scripts/run_tracker.sh +++ b/scripts/run_tracker.sh @@ -1,98 +1,71 @@ -#! /bin/bash +#!/bin/bash -set -ue +set -uex +ymdh="$1" +syndat_prefix="$2" +mpicmd="$3" +fhour_step="$4" +fhour_last="$5" +mpas_app="$6" + +set +x module purge -module use "$TRACKER_DIR/modulefiles" +module use "$mpas_app/src/GFDL-VortexTracker/modulefiles" module load ursa module load wgrib2 module load grib-util module list - set -x -ymdh="$1" mpas_upp=../upp -syndat_prefix="$SYNDAT_PREFIX" fhour_start=0 -fhour_step="$FHOUR_STEP" -fhour_last="$FORECAST_LENGTH" -grid="-new_grid latlon -100:3333:0.03 -10:2666:0.03" -tracker="$TRACKER_DIR/exec/gettrk.x" -mpiserial="$MPISERIAL" -mpicmd="$MPICMD" -rm -rf tracker -mkdir tracker +tracker="$mpas_app/exec/gettrk.x" +basin_list="L" # FIXME: MOVE TO YAML + +#rm -rf tracker +#mkdir tracker cd tracker +rm -f fort.* +rm -f *.atcfunix +rm -f allvit tcvit_rsmc_storms.txt tracker.log + #### ulimit -s unlimited -CC=${ymdh:0:2} -YY=${ymdh:2:2} -MM=${ymdh:4:2} -DD=${ymdh:6:2} -HH=${ymdh:8:2} +cc=${ymdh:0:2} +yy=${ymdh:2:2} +mm=${ymdh:4:2} +dd=${ymdh:6:2} +hh=${ymdh:8:2} -syndat=${syndat_prefix}.$CC$YY -if ( ! grep -E "^.....[0-49][0-9]L ......... $CC$YY$MM$DD $HH" $syndat > allvit ) ; then - echo "No Atlantic storms. There is nothing to track." +syndat=${syndat_prefix}.$cc$yy +if ( ! grep -E "^.....[0-49][0-9][$basin_list] ......... $cc$yy$mm$dd $hh" $syndat > allvit ) ; then + echo "No storms in basin list \"$basin_list\". There is nothing to track." echo "Delivering an empty track." cat /dev/null > mpas.trak.atcfunix exit 0 fi -ln -sf allvit tcvit_rsmc_storms.txt - -opts='-set_grib_type c2 -new_grid_winds grid -new_grid_vectors "UGRD:VGRD" -new_grid_interpolation neighbor' -PARMlistp1="UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m a|VGRD:10 m a|ABSV:850|ABSV:700|MSLET|MSLP|MSLMA|mean sea|sea level" -PARMlistp2="HGT:900|HGT:850|HGT:800|HGT:750|HGT:700|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400" -PARMlistp3="HGT:350|HGT:300|HGT:250|HGT:200|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300|TMP:250|TMP:200" -PARMlist=${PARMlistp1}"|"${PARMlistp2}"|"${PARMlistp3} - -rm -f ../fort.15 # list of forecast minutes +ln -sf allvit tcvit_rsmc_storms.txt i=0 for fhr in $( seq $fhour_start $fhour_step $fhour_last ) ; do i=$(( i + 1 )) fmin=$(( fhr * 60 )) printf '%4d %5d\n' $i $fmin >> fort.15 - - grib2d=$( printf "%s/%03d/%s%02d" "$mpas_upp" $fhr "2DFLD.GrbF" $fhr ) - gribprs=$( printf "%s/%03d/%s%02d" "$mpas_upp" $fhr "PRSLEV.GrbF" $fhr ) - - if [[ ! -s "$grib2d" || ! -s "$gribprs" ]] ; then - echo "No file at time $fhr" 1>&2 - break - fi - - latlon2d=$( printf latlon_2d_%03d.grb2 $fhr ) - latlonprs=$( printf latlon_prs_%03d.grb2 $fhr ) - final=$( printf mpas.trak.all.$CC$YY$MM$DD$HH.f$( printf %05d $fmin ) ) - - echo wgrib2 -s $grib2d \| grep -E "'$PARMlist'" \| wgrib2 -i $grib2d $opts -new_grid latlon -100:3333:0.03 -10:2666:0.03 $latlon2d >> cmdfile1 - echo wgrib2 -s $gribprs \| grep -E "'$PARMlist'" \| wgrib2 -i $gribprs $opts -new_grid latlon -100:3333:0.03 -10:2666:0.03 $latlonprs >> cmdfile1 - - echo "cat $latlon2d $latlonprs > $final ; grb2index $final $final.ix" >> cmdfile2 done -# Subset the grib files: -time $mpicmd "$mpiserial" -m cmdfile1 < /dev/null - -# Merge 2d and pressure grib files. Generate index files. -time $mpicmd "$mpiserial" -m cmdfile2 < /dev/null - -rm -f latlon_2d* latlon_prs* - cat< namelist.gettrk &datein - inp%bcc = ${CC} - inp%byy = ${YY} - inp%bmm = ${MM} - inp%bdd = ${DD} - inp%bhh = ${HH} + inp%bcc = ${cc} + inp%byy = ${yy} + inp%bmm = ${mm} + inp%bdd = ${dd} + inp%bhh = ${hh} inp%model = 17 inp%modtyp = 'regional' inp%lt_units = 'hours' @@ -103,7 +76,7 @@ cat< namelist.gettrk &atcfinfo atcfnum = 81 atcfname = 'MPAS' - atcfymdh = ${CC}${YY}${MM}${DD}${HH} + atcfymdh = ${cc}${yy}${mm}${dd}${hh} atcffreq = 100 / diff --git a/ush/default_config.yaml b/ush/default_config.yaml index 42285cb5..d7a27bf8 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -447,19 +447,18 @@ post: numx: 2 rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/{{ "%03d" % (leadtime.total_seconds() / 3600) }}' tracker: - control_file: "{{ user.mpas_app }}/parm/upp/postxconfig-NT-rrfs_mpas.txt" execution: batchargs: walltime: 00:12:00 nodes: 1 - tasks_per_node: 32 - fhour_step: 6 - native: - - --exclusive - tracker_dir: /scratch3/BMC/wrfruc/Samuel.Trahan/mpashfip/tracker-hafs-211 - mpiserial: /scratch3/BMC/gsd-fv3-dev/role.rtgsd-fv3-dev/merge-hafs-and-gfs/mpiserial/mpiserial - syndat_prefix: /scratch3/HFIP/hwrfv3/noscrub/input/SYNDAT-PLUS/syndat_tcvitals - mpicmd: 'srun -l' + tasks_per_node: 1 + exclusive: true +latlon_regrid: + new_grid: "latlon -100:3333:0.03 -10:2666:0.03" + execution: + batchargs: + walltime: 00:12:00 + cores: 12 graphics: # the graphics task calls a bash run script that runs pygraf execution: diff --git a/ush/workflows/hfip_2025.yaml b/ush/workflows/hfip_2025.yaml index 5b498ed9..7ad4b5c7 100644 --- a/ush/workflows/hfip_2025.yaml +++ b/ush/workflows/hfip_2025.yaml @@ -6,6 +6,8 @@ user: - graphics.yaml - scrubbing.yaml - archiving.yaml + - tracker.yaml + - archiving_tracker.yaml first_cycle: !!timestamp 2025-08-14T00:00:00 last_cycle: !!timestamp 2025-08-15T00:00:00 From c707e6cd537b226fe6c104a8792bf7d528ed0da3 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 8 Dec 2025 17:24:51 +0000 Subject: [PATCH 32/42] make it configurable --- parm/wflow/tracker.yaml | 18 ++++++++-- scripts/run_latlon_regrid.sh | 7 ---- scripts/run_tracker.sh | 64 +++++++++++++++++++++++++----------- ush/default_config.yaml | 6 ++++ 4 files changed, 66 insertions(+), 29 deletions(-) diff --git a/parm/wflow/tracker.yaml b/parm/wflow/tracker.yaml index 2ce6fb2d..d9cb6495 100644 --- a/parm/wflow/tracker.yaml +++ b/parm/wflow/tracker.yaml @@ -13,7 +13,8 @@ workflow: "{{ platform.mpicmd }}" "#fhr#" "{{ latlon_regrid.new_grid }}" - "&MPAS_APP;"' + "&MPAS_APP;" + ' join: cyclestr: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' @@ -28,7 +29,11 @@ workflow: task_tracker: command: cyclestr: - value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + value: ' + source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + module purge && + module use &MPAS_APP;/src/GFDL-VortexTracker/modulefiles && + module load &PLATFORM; && cd {{ user.experiment_dir }}/@Y@m@d@H && &MPAS_APP;/scripts/run_tracker.sh @Y@m@d@H @@ -36,7 +41,14 @@ workflow: "{{ platform.mpicmd }}" "{{ user.forecast.output_interval }}" "{{ forecast.mpas.length }}" - "&MPAS_APP;"' + "&MPAS_APP;" + "{{ tracker.eastbd }}" + "{{ tracker.westbd }}" + "{{ tracker.northbd }}" + "{{ tracker.southbd }}" + "{{ tracker.atcfname }}" + "{{ tracker.basin_list }}" + ' account: "{{ platform.account }}" join: cyclestr: diff --git a/scripts/run_latlon_regrid.sh b/scripts/run_latlon_regrid.sh index 966ce6fe..1cca2ae9 100755 --- a/scripts/run_latlon_regrid.sh +++ b/scripts/run_latlon_regrid.sh @@ -5,14 +5,10 @@ set -uex ymdh="$1" mpicmd="$2" fhr=$(( "10#$3" )) -#new_grid="latlon -100:3333:0.03 -10:2666:0.03" new_grid="$4" mpas_app="$5" set +x -module purge -module use "$mpas_app/src/GFDL-VortexTracker/modulefiles" -module load ursa module load wgrib2 module load grib-util module list @@ -57,6 +53,3 @@ $mpicmd -n 1 wgrib2 -i "$gribprs" $opts -new_grid $new_grid "$latlonprs" < "$lat cat "$latlon2d" "$latlonprs" > "$final" grb2index "$final" "$final.ix" - -#rm -f "$latlon2d" -#rm -f "$latlonprs" diff --git a/scripts/run_tracker.sh b/scripts/run_tracker.sh index dd636ddd..f0559ccc 100755 --- a/scripts/run_tracker.sh +++ b/scripts/run_tracker.sh @@ -5,29 +5,55 @@ set -uex ymdh="$1" syndat_prefix="$2" mpicmd="$3" -fhour_step="$4" -fhour_last="$5" +fhour_step="$4" # 6 +fhour_last="$5" # 120 mpas_app="$6" - -set +x -module purge -module use "$mpas_app/src/GFDL-VortexTracker/modulefiles" -module load ursa -module load wgrib2 -module load grib-util -module list -set -x +eastbd="$7" # 3313 +westbd="$8" # 20 +northbd="$9" # 2646 +southbd="${10}" # 20 +atcfname="${11}" # MPAS +basin_list="${12}" # L +platform="${13}" # ursa mpas_upp=../upp fhour_start=0 tracker="$mpas_app/exec/gettrk.x" -basin_list="L" # FIXME: MOVE TO YAML -#rm -rf tracker -#mkdir tracker cd tracker +valid_basins='ABCELPQSW' +if [[ ! "$basin_list" =~ [$valid_basins] ]] ; then + set +x + echo "Invalid basin in list \"$basin_list\". Valid basins are: \"$valid_basins\" (Q is exceptionally rare)." + exit 2 +fi + +# Some sanity checks. More could be added, but these detected my mistakes. +min_width_height=80 +if ! [[ "$eastbd$westbd$northbd$southbd" =~ [0-9]+ ]] ; then + set +x + echo "Bounds must all be positive numbers. Got: east=$eastbd west=$westbd north=$northbd south=$southbd" + exit 2 +elif (( eastbd < westbd )) ; then + set +x + echo "East and west bound are probably switched. East bound ($eastbd) is less than west bound ($westbd)" + exit 2 +elif (( eastbd < westbd+min_width_height )) ; then + set +x + echo "East and west bound are close together ($eastbd vs $westbd). Recommend at least $min_width_height points." + exit 2 +elif (( northbd < southbd )) ; then + set +x + echo "North and south bound are probably switched. North bound ($northbd) is less than south bound ($southbd)." + exit 2 +elif (( northbd < southbd+min_width_height )) ; then + set +x + echo "North and south bound are close together. Recommend at least $min_width_height points." + exit 2 +fi + rm -f fort.* rm -f *.atcfunix rm -f allvit tcvit_rsmc_storms.txt tracker.log @@ -75,16 +101,16 @@ cat< namelist.gettrk &atcfinfo atcfnum = 81 - atcfname = 'MPAS' + atcfname = '$atcfname' atcfymdh = ${cc}${yy}${mm}${dd}${hh} atcffreq = 100 / &trackerinfo - trkrinfo%eastbd = 3313, - trkrinfo%westbd = 20, - trkrinfo%northbd = 2646, - trkrinfo%southbd = 20, + trkrinfo%eastbd = $eastbd, + trkrinfo%westbd = $westbd, + trkrinfo%northbd = $northbd, + trkrinfo%southbd = $southbd, trkrinfo%contint = 100.0 trkrinfo%type = 'tracker' trkrinfo%mslpthresh = 0.0015 diff --git a/ush/default_config.yaml b/ush/default_config.yaml index d7a27bf8..afb1e2e6 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -447,6 +447,12 @@ post: numx: 2 rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/{{ "%03d" % (leadtime.total_seconds() / 3600) }}' tracker: + basin_list: "L" + eastbd: 3313 + westbd: 20 + northbd: 2646 + southbd: 20 + atcfname: "MPAS" execution: batchargs: walltime: 00:12:00 From de21a03a03893a73cc1336c2d8b78b3cfd87a072 Mon Sep 17 00:00:00 2001 From: Christina Holt Date: Mon, 15 Dec 2025 19:48:36 +0000 Subject: [PATCH 33/42] Adding driver files from HFIP_2024 --- drivers/__init__.py | 0 drivers/tracker.jsonschema | 78 +++++++++++++++ drivers/tracker.py | 198 +++++++++++++++++++++++++++++++++++++ 3 files changed, 276 insertions(+) create mode 100644 drivers/__init__.py create mode 100644 drivers/tracker.jsonschema create mode 100644 drivers/tracker.py diff --git a/drivers/__init__.py b/drivers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/drivers/tracker.jsonschema b/drivers/tracker.jsonschema new file mode 100644 index 00000000..c644fb31 --- /dev/null +++ b/drivers/tracker.jsonschema @@ -0,0 +1,78 @@ +{ + "properties": { + "gfdltracker": { + "additionalProperaties": false, + "properties": { + "execution": { + "$ref": "urn:uwtools:execution-serial" + }, + "input_files": { + "additionalProperties": false, + "properties": { + "endhour": { + "type": "number" + }, + "filefreq": { + "type": "number" + }, + "filepath": { + "type": "string" + } + }, + "type": "object" + }, + "namelist": { + "additionalProperties": false, + "anyOf": [ + { + "required": [ + "base_file" + ] + }, + { + "required": [ + "update_values" + ] + } + ], + "properties": { + "base_file": { + "type": "string" + }, + "update_values": { + "type": "object" + }, + "validate": { + "type": "boolean" + } + }, + "type": "object" + }, + "rundir": { + "type": "string" + }, + "tcvitals": { + "type": "string" + } + }, + "required": [ + "execution", + "input_files", + "namelist", + "rundir", + "tcvitals" + ], + "type": "object" + } + }, + "required": [ + "gfdltracker" + ], + "type": "object" +} + + + + + + diff --git a/drivers/tracker.py b/drivers/tracker.py new file mode 100644 index 00000000..4b9e6c42 --- /dev/null +++ b/drivers/tracker.py @@ -0,0 +1,198 @@ +""" +A driver for GFDL's Cyclone Tracker +""" +import json +import re +from datetime import timedelta +from itertools import chain +from pathlib import Path + +from iotaa import asset, task, tasks + +from uwtools.config.formats.yaml import YAMLConfig +from uwtools.config.formats.nml import NMLConfig +from uwtools.drivers.driver import DriverCycleBased +from uwtools.strings import STR +from uwtools.utils.file import writable +from uwtools.utils.processing import execute +from uwtools.utils.tasks import file, symlink + + + +class GFDLTracker(DriverCycleBased): + + """ + A driver for the GFDL Tracker + """ + + # Workflow tasks + + + @task + def input_fcst_minutes(self): + """ + The input.fcst_minutes (fort.15) file. + """ + fn = "fort.15" + yield self.taskname("input fcst minutes file") + path = self.rundir / fn + yield asset(path, path.is_file) + yield [self.input_files(), self.input_index_files()] + content_list = [f"{i+1:4d} {fhr*60:5d}" for i, fhr in enumerate(self._input_file_map())] + with writable(path) as f: + f.write("\n".join(content_list)) + + @tasks + def input_files(self): + """ + The UPP-processed, combined forecast files. + """ + yield self.taskname("input files") + upp_files = self._input_file_map() + symlinks = {} + for fhr, target in upp_files.items(): + linkname = f"mpas.trak.all.{self.cycle.strftime('%Y%m%d%H')}.f{fhr * 60:05d}" + target = Path(target) + symlinks[target] = linkname + yield [symlink(target=t, linkname=self.rundir / l) for t, l in symlinks.items()] + + + @task + def input_index_files(self): + """ + The Grib2 index files + """ + yield self.taskname("input index files") + index_files = {} + for fhr in self._input_file_map(): + infile = str(self.rundir / + f"mpas.trak.all.{self.cycle.strftime('%Y%m%d%H')}.f{fhr * 60:05d}") + indexfile = f"{infile}.ix" + index_files[infile] = str(self.rundir / indexfile) + yield [file(Path(idx)) for idx in index_files.values()] + yield self.input_files() + self.rundir.mkdir(exist_ok=True) + envcmds = self.config["execution"]["envcmds"] + for infile, idx in index_files.items(): + execute( + cmd=f"{' && '.join(envcmds)} && grb2index {infile} {idx}", + cwd=self.rundir, + log_output=True, + ) + + @task + def input_vitals(self): + """ + Theh TC vitals input data + """ + fn = "allvit" + yield self.taskname("TC vitals input file {fn}") + path = self.rundir / fn + yield asset(path, path.is_file) + tcvitals = Path(self.config["tcvitals"]) + yield file(tcvitals) + datestr = self.cycle.strftime("%Y%m%d %H") + data = {} + with open(tcvitals, "r", encoding="utf-8") as f: + for line in f: + if datestr in line: + match = re.match(r'^(.{19})(.*)$', line) + if match: + key = match.group(1) + value = f"{match.group(1)}{match.group(2)}" + data[key] = value + content = [data[k] for k in sorted(data)] + with writable(path) as f: + f.write("\n".join(content)) + + @task + def input_vitals_other_names(self): + """ + TC Vitals file named differently. + """ + fns = ["tcvit_rsmc_storms.txt", "fort.12"] + yield self.taskname("TC vitals input file {' & '.join(fns)}") + paths = [self.rundir / fn for fn in fns] + yield [asset(path, path.is_file) for path in paths] + yield self.input_vitals() + for path in paths: + symlink(target=self.rundir/ "allvit", linkname=path) + + @task + def namelist_file(self): + """ + The namelist file + """ + fn = "namelist.gettrk" + yield self.taskname(f"namelist file {fn}") + path = self.rundir / fn + yield asset(path, path.is_file) + input_files = [] + namelist = self.config[STR.namelist] + if base_file := namelist.get(STR.basefile): + input_files.append(base_file) + yield [file(Path(input_file)) for input_file in input_files] + self._create_user_updated_config( + config_class=NMLConfig, + config_values=namelist, + path=path, + ) + + @tasks + def provisioned_rundir(self): + """ + Run directory provisioned with all required content. + """ + yield self.taskname(f"provisioned run directory: {str(self.rundir)}") + self.rundir.mkdir(exist_ok=True) + yield [ + self.input_fcst_minutes(), + self.input_files(), + self.input_index_files(), + self.input_vitals(), + self.input_vitals_other_names(), + self.namelist_file(), + self.runscript(), + ] + + + @task + def runscript(self): + """ + The runscript. + """ + path = self._runscript_path + yield self.taskname(path.name) + yield asset(path, path.is_file) + yield None + self._write_runscript(path=path) + + # Private helper methods + + @property + def driver_name(self) -> str: + """ + Returns the name of this driver. + """ + return "gfdltracker" + + def _input_file_map(self) -> dict: + """ + Return a map of forecast hour to UPP file name. + """ + infiles = self.config["input_files"] + endhour = infiles["endhour"] + filefreq = infiles["filefreq"] + filemap = {} + for fhr in range(0, endhour + 1, filefreq): + leadtime = timedelta(hours=fhr) + configobj = YAMLConfig(infiles) + configobj.dereference( + context={ + "cycle": self.cycle, + "leadtime": leadtime, + **self.config_full, + } + ) + filemap[fhr] = configobj["filepath"] + return filemap From 92e0f110eacf1f16d3cdf01474c4e92b690f841b Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Mon, 15 Dec 2025 22:35:23 +0000 Subject: [PATCH 34/42] rename some directories and add configurability --- parm/wflow/tracker.yaml | 34 +++++++------------------- scripts/run_latlon_regrid.sh | 4 ++-- ush/default_config.yaml | 46 ++++++++++++++++++++++++++---------- 3 files changed, 45 insertions(+), 39 deletions(-) diff --git a/parm/wflow/tracker.yaml b/parm/wflow/tracker.yaml index d9cb6495..87d0f5b3 100644 --- a/parm/wflow/tracker.yaml +++ b/parm/wflow/tracker.yaml @@ -27,36 +27,20 @@ workflow: attrs: task: upp_#fhr# task_tracker: - command: - cyclestr: - value: ' - source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && - module purge && - module use &MPAS_APP;/src/GFDL-VortexTracker/modulefiles && - module load &PLATFORM; && - cd {{ user.experiment_dir }}/@Y@m@d@H && - &MPAS_APP;/scripts/run_tracker.sh - @Y@m@d@H - "{{ platform.syndat_prefix }}" - "{{ platform.mpicmd }}" - "{{ user.forecast.output_interval }}" - "{{ forecast.mpas.length }}" - "&MPAS_APP;" - "{{ tracker.eastbd }}" - "{{ tracker.westbd }}" - "{{ tracker.northbd }}" - "{{ tracker.southbd }}" - "{{ tracker.atcfname }}" - "{{ tracker.basin_list }}" - ' + command: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; ; python &MPAS_APP;/scripts/tracker.py' account: "{{ platform.account }}" join: cyclestr: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' - walltime: "{{ tracker.execution.batchargs.walltime }}" - nodes: "{{ tracker.execution.batchargs.nodes }}:ppn={{ tracker.execution.batchargs.tasks_per_node }}" + walltime: "{{ tracker.gfdltracker.execution.batchargs.walltime }}" + nodes: "{{ tracker.gfdltracker.execution.batchargs.nodes }}:ppn={{ tracker.gfdltracker.execution.batchargs.tasks_per_node }}" exclusive: "{{ tracker.execution.batchargs.exclusive }}" - partition: "{{ post.upp.execution.batchargs.partition }}" + partition: "{{ tracker.gfdltracker.execution.batchargs.partition }}" + envars: + CONFIG_PATH: '&EXPERIMENT_CONFIG;' + CYCLE: + cyclestr: + value: "@Y-@m-@dT@H:@M:@S" dependency: metataskdep: attrs: diff --git a/scripts/run_latlon_regrid.sh b/scripts/run_latlon_regrid.sh index 1cca2ae9..9a7d1f07 100755 --- a/scripts/run_latlon_regrid.sh +++ b/scripts/run_latlon_regrid.sh @@ -14,8 +14,8 @@ module load grib-util module list set -x -mkdir tracker || true -cd tracker +mkdir latlon || true +cd latlon cc=${ymdh:0:2} yy=${ymdh:2:2} diff --git a/ush/default_config.yaml b/ush/default_config.yaml index afb1e2e6..b1085c56 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -447,18 +447,40 @@ post: numx: 2 rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/{{ "%03d" % (leadtime.total_seconds() / 3600) }}' tracker: - basin_list: "L" - eastbd: 3313 - westbd: 20 - northbd: 2646 - southbd: 20 - atcfname: "MPAS" - execution: - batchargs: - walltime: 00:12:00 - nodes: 1 - tasks_per_node: 1 - exclusive: true + gfdltracker: + execution: + batchargs: + tasks_per_node: 32 + nodes: 1 + walltime: 00:30:00 + partition: xjet,kjet + envcmds: + - module use {{ user.mpas_app }}/src/GFDL-VortexTracker/modulefiles + - module load {{ user.platform }} + - ulimit -s unlimited + executable: "{{ user.mpas_app }}/exec/gettrk.x" + input_files: + endhour: !int "{{ forecast.mpas.length }}" + filefreq: 6 + filepath: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/COMBINED.GrbF{{ "%02d" % (leadtime.total_seconds() / 3600) }}' + namelist: + base_file: "{{ user.mpas_app }}/parm/tracker/namelist.gettrk" + update_values: + datein: + inp: + bcc: !int "{{ cycle.strftime('%Y')[:2] }}" + byy: !int "{{ cycle.strftime('%y') }}" + bmm: !int "{{ cycle.strftime('%m') }}" + bdd: !int "{{ cycle.strftime('%d') }}" + bhh: !int "{{ cycle.strftime('%H') }}" + atcfinfo: + atcfname: MPAS + atcfymdh: !int "{{ cycle.strftime('%Y%m%d%H') }}" + rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/tracker' + tcvitals: '{{ platform.syndat_prefix }}' + platform: + account: '{{ platform.account }}' + scheduler: '{{ platform.scheduler }}' latlon_regrid: new_grid: "latlon -100:3333:0.03 -10:2666:0.03" execution: From 9b206956692813466f4197cd69b686e659b71cf9 Mon Sep 17 00:00:00 2001 From: Christina Holt Date: Mon, 15 Dec 2025 23:12:02 +0000 Subject: [PATCH 35/42] First pass at adding uwtools tracker driver components --- drivers/tracker.jsonschema | 4 + drivers/tracker.py | 37 +++++--- parm/machines/jet.yaml | 2 + parm/machines/ursa.yaml | 2 +- parm/tracker/namelist.gettrk | 178 +++++++++++++++++++++++++++++++++++ parm/wflow/tracker.yaml | 23 +---- scripts/tracker.py | 44 +++++++++ ush/default_config.yaml | 46 ++++++++- ush/experiment_gen.py | 3 +- ush/validation.py | 59 +++++++++++- 10 files changed, 358 insertions(+), 40 deletions(-) create mode 100644 parm/tracker/namelist.gettrk create mode 100644 scripts/tracker.py diff --git a/drivers/tracker.jsonschema b/drivers/tracker.jsonschema index c644fb31..8ff53f1c 100644 --- a/drivers/tracker.jsonschema +++ b/drivers/tracker.jsonschema @@ -3,6 +3,10 @@ "gfdltracker": { "additionalProperaties": false, "properties": { + "basins": { + "type": "string", + "pattern": "^[ABCELPQSW]$" + }, "execution": { "$ref": "urn:uwtools:execution-serial" }, diff --git a/drivers/tracker.py b/drivers/tracker.py index 4b9e6c42..1905d6f8 100644 --- a/drivers/tracker.py +++ b/drivers/tracker.py @@ -11,12 +11,12 @@ from uwtools.config.formats.yaml import YAMLConfig from uwtools.config.formats.nml import NMLConfig -from uwtools.drivers.driver import DriverCycleBased +from uwtools.drivers.driver import Assets, DriverCycleBased from uwtools.strings import STR from uwtools.utils.file import writable from uwtools.utils.processing import execute from uwtools.utils.tasks import file, symlink - +from ush.validation import TrackerNamelist class GFDLTracker(DriverCycleBased): @@ -83,7 +83,7 @@ def input_index_files(self): @task def input_vitals(self): """ - Theh TC vitals input data + The TC vitals input data """ fn = "allvit" yield self.taskname("TC vitals input file {fn}") @@ -92,18 +92,18 @@ def input_vitals(self): tcvitals = Path(self.config["tcvitals"]) yield file(tcvitals) datestr = self.cycle.strftime("%Y%m%d %H") - data = {} + basins = self.config["basins"] + storms = [] with open(tcvitals, "r", encoding="utf-8") as f: for line in f: if datestr in line: - match = re.match(r'^(.{19})(.*)$', line) - if match: - key = match.group(1) - value = f"{match.group(1)}{match.group(2)}" - data[key] = value - content = [data[k] for k in sorted(data)] + # Get all the storms in the required basins + # Matches: NHC 13L MELISSA 20251021 1200 143N 0713W 280 062..... + pattern = r'^.{5}[0-49][0-9][%s].{11}%s.*$' % (basins, datestr) + match = re.match(pattern, line) + storms.append(match.group(0) with writable(path) as f: - f.write("\n".join(content)) + f.write("\n".join(storms)) @task def input_vitals_other_names(self): @@ -196,3 +196,18 @@ def _input_file_map(self) -> dict: ) filemap[fhr] = configobj["filepath"] return filemap + + def _validate(self) -> None: + """ + Perform all necessary schema and pydantic validation. + + :raises: UWConfigError if validation fails. + """ + Assets._validate(self) # noqa: SLF001 + validate_internal( + schema_name=STR.platform, + desc="platform config", + config_data=self._config_intermediate, + ) + TrackerNamelist(self.config["namelist"]["update_values"]) + diff --git a/parm/machines/jet.yaml b/parm/machines/jet.yaml index ae1b8497..00d7ef83 100644 --- a/parm/machines/jet.yaml +++ b/parm/machines/jet.yaml @@ -12,6 +12,8 @@ platform: gfs: path: /public/data/grids/gfs/0p25deg/grib2 file_templates: '@y@j@H00{{ "%04d" % fcst_hr }}' + syndat_tcvitals: /lfs5/HFIP/hwrf-data/hwrf-input/SYNDAT-PLUS + forecast: mpas: execution: diff --git a/parm/machines/ursa.yaml b/parm/machines/ursa.yaml index d21105b3..e99873c1 100644 --- a/parm/machines/ursa.yaml +++ b/parm/machines/ursa.yaml @@ -3,7 +3,6 @@ data: platform: crtm_dir: /contrib/spack-stack/spack-stack-1.9.1/envs/ue-oneapi-2024.2.1/install/oneapi/2024.2.1/crtm-fix-2.4.0.1_emc-t5jym6r/fix hrrr_fix: /scratch3/BMC/wrfruc/cholt/MPAS-Model/fix - syndat_prefix: /scratch3/HFIP/hwrfv3/noscrub/input/SYNDAT-PLUS/syndat_tcvitals scheduler: slurm mpicmd: "srun -l" geog_data: @@ -13,6 +12,7 @@ platform: gfs: path: /public/data/grids/gfs/0p25deg/grib2 file_templates: '@y@j@H00{{ "%04d" % fcst_hr }}' + syndat_tcvitals: /scratch3/HFIP/hwrfv3/noscrub/input/SYNDAT-PLUS/syndat_tcvitals create_ics: mpas_init: execution: diff --git a/parm/tracker/namelist.gettrk b/parm/tracker/namelist.gettrk new file mode 100644 index 00000000..2f62fc28 --- /dev/null +++ b/parm/tracker/namelist.gettrk @@ -0,0 +1,178 @@ + +&datein + inp%bcc = 20, + inp%byy = 24, + inp%bmm = 07, + inp%bdd = 06, + inp%bhh = 12, + inp%model = 17, + inp%modtyp = "regional", + inp%lt_units = "hours", + inp%file_seq = "multi", + inp%nesttyp = "fixed", +/ + +&atcfinfo + atcfnum = 81, + atcfname = "MPAS", + atcfymdh = 2024070612, + atcffreq = 100, +/ + +&trackerinfo + trkrinfo%eastbd=, + trkrinfo%westbd=, + trkrinfo%northbd=, + trkrinfo%southbd=, + trkrinfo%contint=100.0, + trkrinfo%type = "tracker", + trkrinfo%mslpthresh = 0.0015, + trkrinfo%use_backup_mslp_grad_check = "y", + trkrinfo%v850thresh = 1.5, + trkrinfo%v850_qwc_thresh = 1.0, + trkrinfo%use_backup_850_vt_check = "y", + trkrinfo%enable_timing = 1, + trkrinfo%gridtype = "regional", + trkrinfo%contint = 100.0, + trkrinfo%want_oci = .true., + trkrinfo%out_vit = "n", + trkrinfo%use_land_mask = "y", + trkrinfo%read_separate_land_mask_file="n", + trkrinfo%inp_data_type = "grib", + trkrinfo%gribver = 2, + trkrinfo%g2_jpdtn = 0, + trkrinfo%g2_mslp_parm_id = 198, + trkrinfo%g1_mslp_parm_id = 2, + trkrinfo%g1_sfcwind_lev_typ = 105, + trkrinfo%g1_sfcwind_lev_val = 10, + trkrinfo%max_mslp_850=400.0, +/ + +&phaseinfo + phaseflag = "y", + phasescheme = "both", + wcore_depth = 1.0, +/ + +&structinfo + structflag = "n", + ikeflag = "n", + radii_pctile=95.0, + radii_free_pass_pctile=67.0, + radii_width_thresh=15.0 +/ + +&fnameinfo + ! The full filename has to fit in 120 chars, so don't make these long: + gmodname = "mpas", + rundescr = "trak", + atcfdescr = "all", +/ + +&cintinfo + contint_grid_bound_check = 50.0 +/ + +&waitinfo + use_waitfor = "n", + use_per_fcst_command = "n", +/ + +&netcdflist + netcdfinfo%num_netcdf_vars=, + netcdfinfo%netcdf_filename='', + netcdfinfo%netcdf_lsmask_filename='', + netcdfinfo%rv850name='', + netcdfinfo%rv700name='', + netcdfinfo%u850name='', + netcdfinfo%v850name='', + netcdfinfo%u700name='', + netcdfinfo%v700name='', + netcdfinfo%z850name='', + netcdfinfo%z700name='', + netcdfinfo%mslpname='', + netcdfinfo%usfcname='', + netcdfinfo%vsfcname='', + netcdfinfo%u500name='', + netcdfinfo%v500name='', + netcdfinfo%u200name='', + netcdfinfo%v200name='', + netcdfinfo%tmean_300_500_name='', + netcdfinfo%z500name='', + netcdfinfo%z200name='', + netcdfinfo%lmaskname='', + netcdfinfo%z900name='', + netcdfinfo%z850name='', + netcdfinfo%z800name='', + netcdfinfo%z750name='', + netcdfinfo%z700name='', + netcdfinfo%z650name='', + netcdfinfo%z600name='', + netcdfinfo%z550name='', + netcdfinfo%z500name='', + netcdfinfo%z450name='', + netcdfinfo%z400name='', + netcdfinfo%z350name='', + netcdfinfo%z300name='', + netcdfinfo%time_name='', + netcdfinfo%lon_name='', + netcdfinfo%lat_name='', + netcdfinfo%time_units='', + netcdfinfo%sstname='', + netcdfinfo%q850name='', + netcdfinfo%rh1000name='', + netcdfinfo%rh925name='', + netcdfinfo%rh800name='', + netcdfinfo%rh750name='', + netcdfinfo%rh700name='', + netcdfinfo%rh650name='', + netcdfinfo%rh600name='', + netcdfinfo%spfh1000name='', + netcdfinfo%spfh925name='', + netcdfinfo%spfh800name='', + netcdfinfo%spfh750name='', + netcdfinfo%spfh700name='', + netcdfinfo%spfh650name='', + netcdfinfo%spfh600name='', + netcdfinfo%temp1000name='', + netcdfinfo%temp925name='', + netcdfinfo%temp800name='', + netcdfinfo%temp750name='', + netcdfinfo%temp700name='', + netcdfinfo%temp650name='', + netcdfinfo%temp600name='', + netcdfinfo%omega500name='' +/ + +&parmpreflist + user_wants_to_track_zeta700 = "y", + user_wants_to_track_wcirc850 = "y", + user_wants_to_track_wcirc700 = "y", + user_wants_to_track_gph850 = "y", + user_wants_to_track_gph700 = "y", + user_wants_to_track_mslp = "y", + user_wants_to_track_wcircsfc = "y", + user_wants_to_track_zetasfc = "y", + user_wants_to_track_thick500850 = "n", + user_wants_to_track_thick200500 = "n", + user_wants_to_track_thick200850 = "n", + user_wants_to_track_zeta850 = "y", +/ + +&verbose + verb = 3, + verb_g2 = 0, +/ + +&sheardiaginfo + shearflag='y' +/ + +&sstdiaginfo + sstflag='y' +/ + +&gendiaginfo + genflag='n', + gen_read_rh_fields='' +/ diff --git a/parm/wflow/tracker.yaml b/parm/wflow/tracker.yaml index d9cb6495..75cade15 100644 --- a/parm/wflow/tracker.yaml +++ b/parm/wflow/tracker.yaml @@ -29,26 +29,7 @@ workflow: task_tracker: command: cyclestr: - value: ' - source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && - module purge && - module use &MPAS_APP;/src/GFDL-VortexTracker/modulefiles && - module load &PLATFORM; && - cd {{ user.experiment_dir }}/@Y@m@d@H && - &MPAS_APP;/scripts/run_tracker.sh - @Y@m@d@H - "{{ platform.syndat_prefix }}" - "{{ platform.mpicmd }}" - "{{ user.forecast.output_interval }}" - "{{ forecast.mpas.length }}" - "&MPAS_APP;" - "{{ tracker.eastbd }}" - "{{ tracker.westbd }}" - "{{ tracker.northbd }}" - "{{ tracker.southbd }}" - "{{ tracker.atcfname }}" - "{{ tracker.basin_list }}" - ' + value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; ; python &MPAS_APP;/scripts/tracker.py' account: "{{ platform.account }}" join: cyclestr: @@ -56,7 +37,7 @@ workflow: walltime: "{{ tracker.execution.batchargs.walltime }}" nodes: "{{ tracker.execution.batchargs.nodes }}:ppn={{ tracker.execution.batchargs.tasks_per_node }}" exclusive: "{{ tracker.execution.batchargs.exclusive }}" - partition: "{{ post.upp.execution.batchargs.partition }}" + partition: "{{ tracker.upp.execution.batchargs.partition }}" dependency: metataskdep: attrs: diff --git a/scripts/tracker.py b/scripts/tracker.py new file mode 100644 index 00000000..61212f47 --- /dev/null +++ b/scripts/tracker.py @@ -0,0 +1,44 @@ +""" +The run script for UPP +""" + +import os +import sys +from datetime import datetime, timedelta +from pathlib import Path + +from uwtools.api import config as uwconfig +from uwtools.api.driver import execute + + +# Load the YAML config +CONFIG_PATH = os.environ["CONFIG_PATH"] +CYCLE = os.environ["CYCLE"] + +cycle = datetime.fromisoformat(CYCLE) +key_path = "tracker" + +# Extract driver config from experiment config +expt_config = uwconfig.get_yaml_config(CONFIG_PATH) +expt_config.dereference(context={"cycle": cycle, **expt_config}) + +driver_dir = Path(expt_config["user"]["mpas_app"], "drivers") + +driver_config = expt_config[key_path]["gfdltracker"] +rundir = Path(driver_config["rundir"]) +print(f"Will run in {rundir}") + +# Run the tracker +execute( + module=driver_dir / "tracker.py", + classname="GFDLTracker", + task="run", + schema_file=driver_dir / "tracker.jsonschema", + config=CONFIG_PATH, + cycle=cycle, + key_path=[key_path], +) + +if not (rundir / "runscript.gfdltracker.done").is_file(): + print("Error occurred running the GFDL Vortex Tracker. Please see component error logs.") + sys.exit(1) diff --git a/ush/default_config.yaml b/ush/default_config.yaml index afb1e2e6..d33a10c3 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -447,11 +447,49 @@ post: numx: 2 rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/{{ "%03d" % (leadtime.total_seconds() / 3600) }}' tracker: + gfdltracker: + execution: + batchargs: + tasks_per_node: 32 + nodes: 1 + walltime: 00:30:00 + envcmds: + - module use {{ user.mpas_app }}/src/gfdl-tracker/modulefiles + - module load {{ user.platform }} + - ulimit -s unlimited + executable: "{{ user.mpas_app }}/exec/gettrk.x" + mpicmd: srun -l + input_files: + endhour: !int "{{ forecast.mpas.length }}" + filefreq: 6 + filepath: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/COMBINED.GrbF{{ "%02d" % (leadtime.total_seconds() / 3600) }}' + namelist: + base_file: "{{ user.mpas_app }}/parm/tracker/namelist.gettrk" + basins: L + update_values: + datein: + inp: + bcc: !int "{{ cycle.strftime('%Y')[:2] }}" + byy: !int "{{ cycle.strftime('%y') }}" + bmm: !int "{{ cycle.strftime('%m') }}" + bdd: !int "{{ cycle.strftime('%d') }}" + bhh: !int "{{ cycle.strftime('%H') }}" + atcfinfo: + atcfname: MPAS + atcfymdh: !int "{{ cycle.strftime('%Y%m%d%H') }}" + trackerinfo: + trkrinfo: + eastbd: 3313 + westbd: 20 + northbd: 2646 + southbd: 20 + rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/tracker' + tcvitals: "{{ platform.data.syndat_tcvitals }}/syndat_tcvitals.{{ cycle.strftime('%Y') }}" + platform: + account: '{{ platform.account }}' + scheduler: '{{ platform.scheduler }}' +graphics: basin_list: "L" - eastbd: 3313 - westbd: 20 - northbd: 2646 - southbd: 20 atcfname: "MPAS" execution: batchargs: diff --git a/ush/experiment_gen.py b/ush/experiment_gen.py index f18c14a5..aec23b06 100755 --- a/ush/experiment_gen.py +++ b/ush/experiment_gen.py @@ -185,8 +185,7 @@ def validate_driver_blocks(validated_blocks: list[str], workflow_config: YAMLCon # 0 is an arbitrary number for validation purposes. kwargs["leadtime"] = timedelta(hours=0) # Driver is validated when instantiated. - driver_class(**kwargs) - + driver = driver_class(**kwargs) if __name__ == "__main__": main() # pragma: no cover diff --git a/ush/validation.py b/ush/validation.py index 7be10294..3d6f56da 100644 --- a/ush/validation.py +++ b/ush/validation.py @@ -8,7 +8,7 @@ from uwtools.api.driver import yaml_keys_to_classes Model = Literal["GFS", "RAP", "RRFS"] - +MIN_WIDTH_HEIGHT = 80 class Config(BaseModel): user: User @@ -24,6 +24,63 @@ class LBCs(BaseModel): interval_hours: PositiveInt offset_hours: NonNegativeInt +class TrackerInfo(BaseModel): + trkrinfo: TrkrInfo + +class TrackerNamelist(BaseModel): + trackerinfo: TrackerInfo + +class TrkrInfo(BaseModel): + eastbd: float + westbd: float + northbd: float + southbd: float + + @model_validator(mode="after") + def positive_values(self): + for val in (self.eastbd, self.westbd, self.northbd, self.southbd): + if val < 0: + msg = f"Bounds must all be positive numbers. Got: {self.model_dump()}" + raise ValueError(msg) + return self + + @model_validator(mode="after") + def east_west_order(self): + if self.eastbd < self.westbd: + msg = "East and west bounds are probably switched. East bound + ({self.eastbd}) < west bound ({self.westbd})." + raise ValueError(msg) + return self + + + @model_validator(mode="after") + def east_west_size(self): + if self.eastbd < (self.westbd + MIN_WIDTH_HEIGHT): + msg = f"East and west bounds ({self.eastbd}, {self.westbd}) are close together. Recommend at least + {MIN_WIDTH_HEIGHT} points." + raise ValueError(msg) + return self + + + @model_validator(mode="after") + def north_south_order(self): + if self.northbd < self.southbd: + msg = "North and south bounds are probably switched. North bound + ({self.northbd}) < south bound ({self.southbd})." + raise ValueError(msg) + return self + + + @model_validator(mode="after") + def north_south_size(self): + if self.northbd < (self.southbd + MIN_WIDTH_HEIGHT): + msg = f"North and south bounds ({self.northbd}, {self.southbd}) are close together. Recommend at least + {MIN_WIDTH_HEIGHT} points." + raise ValueError(msg) + return self + + + class User(BaseModel): cycle_frequency: PositiveInt From abf1f7aa33cceea3b138f171fa96337257699ec5 Mon Sep 17 00:00:00 2001 From: "Samuel.Trahan" Date: Tue, 16 Dec 2025 23:43:36 +0000 Subject: [PATCH 36/42] it works again --- parm/wflow/tracker.yaml | 28 ++++++++++++++++++--- scripts/run_tracker.sh | 5 +++- ush/default_config.yaml | 47 ++++++++++-------------------------- ush/workflows/hfip_2025.yaml | 5 ++++ 4 files changed, 46 insertions(+), 39 deletions(-) diff --git a/parm/wflow/tracker.yaml b/parm/wflow/tracker.yaml index 87d0f5b3..a4fcdb7c 100644 --- a/parm/wflow/tracker.yaml +++ b/parm/wflow/tracker.yaml @@ -27,15 +27,35 @@ workflow: attrs: task: upp_#fhr# task_tracker: - command: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; ; python &MPAS_APP;/scripts/tracker.py' + command: + cyclestr: + value: ' + source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && + module purge && + module use &MPAS_APP;/src/GFDL-VortexTracker/modulefiles && + module load &PLATFORM; && + cd {{ user.experiment_dir }}/@Y@m@d@H && + &MPAS_APP;/scripts/run_tracker.sh + @Y@m@d@H + "{{ platform.syndat_prefix }}" + "{{ platform.mpicmd }}" + "{{ user.forecast.output_interval }}" + "{{ forecast.mpas.length }}" + "&MPAS_APP;" + "{{ tracker.eastbd }}" + "{{ tracker.westbd }}" + "{{ tracker.northbd }}" + "{{ tracker.southbd }}" + "{{ tracker.atcfname }}" + "{{ tracker.basin_list }}" + ' account: "{{ platform.account }}" join: cyclestr: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' - walltime: "{{ tracker.gfdltracker.execution.batchargs.walltime }}" - nodes: "{{ tracker.gfdltracker.execution.batchargs.nodes }}:ppn={{ tracker.gfdltracker.execution.batchargs.tasks_per_node }}" + walltime: "{{ tracker.execution.batchargs.walltime }}" + nodes: "{{ tracker.execution.batchargs.nodes }}:ppn={{ tracker.execution.batchargs.tasks_per_node }}" exclusive: "{{ tracker.execution.batchargs.exclusive }}" - partition: "{{ tracker.gfdltracker.execution.batchargs.partition }}" envars: CONFIG_PATH: '&EXPERIMENT_CONFIG;' CYCLE: diff --git a/scripts/run_tracker.sh b/scripts/run_tracker.sh index f0559ccc..a77f704c 100755 --- a/scripts/run_tracker.sh +++ b/scripts/run_tracker.sh @@ -14,15 +14,18 @@ northbd="$9" # 2646 southbd="${10}" # 20 atcfname="${11}" # MPAS basin_list="${12}" # L -platform="${13}" # ursa mpas_upp=../upp fhour_start=0 tracker="$mpas_app/exec/gettrk.x" +rm -rf tracker +mkdir tracker cd tracker +ln -s ../latlon/mpas.trak.all.* . + valid_basins='ABCELPQSW' if [[ ! "$basin_list" =~ [$valid_basins] ]] ; then set +x diff --git a/ush/default_config.yaml b/ush/default_config.yaml index b1085c56..7b6affd1 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -447,40 +447,19 @@ post: numx: 2 rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/{{ "%03d" % (leadtime.total_seconds() / 3600) }}' tracker: - gfdltracker: - execution: - batchargs: - tasks_per_node: 32 - nodes: 1 - walltime: 00:30:00 - partition: xjet,kjet - envcmds: - - module use {{ user.mpas_app }}/src/GFDL-VortexTracker/modulefiles - - module load {{ user.platform }} - - ulimit -s unlimited - executable: "{{ user.mpas_app }}/exec/gettrk.x" - input_files: - endhour: !int "{{ forecast.mpas.length }}" - filefreq: 6 - filepath: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/COMBINED.GrbF{{ "%02d" % (leadtime.total_seconds() / 3600) }}' - namelist: - base_file: "{{ user.mpas_app }}/parm/tracker/namelist.gettrk" - update_values: - datein: - inp: - bcc: !int "{{ cycle.strftime('%Y')[:2] }}" - byy: !int "{{ cycle.strftime('%y') }}" - bmm: !int "{{ cycle.strftime('%m') }}" - bdd: !int "{{ cycle.strftime('%d') }}" - bhh: !int "{{ cycle.strftime('%H') }}" - atcfinfo: - atcfname: MPAS - atcfymdh: !int "{{ cycle.strftime('%Y%m%d%H') }}" - rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/tracker' - tcvitals: '{{ platform.syndat_prefix }}' - platform: - account: '{{ platform.account }}' - scheduler: '{{ platform.scheduler }}' + basin_list: "ABCELPQSW" + eastbd: 3313 + westbd: 20 + northbd: 2646 + southbd: 20 + atcfname: "MPAS" + execution: + batchargs: + walltime: 00:12:00 + nodes: 1 + tasks_per_node: 1 + exclusive: true + atcfname: MPAS latlon_regrid: new_grid: "latlon -100:3333:0.03 -10:2666:0.03" execution: diff --git a/ush/workflows/hfip_2025.yaml b/ush/workflows/hfip_2025.yaml index 5b498ed9..1ab27322 100644 --- a/ush/workflows/hfip_2025.yaml +++ b/ush/workflows/hfip_2025.yaml @@ -6,6 +6,8 @@ user: - graphics.yaml - scrubbing.yaml - archiving.yaml + - tracker.yaml + - archiving_tracker.yaml first_cycle: !!timestamp 2025-08-14T00:00:00 last_cycle: !!timestamp 2025-08-15T00:00:00 @@ -52,6 +54,9 @@ create_ics: preproc_stages: config_aerosol_climo: true +tracker: + basin_list: "L" + forecast: mpas: domain: global From f57c0608d4c2bd396bcb9ca01603d6a41be358a1 Mon Sep 17 00:00:00 2001 From: Christina Holt Date: Thu, 18 Dec 2025 17:43:15 +0000 Subject: [PATCH 37/42] WIP --- drivers/tracker.jsonschema | 1 + drivers/tracker.py | 69 ++++++++++++++-------------- format | 2 +- pyproject.toml | 3 +- scripts/common.py | 8 +++- scripts/tracker.py | 53 +++++++++------------- tests/scripts/test_common.py | 3 +- tests/ush/test_validation.py | 88 ++++++++++++++++++++++++++++++++++++ ush/default_config.yaml | 2 +- ush/experiment_gen.py | 3 +- ush/validation.py | 58 +++++++++++++----------- 11 files changed, 192 insertions(+), 98 deletions(-) mode change 100644 => 100755 scripts/tracker.py diff --git a/drivers/tracker.jsonschema b/drivers/tracker.jsonschema index 8ff53f1c..0541c2ab 100644 --- a/drivers/tracker.jsonschema +++ b/drivers/tracker.jsonschema @@ -60,6 +60,7 @@ } }, "required": [ + "basins", "execution", "input_files", "namelist", diff --git a/drivers/tracker.py b/drivers/tracker.py index 1905d6f8..57807f46 100644 --- a/drivers/tracker.py +++ b/drivers/tracker.py @@ -1,33 +1,31 @@ """ A driver for GFDL's Cyclone Tracker """ -import json + import re from datetime import timedelta -from itertools import chain from pathlib import Path from iotaa import asset, task, tasks - -from uwtools.config.formats.yaml import YAMLConfig from uwtools.config.formats.nml import NMLConfig +from uwtools.config.formats.yaml import YAMLConfig +from uwtools.config.validator import validate_internal from uwtools.drivers.driver import Assets, DriverCycleBased from uwtools.strings import STR from uwtools.utils.file import writable -from uwtools.utils.processing import execute +from uwtools.utils.processing import run_shell_cmd from uwtools.utils.tasks import file, symlink + from ush.validation import TrackerNamelist class GFDLTracker(DriverCycleBased): - """ A driver for the GFDL Tracker """ # Workflow tasks - @task def input_fcst_minutes(self): """ @@ -38,7 +36,7 @@ def input_fcst_minutes(self): path = self.rundir / fn yield asset(path, path.is_file) yield [self.input_files(), self.input_index_files()] - content_list = [f"{i+1:4d} {fhr*60:5d}" for i, fhr in enumerate(self._input_file_map())] + content_list = [f"{i + 1:4d} {fhr * 60:5d}" for i, fhr in enumerate(self._input_file_map())] with writable(path) as f: f.write("\n".join(content_list)) @@ -52,10 +50,11 @@ def input_files(self): symlinks = {} for fhr, target in upp_files.items(): linkname = f"mpas.trak.all.{self.cycle.strftime('%Y%m%d%H')}.f{fhr * 60:05d}" - target = Path(target) symlinks[target] = linkname - yield [symlink(target=t, linkname=self.rundir / l) for t, l in symlinks.items()] - + yield [ + symlink(target=Path(target), linkname=self.rundir / link) + for target, link in symlinks.items() + ] @task def input_index_files(self): @@ -65,20 +64,21 @@ def input_index_files(self): yield self.taskname("input index files") index_files = {} for fhr in self._input_file_map(): - infile = str(self.rundir / - f"mpas.trak.all.{self.cycle.strftime('%Y%m%d%H')}.f{fhr * 60:05d}") + infile = str( + self.rundir / f"mpas.trak.all.{self.cycle.strftime('%Y%m%d%H')}.f{fhr * 60:05d}" + ) indexfile = f"{infile}.ix" index_files[infile] = str(self.rundir / indexfile) - yield [file(Path(idx)) for idx in index_files.values()] - yield self.input_files() + yield [asset(Path(idx), Path(idx).is_file) for idx in index_files.values()] + yield [self.input_files()] self.rundir.mkdir(exist_ok=True) envcmds = self.config["execution"]["envcmds"] for infile, idx in index_files.items(): - execute( + run_shell_cmd( cmd=f"{' && '.join(envcmds)} && grb2index {infile} {idx}", cwd=self.rundir, log_output=True, - ) + ) @task def input_vitals(self): @@ -94,14 +94,15 @@ def input_vitals(self): datestr = self.cycle.strftime("%Y%m%d %H") basins = self.config["basins"] storms = [] - with open(tcvitals, "r", encoding="utf-8") as f: + with tcvitals.open() as f: for line in f: if datestr in line: # Get all the storms in the required basins # Matches: NHC 13L MELISSA 20251021 1200 143N 0713W 280 062..... - pattern = r'^.{5}[0-49][0-9][%s].{11}%s.*$' % (basins, datestr) + pattern = r"^.{5}[0-49][0-9][%s].{11}%s.*$" % (basins, datestr) match = re.match(pattern, line) - storms.append(match.group(0) + if match: + storms.append(match.group(0)) with writable(path) as f: f.write("\n".join(storms)) @@ -116,7 +117,7 @@ def input_vitals_other_names(self): yield [asset(path, path.is_file) for path in paths] yield self.input_vitals() for path in paths: - symlink(target=self.rundir/ "allvit", linkname=path) + symlink(target=self.rundir / "allvit", linkname=path) @task def namelist_file(self): @@ -132,7 +133,7 @@ def namelist_file(self): if base_file := namelist.get(STR.basefile): input_files.append(base_file) yield [file(Path(input_file)) for input_file in input_files] - self._create_user_updated_config( + self.create_user_updated_config( config_class=NMLConfig, config_values=namelist, path=path, @@ -143,7 +144,7 @@ def provisioned_rundir(self): """ Run directory provisioned with all required content. """ - yield self.taskname(f"provisioned run directory: {str(self.rundir)}") + yield self.taskname(f"provisioned run directory: {self.rundir}") self.rundir.mkdir(exist_ok=True) yield [ self.input_fcst_minutes(), @@ -155,7 +156,6 @@ def provisioned_rundir(self): self.runscript(), ] - @task def runscript(self): """ @@ -169,8 +169,8 @@ def runscript(self): # Private helper methods - @property - def driver_name(self) -> str: + @classmethod + def driver_name(cls) -> str: """ Returns the name of this driver. """ @@ -188,12 +188,12 @@ def _input_file_map(self) -> dict: leadtime = timedelta(hours=fhr) configobj = YAMLConfig(infiles) configobj.dereference( - context={ - "cycle": self.cycle, - "leadtime": leadtime, - **self.config_full, - } - ) + context={ + "cycle": self.cycle, + "leadtime": leadtime, + **self.config_full, + } + ) filemap[fhr] = configobj["filepath"] return filemap @@ -203,11 +203,10 @@ def _validate(self) -> None: :raises: UWConfigError if validation fails. """ - Assets._validate(self) # noqa: SLF001 + Assets._validate(self) # noqa: SLF001 validate_internal( schema_name=STR.platform, desc="platform config", config_data=self._config_intermediate, ) - TrackerNamelist(self.config["namelist"]["update_values"]) - + TrackerNamelist(**self.config["namelist"]["update_values"]) diff --git a/format b/format index 293cb0f8..5115f7b3 100755 --- a/format +++ b/format @@ -1,6 +1,6 @@ #!/bin/bash -eu -dirs=( docs scripts tests ush ) +dirs=( docs drivers scripts tests ush ) echo "=> Formatting code" ruff format ${dirs[*]} diff --git a/pyproject.toml b/pyproject.toml index 10ccfcd0..259bc901 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ show_missing = true skip_covered = true [tool.coverage.run] -source = ["scripts", "ush"] +source = ["drivers", "scripts", "ush"] [tool.mypy] check_untyped_defs = true @@ -31,6 +31,7 @@ ignore = [ "FBT002", # boolean-default-value-positional-argument "LOG015", # root-logger-call "PLR0912", # too-many-branches + "PLR0913", # too-many-arguments "PLR2004", # magic-value-comparison "PTH207", # glob "S101", # assert diff --git a/scripts/common.py b/scripts/common.py index de0dcbd1..67fceb49 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -42,9 +42,15 @@ def run_component( cycle: datetime, key_path: list[str], leadtime: timedelta | None = None, + schema_file: Path | None = None, ) -> Driver: use_uwtools_logger() - kwargs = {"config": config_file, "cycle": cycle, "key_path": key_path} + kwargs = { + "config": config_file, + "cycle": cycle, + "key_path": key_path, + "schema_file": schema_file, + } if leadtime is not None: kwargs["leadtime"] = leadtime driver: Driver = driver_class(**kwargs) diff --git a/scripts/tracker.py b/scripts/tracker.py old mode 100644 new mode 100755 index 61212f47..279f5cf1 --- a/scripts/tracker.py +++ b/scripts/tracker.py @@ -1,44 +1,35 @@ +#!/usr/bin/env python3 """ -The run script for UPP +The run script for the GFDL Vortex Tracker. """ -import os import sys -from datetime import datetime, timedelta from pathlib import Path -from uwtools.api import config as uwconfig -from uwtools.api.driver import execute +sys.path.append(str(Path(__file__).parent.parent)) +from uwtools.api.config import get_yaml_config +from uwtools.api.logging import use_uwtools_logger -# Load the YAML config -CONFIG_PATH = os.environ["CONFIG_PATH"] -CYCLE = os.environ["CYCLE"] +from drivers.tracker import GFDLTracker +from scripts.common import parse_args, run_component -cycle = datetime.fromisoformat(CYCLE) -key_path = "tracker" -# Extract driver config from experiment config -expt_config = uwconfig.get_yaml_config(CONFIG_PATH) -expt_config.dereference(context={"cycle": cycle, **expt_config}) +def main(): + args = parse_args() + use_uwtools_logger() + expt_config = get_yaml_config(args.config_file) + driver_dir = Path(expt_config["user"]["mpas_app"], "drivers") -driver_dir = Path(expt_config["user"]["mpas_app"], "drivers") + # Run the tracker + run_component( + driver_class=GFDLTracker, + config_file=args.config_file, + cycle=args.cycle, + key_path=args.key_path, + schema_file=driver_dir / "tracker.jsonschema", + ) -driver_config = expt_config[key_path]["gfdltracker"] -rundir = Path(driver_config["rundir"]) -print(f"Will run in {rundir}") -# Run the tracker -execute( - module=driver_dir / "tracker.py", - classname="GFDLTracker", - task="run", - schema_file=driver_dir / "tracker.jsonschema", - config=CONFIG_PATH, - cycle=cycle, - key_path=[key_path], -) - -if not (rundir / "runscript.gfdltracker.done").is_file(): - print("Error occurred running the GFDL Vortex Tracker. Please see component error logs.") - sys.exit(1) +if __name__ == "__main__": + main() # pragma: no cover diff --git a/tests/scripts/test_common.py b/tests/scripts/test_common.py index 39c3fcf3..b8216f44 100644 --- a/tests/scripts/test_common.py +++ b/tests/scripts/test_common.py @@ -10,12 +10,13 @@ @fixture def test_driver(): class Driver: - def __init__(self, config, cycle, key_path, leadtime=None): + def __init__(self, config, cycle, key_path, leadtime=None, schema_file=None): config = {"rundir": "/some/rundir"} self.config = config self.cycle = cycle self.key_path = key_path self.leadtime = leadtime + self.schema_file = schema_file def run(self): pass diff --git a/tests/ush/test_validation.py b/tests/ush/test_validation.py index fc45a705..5f73de84 100644 --- a/tests/ush/test_validation.py +++ b/tests/ush/test_validation.py @@ -11,6 +11,7 @@ MSG = SimpleNamespace( dt="a valid datetime", + float="a valid number", ge0="greater than or equal to 0", gt0="greater than 0", int="a valid integer", @@ -19,9 +20,82 @@ str="a valid string", ) + # Tests +@mark.parametrize( + ("param", "error_start"), + [ + ("westbd", "East and west"), + ("southbd", "North and south"), + ], +) +def test_validate__trackernamelist_param_order_switched(tracker_config, param, error_start): + keys = ["trackerinfo", "trkrinfo"] + with raises(ValidationError) as e: + validation.TrackerNamelist(**with_set(tracker_config, 100000, *[*keys, param])) + check(e, keys, f"Value error, {error_start} bounds are probably switched.") + + +@mark.parametrize( + ("param", "error_start"), + [ + ("eastbd", "East and west"), + ("northbd", "North and south"), + ], +) +def test_validate__trackernamelist_param_size_too_small(tracker_config, param, error_start): + keys = ["trackerinfo", "trkrinfo"] + with raises(ValidationError) as e: + validation.TrackerNamelist(**with_set(tracker_config, 30, *[*keys, param])) + check(e, keys, f"Value error, {error_start} bounds (30.0, 20.0) are close together.") + + +@mark.parametrize( + ("keys", "msg", "val"), + [ + (["eastbd"], MSG.ge0, -1), + (["eastbd"], MSG.float, None), + (["westbd"], MSG.ge0, -1), + (["westbd"], MSG.float, None), + (["northbd"], MSG.ge0, -1), + (["northbd"], MSG.float, None), + (["southbd"], MSG.ge0, -1), + (["southbd"], MSG.float, None), + ], +) +def test_validate__trackernamelist_fail_values_bad(tracker_config, keys, msg, val): + keys = ["trackerinfo", "trkrinfo", *keys] + with raises(ValidationError) as e: + validation.TrackerNamelist(**with_set(tracker_config, val, *keys)) + check(e, keys, f"Input should be {msg}") + + +@mark.parametrize( + "keys", + [ + ["eastbd"], + ["westbd"], + ["northbd"], + ["southbd"], + ], +) +def test_validate__trackernamelist_fail_values_missing(tracker_config, keys): + keys = ["trackerinfo", "trkrinfo", *keys] + with raises(ValidationError) as e: + validation.TrackerNamelist(**with_del(tracker_config, *keys)) + check(e, keys, "Field required") + + +def test_validate__trackernamelist_pass(tracker_config): + validated = validation.TrackerNamelist(**tracker_config) + assert validated.trackerinfo.trkrinfo.eastbd == 3310.0 + assert validated.trackerinfo.trkrinfo.westbd == 20.0 + assert validated.trackerinfo.trkrinfo.northbd == 2646.0 + assert validated.trackerinfo.trkrinfo.westbd == 20.0 + + def test_validate__user_driver_validation_blocks(config): keys = ["user", "driver_validation_blocks"] # Fine: one of the uwtools drivers @@ -148,6 +222,20 @@ def config(tmp_path): } +@fixture +def tracker_config(): + return { + "trackerinfo": { + "trkrinfo": { + "eastbd": 3310.0, + "westbd": 20.0, + "northbd": 2646.0, + "southbd": 20.0, + }, + }, + } + + def check(e: ExceptionInfo[ValidationError], keys: list[str], msg: str): assert e.value.error_count() == 1 info = json.loads(e.value.json())[0] diff --git a/ush/default_config.yaml b/ush/default_config.yaml index d33a10c3..53f4006b 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -448,6 +448,7 @@ post: rundir: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/{{ "%03d" % (leadtime.total_seconds() / 3600) }}' tracker: gfdltracker: + basins: L execution: batchargs: tasks_per_node: 32 @@ -465,7 +466,6 @@ tracker: filepath: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/COMBINED.GrbF{{ "%02d" % (leadtime.total_seconds() / 3600) }}' namelist: base_file: "{{ user.mpas_app }}/parm/tracker/namelist.gettrk" - basins: L update_values: datein: inp: diff --git a/ush/experiment_gen.py b/ush/experiment_gen.py index aec23b06..f18c14a5 100755 --- a/ush/experiment_gen.py +++ b/ush/experiment_gen.py @@ -185,7 +185,8 @@ def validate_driver_blocks(validated_blocks: list[str], workflow_config: YAMLCon # 0 is an arbitrary number for validation purposes. kwargs["leadtime"] = timedelta(hours=0) # Driver is validated when instantiated. - driver = driver_class(**kwargs) + driver_class(**kwargs) + if __name__ == "__main__": main() # pragma: no cover diff --git a/ush/validation.py b/ush/validation.py index 3d6f56da..812b2ffa 100644 --- a/ush/validation.py +++ b/ush/validation.py @@ -4,12 +4,20 @@ from pathlib import Path # noqa: TC003 from typing import Literal -from pydantic import BaseModel, Field, NonNegativeInt, PositiveInt, model_validator +from pydantic import ( + BaseModel, + Field, + NonNegativeFloat, + NonNegativeInt, + PositiveInt, + model_validator, +) from uwtools.api.driver import yaml_keys_to_classes Model = Literal["GFS", "RAP", "RRFS"] MIN_WIDTH_HEIGHT = 80 + class Config(BaseModel): user: User @@ -24,64 +32,62 @@ class LBCs(BaseModel): interval_hours: PositiveInt offset_hours: NonNegativeInt + class TrackerInfo(BaseModel): trkrinfo: TrkrInfo + class TrackerNamelist(BaseModel): trackerinfo: TrackerInfo -class TrkrInfo(BaseModel): - eastbd: float - westbd: float - northbd: float - southbd: float - @model_validator(mode="after") - def positive_values(self): - for val in (self.eastbd, self.westbd, self.northbd, self.southbd): - if val < 0: - msg = f"Bounds must all be positive numbers. Got: {self.model_dump()}" - raise ValueError(msg) - return self +class TrkrInfo(BaseModel): + eastbd: NonNegativeFloat + westbd: NonNegativeFloat + northbd: NonNegativeFloat + southbd: NonNegativeFloat @model_validator(mode="after") def east_west_order(self): if self.eastbd < self.westbd: - msg = "East and west bounds are probably switched. East bound - ({self.eastbd}) < west bound ({self.westbd})." + msg = ( + "East and west bounds are probably switched. East bound " + f"({self.eastbd}) < west bound ({self.westbd})." + ) raise ValueError(msg) return self - @model_validator(mode="after") def east_west_size(self): if self.eastbd < (self.westbd + MIN_WIDTH_HEIGHT): - msg = f"East and west bounds ({self.eastbd}, {self.westbd}) are close together. Recommend at least - {MIN_WIDTH_HEIGHT} points." + msg = ( + f"East and west bounds ({self.eastbd}, {self.westbd}) are " + f"close together. Recommend at least {MIN_WIDTH_HEIGHT} points." + ) raise ValueError(msg) return self - @model_validator(mode="after") def north_south_order(self): if self.northbd < self.southbd: - msg = "North and south bounds are probably switched. North bound - ({self.northbd}) < south bound ({self.southbd})." + msg = ( + "North and south bounds are probably switched. North bound" + f"({self.northbd}) < south bound ({self.southbd})." + ) raise ValueError(msg) return self - @model_validator(mode="after") def north_south_size(self): if self.northbd < (self.southbd + MIN_WIDTH_HEIGHT): - msg = f"North and south bounds ({self.northbd}, {self.southbd}) are close together. Recommend at least - {MIN_WIDTH_HEIGHT} points." + msg = ( + f"North and south bounds ({self.northbd}, {self.southbd}) " + f"are close together. Recommend at least {MIN_WIDTH_HEIGHT} points." + ) raise ValueError(msg) return self - - class User(BaseModel): cycle_frequency: PositiveInt driver_validation_blocks: list[str] = Field(default_factory=list) From 1badc002079bbd293db23f3bc552dacc830fad76 Mon Sep 17 00:00:00 2001 From: Christina Holt Date: Thu, 18 Dec 2025 17:43:40 +0000 Subject: [PATCH 38/42] Add new files. --- tests/drivers/__init__.py | 0 tests/drivers/test_tracker.py | 131 ++++++++++++++++++++++++++++++++++ tests/scripts/test_tracker.py | 23 ++++++ 3 files changed, 154 insertions(+) create mode 100644 tests/drivers/__init__.py create mode 100644 tests/drivers/test_tracker.py create mode 100644 tests/scripts/test_tracker.py diff --git a/tests/drivers/__init__.py b/tests/drivers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/drivers/test_tracker.py b/tests/drivers/test_tracker.py new file mode 100644 index 00000000..a1bf5ad2 --- /dev/null +++ b/tests/drivers/test_tracker.py @@ -0,0 +1,131 @@ +""" +Tracker driver tests. +""" + +from datetime import datetime, timezone +from pathlib import Path +from unittest.mock import call, patch + +from iotaa import asset, external +from pytest import fixture + +from drivers import tracker + + +@fixture +def config(tmp_path): + return { + "gfdltracker": { + "basins": "L", + "execution": { + "executable": "tracker.exe", + "batchargs": {"walltime": "01:00:00"}, + "envcmds": ["foo", "bar"], + }, + "input_files": { + "endhour": 12, + "filefreq": 6, + "filepath": str( + tmp_path / "input" / "gribf{{ '%02d' % (leadtime.total_seconds() / 3600) }}" + ), + }, + "namelist": { + "update_values": { + "trackerinfo": { + "trkrinfo": { + "eastbd": 3313, + "westbd": 20, + "northbd": 2646, + "southbd": 20, + }, + }, + }, + }, + "rundir": str(tmp_path / "tracker"), + "tcvitals": "/path/to/tcvitals/syntdat_tcvitals.2025", + } + } + + +@fixture +def cycle(utc): + return utc(2024, 2, 1, 18) + + +@fixture +def driverobj(config, cycle): + schema_file = Path(__name__).parent.parent.parent.absolute() / "drivers" / "tracker.jsonschema" + return tracker.GFDLTracker(config=config, cycle=cycle, batch=True, schema_file=schema_file) + + +@fixture +def outpath(driverobj): + return lambda fn: driverobj.rundir / fn + + +@fixture +def ready_task(): + @external + def ready(*_args, **_kwargs): + yield "ready" + yield asset(None, lambda: True) + + return ready + + +@fixture +def utc(): + def utc(*args, **kwargs) -> datetime: + # See https://github.com/python/mypy/issues/6799 + tz = timezone.utc + dt = datetime(*args, **kwargs, tzinfo=tz) if args or kwargs else datetime.now(tz=tz) # type: ignore[misc] + return dt.replace(tzinfo=None) + + return utc + + +def test_tracker_input_fcst_minutes(driverobj, ready_task): + with ( + patch.object(driverobj, "input_files", new=ready_task), + patch.object(driverobj, "input_index_files", new=ready_task), + ): + driverobj.input_fcst_minutes() + path = driverobj.rundir / "fort.15" + assert path.is_file() + contents = path.read_text().strip("\n").split("\n") + assert contents == [" 1 0", " 2 360", " 3 720"] + + +def test_tracker_input_files(driverobj, tmp_path): + infiles = [Path(fp) for fp in driverobj._input_file_map().values()] + for fp in infiles: + fp.parent.mkdir(parents=True, exist_ok=True) + fp.touch() + driverobj.input_files() + expected_links = [f"mpas.trak.all.2024020118.f{fmin:05d}" for fmin in (0, 360, 720)] + for infile, outlink in zip(infiles, expected_links): + expected = tmp_path / "tracker" / outlink + assert expected.is_symlink() + assert expected.resolve() == infile + + +def test_tracker_input_index_files(driverobj, ready_task): + input_files = driverobj.input_files().ref + with ( + patch.object(driverobj, "input_files", new=ready_task), + patch.object(tracker, "run_shell_cmd") as run, + ): + driverobj.input_index_files() + expected_calls = [ + call( + cmd=f"foo && bar && grb2index {infile} {infile}.ix", + cwd=driverobj.rundir, + log_output=True, + ) + for infile in input_files + ] + assert run.call_args_list == expected_calls + + +def test_tracker_driver_name(driverobj): + assert driverobj.driver_name() == tracker.GFDLTracker.driver_name() == "gfdltracker" diff --git a/tests/scripts/test_tracker.py b/tests/scripts/test_tracker.py new file mode 100644 index 00000000..c2aca288 --- /dev/null +++ b/tests/scripts/test_tracker.py @@ -0,0 +1,23 @@ +from pathlib import Path +from unittest.mock import patch + +from scripts import tracker + + +def test_main(args): + mpas_app = Path("/some/path") + expt_config = {"user": {"mpas_app": str(mpas_app)}} + with ( + patch.object(tracker, "get_yaml_config", return_value=expt_config), + patch.object(tracker, "parse_args", return_value=args) as parse_args, + patch.object(tracker, "run_component", return_value=Path("/some/rundir")) as run_component, + ): + tracker.main() + parse_args.assert_called_once() + run_component.assert_called_once_with( + driver_class=tracker.GFDLTracker, + config_file=args.config_file, + cycle=args.cycle, + key_path=args.key_path, + schema_file=mpas_app / "drivers" / "tracker.jsonschema", + ) From 37742ae268c0917455f94620d6a5c05821add212 Mon Sep 17 00:00:00 2001 From: Christina Holt Date: Thu, 18 Dec 2025 21:29:05 +0000 Subject: [PATCH 39/42] Finished tracker unittests. --- drivers/tracker.jsonschema | 2 +- drivers/tracker.py | 11 - tests/data/syndat_tcvitals.2025 | 1156 +++++++++++++++++++++++++++++++ tests/drivers/test_tracker.py | 93 ++- 4 files changed, 1246 insertions(+), 16 deletions(-) create mode 100644 tests/data/syndat_tcvitals.2025 diff --git a/drivers/tracker.jsonschema b/drivers/tracker.jsonschema index 0541c2ab..7e7e9af8 100644 --- a/drivers/tracker.jsonschema +++ b/drivers/tracker.jsonschema @@ -5,7 +5,7 @@ "properties": { "basins": { "type": "string", - "pattern": "^[ABCELPQSW]$" + "pattern": "^[ABCELPQSW]+$" }, "execution": { "$ref": "urn:uwtools:execution-serial" diff --git a/drivers/tracker.py b/drivers/tracker.py index 57807f46..517306b4 100644 --- a/drivers/tracker.py +++ b/drivers/tracker.py @@ -156,17 +156,6 @@ def provisioned_rundir(self): self.runscript(), ] - @task - def runscript(self): - """ - The runscript. - """ - path = self._runscript_path - yield self.taskname(path.name) - yield asset(path, path.is_file) - yield None - self._write_runscript(path=path) - # Private helper methods @classmethod diff --git a/tests/data/syndat_tcvitals.2025 b/tests/data/syndat_tcvitals.2025 new file mode 100644 index 00000000..5aab9dd0 --- /dev/null +++ b/tests/data/syndat_tcvitals.2025 @@ -0,0 +1,1156 @@ +JTWC 94P INVEST 20251214 0000 117S 1681E 160 032 1001 1006 0241 15 055 -999 -999 -999 -999 M +JTWC 26S TWENTY-SI 20250321 1200 153S 0976E 125 026 1003 1009 0444 13 166 -999 -999 -999 -999 S +JTWC 93S INVEST 20250327 0600 138S 1219E 050 026 0996 1005 0278 15 064 -999 -999 -999 -999 S +JTWC 10W FRANCISCO 20250723 1800 231N 1282E 325 047 0987 0998 0389 20 092 0296 0296 -999 0121 M +JTWC 31P THIRTYONE 20250420 0600 126S 1409E 245 006 1002 1006 0232 15 055 -999 -999 -999 -999 S +NHC 95L INVEST 20251005 0600 080N 0259W 284 067 1011 1013 0389 13 222 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 98L INVEST 20250814 1200 200N 0926W 305 051 1011 1015 0278 10 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 03S BLOSSOM 20250912 0000 085S 0620E 300 037 1006 1010 0158 15 037 -999 -999 -999 -999 S +JTWC 11W CO-MAY 20250730 0600 307N 1218E 330 047 0981 0994 0370 20 092 0241 0158 0093 0204 D +JTWC 10S TEN 20250118 1200 189S 1178E 280 037 0996 1003 0611 23 046 0102 0093 0093 0102 M +NHC 03L CHANTAL 20250707 1800 383N 0757W 045 067 1012 1013 0083 10 037 -999 -999 -999 -999 M -999 -999 -999 -999 24 415N 693W -999 -999 -999 -999 +NHC 91E INVEST 20251015 1800 119N 0954W 270 031 1007 1009 0278 15 185 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 94L INVEST 20250926 0600 198N 0729W 280 041 1009 1013 0334 13 148 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 28W HALONG 20251006 0600 257N 1409E 290 021 0977 1006 0333 33 027 0185 0167 0148 0111 D +JTWC 07S DIKELEDI 20250113 1800 155S 0402E 245 042 0981 1006 0296 36 027 0074 0074 0056 0056 D +JTWC 29S TWENTY-NI 20250412 0600 115S 1266E 235 047 0999 1007 0296 18 074 -999 0074 0111 -999 M +JTWC 25S JUDE 20250313 0000 189S 0361E 145 032 1001 1007 0389 15 166 -999 -999 -999 -999 M +JTWC 01C IONA 20250803 1800 222N 1713E 315 077 1010 1014 0185 13 092 -999 -999 -999 -999 S +JTWC 18W LINGLING 20250821 1800 318N 1314E 095 032 1004 1008 0111 15 055 -999 -999 -999 -999 S +JTWC 21P SERU 20250227 0000 219S 1710E 165 032 0994 1007 0435 23 064 0213 0287 0269 0139 M +JTWC 14S TALIAH 20250217 1800 300S 0770E 230 021 0996 1012 0407 20 111 0130 0139 -999 -999 M +JTWC 97S INVEST 20250224 1800 182S 0516E 125 021 1007 1011 0241 15 037 -999 -999 -999 -999 S +JTWC 13S VINCE 20250208 1800 205S 0715E 265 052 0946 1007 0500 59 031 0121 0259 0250 0111 D +JTWC 32W FUNG-WONG 20251109 1200 161N 1218E 300 088 0945 1004 0713 51 027 0370 0333 0259 0370 D +JTWC 25W NEOGURI 20250922 1800 305N 1528E 060 032 0970 1006 0333 41 027 0185 0269 0222 0333 D +JTWC 28W HALONG 20251007 1200 281N 1373E 310 042 0942 1009 0296 59 027 0222 0222 0130 0121 D +JTWC 92S INVEST 20250102 0600 095S 0581E 080 016 1007 1011 0324 13 074 -999 -999 -999 -999 S +JTWC 31P THIRTYONE 20250421 1200 116S 1366E 290 052 1003 1009 0167 15 037 -999 -999 -999 -999 S +JTWC 19W KAJIKI 20250823 1200 179N 1136E 280 083 0992 1006 0278 28 064 0093 0093 0176 0176 D +JTWC 14S TALIAH 20250204 1200 156S 1104E 260 042 0967 1004 0528 43 037 0324 0204 0222 0333 D +NHC 14E NARDA 20250923 1800 154N 1078W 260 057 0981 1008 0371 39 019 0111 0148 0130 0130 D 0056 0074 0065 0065 72 168N 1203W 0028 -999 -999 0019 +JTWC 27S COURTNEY 20250329 0600 180S 0910E 255 062 0942 1006 0472 61 009 0121 0148 0139 0121 D +JTWC 13S VINCE 20250207 1200 200S 0771E 265 057 0932 1006 0500 66 022 0130 0148 0167 0130 D +JTWC 96S INVEST 20250211 0000 164S 1188E 250 037 0999 1003 0296 15 129 -999 -999 -999 -999 S +JTWC 22S GARANCE 20250301 0600 278S 0549E 180 093 0986 1004 0167 28 055 0139 0111 0037 0074 M +JTWC 24S IVONE 20250310 0000 179S 0827E 205 052 0991 1007 0500 26 111 0333 0481 0370 0185 M +JTWC 13S VINCE 20250205 0000 187S 0869E 250 052 0967 1006 0500 46 027 0121 0158 0213 0158 D +JTWC 06W NARI 20250713 0000 265N 1425E 030 037 0997 1004 0296 18 074 0158 0204 -999 -999 M +NHC 08E HENRIETTE 20250809 0000 200N 1439W 285 077 1009 1013 0185 15 056 -999 -999 -999 -999 S -999 -999 -999 -999 72 291N 1569W -999 -999 -999 -999 +JTWC 23W MITAG 20250918 1200 201N 1168E 295 052 1002 1006 0167 18 064 0130 0111 -999 -999 M +JTWC 25S TWENTY-FI 20250308 1800 145S 0456E 260 062 0996 1007 0333 18 074 0074 0148 0093 0093 M +NHC 18E SONIA 20251028 0000 144N 1219W 295 031 1004 1010 0297 18 056 0074 0037 -999 0074 M -999 -999 -999 -999 48 146N 1276W -999 -999 -999 -999 +JTWC 95W INVEST 20250622 0600 229N 1460E 345 026 1007 1009 0259 10 092 -999 -999 -999 -999 S +JTWC 07S DIKELEDI 20250117 0000 329S 0516E 125 123 0979 1008 0491 33 037 0204 0093 0093 0148 D +JTWC 21W PEIPAH 20250904 1800 331N 1328E 025 067 1000 1006 0259 18 157 -999 0158 0084 -999 M +NHC 14E NARDA 20250925 0000 151N 1127W 270 046 0978 1010 0482 41 028 0130 0259 0167 0167 D 0093 0111 0074 0074 72 182N 1244W 0056 0056 0028 0028 +NHC 92E INVEST 20251024 0600 130N 1131W 280 057 1007 1010 0278 15 185 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 90E INVEST 20250527 1200 121N 1012W 290 046 1009 1010 0259 10 185 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 92S INVEST 20250104 0600 100S 0642E 100 047 1007 1009 0232 13 074 -999 -999 -999 -999 S +JTWC 22S GARANCE 20250228 0600 210S 0555E 180 042 0962 1005 0213 46 022 0167 0167 0093 0130 D +JTWC 06W NARI 20250714 1800 425N 1436E 005 144 0993 0997 0167 20 055 0130 0222 -999 -999 S +JTWC 93S INVEST 20250910 1800 055S 0955E 145 026 1003 1009 0269 15 092 -999 -999 -999 -999 M +NHC 17E RAYMOND 20251012 0000 225N 1100W 330 041 1005 1008 0167 13 046 -999 -999 -999 -999 S -999 -999 -999 -999 12 246N 1105W -999 -999 -999 -999 +JTWC 18P ALFRED 20250225 1800 146S 1550E 115 011 0975 1006 0555 38 018 0130 0093 0102 0093 D +JTWC 12W KROSA 20250727 1800 244N 1453E 005 067 0964 1000 0333 41 046 0306 0352 0185 0241 D +JTWC 23S HONDE 20250302 0000 270S 0458E 120 016 0980 1006 0592 31 055 0167 0222 0222 0167 D +JTWC 11W CO-MAY 20250729 1800 293N 1229E 320 042 0981 0994 0370 20 129 0222 0139 0130 0195 D +NHC 14E NARDA 20250927 0600 175N 1242W 285 057 0979 1012 0500 41 046 0222 0297 0185 0222 D 0130 0130 0093 0111 72 216N 1256W 0074 0065 -999 0056 +JTWC 04W MUN 20250707 0600 358N 1483E 335 042 0996 1005 0213 18 064 0121 0084 0056 0074 S +NHC 93L INVEST 20250716 1800 301N 0859W 275 051 1012 1016 0222 13 148 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 13E MARIO 20250914 0600 180N 1094W 260 046 1008 1011 0167 15 037 -999 -999 -999 -999 M -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 10W FRANCISCO 20250725 1200 262N 1217E 255 052 0993 0997 0222 13 212 -999 -999 -999 -999 S +JTWC 21W PEIPAH 20250905 0600 349N 1393E 065 113 0992 1008 0555 23 074 0056 0222 0185 0037 M +JTWC 08P PITA 20250111 0000 199S 1676W 110 098 0998 1004 0278 20 148 0185 0056 0056 -999 M +JTWC 97P INVEST 20250417 1800 100S 1386E 120 037 1004 1006 0296 15 083 -999 -999 -999 -999 M +JTWC 01W ONE 20250610 1800 152N 1143E 090 011 0996 1003 0555 15 083 -999 -999 -999 -999 S +JTWC 13W BAILU 20250806 0000 402N 1622E 065 057 0982 1004 0222 13 111 -999 -999 -999 -999 S +JTWC 90A INVEST 20251001 1800 211N 0681E 215 021 0996 1001 0278 13 111 -999 -999 -999 -999 S +JTWC 31W KALMAEGI 20251106 0000 132N 1121E 285 093 0948 1005 0463 59 027 0185 0185 0185 0185 D +JTWC 93W INVEST 20250801 1200 263N 1351E 080 057 0997 1000 0259 10 111 -999 -999 -999 -999 S +NHC 96L INVEST 20250808 0600 171N 0378W 310 057 1011 1014 0278 13 111 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 20S BIANCA 20250225 1200 228S 1022E 190 047 0965 1011 0352 48 022 0158 0148 0139 0121 D +JTWC 25S JUDE 20250315 1800 253S 0477E 095 062 0986 1005 0417 26 111 0222 0407 0296 0139 M +JTWC 93A INVEST 20250524 0600 171N 0751E 080 026 0999 1002 0278 10 111 -999 -999 -999 -999 S +JTWC 14S TALIAH 20250212 1200 189S 0902E 205 057 0983 1006 0555 33 092 0296 0352 0278 0241 D +JTWC 15P FIFTEEN 20250203 1800 211S 1682E 135 016 0997 1005 0167 18 074 0185 0241 0185 0111 M +JTWC 25W NEOGURI 20250921 0000 272N 1527E 295 057 0936 1011 0389 64 022 0287 0204 0176 0222 D +JTWC 07S DIKELEDI 20250115 0600 217S 0411E 160 072 0970 1003 0222 36 046 0222 0241 0111 0158 M +JTWC 25W NEOGURI 20250921 0000 272N 1527E 295 057 0936 1011 0389 64 022 0287 0204 0176 0222 D +JTWC 02A TWO 20251003 0000 215N 0672E 300 016 0996 1003 0296 18 064 0084 -999 0065 0102 M +JTWC 23S HONDE 20250228 1200 264S 0446E 115 037 0974 1008 0916 31 101 0269 0269 0352 0259 D +JTWC 94S INVEST 20250104 0000 155S 0936E 265 088 1006 1008 0417 13 092 -999 -999 -999 -999 S +JTWC 10S SEAN 20250121 1200 263S 1075E 215 067 0977 1004 0555 33 037 0278 0259 0213 0222 D +JTWC 96W INVEST 20250718 1200 193N 1225E 320 052 0986 0998 0518 18 157 0333 0315 0065 0185 D +JTWC 06W SIX 20250711 0600 250N 1400E 320 042 1004 1007 0167 15 074 -999 -999 -999 -999 S +JTWC 94S INVEST 20250101 0000 142S 1071E 230 042 1004 1008 0481 13 092 -999 -999 -999 -999 S +JTWC 33W KOTO 20251128 0600 125N 1127E 260 021 0993 1008 0343 26 046 0333 0111 0111 0315 M +JTWC 22S GARANCE 20250302 1200 341S 0611E 125 093 0994 1010 0263 23 120 0176 0139 0065 0084 M +JTWC 28W HALONG 20251010 0000 341N 1532E 085 139 0984 1010 0481 33 074 0222 0269 0278 0241 D +JTWC 31W KALMAEGI 20251102 0600 113N 1333E 285 072 0994 1006 0315 26 037 0111 0074 0093 0130 M +JTWC 94S INVEST 20250106 1200 134S 0811E 285 077 1008 1010 0481 10 240 -999 -999 -999 -999 S +JTWC 94S INVEST 20250105 1800 147S 0855E 275 067 1007 1009 0417 10 240 -999 -999 -999 -999 S +JTWC 13S VINCE 20250204 0600 178S 0901E 250 062 0958 1004 0454 51 009 0130 0241 0241 0148 D +JTWC 17S SEVENTEEN 20250211 0600 169S 1198E 220 021 0992 1000 0241 20 074 0093 0093 0148 0130 M +JTWC 20W TWENTY 20250829 1800 173N 1093E 290 067 0999 1006 0444 15 074 -999 -999 -999 -999 S +JTWC 28W HALONG 20251005 0600 249N 1423E 290 016 0994 1006 0296 20 055 0130 0093 0056 0111 M +NHC 08L HUMBERTO 20251001 0000 346N 0690W 005 062 0979 1002 0222 36 056 0371 0371 0148 0167 D 0167 0148 -999 0111 24 361N 650W 0093 0074 -999 0037 +JTWC 14S TALIAH 20250219 0600 309S 0758E 300 006 1000 1012 0546 20 138 -999 -999 0185 -999 S +JTWC 27S COURTNEY 20250330 1800 227S 0879E 200 047 0980 1009 0537 36 055 0167 0222 0185 0130 D +JTWC 12W KROSA 20250726 1800 195N 1450E 035 037 0987 1004 0426 28 064 0176 0278 0278 0111 D +JTWC 96W INVEST 20250717 1800 170N 1247E 315 067 0994 1002 0426 15 240 -999 -999 -999 -999 M +JTWC 23S HONDE 20250303 0000 271S 0465E 090 006 0982 1006 0333 28 055 0158 0158 0158 0148 M +NHC 10E JULIETTE 20250825 1800 173N 1140W 290 062 0999 1009 0315 26 037 0056 0111 0093 0093 M -999 0046 -999 -999 72 242N 1214W -999 -999 -999 -999 +NHC 11L KAREN 20251010 0000 444N 0334W 035 031 0998 1012 0352 21 037 0037 0074 0056 0056 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 31P THIRTYONE 20250420 0000 124S 1411E 315 001 1001 1009 0222 15 055 -999 -999 -999 -999 S +JTWC 13S VINCE 20250209 0000 206S 0708E 265 042 0945 1007 0500 59 031 0139 0222 0167 0148 D +NHC 09E IVO 20250807 0000 146N 1000W 295 098 1008 1012 0167 18 037 0056 -999 -999 0056 S -999 -999 -999 -999 72 210N 1150W -999 -999 -999 -999 +JTWC 27S COURTNEY 20250329 0600 180S 0910E 255 062 0942 1006 0472 61 009 0121 0148 0139 0121 D +JTWC 24S TWENTY-FO 20250308 1800 131S 0839E 210 037 0996 1008 0648 20 148 0278 0407 0333 0056 M +JTWC 31W KALMAEGI 20251104 1200 106N 1208E 265 057 0984 1006 0454 36 027 0176 0148 0139 0130 D +JTWC 11S ELEVEN 20250201 0600 170S 0618E 270 062 0997 1008 0592 18 046 0111 0093 0148 0074 M +JTWC 31W KALMAEGI 20251103 0000 105N 1289E 260 072 0985 1008 0333 36 018 0167 0148 0130 0176 D +JTWC 98W INVEST 20250914 1200 125N 1200E 255 067 1007 1009 0130 10 074 -999 -999 -999 -999 S +JTWC 05W DANAS 20250708 1800 278N 1207E 265 026 0986 0996 0185 18 055 0130 0139 0195 -999 S +JTWC 97S INVEST 20250224 1800 182S 0516E 125 021 1007 1011 0241 15 037 -999 -999 -999 -999 S +NHC 04E DALILA 20250615 1200 181N 1074W 295 051 0996 1012 0371 26 056 0148 0093 0130 0111 M 0056 0056 -999 0056 48 178N 1137W -999 -999 -999 -999 +JTWC 92S INVEST 20250102 0600 095S 0581E 080 016 1007 1011 0324 13 074 -999 -999 -999 -999 S +NHC 91E INVEST 20251014 1800 120N 0925W 270 015 1008 1009 0278 15 185 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 90E INVEST 20251009 0000 153N 0965W 280 041 1006 1008 0222 15 056 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 05E ERICK 20250618 1800 142N 0963W 315 041 0970 1008 0297 46 019 0148 0148 0111 0111 D 0074 0037 0037 0046 36 174N 998W 0037 0019 0019 0028 +JTWC 26W BUALOI 20250928 1200 177N 1071E 300 067 0977 1001 0241 36 055 0232 0195 0111 0176 D + +JTWC 29W NAKRI 20251014 1200 354N 1580E 080 144 0979 1012 0380 36 064 0315 0269 0250 0278 D +JTWC 04B SENYAR 20251127 1200 036N 1009E 090 026 1005 1008 0148 13 046 -999 -999 -999 -999 S +JTWC 11W CO-MAY 20250724 1200 161N 1195E 120 026 0976 0999 0250 33 027 0084 0158 0158 0093 D +JTWC 96P INVEST 20250223 1800 133S 1691E 130 026 1002 1004 0278 15 000 -999 -999 -999 -999 S +JTWC 98P INVEST 20250413 1200 129S 1693E 150 032 1004 1007 0352 10 185 -999 -999 -999 -999 S +NHC 16E PRISCILLA 20251005 0600 159N 1068W 325 021 0994 1007 0297 26 037 0222 0185 0111 0167 M 0037 -999 -999 -999 72 202N 1114W -999 -999 -999 -999 +NHC 07L GABRIELLE 20250926 0000 374N 0307W 075 124 0985 1008 0315 28 130 0222 0259 0241 0111 D -999 0130 -999 -999 72 369N 82W -999 -999 -999 -999 +JTWC 29S ERROL 20250418 1200 160S 1245E 095 042 1002 1006 0185 15 055 -999 -999 -999 -999 S +JTWC 25S JUDE 20250313 0600 197S 0372E 135 042 1001 1007 0389 15 166 -999 -999 -999 -999 M +JTWC 05B DITWAH 20251128 1800 090N 0808E 340 016 1004 1010 0389 18 111 0213 0167 0158 0176 M +JTWC 99S INVEST 20250223 0000 162S 1086E 245 052 0998 1009 0343 15 083 -999 -999 -999 -999 M +JTWC 11S ELEVEN 20250131 1200 169S 0656E 255 052 0999 1005 0472 18 055 0093 0185 0167 0084 S +NHC 98E INVEST 20250929 0600 104N 1109W 250 046 1009 1012 0371 13 074 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 18P ALFRED 20250224 1800 144S 1547E 130 016 0987 1006 0167 31 022 0065 0093 0093 0065 M +JTWC 23S HONDE 20250305 1800 349S 0507E 160 062 0988 1014 0352 28 101 0435 0444 0232 0167 M +JTWC 19P RAE 20250225 1200 245S 1777W 160 057 0994 1010 0269 26 037 0232 0139 0130 0195 M +JTWC 15P FIFTEEN 20250203 1200 210S 1680E 130 042 0995 1006 0204 20 074 0185 0241 0185 0111 M +JTWC 06W NARI 20250714 0000 341N 1422E 355 113 0983 1000 0259 23 037 0278 0537 0148 -999 D +NHC 98E INVEST 20250728 0000 104N 1305W 020 010 1008 1011 0222 13 056 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 11W CO-MAY 20250801 0600 317N 1174E 255 016 0996 0998 0296 13 166 -999 -999 -999 -999 S +JTWC 08W EIGHT 20250715 1200 365N 1410E 005 159 1002 1006 0093 20 046 0074 0185 -999 -999 S +NHC 07L GABRIELLE 20250922 1200 304N 0624W 360 041 0955 1013 0278 54 037 0222 0222 0093 0111 D 0074 0074 0046 0056 72 367N 415W 0037 0037 0019 0028 +JTWC 10S SEAN 20250122 0000 273S 1070E 205 042 0988 1004 0491 23 046 0250 0241 0213 0222 D +JTWC 04W MUN 20250707 0000 350N 1489E 350 042 0986 1005 0241 23 055 0148 0148 0093 0093 S +JTWC 14S TALIAH 20250208 0000 157S 0962E 270 057 0982 1004 0685 26 074 0148 0204 0222 0167 D +JTWC 93A INVEST 20250523 1200 169N 0735E 110 016 1000 1002 0185 10 138 -999 -999 -999 -999 S +JTWC 18P ALFRED 20250225 1800 146S 1550E 115 011 0975 1006 0555 38 018 0130 0093 0102 0093 D +JTWC 13S VINCE 20250204 1200 181S 0892E 245 052 0962 1004 0500 48 009 0158 0269 0259 0176 D +JTWC 19P RAE 20250224 0000 179S 1794W 190 047 0988 1007 0315 31 064 0259 0185 0185 0278 D +JTWC 93A INVEST 20250524 0000 163N 0733E 170 011 0997 0999 0093 10 064 -999 -999 -999 -999 S +JTWC 21P TWENTY-ON 20250225 0000 168S 1709E 155 021 0980 1008 0481 23 037 0056 0084 0065 0047 M +JTWC 92P INVEST 20250203 1800 160S 1598E 165 021 1002 1006 0278 15 055 -999 -999 -999 -999 M +JTWC 08P EIGHT 20251217 0600 138S 1722E 330 016 1006 1008 0250 13 055 -999 -999 -999 -999 S +NHC 95E INVEST 20250626 0000 095N 0929W 295 026 1007 1010 0371 13 185 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 14S TALIAH 20250206 1200 149S 1028E 270 057 0981 1004 0685 33 064 0278 0241 0315 0333 D +JTWC 18P ALFRED 20250227 0600 175S 1554E 180 032 0949 1006 0629 56 009 0296 0324 0315 0222 D +NHC 93E INVEST 20250612 1200 112N 0995W 310 041 1009 1012 0334 13 278 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 + +JTWC 16W PODUL 20250813 1200 234N 1188E 290 077 0985 1004 0287 33 046 0176 0176 0148 0130 D +JTWC 25W NEOGURI 20250920 0000 255N 1569E 295 057 0980 1010 0296 36 064 0195 0195 0139 0158 D +JTWC 10S SEAN 20250122 1200 282S 1072E 175 026 0992 1006 0454 20 111 0139 0167 0213 0148 M +NHC 99L INVEST 20250821 0600 113N 0325W 265 051 1010 1013 0222 15 074 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 04B FOUR 20251126 0000 045N 0979E 265 026 0997 1008 0296 23 046 0093 0074 0056 0093 M +JTWC 32W FUNG-WONG 20251106 1200 102N 1396E 300 032 0995 1006 0611 20 129 0352 0278 0185 0315 M +JTWC 29S TWENTY-NI 20250414 1200 140S 1229E 230 016 0999 1008 0185 20 055 0093 0111 0074 0056 M +JTWC 98W INVEST 20250723 1200 127N 1445E 290 083 1007 1009 0222 10 092 -999 -999 -999 -999 S +JTWC 97S INVEST 20251117 0600 110S 1291E 085 032 1003 1006 0296 15 055 -999 -999 -999 -999 S +JTWC 05B DITWAH 20251202 0000 125N 0806E 245 011 1005 1008 0222 13 074 -999 -999 -999 -999 S +JTWC 32W FUNG-WONG 20251106 0600 097N 1406E 305 026 0992 1004 0629 20 129 0370 0222 0222 0333 M +JTWC 92W INVEST 20251123 1800 086N 1304E 280 067 1004 1006 0278 10 111 -999 -999 -999 -999 S +JTWC 92P INVEST 20250204 1200 182S 1611E 150 037 0998 1005 0259 15 055 -999 -999 -999 -999 S +NHC 89E LORENA 20250904 1200 240N 1141W 310 036 0991 1009 0278 31 019 0111 0074 0056 0074 M 0037 0028 -999 0028 72 280N 1129W -999 -999 -999 -999 +NHC 07L GABRIELLE 20250918 0600 197N 0498W 300 067 1004 1011 0371 23 241 0389 0334 0056 0278 M -999 -999 -999 -999 72 258N 603W -999 -999 -999 -999 +JTWC 09W WIPHA 20250719 0600 205N 1189E 290 057 0980 0994 0518 26 092 0278 0185 0222 0195 D +JTWC 14S TALIAH 20250216 1200 284S 0801E 220 057 0990 1007 0444 20 148 0222 0463 0370 0241 M +JTWC 20S BIANCA 20250226 0600 255S 1027E 165 052 0999 1013 0222 23 037 0158 0111 0111 0130 M +JTWC 95W INVEST 20251007 0000 147N 1445E 310 072 1009 1010 0213 10 185 -999 -999 -999 -999 S +NHC 12E LORENA 20250903 1200 220N 1111W 320 072 0990 1010 0259 33 028 0111 0074 0056 0074 D 0037 0037 -999 0037 72 274N 1133W 0028 -999 -999 0028 +JTWC 14S TALIAH 20250206 1200 149S 1028E 270 057 0981 1004 0685 33 064 0278 0241 0315 0333 D +JTWC 25S JUDE 20250316 0600 264S 0534E 105 103 0993 1008 0444 23 111 0204 0407 0343 0139 M +JTWC 11S ELEVEN 20250130 1200 166S 0699E 255 062 0999 1004 0352 18 055 0093 0111 0139 0111 M +JTWC 23S HONDE 20250228 0000 256S 0430E 120 032 0977 1006 0629 31 101 0343 0324 0352 0315 D +JTWC 18W LINGLING 20250821 0600 317N 1299E 065 026 0992 1009 0158 23 046 0056 0111 0074 -999 M +JTWC 07S DIKELEDI 20250117 1800 350S 0619E 105 144 0994 1006 0269 23 185 0269 0130 0111 0232 S +JTWC 25S JUDE 20250312 0000 174S 0351E 210 042 1000 1009 0306 13 185 -999 -999 -999 -999 M +NHC 98E INVEST 20250730 0000 109N 1386W 280 067 1008 1011 0222 15 056 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 08L HUMBERTO 20250926 1800 223N 0578W 295 021 0966 1012 0278 49 019 0167 0111 0093 0148 D 0074 0056 0046 0074 72 268N 669W 0037 0019 0019 0037 +JTWC 21P TWENTY-ON 20250225 0000 168S 1709E 155 021 0980 1008 0481 23 037 0056 0084 0065 0047 M +NHC 09E IVO 20250811 1200 231N 1191W 300 046 1008 1012 0185 13 056 -999 -999 -999 -999 M -999 -999 -999 -999 36 230N 1250W -999 -999 -999 -999 +NHC 93E INVEST 20250829 0600 119N 1136W 290 041 1010 1013 0334 10 111 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 14E NARDA 20250925 1800 161N 1173W 280 072 0980 1011 0482 41 028 0222 0297 0167 0185 D 0111 0111 0056 0074 72 199N 1270W 0074 0074 0037 0037 +NHC 05L ERIN 20250817 0000 200N 0645W 280 062 0934 1011 0371 64 009 0334 0204 0074 0278 D 0130 0056 0037 0093 72 273N 713W 0037 0037 0028 0037 +JTWC 31W KALMAEGI 20251105 1800 132N 1143E 290 088 0960 1005 0463 51 027 0185 0185 0185 0185 D +NHC 09E IVO 20250807 1200 173N 1033W 300 103 1006 1012 0167 21 019 0056 -999 -999 0056 M -999 -999 -999 -999 72 209N 1165W -999 -999 -999 -999 +JTWC 01B ONE 20251002 0600 186N 0849E 335 042 0995 1002 0296 18 120 0185 0259 0259 -999 M +NHC 90C INVEST 20250727 0000 109N 1441W 265 046 1008 1011 0334 13 056 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 12W KROSA 20250804 0000 427N 1630E 070 118 0995 1002 0324 20 111 -999 0259 0222 0084 S +JTWC 29S TWENTY-NI 20250414 0000 135S 1225E 250 037 1001 1009 0241 20 092 0084 0204 0167 -999 M +JTWC 07S DIKELEDI 20250116 0600 289S 0447E 150 098 0950 1006 0324 51 027 0269 0148 0093 0222 D +JTWC 22W TAPAH 20250906 1800 185N 1148E 280 042 0997 1005 0315 20 055 0074 0102 0158 0065 M +JTWC 99S INVEST 20250308 0600 142S 0475E 250 093 1002 1008 0370 15 157 -999 -999 -999 -999 S +JTWC 93A INVEST 20250521 1800 168N 0719E 310 026 1002 1005 0185 13 064 -999 -999 -999 -999 S +JTWC 22S GARANCE 20250302 0600 335S 0590E 140 093 0993 1009 0167 23 064 0167 0111 0065 0056 M +JTWC 10W FRANCISCO 20250725 0000 267N 1237E 295 072 0991 0996 0232 18 092 0167 -999 0158 0185 S +JTWC 27S COURTNEY 20250330 1200 220S 0880E 205 047 0970 1008 0518 43 027 0204 0222 0185 0167 D +JTWC 96W INVEST 20251017 0000 138N 1310E 265 047 1007 1009 0361 10 101 -999 -999 -999 -999 S +JTWC 28S DIANNE 20250328 1800 162S 1238E 170 032 0991 1002 0213 23 046 0102 0074 0093 0084 M +JTWC 31P THIRTYONE 20250419 1200 127S 1410E 185 016 1001 1009 0222 15 055 -999 -999 -999 -999 S +JTWC 01W WUTIP 20250613 0600 187N 1083E 325 026 0983 1003 0481 31 055 0204 0167 0204 0204 M +JTWC 24S IVONE 20250310 1800 202S 0810E 220 042 0996 1010 0500 23 120 0010 0546 0370 0010 M +JTWC 27S COURTNEY 20250331 1800 248S 0888E 160 032 0986 1007 0296 28 055 0139 0269 0222 0111 M +NHC 06E FLOSSIE 20250703 1800 209N 1120W 305 046 1003 1010 0352 18 046 0093 0074 -999 -999 M -999 -999 -999 -999 48 243N 1177W -999 -999 -999 -999 +NHC 04E FOUR 20250613 1200 135N 1013W 335 046 1005 1010 0334 15 222 -999 -999 -999 -999 S -999 -999 -999 -999 72 176N 1105W -999 -999 -999 -999 +JTWC 99S INVEST 20250222 0600 151S 1109E 265 072 1000 1006 0222 15 083 -999 -999 -999 -999 S +JTWC 14S TALIAH 20250210 0600 140S 0929E 325 021 0994 1008 0851 20 074 0148 0111 0167 0148 M +NHC 13L MELISSA 20251030 1800 289N 0709W 035 139 0965 1003 0389 46 065 0315 0408 0259 0241 D 0167 0204 0148 0093 72 547N 375W 0093 0130 0074 -999 +NHC 03E COSME 20250611 0000 158N 1150W 320 015 1005 1013 0278 21 037 0037 0056 0056 0056 M -999 -999 -999 -999 48 191N 1141W -999 -999 -999 -999 +JTWC 96S INVEST 20250210 0600 158S 1209E 260 042 0996 1000 0241 13 074 -999 -999 -999 -999 S +JTWC 93P INVEST 20250509 1800 070S 1366E 295 026 1005 1007 0333 13 166 -999 -999 -999 -999 S +NHC 93L INVEST 20250716 1200 303N 0849W 280 051 1012 1016 0222 13 148 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 25W NEOGURI 20250923 0600 307N 1533E 065 026 0970 1010 0555 38 046 0296 0296 0241 0352 D +JTWC 18P ALFRED 20250303 0600 262S 1578E 140 037 0987 1004 0454 23 055 0259 0222 0315 0222 M +JTWC 32W FUNG-WONG 20251110 0000 173N 1192E 305 077 0967 1008 0851 43 027 0555 0417 0333 0481 D +JTWC 05B FIVE 20251127 0600 070N 0821E 015 021 1002 1010 0352 18 092 0130 0222 0278 0056 M +JTWC 14S TALIAH 20250218 0000 305S 0768E 220 026 0996 1010 0370 20 111 0130 0139 -999 -999 M +JTWC 15P FIFTEEN 20250202 1200 194S 1659E 120 032 0997 1005 0296 20 111 0111 0241 0185 0111 M +NHC 03E COSME 20250609 0000 135N 1115W 315 041 0999 1009 0371 21 074 0074 0056 -999 0074 M -999 -999 -999 -999 72 175N 1128W -999 -999 -999 -999 +JTWC 26S TWENTY-SI 20250321 1200 153S 0976E 125 026 1003 1009 0444 13 166 -999 -999 -999 -999 S +NHC 13L MELISSA 20251031 1200 375N 0621W 040 216 0973 0992 0259 39 111 0334 0445 0371 0167 D 0167 0259 0167 0056 72 568N 267W 0074 0167 0111 -999 +JTWC 97W INVEST 20251021 1800 231N 1231E 190 021 1006 1010 0185 10 064 -999 -999 -999 -999 S +JTWC 12W KROSA 20250803 1800 420N 1603E 070 123 0983 1002 0324 23 055 -999 0222 0222 0084 S +NHC 12L LORENZO 20251015 1800 223N 0433W 035 077 1006 1010 0185 15 046 -999 -999 -999 -999 S -999 -999 -999 -999 12 237N 421W -999 -999 -999 -999 +NHC 04L DEXTER 20250807 1200 410N 0514W 070 077 0998 1019 0445 26 130 0278 0204 0148 0222 M -999 -999 -999 0130 72 467N 285W -999 -999 -999 -999 +NHC 05E FIVE 20250616 1800 104N 0915W 295 046 1009 1011 0278 15 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 18P ALFRED 20250306 0600 273S 1553E 270 021 0985 1008 0389 26 092 0176 0324 0407 0278 M +JTWC 13S VINCE 20250207 0600 198S 0783E 265 057 0934 1008 0592 66 022 0130 0148 0167 0130 D +JTWC 93S INVEST 20250911 1800 095S 0933E 210 067 1005 1009 0278 13 092 -999 -999 -999 -999 S +NHC 99E INVEST 20250730 0600 114N 1082W 275 093 1008 1010 0445 13 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 24W RAGASA 20250921 0600 183N 1263E 295 042 0922 1006 0592 71 009 0343 0232 0241 0306 D +JTWC 13W BAILU 20250804 0600 374N 1517E 070 093 0998 1006 0315 15 111 -999 -999 -999 -999 S +JTWC 10S SEAN 20250119 1200 202S 1144E 250 052 0978 1005 0750 33 022 0167 0278 0167 0130 D +JTWC 20S BIANCA 20250224 1800 202S 1029E 220 042 0958 1011 0463 48 031 0139 0130 0121 0074 D +NHC 10E JULIETTE 20250828 0000 244N 1206W 330 051 1006 1012 0334 21 037 0074 0037 -999 0056 M -999 -999 -999 -999 48 278N 1208W -999 -999 -999 -999 +JTWC 96P INVEST 20250107 0600 189S 1713W 110 067 1000 1004 0250 10 240 -999 -999 -999 -999 S +JTWC 05B DITWAH 20251128 0600 083N 0810E 315 016 1004 1010 0389 18 111 0269 0296 0315 0185 M +JTWC 18P ALFRED 20250305 0600 272S 1564E 290 032 0978 1006 0407 28 092 0278 0518 0444 0278 M +JTWC 27S COURTNEY 20250401 0000 249S 0888E 165 016 0988 1007 0296 26 055 0139 0269 0222 0111 M +JTWC 12W KROSA 20250804 0000 427N 1630E 070 118 0995 1002 0324 20 111 -999 0259 0222 0084 S +JTWC 23S TWENTY-TH 20250225 1800 227S 0381E 180 006 0995 1006 0500 18 111 0250 0204 -999 -999 M +JTWC 13W BAILU 20250804 1800 380N 1557E 080 083 0999 1007 0352 15 148 -999 -999 -999 -999 S +JTWC 30P THIRTY 20250414 1200 164S 1684E 175 047 0998 1006 0537 20 166 0370 0278 -999 -999 M +JTWC 06W SIX 20250711 0600 250N 1400E 320 042 1004 1007 0167 15 074 -999 -999 -999 -999 S +JTWC 22S GARANCE 20250227 1200 188S 0554E 140 026 0953 1006 0278 54 009 0167 0130 0111 0139 D +JTWC 28W HALONG 20251009 1800 341N 1499E 080 128 0980 1012 0444 36 074 0259 0250 0269 0343 D +JTWC 25W NEOGURI 20250918 1800 235N 1623E 275 037 1005 1012 0204 18 083 0065 0084 -999 -999 M +JTWC 93A INVEST 20250523 0600 177N 0728E 070 006 1000 1002 0185 10 138 -999 -999 -999 -999 S +NHC 07L GABRIELLE 20250921 0000 259N 0590W 335 041 0996 1013 0334 28 028 0222 0204 0056 0093 D 0028 -999 -999 -999 72 348N 558W -999 -999 -999 -999 +JTWC 94S INVEST 20250105 0000 150S 0894E 270 072 1007 1009 0417 13 129 -999 -999 -999 -999 S +JTWC 13W THIRTEEN 20250802 0000 273N 1369E 055 052 0998 1000 0315 13 148 -999 -999 -999 -999 S +NHC 95E INVEST 20250910 0000 120N 0950W 285 072 1009 1011 0315 10 222 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 14S TALIAH 20250202 1200 142S 1162E 280 037 0983 1002 0333 31 055 0259 0167 0185 0259 D +JTWC 11W CO-MAY 20250723 1800 169N 1180E 230 052 0981 0999 0185 31 046 0102 0093 0139 0158 D +JTWC 05W FIVE 20250704 1200 203N 1180E 285 021 0997 1005 0185 18 055 0102 0111 0074 -999 S +JTWC 28W HALONG 20251009 0000 330N 1411E 050 067 0950 1010 0398 54 049 0232 0250 0259 0250 D +JTWC 04S CHENGE 20251019 0600 086S 0698E 260 057 0999 1008 0389 20 092 -999 0213 0167 0121 M +JTWC 02A SHAKHTI 20251006 0600 198N 0604E 240 006 0998 1008 0148 20 046 0084 0093 0084 0074 M +JTWC 05B DITWAH 20251202 0600 123N 0809E 190 011 1005 1008 0222 13 074 -999 -999 -999 -999 S +JTWC 11S FAIDA 20250204 0600 184S 0492E 275 042 1003 1009 0259 18 074 -999 -999 0111 0111 S +JTWC 14S TALIAH 20250219 0600 309S 0758E 300 006 1000 1012 0546 20 138 -999 -999 0185 -999 S +JTWC 12W KROSA 20250802 1200 383N 1460E 050 077 0973 0998 0241 28 064 0185 0195 0139 0121 M +JTWC 14W FOURTEEN 20250804 0600 280N 1630E 310 047 1008 1011 0296 13 064 -999 -999 -999 -999 S +JTWC 11W CO-MAY 20250726 0000 253N 1257E 035 128 0997 1000 0259 13 111 -999 -999 -999 -999 S +JTWC 33W KOTO 20251128 0600 125N 1127E 260 021 0993 1008 0343 26 046 0333 0111 0111 0315 M +JTWC 94S INVEST 20250108 1800 150S 0682E 265 103 1004 1009 0407 15 111 -999 -999 -999 -999 S +JTWC 97A INVEST 20250910 1200 248N 0646E 250 032 1002 1005 0111 13 055 -999 -999 -999 -999 S +JTWC 05W DANAS 20250705 1800 211N 1181E 025 016 0977 1002 0296 33 037 0222 0204 0130 0148 D +JTWC 19W KAJIKI 20250823 1800 172N 1122E 270 072 0989 1006 0278 31 037 0139 0139 0158 0111 D +NHC 16E PRISCILLA 20251006 0600 170N 1072W 340 021 0977 1006 0334 39 065 0315 0259 0204 0222 M 0074 0093 0074 -999 72 221N 1137W -999 0065 -999 -999 +JTWC 32W FUNG-WONG 20251107 1200 119N 1354E 290 062 0982 1006 0703 33 074 0407 0278 0278 0407 D +JTWC 26S TWENTY-SI 20250319 1800 130S 0948E 275 026 0995 1007 0222 23 046 0167 0130 0296 0222 M +JTWC 33W KOTO 20251126 0600 119N 1164E 280 062 0990 1005 0389 28 046 0296 0111 0130 0259 D +JTWC 90S INVEST 20250804 0000 090S 0934E 235 042 1006 1008 0370 13 166 -999 -999 -999 -999 S +JTWC 12W KROSA 20250726 0600 179N 1441E 050 011 0988 1006 0611 26 083 0185 0232 0232 0111 M +NHC 94E INVEST 20250901 1200 153N 1026W 285 072 1009 1011 0222 13 148 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 15P FIFTEEN 20250204 0600 214S 1705E 100 042 0996 1005 0204 18 037 0121 0148 0074 0102 M +JTWC 27S COURTNEY 20250328 1800 174S 0930E 260 072 0948 1006 0444 59 012 0093 0148 0176 0111 D +JTWC 92P INVEST 20250203 0000 145S 1605E 130 042 1002 1006 0185 13 046 -999 -999 -999 -999 S +JTWC 90A INVEST 20251001 1200 218N 0680E 260 011 0996 1000 0259 13 111 -999 -999 -999 -999 S +JTWC 16P SIXTEEN 20250211 1200 230S 1647E 115 072 0998 1009 0518 18 092 0185 0148 0111 0056 M +JTWC 10S SEAN 20250121 1200 263S 1075E 215 067 0977 1004 0555 33 037 0278 0259 0213 0222 D +JTWC 32W FUNG-WONG 20251108 0000 125N 1321E 280 077 0975 1006 0898 41 092 0444 0278 0296 0472 D +JTWC 04B SENYAR 20251128 0600 038N 1018E 075 016 1005 1008 0148 13 046 -999 -999 -999 -999 S +JTWC 18P ALFRED 20250224 1800 144S 1547E 130 016 0987 1006 0167 31 022 0065 0093 0093 0065 M +NHC 97E INVEST 20250920 0600 126N 0974W 290 041 1008 1011 0278 13 148 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 18P ALFRED 20250223 1800 142S 1535E 095 032 0992 1008 0278 28 037 0167 0167 0121 0158 D +NHC 96E INVEST 20250708 0600 186N 1158W 290 057 1012 1013 0139 10 074 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 11W CO-MAY 20250728 0000 263N 1279E 270 006 0988 0996 0324 18 111 0195 0259 -999 -999 M +JTWC 26W BUALOI 20250924 1800 107N 1301E 290 047 0991 1007 0426 28 064 0148 0121 0139 0148 D +JTWC 32W THIRTYTWO 20251105 0000 081N 1434E 160 026 0999 1008 0703 15 370 -999 -999 -999 -999 S +JTWC 13S VINCE 20250209 1800 216S 0693E 230 032 0952 1007 0500 54 040 0222 0259 0185 0158 D +JTWC 14S TALIAH 20250212 0600 177S 0906E 205 047 0984 1007 0592 33 111 0296 0352 0278 0241 D +JTWC 02W SEPAT 20250623 0600 259N 1439E 325 057 1002 1008 0296 18 055 0167 0167 -999 0111 M +JTWC 99W INVEST 20250813 1200 256N 1782E 020 016 1008 1012 0315 13 092 -999 -999 -999 -999 S +JTWC 32W FUNG-WONG 20251111 0600 201N 1186E 000 042 0986 1006 0555 28 074 0426 0278 0278 0444 M +JTWC 07S BAKUNG 20251217 1200 126S 0923E 225 021 0988 1008 0315 26 018 0056 0148 0121 0056 D +JTWC 09W WIPHA 20250721 0000 215N 1094E 265 062 0985 0998 0555 23 037 0102 0130 0148 0111 D +JTWC 92W INVEST 20250712 1200 303N 1231E 270 011 1002 1008 0278 15 074 -999 -999 -999 -999 S +JTWC 27W MATMO 20251002 1200 156N 1250E 290 062 0995 1008 0333 26 083 0185 0241 0241 0185 M +NHC 13E MARIO 20250913 0000 179N 1040W 290 072 1007 1011 0111 18 037 -999 -999 -999 0037 M -999 -999 -999 -999 72 203N 1118W -999 -999 -999 -999 +NHC 01C IONA 20250802 0000 155N 1788W 290 088 1008 1012 0213 15 093 -999 -999 -999 -999 M -999 -999 -999 -999 72 227N 1695E -999 -999 -999 -999 +NHC 97L INVEST 20250811 0600 172N 0252W 300 098 1006 1010 0297 15 074 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 24S TWENTY-FO 20250308 1200 121S 0846E 220 037 0996 1006 0574 18 185 0232 0417 0259 -999 S +NHC 96E INVEST 20250706 1800 157N 1098W 285 041 1009 1011 0222 15 074 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 32W FUNG-WONG 20251112 1800 231N 1218E 055 052 1001 1008 0278 18 092 0518 0148 0148 0389 S +JTWC 18P ALFRED 20250305 0000 276S 1564E 280 042 0980 1010 0518 28 120 0278 0537 0481 0370 M +JTWC 96S INVEST 20250208 1800 146S 1244E 250 021 0998 1000 0185 13 046 -999 -999 -999 -999 S +NHC 95E INVEST 20250625 1800 092N 0922W 315 021 1007 1010 0371 13 185 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 60L GEMINI 20251103 1200 249N 0918W 315 031 0987 1010 0278 33 037 0167 0148 0130 0148 M 0074 0074 0056 0074 -9 -99N -999W 0037 0037 -999 0037 +JTWC 31P THIRTYONE 20250420 1800 126S 1395E 260 026 1002 1009 0232 15 055 -999 -999 -999 -999 S +NHC 06L FERNAND 20250824 1800 313N 0600W 020 062 1009 1017 0204 21 074 0056 0093 -999 -999 S -999 -999 -999 -999 72 445N 460W -999 -999 -999 -999 +JTWC 99W INVEST 20250916 0000 144N 1247E 325 032 1008 1010 0278 10 037 -999 -999 -999 -999 S +NHC 16E PRISCILLA 20251008 0600 207N 1117W 310 036 0968 1008 0371 44 056 0259 0241 0241 0259 D 0130 0111 0111 0093 72 274N 1151W 0074 0074 0056 0056 +NHC 05L ERIN 20250815 1800 187N 0568W 290 082 0993 1012 0334 33 037 0185 0093 0037 0167 D 0074 0056 -999 0074 72 238N 692W 0037 -999 -999 -999 +JTWC 14S TALIAH 20250208 1800 157S 0947E 275 032 0994 1005 0583 23 148 0148 0204 0222 0167 D +NHC 90E INVEST 20250803 1800 121N 1153W 295 046 1009 1013 0297 13 222 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 12L LORENZO 20251014 0600 167N 0434W 310 067 1000 1010 0259 26 056 0167 0278 -999 0148 M 0056 -999 -999 -999 72 290N 350W -999 -999 -999 -999 +JTWC 04W MUN 20250703 0600 276N 1454E 330 026 0989 1008 0306 26 037 0102 0121 0084 0074 M +JTWC 12W TWELVE 20250724 0000 135N 1439E 300 016 1004 1008 0259 13 148 -999 -999 -999 -999 S +JTWC 91P INVEST 20250202 0000 190S 1642E 195 032 1001 1004 0204 13 166 -999 -999 -999 -999 S +NHC 12L LORENZO 20251014 1800 184N 0453W 315 062 1005 1010 0259 18 046 0093 0093 -999 -999 M -999 -999 -999 -999 72 299N 327W -999 -999 -999 -999 +JTWC 93W INVEST 20251203 0600 144N 1327E 285 047 1004 1006 0278 10 083 -999 -999 -999 -999 S +JTWC 04S CHENGE 20251025 0600 078S 0515E 290 057 1003 1012 0435 18 074 0056 0074 0167 0056 S +JTWC 27S COURTNEY 20250329 0000 177S 0919E 255 062 0947 1006 0500 59 009 0121 0130 0158 0121 D +JTWC 18P ALFRED 20250226 1200 155S 1554E 150 016 0969 1008 0611 43 027 0241 0352 0352 0176 D +JTWC 18P ALFRED 20250303 1200 267S 1582E 140 037 0986 1006 0500 26 120 0250 0222 0259 0287 M +JTWC 92P INVEST 20250205 0000 199S 1615E 165 042 1000 1006 0500 15 055 -999 -999 -999 -999 M +JTWC 25S JUDE 20250314 1200 237S 0422E 135 057 0988 1007 0426 28 046 0222 0259 0222 0139 D +JTWC 12W KROSA 20250801 0600 337N 1413E 345 052 0977 0998 0232 28 064 0185 0167 0093 0148 M +NHC 63L LIBRA 20251103 1800 216N 0900W 305 051 1007 1010 0278 18 111 0111 0074 -999 0111 M -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 05S FIVE 20251118 1200 099S 1312E 060 021 0995 1004 0315 20 027 0047 0028 0047 0047 M +JTWC 95W INVEST 20251007 0000 147N 1445E 310 072 1009 1010 0213 10 185 -999 -999 -999 -999 S +NHC 02L TWO 20250628 1800 192N 0939W 285 036 1011 1013 0259 13 093 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 29S TWENTY-NI 20250412 0600 115S 1266E 235 047 0999 1007 0296 18 074 -999 0074 0111 -999 M +JTWC 10W FRANCISCO 20250723 0000 208N 1299E 320 062 0996 1001 0259 18 055 0158 0296 -999 0102 S +NHC 75L KONG 20240710 0000 389N 0872W 045 134 1005 1012 0408 15 148 -999 -999 -999 -999 M -999 -999 -999 -999 48 460N 762W -999 -999 -999 -999 +JTWC 24S IVONE 20250314 1200 247S 0657E 225 021 0992 1008 0481 18 175 -999 0417 0370 -999 S +JTWC 18P ALFRED 20250225 0000 147S 1546E 165 016 0984 1008 0500 33 018 0065 0093 0093 0065 M +NHC 11L KAREN 20251010 1800 468N 0306W 035 062 1000 1010 0222 21 037 0056 0074 0074 -999 S -999 -999 -999 -999 24 514N 283W -999 -999 -999 -999 +JTWC 29S ERROL 20250416 0000 141S 1197E 265 032 0976 1006 0195 41 012 0084 0139 0121 0056 D +JTWC 18P ALFRED 20250226 0600 153S 1553E 165 016 0970 1008 0592 43 018 0222 0278 0269 0176 D +JTWC 29S TWENTY-NI 20250413 1200 132S 1240E 245 042 1000 1009 0259 18 092 -999 0167 0148 -999 M +JTWC 03S THREE 20250910 0000 105S 0661E 250 052 1006 1010 0241 18 055 -999 0037 0130 0130 M +JTWC 29W NAKRI 20251013 0600 338N 1428E 065 098 0981 1010 0315 33 064 0185 0250 0232 0148 D +JTWC 96W INVEST 20251017 0000 138N 1310E 265 047 1007 1009 0361 10 101 -999 -999 -999 -999 S +JTWC 13S VINCE 20250207 1200 200S 0771E 265 057 0932 1006 0500 66 022 0130 0148 0167 0130 D +JTWC 90W INVEST 20250918 0600 157N 1334E 290 032 1006 1008 0333 10 111 -999 -999 -999 -999 S +JTWC 93W INVEST 20251203 0000 144N 1352E 330 016 1007 1009 0278 10 083 -999 -999 -999 -999 S +JTWC 98P INVEST 20250413 1800 134S 1695E 155 026 1003 1005 0324 15 212 -999 -999 -999 -999 S +JTWC 12W KROSA 20250729 0600 285N 1429E 330 021 0974 0997 0407 28 064 0158 0158 0121 0139 D +JTWC 03S THREE 20250909 0600 091S 0693E 255 057 1006 1012 0296 18 092 -999 -999 0167 -999 M +JTWC 29W NAKRI 20251008 1800 218N 1363E 325 072 1000 1008 0241 20 055 0102 0093 0093 0065 S +JTWC 22S TWENTY-TW 20250225 1200 184S 0520E 100 011 1001 1010 0241 18 046 0084 0037 0037 0084 M +JTWC 95S INVEST 20251022 0600 073S 0921E 250 062 1005 1008 0352 13 055 -999 -999 -999 -999 S +JTWC 07S DIKELEDI 20250116 0600 289S 0447E 150 098 0950 1006 0324 51 027 0269 0148 0093 0222 D +NHC 61L PISCES 20251103 1200 233N 0715W 285 046 1006 1009 0278 18 000 0056 -999 -999 0056 M -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 31W KALMAEGI 20251104 1200 106N 1208E 265 057 0984 1006 0454 36 027 0176 0148 0139 0130 D +JTWC 14S TALIAH 20250206 0600 149S 1038E 270 047 0981 1004 0685 33 064 0278 0241 0315 0333 D +NHC 05E FIVE 20250617 0000 110N 0924W 300 051 1007 1010 0278 15 111 -999 -999 -999 -999 S -999 -999 -999 -999 72 158N 974W -999 -999 -999 -999 +JTWC 32W FUNG-WONG 20251110 1800 188N 1183E 335 042 0981 1003 0481 33 027 0435 0278 0296 0463 D +NHC 10E JULIETTE 20250826 1800 195N 1168W 325 046 0996 1010 0315 28 037 0074 0111 0074 0074 M 0037 0056 -999 -999 72 256N 1227W -999 -999 -999 -999 +JTWC 18P ALFRED 20250307 0000 276S 1545E 245 016 0986 1008 0370 23 120 0148 0287 0444 0250 M +JTWC 93W INVEST 20251203 0000 144N 1352E 330 016 1007 1009 0278 10 083 -999 -999 -999 -999 S +JTWC 05B DITWAH 20251129 1200 102N 0808E 000 021 1001 1008 0370 18 111 0222 0148 0148 0204 S +JTWC 11W CO-MAY 20250725 0600 193N 1209E 025 062 0986 0996 0259 23 027 0065 0343 0074 0010 M +JTWC 19P NINETEEN 20250223 0600 153S 1788W 195 026 0989 1004 0269 26 064 0259 0241 0130 0287 M +JTWC 06W NARI 20250714 1200 398N 1427E 000 128 0985 1000 0259 20 037 0213 0315 0093 0056 M +NHC 75L KONG 20240710 0000 389N 0872W 045 134 1005 1012 0408 15 148 -999 -999 -999 -999 M -999 -999 -999 -999 48 460N 762W -999 -999 -999 -999 +NHC 94L INVEST 20250924 0000 173N 0631W 275 046 1012 1014 0334 13 278 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 05W DANAS 20250708 0600 279N 1220E 355 016 0987 0996 0185 18 055 0130 0139 0195 0121 S +NHC 81C CPTEST 20250424 1200 285N 1661W 035 015 0985 1014 0463 31 093 0222 0222 -999 0222 M 0167 0130 -999 0167 -9 -99N -999W -999 -999 -999 -999 +JTWC 33W KOTO 20251125 1800 121N 1193E 300 057 0993 1005 0333 26 055 0167 0093 0093 0204 M +JTWC 91S INVEST 20251211 0600 073S 1013E 150 052 1006 1010 0278 15 083 -999 -999 -999 -999 S +JTWC 93S INVEST 20250910 0000 048S 0938E 265 037 1006 1008 0222 13 111 -999 -999 -999 -999 S +JTWC 98W INVEST 20250914 1800 123N 1192E 245 057 1007 1009 0130 10 074 -999 -999 -999 -999 S +JTWC 15P FIFTEEN 20250204 1800 215S 1734E 095 067 0998 1006 0241 18 055 0139 0167 0084 0102 M +JTWC 18P ALFRED 20250308 0600 270S 1533E 325 011 1001 1010 0278 18 111 0148 0204 -999 -999 S +JTWC 97S INVEST 20250110 0600 176S 1030E 195 037 1003 1010 0426 15 074 -999 -999 -999 -999 S +JTWC 04S CHENGE 20251024 0000 096S 0566E 280 052 0998 1009 0398 23 120 -999 0241 0222 0167 M +JTWC 29W NAKRI 20251013 0600 338N 1428E 065 098 0981 1010 0315 33 064 0185 0250 0232 0148 D +NHC 84L GSTEST 20250429 1200 059N 0185W 270 046 0983 1010 0241 39 037 0148 0148 0074 0130 D 0074 0074 0037 0056 -9 -99N -999W 0037 -999 0019 -999 +JTWC 97S INVEST 20250225 0600 185S 0517E 120 011 1002 1010 0241 15 046 -999 -999 -999 -999 M +JTWC 94S INVEST 20250103 1800 154S 0955E 265 077 1006 1008 0491 13 092 -999 -999 -999 -999 S +JTWC 93W INVEST 20251204 1800 114N 1279E 250 052 1004 1006 0278 10 129 -999 -999 -999 -999 S +JTWC 11S ELEVEN 20250131 0000 161S 0673E 275 052 0997 1006 0333 18 055 0093 0185 0167 0084 M +JTWC 27S COURTNEY 20250328 0600 168S 0955E 270 062 0972 1004 0380 41 027 0111 0148 0176 0121 D +JTWC 21P SERU 20250225 0600 170S 1709E 155 016 0986 1006 0481 31 046 0278 0167 0047 0259 M +JTWC 09W WIPHA 20250722 1200 202N 1060E 250 026 0990 0994 0241 18 055 0093 0158 0148 0130 S +JTWC 18P ALFRED 20250305 0600 272S 1564E 290 032 0978 1006 0407 28 092 0278 0518 0444 0278 M +JTWC 15P FIFTEEN 20250204 0000 214S 1693E 115 026 0997 1005 0167 15 074 -999 -999 -999 -999 M +JTWC 13S VINCE 20250206 0000 191S 0833E 260 042 0944 1006 0481 54 009 0148 0195 0222 0148 D +JTWC 14S TALIAH 20250219 0600 309S 0758E 300 006 1000 1012 0546 20 138 -999 -999 0185 -999 S +JTWC 13S THIRTEEN 20250202 0600 157S 0989E 265 062 0990 1004 0666 20 074 0093 0111 0111 0111 M +JTWC 18P ALFRED 20250303 0000 258S 1572E 145 042 0986 1008 0491 26 055 0259 0278 0315 0222 M +JTWC 90W INVEST 20250917 1200 138N 1354E 285 032 1008 1010 0343 10 046 -999 -999 -999 -999 S +NHC 06E FLOSSIE 20250702 0600 184N 1079W 300 046 0962 1010 0278 51 037 0148 0111 0093 0111 D 0074 0074 0037 0056 72 233N 1151W 0037 0037 0019 0028 +JTWC 03W THREE 20250626 0000 201N 1107E 305 052 1003 1006 0167 13 046 -999 -999 -999 -999 S +JTWC 29W NAKRI 20251013 1200 343N 1453E 070 108 0980 1008 0333 33 064 0250 0250 0232 0148 D +JTWC 25S JUDE 20250310 0600 152S 0399E 270 037 0983 1006 0370 33 027 0241 0296 0204 0185 D +JTWC 94S INVEST 20250105 1200 151S 0866E 265 077 1007 1009 0417 13 129 -999 -999 -999 -999 S +JTWC 19P NINETEEN 20250222 1200 135S 1777W 085 021 0996 1006 0352 18 129 0287 0148 -999 -999 S +NHC 02E BARBARA 20250609 0600 166N 1056W 295 051 0994 1009 0185 31 028 0111 0093 0056 0074 M 0037 -999 -999 0037 72 205N 1114W -999 -999 -999 -999 +NHC 81C CPTEST 20250424 1800 285N 1653W 075 026 0985 1014 0463 33 056 0222 0222 -999 0222 M 0167 0130 -999 0167 -9 -99N -999W 0056 -999 -999 -999 +JTWC 11S ELEVEN 20250202 0000 185S 0588E 240 057 0997 1005 0481 18 148 -999 -999 -999 0148 M +JTWC 92P INVEST 20250205 0600 205S 1615E 170 037 1000 1004 0454 15 055 -999 -999 -999 -999 S +JTWC 14S TALIAH 20250215 0000 248S 0836E 215 021 0991 1007 0500 23 148 -999 0167 0278 0176 M +JTWC 01W WUTIP 20250614 0600 212N 1098E 030 047 0985 1000 0204 28 022 0158 0074 0121 0111 D +JTWC 01W ONE 20250610 1200 150N 1139E 250 026 0996 1003 0620 13 194 -999 -999 -999 -999 S +JTWC 91W INVEST 20250918 0000 235N 1643E 280 042 1009 1011 0278 13 092 -999 -999 -999 -999 S +JTWC 98W INVEST 20250914 0600 131N 1207E 270 067 1007 1009 0130 10 074 -999 -999 -999 -999 S +JTWC 18P ALFRED 20250304 0600 281S 1590E 155 026 0983 1009 0574 28 101 0278 0417 0361 0296 M +JTWC 27S TWENTY-SE 20250325 1200 170S 1082E 260 037 0993 1003 0352 20 037 0093 0148 0148 0111 M +JTWC 28W HALONG 20251007 0600 276N 1379E 305 042 0958 1008 0306 48 027 0158 0148 0130 0121 D +JTWC 06W SIX 20250712 1800 252N 1423E 085 026 0998 1004 0269 18 074 0093 0176 -999 -999 M +JTWC 29S ERROL 20250417 1800 160S 1216E 110 047 0980 1005 0333 36 018 0130 0148 0056 0056 D +NHC 96E INVEST 20250920 0000 189N 1133W 305 036 1003 1009 0334 15 111 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 19W NINETEEN 20250822 1800 171N 1170E 280 093 1002 1006 0324 15 074 -999 -999 -999 -999 S +JTWC 24W RAGASA 20250919 0000 160N 1313E 280 037 1000 1009 0444 20 111 0213 0185 -999 -999 M +JTWC 18P ALFRED 20250306 1800 272S 1550E 280 011 0985 1006 0435 23 064 0121 0407 0333 0204 M +JTWC 93A INVEST 20250523 0600 177N 0728E 070 006 1000 1002 0185 10 138 -999 -999 -999 -999 S +JTWC 97P INVEST 20250417 1800 100S 1386E 120 037 1004 1006 0296 15 083 -999 -999 -999 -999 M +NHC 10E JULIETTE 20250828 0000 244N 1206W 330 051 1006 1012 0334 21 037 0074 0037 -999 0056 M -999 -999 -999 -999 48 278N 1208W -999 -999 -999 -999 +NHC 91E INVEST 20251015 1200 125N 0946W 290 026 1007 1009 0278 15 185 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 26W BUALOI 20250926 1200 131N 1192E 280 103 0990 1006 0333 31 046 0130 0185 0204 0130 D +JTWC 20W TWENTY 20250828 1200 150N 1155E 270 021 1001 1006 0500 15 138 -999 -999 -999 -999 S +JTWC 97W INVEST 20251022 0000 230N 1229E 195 016 1006 1010 0185 10 064 -999 -999 -999 -999 S +JTWC 16W PODUL 20250811 0600 207N 1322E 260 062 0990 1006 0306 28 027 0130 0074 0056 0037 M +JTWC 90S INVEST 20250804 0600 089S 0925E 260 042 1006 1008 0361 13 166 -999 -999 -999 -999 S +JTWC 04S FOUR 20251019 0000 084S 0699E 265 077 1002 1006 0352 18 092 -999 0213 0167 0121 M +NHC 05L ERIN 20250812 0000 176N 0313W 275 098 1004 1010 0185 21 037 0074 0037 -999 0074 M -999 -999 -999 -999 72 185N 500W -999 -999 -999 -999 +NHC 07L GABRIELLE 20250923 0600 328N 0604W 045 051 0949 1014 0278 62 028 0222 0222 0111 0111 D 0111 0111 0074 0074 72 388N 315W 0065 0056 0046 0046 +JTWC 23S HONDE 20250228 1200 264S 0446E 115 037 0974 1008 0916 31 101 0269 0269 0352 0259 D +JTWC 92S INVEST 20250323 1200 142S 1146E 210 026 1002 1005 0315 13 148 -999 -999 -999 -999 S +JTWC 96S INVEST 20250208 0000 139S 1264E 340 011 1002 1008 0278 08 037 -999 -999 -999 -999 S +JTWC 29S TWENTY-NI 20250414 1200 140S 1229E 230 016 0999 1008 0185 20 055 0093 0111 0074 0056 M +JTWC 31P THIRTYONE 20250419 1800 125S 1410E 225 006 1001 1009 0222 15 055 -999 -999 -999 -999 S +NHC 10L JERRY 20251008 0600 130N 0498W 285 103 1003 1011 0222 23 074 0204 0185 -999 0130 S -999 -999 -999 -999 72 221N 633W -999 -999 -999 -999 +JTWC 01S ONE 20250718 1200 122S 0843E 240 067 1002 1010 0426 18 101 -999 0102 0102 -999 M +NHC 15E OCTAVE 20251007 1800 155N 1192W 110 026 1000 1008 0185 21 046 0037 0074 0093 0093 M -999 -999 -999 -999 48 170N 1122W -999 -999 -999 -999 +JTWC 08P EIGHT 20251217 0600 138S 1722E 330 016 1006 1008 0250 13 055 -999 -999 -999 -999 S +JTWC 06W NARI 20250713 0000 265N 1425E 030 037 0997 1004 0296 18 074 0158 0204 -999 -999 M +JTWC 05W DANAS 20250705 1200 208N 1180E 025 016 0982 1003 0315 31 064 0213 0185 0130 0093 M +JTWC 26W BUALOI 20250926 0600 127N 1206E 280 103 0992 1006 0426 31 046 0130 0185 0204 0130 D +NHC 03E COSME 20250609 1800 149N 1137W 305 041 0992 1010 0278 31 028 0093 0093 0074 0093 M 0037 0037 0019 0037 72 196N 1140W -999 -999 -999 -999 +JTWC 93S INVEST 20250128 0000 119S 0747E 260 037 1003 1007 0555 13 074 -999 -999 -999 -999 S +JTWC 18W EIGHTEEN 20250819 1200 279N 1271E 355 067 1008 1012 0222 15 092 -999 -999 -999 -999 S +JTWC 29W NAKRI 20251009 1200 247N 1343E 330 057 1001 1010 0278 18 074 0084 0111 0084 -999 S +JTWC 93S INVEST 20250910 0600 043S 0941E 290 021 1004 1009 0278 15 092 -999 -999 -999 -999 M +JTWC 16W PODUL 20250812 1200 216N 1250E 285 072 0975 1007 0370 41 031 0195 0167 0111 0148 D +JTWC 28W HALONG 20251005 1800 255N 1419E 315 016 0985 1007 0352 28 046 0185 0148 0121 0148 D +JTWC 22W TAPAH 20250907 1200 201N 1135E 320 042 0991 1005 0315 26 037 0074 0102 0158 0065 M +JTWC 97W INVEST 20251022 1200 220N 1229E 190 021 1006 1010 0222 10 064 -999 -999 -999 -999 S +JTWC 24W RAGASA 20250922 1800 196N 1193E 275 057 0930 1002 0463 64 031 0361 0389 0296 0370 D +JTWC 14S TALIAH 20250213 1200 226S 0866E 225 062 0988 1006 0435 26 092 0278 0407 0315 0269 M +JTWC 90S INVEST 20250803 0600 075S 0954E 190 042 1005 1008 0287 15 175 -999 -999 -999 -999 S +JTWC 14S TALIAH 20250209 1200 149S 0934E 290 026 0997 1006 0731 20 074 0167 0185 0204 0148 M +NHC 99E INVEST 20251003 0000 125N 1025W 280 031 1009 1011 0185 10 148 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 20S BIANCA 20250224 1800 202S 1029E 220 042 0958 1011 0463 48 031 0139 0130 0121 0074 D +JTWC 18W EIGHTEEN 20250820 0600 303N 1279E 015 042 1005 1010 0111 15 064 -999 -999 -999 -999 S +JTWC 14S TALIAH 20250214 0600 239S 0845E 235 037 0994 1008 0518 23 111 -999 0306 0324 0222 M +JTWC 22W TAPAH 20250907 1800 208N 1132E 335 042 0984 1004 0287 31 046 0139 0195 0167 0102 D +JTWC 14S TALIAH 20250207 0600 156S 0995E 255 052 0992 1006 0703 23 074 0241 0222 0222 0296 M +JTWC 93A INVEST 20250523 0600 177N 0728E 070 006 1000 1002 0185 10 138 -999 -999 -999 -999 S +JTWC 93S INVEST 20250326 1200 149S 1210E 350 016 1000 1004 0259 13 074 -999 -999 -999 -999 S +JTWC 24S IVONE 20250311 1200 201S 0780E 270 047 0999 1007 0426 23 194 -999 0509 0333 -999 M +JTWC 25S JUDE 20250314 1200 237S 0422E 135 057 0988 1007 0426 28 046 0222 0259 0222 0139 D +JTWC 33W THIRTYTHR 20251124 1800 098N 1237E 290 072 1000 1004 0343 13 111 -999 -999 -999 -999 S +NHC 96L INVEST 20250810 1200 235N 0517W 310 067 1018 1019 0222 13 204 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 24W RAGASA 20250919 1200 163N 1301E 280 037 0996 1010 0500 23 074 0259 0241 0259 0130 M +NHC 75L KONG 20240710 0000 389N 0872W 045 134 1005 1012 0408 15 148 -999 -999 -999 -999 M -999 -999 -999 -999 48 460N 762W -999 -999 -999 -999 +JTWC 97P INVEST 20250417 1200 095S 1376E 115 026 1002 1008 0315 15 074 -999 -999 -999 -999 M +JTWC 17S ZELIA 20250212 0000 191S 1186E 195 037 0982 1001 0324 31 074 0195 0232 0204 0185 D +JTWC 10S SEAN 20250121 0600 251S 1084E 220 062 0966 1004 0555 41 027 0278 0259 0213 0222 D +NHC 16E PRISCILLA 20251010 0600 252N 1152W 350 026 0994 1009 0278 23 065 0111 0074 0111 0148 M -999 -999 -999 -999 36 268N 1148W -999 -999 -999 -999 +NHC 97E INVEST 20250921 1200 135N 0990W 285 031 1008 1011 0278 15 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 27S TWENTY-SE 20250325 0000 167S 1100E 250 037 0995 1003 0343 18 037 0074 0084 0158 0111 M +JTWC 98S INVEST 20250308 0000 111S 0849E 245 057 0998 1006 0537 15 111 -999 -999 -999 -999 S +JTWC 15P FIFTEEN 20250204 1800 215S 1734E 095 067 0998 1006 0241 18 055 0139 0167 0084 0102 M +JTWC 96P INVEST 20250224 1200 158S 1708E 145 037 0983 1004 0232 15 055 -999 -999 -999 -999 S +NHC 01E ONE 20250529 0000 124N 1046W 335 041 1006 1010 0278 15 130 -999 -999 -999 -999 S -999 -999 -999 -999 72 201N 1090W -999 -999 -999 -999 +JTWC 21W PEIPAH 20250904 0000 297N 1311E 350 072 0999 1008 0463 18 083 0139 0139 -999 -999 S +JTWC 18P ALFRED 20250306 0600 273S 1553E 270 021 0985 1008 0389 26 092 0176 0324 0407 0278 M +JTWC 22S GARANCE 20250301 0600 278S 0549E 180 093 0986 1004 0167 28 055 0139 0111 0037 0074 M +JTWC 11S ELEVEN 20250131 1200 169S 0656E 255 052 0999 1005 0472 18 055 0093 0185 0167 0084 S +JTWC 18P ALFRED 20250305 1200 273S 1567E 320 021 0978 1006 0407 28 092 0278 0518 0444 0278 M +JTWC 28S TWENTY-EI 20250328 0600 148S 1237E 135 026 0991 1000 0232 20 046 0139 0111 0148 0130 M +NHC 96E INVEST 20250920 0600 194N 1135W 340 021 1007 1011 0334 13 148 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 99E INVEST 20251002 1800 124N 1020W 280 031 1009 1011 0185 10 148 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 91P INVEST 20250201 1200 177S 1648E 185 052 0999 1004 0204 15 129 -999 -999 -999 -999 S +JTWC 96P INVEST 20250411 0000 087S 1296E 245 021 1001 1008 0204 13 092 -999 -999 -999 -999 S +JTWC 02A TWO 20251003 0600 218N 0668E 300 021 0993 1003 0296 20 074 0084 -999 0065 0102 M +JTWC 11S ELEVEN 20250130 0600 160S 0706E 250 077 0996 1008 0407 20 055 0093 0084 0139 0111 M +JTWC 23S HONDE 20250303 0600 272S 0467E 105 006 0987 1008 0333 26 064 0158 0158 0158 0148 M +NHC 15E OCTAVE 20251002 1200 124N 1182W 285 041 0996 1010 0371 28 019 0074 0074 0074 0074 M 0028 0028 0028 0028 72 149N 1240W -999 -999 -999 -999 +NHC 89L INVEST 20250825 0600 136N 0611W 280 093 1010 1013 0259 15 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 93W INVEST 20251205 1800 119N 1261E 285 032 1004 1008 0296 10 148 -999 -999 -999 -999 S +NHC 09E IVO 20250809 1800 209N 1131W 280 031 1003 1012 0278 23 028 0056 0074 0037 0056 M -999 -999 -999 -999 72 226N 1243W -999 -999 -999 -999 +JTWC 25S JUDE 20250310 1200 149S 0391E 270 037 0989 1006 0370 28 037 0241 0296 0204 0185 D +JTWC 25W NEOGURI 20250926 0000 320N 1537E 250 042 0982 1010 0537 31 037 0241 0185 0222 0306 D +JTWC 25W NEOGURI 20250927 1800 332N 1605E 065 077 0972 1008 0287 38 037 0121 0195 0167 0102 D +NHC 93L INVEST 20250923 0600 142N 0476W 285 088 1011 1013 0278 10 222 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 96W INVEST 20250624 1800 169N 1153E 310 032 1004 1006 0176 10 111 -999 -999 -999 -999 S +NHC 09L NINE 20250928 0000 224N 0766W 320 015 1004 1009 0315 15 111 -999 -999 -999 -999 S -999 -999 -999 -999 72 308N 786W -999 -999 -999 -999 +JTWC 02W SEPAT 20250624 0600 300N 1404E 320 062 1000 1010 0204 18 074 0121 0093 -999 -999 M +NHC 11E KIKO 20250902 1800 138N 1286W 270 026 0984 1012 0334 41 019 0093 0074 0074 0093 D 0046 0046 0028 0046 72 144N 1354W 0028 0028 -999 0028 +JTWC 30W FENGSHEN 20251022 1800 165N 1087E 245 042 1000 1006 0185 18 074 0463 0185 0185 0426 S +NHC 13E THIRTEEN 20250912 0600 163N 1002W 295 051 1007 1010 0148 15 037 -999 -999 -999 -999 S -999 -999 -999 -999 72 189N 1099W -999 -999 -999 -999 +JTWC 28W HALONG 20251006 0000 256N 1415E 300 021 0981 1006 0407 31 037 0185 0148 0121 0148 D +JTWC 12W KROSA 20250803 1800 420N 1603E 070 123 0983 1002 0324 23 055 -999 0222 0222 0084 S +JTWC 92W INVEST 20250922 1800 111N 1382E 305 026 1007 1008 0278 10 000 -999 -999 -999 -999 S +JTWC 12W KROSA 20250724 0600 152N 1435E 340 037 1003 1006 0287 15 111 -999 -999 -999 -999 S +JTWC 95S INVEST 20250224 1800 222S 0387E 200 016 0998 1006 0481 15 074 -999 -999 -999 -999 S +JTWC 23S HONDE 20250303 1200 278S 0473E 130 021 0986 1006 0343 26 092 0158 0158 0158 0148 M +JTWC 14S TALIAH 20250216 0600 273S 0810E 225 047 0991 1008 0463 20 148 0222 0463 0370 0241 M +JTWC 30W FENGSHEN 20251021 0600 171N 1116E 245 042 0993 1005 0232 23 083 0407 0222 0195 0333 M +JTWC 95W INVEST 20251008 0000 178N 1388E 305 072 1005 1008 0241 13 231 -999 -999 -999 -999 S +JTWC 99S INVEST 20250307 1200 124S 0527E 265 052 1003 1006 0278 13 203 -999 -999 -999 -999 S +NHC 90E INVEST 20251008 0600 147N 0949W 280 051 1006 1009 0222 15 037 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 29S ERROL 20250416 0600 142S 1192E 260 032 0940 1006 0250 61 009 0093 0121 0102 0093 D +JTWC 11S FAIDA 20250204 1200 196S 0504E 205 016 1002 1009 0222 18 074 0093 -999 0111 0111 S + +JTWC 01S ONE 20250719 0000 122S 0818E 265 057 1003 1008 0352 15 101 -999 -999 -999 -999 S +JTWC 07W SEVEN 20250713 1800 317N 1295E 075 072 0995 0998 0278 13 101 -999 -999 -999 -999 S +JTWC 29S ERROL 20250418 0600 160S 1239E 100 057 0998 1004 0185 20 037 0111 0056 0019 0093 S +NHC 10L JERRY 20251008 0000 125N 0477W 285 103 1003 1011 0222 23 046 0222 0185 -999 0111 S -999 -999 -999 -999 72 211N 626W -999 -999 -999 -999 +JTWC 05B DITWAH 20251201 0600 129N 0811E 005 021 1005 1010 0259 15 083 -999 -999 -999 -999 S +NHC 10L JERRY 20251010 0600 186N 0622W 315 077 1007 1010 0185 23 093 0259 0297 -999 0093 M -999 -999 -999 -999 72 313N 605W -999 -999 -999 -999 +JTWC 23S HONDE 20250302 1200 271S 0463E 100 011 0977 1007 0574 33 055 0167 0222 0222 0167 S +JTWC 16P SIXTEEN 20250211 0600 223S 1635E 110 072 0997 1006 0426 20 129 0222 0130 -999 0148 M +JTWC 02A SHAKHTI 20251003 1200 220N 0664E 300 021 0995 1008 0343 23 092 0084 -999 0065 0102 M +NHC 06L FERNAND 20250826 0000 356N 0568W 035 057 1002 1017 0241 23 074 0130 0130 0111 -999 M -999 -999 -999 -999 48 430N 480W -999 -999 -999 -999 +JTWC 94S INVEST 20250107 1800 146S 0760E 245 047 1006 1009 0315 15 138 -999 -999 -999 -999 M +JTWC 93W INVEST 20251205 0600 115N 1273E 265 026 1004 1006 0241 10 148 -999 -999 -999 -999 S +JTWC 11W CO-MAY 20250729 1200 286N 1234E 320 042 0982 0995 0324 20 129 0278 -999 -999 0121 M +JTWC 20S BIANCA 20250226 0600 255S 1027E 165 052 0999 1013 0222 23 037 0158 0111 0111 0130 M +JTWC 24W TWENTY-FO 20250918 1200 159N 1330E 305 032 1005 1010 0333 15 111 -999 -999 -999 -999 M +JTWC 22W TAPAH 20250907 1800 208N 1132E 335 042 0984 1004 0287 31 046 0139 0195 0167 0102 D +JTWC 24W RAGASA 20250921 0000 179N 1270E 300 037 0933 1006 0444 61 009 0324 0278 0232 0306 D +JTWC 96W INVEST 20250716 1200 138N 1292E 275 052 1002 1005 0426 13 277 -999 -999 -999 -999 S +JTWC 93W INVEST 20250828 0000 145N 1161E 235 026 1003 1006 0583 13 296 -999 -999 -999 -999 S +JTWC 14S TALIAH 20250214 1800 245S 0838E 225 032 0992 1008 0574 20 148 -999 0167 0269 0167 M +JTWC 96W INVEST 20250717 0000 130N 1283E 265 042 1002 1008 0370 13 360 -999 -999 -999 -999 S +JTWC 90W INVEST 20251103 1200 090N 1455E 290 042 1005 1008 0389 10 166 -999 -999 -999 -999 S +JTWC 29W NAKRI 20251010 1800 267N 1306E 270 032 1000 1010 0241 20 055 -999 0130 0093 -999 M +JTWC 09W WIPHA 20250721 1800 208N 1076E 250 037 0984 0998 0463 26 055 0139 0185 0241 0121 D +JTWC 25S JUDE 20250309 1800 149S 0412E 270 057 0975 1007 0333 41 027 0241 0278 0204 0185 D +JTWC 16W PODUL 20250812 0000 209N 1281E 270 067 0984 1007 0333 33 027 0185 0185 0130 0167 D +JTWC 05S FINA 20251125 0600 147S 1274E 240 011 0991 1001 0148 20 037 0093 0056 0056 0093 M +JTWC 95W INVEST 20250622 0600 229N 1460E 345 026 1007 1009 0259 10 092 -999 -999 -999 -999 S +JTWC 96W INVEST 20250623 1800 145N 1180E 285 021 1004 1006 0195 10 074 -999 -999 -999 -999 S +JTWC 13W THIRTEEN 20250802 0000 273N 1369E 055 052 0998 1000 0315 13 148 -999 -999 -999 -999 S +JTWC 94S INVEST 20250104 1200 149S 0927E 280 047 1004 1008 0417 13 120 -999 -999 -999 -999 S +NHC 89L TEST 20250624 1200 300N 0740W 285 082 0950 1010 0371 51 056 0389 0278 0222 0334 D 0185 0167 0130 0167 -9 -99N -999W 0093 0074 0056 0093 +JTWC 32W FUNG-WONG 20251109 1800 165N 1203E 300 083 0959 1004 0666 48 027 0481 0389 0287 0407 D +NHC 15E OCTAVE 20250930 1200 095N 1133W 280 015 1004 1010 0185 18 028 0074 0056 0056 0056 S -999 -999 -999 -999 72 135N 1174W -999 -999 -999 -999 +JTWC 33W KOTO 20251128 0600 125N 1127E 260 021 0993 1008 0343 26 046 0333 0111 0111 0315 M +JTWC 91S INVEST 20250806 1800 073S 0625E 270 037 1004 1010 0352 15 092 -999 -999 -999 -999 M +JTWC 01S ONE 20250719 0600 130S 0815E 250 047 1005 1009 0352 15 120 -999 -999 -999 -999 S +NHC 11E KIKO 20250904 1200 138N 1333W 270 036 0951 1012 0278 59 028 0111 0130 0093 0111 D 0065 0074 0056 0056 72 164N 1427W 0046 0037 0037 0037 +JTWC 14W FOURTEEN 20250805 0600 265N 1582E 245 062 1007 1009 0176 08 074 -999 -999 -999 -999 S +JTWC 22S GARANCE 20250226 0600 176S 0535E 065 032 0992 1011 0315 31 037 0139 0084 0056 0093 M +JTWC 29W NAKRI 20251013 0600 338N 1428E 065 098 0981 1010 0315 33 064 0185 0250 0232 0148 D +JTWC 14S TALIAH 20250202 1200 142S 1162E 280 037 0983 1002 0333 31 055 0259 0167 0185 0259 D +JTWC 91S INVEST 20251211 0600 073S 1013E 150 052 1006 1010 0278 15 083 -999 -999 -999 -999 S +JTWC 05B DITWAH 20251201 0600 129N 0811E 005 021 1005 1010 0259 15 083 -999 -999 -999 -999 S +JTWC 95W INVEST 20251007 0600 157N 1429E 315 077 1008 1010 0213 10 185 -999 -999 -999 -999 S +JTWC 24W RAGASA 20250923 1200 208N 1160E 290 057 0937 1002 0546 59 031 0352 0389 0296 0333 D +JTWC 25W NEOGURI 20250921 1200 285N 1514E 310 047 0939 1010 0518 61 022 0241 0213 0167 0176 D +NHC 05E ERICK 20250619 1200 164N 0984W 315 051 0962 1009 0222 49 019 0111 0148 0130 0093 D 0037 0046 0037 0037 24 175N 998W 0019 0028 0019 0019 +JTWC 02S AWO 20250808 0600 058S 0594E 315 037 1005 1007 0278 15 203 -999 -999 -999 -999 S +JTWC 92W INVEST 20250817 1200 229N 1275E 020 047 1008 1010 0185 10 083 -999 -999 -999 -999 S +NHC 93E INVEST 20250612 0000 096N 0985W 290 046 1010 1012 0334 10 278 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 95S INVEST 20251022 0600 073S 0921E 250 062 1005 1008 0352 13 055 -999 -999 -999 -999 S +JTWC 14S TALIAH 20250202 1800 151S 1154E 250 032 0977 1002 0333 33 027 0148 0111 0204 0111 D +NHC 04L DEXTER 20250805 0600 370N 0649W 050 057 1005 1017 0297 18 130 0130 0185 -999 -999 M -999 -999 -999 -999 72 428N 480W -999 -999 -999 -999 +JTWC 29S TWENTY-NI 20250414 0600 139S 1231E 220 021 1000 1006 0204 18 055 0093 0130 0093 -999 M +NHC 09E IVO 20250806 1800 138N 0982W 295 098 1008 1012 0195 18 037 0037 -999 -999 0037 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 98W INVEST 20250806 1800 184N 1481E 280 021 1006 1008 0111 10 037 -999 -999 -999 -999 S +JTWC 08W EIGHT 20250715 1800 395N 1415E 005 174 1006 1008 0093 13 037 -999 -999 -999 -999 S +JTWC 18P ALFRED 20250307 0000 276S 1545E 245 016 0986 1008 0370 23 120 0148 0287 0444 0250 M +JTWC 05W DANAS 20250705 1800 211N 1181E 025 016 0977 1002 0296 33 037 0222 0204 0130 0148 D +NHC 71L WEGMAN 20240710 0000 389N 0872W 045 134 1005 1012 0371 15 148 -999 -999 -999 -999 M -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 05S FINA 20251122 0000 118S 1314E 220 026 0974 1007 0333 41 027 0121 0111 0093 0093 D +JTWC 29S TWENTY-NI 20250413 0000 122S 1258E 230 016 1000 1007 0222 18 129 -999 0185 0167 -999 M +JTWC 90S INVEST 20250716 0600 088S 0908E 195 032 1004 1009 0426 15 148 -999 -999 -999 -999 M +JTWC 13S VINCE 20250207 1200 200S 0771E 265 057 0932 1006 0500 66 022 0130 0148 0167 0130 D +JTWC 98W INVEST 20250914 1200 125N 1200E 255 067 1007 1009 0130 10 074 -999 -999 -999 -999 S +JTWC 23S HONDE 20250305 0000 318S 0490E 170 052 0987 1010 0352 26 074 0259 0370 0241 0130 M +JTWC 98W INVEST 20250702 0000 173N 1237E 290 037 1006 1008 0222 10 111 -999 -999 -999 -999 S +JTWC 14S TALIAH 20250209 1800 149S 0933E 285 021 0999 1008 0805 20 074 0195 0185 0167 0148 M +JTWC 22S GARANCE 20250302 0600 335S 0590E 140 093 0993 1009 0167 23 064 0167 0111 0065 0056 M +JTWC 28W HALONG 20251006 0600 257N 1409E 290 021 0977 1006 0333 33 027 0185 0167 0148 0111 D +JTWC 25S JUDE 20250313 1800 211S 0395E 130 057 0992 1008 0324 23 111 0185 0352 0232 0121 M +JTWC 02A SHAKHTI 20251004 0000 222N 0647E 285 032 0988 1006 0333 28 055 0167 0111 0102 0158 D +JTWC 24S IVONE 20250311 0600 203S 0791E 255 042 0992 1009 0426 23 194 -999 0509 0333 -999 M +NHC 04E DALILA 20250614 0600 156N 1033W 310 046 0999 1010 0463 23 111 0408 0222 0111 0222 M -999 -999 -999 -999 72 182N 1135W -999 -999 -999 -999 +JTWC 12W KROSA 20250727 1800 244N 1453E 005 067 0964 1000 0333 41 046 0306 0352 0185 0241 D +JTWC 93W INVEST 20251203 1800 129N 1317E 240 042 1003 1006 0250 10 074 -999 -999 -999 -999 S +JTWC 13S VINCE 20250211 0600 269S 0692E 165 057 0975 1006 0407 36 037 0287 0296 0204 0158 D +JTWC 05S FINA 20251119 1200 095S 1326E 070 016 0984 1004 0296 31 018 0084 0056 0056 0084 D +NHC 03L CHANTAL 20250708 0000 392N 0748W 045 072 1011 1012 0083 10 046 -999 -999 -999 -999 S -999 -999 -999 -999 12 406N 720W -999 -999 -999 -999 +NHC 96L INVEST 20250811 0600 263N 0526W 350 041 1018 1019 0278 13 222 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 03S THREE 20250910 1800 102S 0647E 280 026 1006 1012 0185 18 055 -999 0093 0130 -999 M +JTWC 07S BAKUNG 20251215 1200 109S 0921E 095 016 0995 1007 0287 23 027 0074 0102 0093 0084 M +JTWC 12W KROSA 20250727 0000 202N 1451E 020 042 0983 1004 0426 31 064 0213 0278 0259 0158 D +JTWC 31W THIRTYONE 20251101 0600 098N 1381E 295 047 1002 1008 0333 13 074 -999 -999 -999 -999 S +NHC 16E PRISCILLA 20251010 1800 261N 1154W 350 026 1004 1009 0278 15 074 -999 -999 -999 -999 M -999 -999 -999 -999 12 265N 1151W -999 -999 -999 -999 +JTWC 96W INVEST 20250717 1200 163N 1256E 315 067 0998 1005 0555 15 333 -999 -999 -999 -999 M +JTWC 25S JUDE 20250315 1800 255S 0468E 105 047 0986 1005 0417 26 111 0222 0407 0296 0139 M +JTWC 29S TWENTY-NI 20250415 0000 136S 1221E 270 021 0996 1007 0204 23 046 0093 0111 0074 0056 D +NHC 01E ALVIN 20250529 1800 146N 1068W 320 046 1002 1010 0371 23 093 0185 0111 -999 0130 M -999 -999 -999 -999 72 219N 1086W -999 -999 -999 -999 +NHC 94L INVEST 20250923 1200 173N 0620W 275 082 1010 1012 0334 13 278 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 18W LINGLING 20250821 1200 316N 1309E 100 037 1002 1009 0139 15 046 -999 -999 -999 -999 M +JTWC 94P INVEST 20251214 0000 117S 1681E 160 032 1001 1006 0241 15 055 -999 -999 -999 -999 M +JTWC 18P EIGHTEEN 20250223 0600 147S 1525E 100 032 0994 1006 0324 26 055 0185 0148 0130 0093 M +JTWC 04S CHENGE 20251020 0600 090S 0670E 260 037 0994 1008 0500 26 074 0176 0213 0380 0195 D +JTWC 04S CHENGE 20251023 0600 102S 0595E 275 037 0996 1011 0389 20 055 0111 0222 0204 0167 M +JTWC 25S JUDE 20250311 1800 170S 0353E 220 052 0999 1006 0278 13 185 -999 -999 -999 -999 M +JTWC 11S FAIDA 20250203 1800 192S 0513E 235 032 0998 1007 0352 20 074 -999 -999 0111 0111 M +JTWC 19W KAJIKI 20250823 1800 172N 1122E 270 072 0989 1006 0278 31 037 0139 0139 0158 0111 D +JTWC 27S COURTNEY 20250401 0600 250S 0884E 220 011 0993 1009 0241 23 092 -999 0259 0204 0111 S +JTWC 06W SIX 20250712 1200 249N 1416E 100 026 0998 1006 0185 18 074 0093 0176 -999 -999 S +JTWC 21P SERU 20250225 1800 181S 1713E 160 026 0985 1008 0463 28 046 0259 0158 0047 0241 M +JTWC 29S ERROL 20250417 0600 152S 1194E 150 016 0951 1005 0333 54 009 0130 0130 0093 0074 D +JTWC 07S DIKELEDI 20250111 1800 129S 0490E 270 067 0980 1007 0306 38 018 0111 0158 0148 0139 D +JTWC 05B DITWAH 20251127 1800 079N 0813E 325 026 1004 1011 0389 18 092 0130 0222 0278 0056 M +JTWC 96S INVEST 20250209 0000 149S 1239E 240 026 1000 1002 0222 13 046 -999 -999 -999 -999 S +JTWC 27W MATMO 20251004 0000 182N 1167E 290 067 0992 1010 0352 31 092 0315 0185 0167 0259 D +JTWC 24S IVONE 20250312 1200 197S 0729E 270 067 0999 1007 0509 18 240 -999 0435 0315 -999 M +JTWC 22W TAPAH 20250906 1800 185N 1148E 280 042 0997 1005 0315 20 055 0074 0102 0158 0065 M +JTWC 92S INVEST 20250324 0600 160S 1120E 230 057 0997 1003 0352 15 120 -999 -999 -999 -999 M +JTWC 15P FIFTEEN 20250204 0000 214S 1693E 115 026 0997 1005 0167 15 074 -999 -999 -999 -999 M +JTWC 12W KROSA 20250802 0600 375N 1440E 035 067 0973 0998 0287 28 064 0185 0195 0139 0121 M +JTWC 04S CHENGE 20251020 0600 090S 0670E 260 037 0994 1008 0500 26 074 0176 0213 0380 0195 D +JTWC 94S INVEST 20250104 1800 147S 0911E 280 052 1006 1009 0417 13 129 -999 -999 -999 -999 S +JTWC 14S TALIAH 20250207 1800 158S 0969E 260 067 0986 1004 0685 26 074 0232 0213 0222 0269 D +JTWC 91W INVEST 20250918 0600 235N 1639E 275 042 1009 1012 0185 13 092 -999 -999 -999 -999 S +NHC 99E INVEST 20251003 1800 131N 1047W 285 041 1007 1011 0334 15 222 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 29S ERROL 20250418 1200 160S 1245E 095 042 1002 1006 0185 15 055 -999 -999 -999 -999 S +JTWC 13S VINCE 20250206 1200 195S 0817E 250 037 0944 1005 0611 59 022 0139 0176 0167 0148 D +JTWC 96S INVEST 20250209 1800 154S 1229E 260 016 0997 1000 0204 13 083 -999 -999 -999 -999 S +JTWC 23S HONDE 20250228 1800 267S 0450E 120 037 0974 1008 0916 31 101 0269 0269 0352 0259 M +JTWC 02W SEPAT 20250625 1800 345N 1403E 015 047 1008 1010 0176 13 055 -999 -999 -999 -999 S +JTWC 25W NEOGURI 20250922 0000 297N 1510E 340 037 0950 1010 0407 54 009 0250 0213 0185 0213 D +JTWC 90S INVEST 20250716 0600 088S 0908E 195 032 1004 1009 0426 15 148 -999 -999 -999 -999 M +JTWC 24S IVONE 20250311 0000 202S 0799E 245 042 0998 1008 0444 23 148 -999 0620 0315 -999 M +JTWC 93S INVEST 20250911 0600 070S 0950E 185 037 1004 1008 0259 15 092 -999 -999 -999 -999 M +JTWC 04B SENYAR 20251126 1800 036N 0999E 110 032 1003 1008 0185 15 046 -999 -999 -999 -999 M +JTWC 29S TWENTY-NI 20250411 1800 106S 1281E 220 042 1000 1006 0121 18 083 -999 -999 0084 0037 S +JTWC 22W TAPAH 20250906 1800 185N 1148E 280 042 0997 1005 0315 20 055 0074 0102 0158 0065 M +JTWC 05W FIVE 20250704 0600 196N 1182E 255 037 1001 1005 0185 15 064 -999 -999 -999 -999 S +NHC 90E INVEST 20250528 0600 131N 1029W 295 036 1008 1010 0259 10 185 -999 -999 -999 -999 S -999 +JTWC 20S BIANCA 20250225 0000 211S 1025E 205 042 0962 1011 0370 51 022 0102 0111 0111 0102 D +JTWC 06P SIX 20251206 0600 202S 1465W 160 072 1000 1007 0148 18 037 0111 0093 -999 0074 M +NHC 98L INVEST 20251020 1200 140N 0665W 280 088 1008 1012 0278 18 074 0111 0093 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 11W CO-MAY 20250730 1800 312N 1204E 305 037 0988 0994 0259 15 092 -999 -999 -999 -999 M +JTWC 10W FRANCISCO 20250724 1800 269N 1249E 320 072 0991 0996 0324 18 101 0232 -999 -999 0185 S +JTWC 95S INVEST 20251020 1800 048S 0975E 175 052 1003 1007 0278 13 064 -999 -999 -999 -999 S +JTWC 92S INVEST 20250102 0600 095S 0581E 080 016 1007 1011 0324 13 074 -999 -999 -999 -999 S +JTWC 93W INVEST 20251206 0000 120N 1259E 290 026 1004 1008 0296 10 148 -999 -999 -999 -999 S +JTWC 25W NEOGURI 20250924 1200 312N 1568E 070 047 0980 1008 0491 31 055 0417 0315 0093 0407 D +JTWC 99S INVEST 20250220 1200 138S 1200E 255 037 1006 1009 0241 13 064 -999 -999 -999 -999 S +JTWC 08P PITA 20250112 0000 219S 1588W 100 103 0997 1007 0426 18 055 0102 0121 0093 -999 S +JTWC 24S IVONE 20250313 1200 229S 0679E 225 067 0998 1007 0472 18 240 -999 0315 0315 -999 M +JTWC 07S BAKUNG 20251214 0600 104S 0912E 245 037 0983 1008 0204 36 018 0065 0084 0084 0065 D +NHC 72L HAGEN 20250704 1200 462N 0200W 060 103 0958 1000 0371 26 111 0371 -999 -999 -999 S 0185 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 11W CO-MAY 20250724 0600 159N 1193E 170 026 0974 1000 0232 36 027 0084 0158 0158 0093 D +NHC 04E DALILA 20250613 1800 145N 1020W 330 062 1001 1009 0445 18 167 0500 0334 -999 0222 M -999 -999 -999 -999 72 182N 1116W -999 -999 -999 -999 +JTWC 24S TWENTY-FO 20250308 0600 119S 0847E 235 052 0998 1006 0574 18 185 0232 0417 0259 -999 S +JTWC 09W WIPHA 20250722 0000 206N 1069E 250 037 0987 0998 0463 23 055 0139 0185 0241 0121 M +JTWC 10S SEAN 20250121 0600 251S 1084E 220 062 0966 1004 0555 41 027 0278 0259 0213 0222 D +JTWC 11S ELEVEN 20250129 1800 153S 0744E 210 052 0996 1008 0370 15 074 -999 -999 -999 -999 M +JTWC 99S INVEST 20250131 0600 146S 1057E 255 037 1000 1003 0278 13 138 -999 -999 -999 -999 S +NHC 75L KONG 20240710 0000 389N 0872W 045 134 1005 1012 0408 15 148 -999 -999 -999 -999 M -999 -999 -999 -999 48 460N 762W -999 -999 -999 -999 +JTWC 24S TWENTY-FO 20250308 0600 119S 0847E 235 052 0998 1006 0574 18 185 0232 0417 0259 -999 S +JTWC 20W TWENTY 20250829 1200 172N 1112E 300 057 0999 1006 0444 15 074 -999 -999 -999 -999 S +JTWC 08P EIGHT 20251215 1200 148S 1712E 125 037 1000 1008 0250 20 055 0130 0074 -999 -999 M +NHC 89L TEST 20250529 1200 300N 0740W 285 082 0950 1010 0371 51 056 0389 0278 0222 0334 D 0185 0167 0130 0167 -9 -99N -999W 0093 0074 0056 0093 +JTWC 14S TALIAH 20250205 1200 148S 1066E 290 047 0979 1003 0602 33 046 0269 0185 0241 0315 D +JTWC 90W INVEST 20250701 1200 232N 1479E 340 057 1007 1009 0176 15 120 -999 -999 -999 -999 S +JTWC 05B DITWAH 20251130 0000 110N 0808E 000 021 1003 1008 0370 15 138 -999 -999 -999 -999 S +JTWC 24S TWENTY-FO 20250308 1800 131S 0839E 210 037 0996 1008 0648 20 148 0278 0407 0333 0056 M +JTWC 95W INVEST 20251006 1200 127N 1463E 290 062 1007 1010 0204 10 185 -999 -999 -999 -999 S +JTWC 11S FAIDA 20250203 1200 181S 0505E 275 057 0998 1006 0315 20 074 -999 -999 0111 0111 M +NHC 99L INVEST 20250825 0600 136N 0611W 280 093 1010 1013 0259 15 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 15P FIFTEEN 20250204 1800 215S 1734E 095 067 0998 1006 0241 18 055 0139 0167 0084 0102 M +JTWC 15P FIFTEEN 20250205 0000 213S 1741E 090 052 0998 1006 0241 18 055 0139 0167 0084 0102 S +NHC 13L MELISSA 20251022 1800 143N 0740W 310 010 1000 1007 0278 23 111 0185 0167 -999 0111 M -999 -999 -999 -999 72 165N 749W -999 -999 -999 -999 +NHC 06L FERNAND 20250826 0000 356N 0568W 035 057 1002 1017 0241 23 074 0130 0130 0111 -999 M -999 -999 -999 -999 48 430N 480W -999 -999 -999 -999 +NHC 99E INVEST 20250729 1200 106N 1027W 285 046 1009 1011 0334 13 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 24S IVONE 20250312 0000 197S 0755E 280 062 0997 1009 0481 20 194 -999 0435 0315 -999 M +JTWC 32P THIRTYTWO 20250511 1800 090S 1379E 205 006 1003 1006 0204 18 055 0056 0148 0056 0037 M +JTWC 96P INVEST 20250108 0600 244S 1638W 125 113 0997 1003 0259 15 129 -999 -999 -999 -999 S +JTWC 94S INVEST 20251017 1200 064S 0764E 250 067 1008 1010 0343 10 120 -999 -999 -999 -999 S +JTWC 27W TWENTY-SE 20251001 0600 147N 1308E 285 057 1006 1008 0222 13 092 -999 -999 -999 -999 S +JTWC 22S GARANCE 20250226 0600 176S 0535E 065 032 0992 1011 0315 31 037 0139 0084 0056 0093 M +JTWC 14S TALIAH 20250216 1800 289S 0791E 225 057 0990 1007 0444 23 111 0222 0306 0278 0167 M +NHC 13E MARIO 20250914 1800 187N 1103W 300 031 1003 1009 0315 21 028 0037 0037 0056 0056 M -999 -999 -999 -999 72 240N 1210W -999 -999 -999 -999 +JTWC 32W FUNG-WONG 20251107 1200 119N 1354E 290 062 0982 1006 0703 33 074 0407 0278 0278 0407 D +NHC 09L IMELDA 20250929 1800 272N 0773W 355 046 0986 1009 0371 28 056 0278 0278 0074 0278 M 0111 -999 0056 0074 72 337N 600W -999 -999 -999 -999 +JTWC 01S ONE 20250718 1800 122S 0825E 255 067 1003 1010 0444 15 101 -999 -999 -999 -999 S +JTWC 05W FIVE 20250704 1800 201N 1174E 290 021 0994 1003 0259 20 046 0111 0111 0074 0093 M +JTWC 13S VINCE 20250210 0600 230S 0683E 210 042 0960 1007 0481 48 031 0259 0278 0222 0167 D +JTWC 24S IVONE 20250310 1800 202S 0810E 220 042 0996 1010 0500 23 120 0010 0546 0370 0010 M +JTWC 01S ONE 20250718 1800 122S 0825E 255 067 1003 1010 0444 15 101 -999 -999 -999 -999 S +JTWC 12W KROSA 20250729 0600 285N 1429E 330 021 0974 0997 0407 28 064 0158 0158 0121 0139 D +JTWC 90S INVEST 20250805 0000 104S 0922E 190 026 1005 1009 0537 13 222 -999 -999 -999 -999 S +JTWC 29S TWENTY-NI 20250415 1200 139S 1208E 260 032 0992 1008 0222 28 037 0102 0121 0093 0065 D +JTWC 20S BIANCA 20250226 0600 255S 1027E 165 052 0999 1013 0222 23 037 0158 0111 0111 0130 M +JTWC 05B DITWAH 20251129 0000 094N 0808E 350 021 1003 1008 0389 18 111 0213 0167 0158 0176 S +JTWC 16W SIXTEEN 20250807 1200 190N 1470E 305 021 1005 1012 0250 18 037 -999 0093 -999 -999 M +JTWC 10W TEN 20250722 1200 196N 1316E 335 067 1003 1006 0222 13 055 -999 -999 -999 -999 S +JTWC 93A INVEST 20250524 0000 163N 0733E 170 011 0997 0999 0093 10 064 -999 -999 -999 -999 S +JTWC 27W MATMO 20251005 1200 214N 1095E 300 062 0972 1006 0306 41 046 0278 0259 0241 0241 D +JTWC 95S INVEST 20251022 0000 067S 0936E 260 052 1004 1007 0278 13 055 -999 -999 -999 -999 S +JTWC 23W MITAG 20250919 0000 223N 1158E 325 047 0994 1006 0167 23 064 0130 0111 -999 -999 D +JTWC 96P INVEST 20250129 0000 170S 1460E 165 032 1007 1008 0176 10 046 -999 -999 -999 -999 S +JTWC 19P RAE 20250225 1200 245S 1777W 160 057 0994 1010 0269 26 037 0232 0139 0130 0195 M +JTWC 19P RAE 20250225 0600 236S 1785W 170 057 0988 1009 0287 31 037 0232 0139 0130 0195 M +JTWC 11S ELEVEN 20250128 1200 117S 0762E 200 011 0998 1005 0463 18 092 -999 -999 0259 -999 M +NHC 08L HUMBERTO 20250926 1800 223N 0578W 295 021 0966 1012 0278 49 019 0167 0111 0093 0148 D 0074 0056 0046 0074 72 268N 669W 0037 0019 0019 0037 +JTWC 11S ELEVEN 20250129 1200 146S 0750E 210 047 1000 1007 0537 15 074 -999 -999 -999 -999 M +JTWC 25S JUDE 20250314 1200 237S 0422E 135 057 0988 1007 0426 28 046 0222 0259 0222 0139 D +JTWC 14S TALIAH 20250217 0600 294S 0778E 240 037 0996 1012 0463 20 111 0204 0296 0222 0130 M +JTWC 30P THIRTY 20250415 0000 190S 1696E 155 067 0994 1004 0574 23 129 0398 0333 -999 -999 D +JTWC 98W INVEST 20250914 0600 131N 1207E 270 067 1007 1009 0130 10 074 -999 -999 -999 -999 S +JTWC 29S TWENTY-NI 20250412 0000 112S 1275E 220 047 1000 1007 0185 20 083 0028 0028 0093 0047 M +JTWC 18P ALFRED 20250226 1200 155S 1554E 150 016 0969 1008 0611 43 027 0241 0352 0352 0176 D +JTWC 93A INVEST 20250521 0000 159N 0727E 320 042 1003 1006 0259 13 083 -999 -999 -999 -999 S +JTWC 23W TWENTY-TH 20250916 1800 161N 1222E 305 047 0999 1009 0167 23 027 0056 0056 0056 -999 M +JTWC 13W BAILU 20250804 0000 372N 1496E 060 098 0998 1006 0269 18 129 -999 0278 0130 -999 M +JTWC 97W INVEST 20251022 0000 230N 1229E 195 016 1006 1010 0185 10 064 -999 -999 -999 -999 S +JTWC 95S INVEST 20250223 0600 207S 0368E 355 032 1004 1008 0639 10 000 -999 -999 -999 -999 S +NHC 92E INVEST 20250607 0600 128N 0980W 305 057 1006 1008 0371 15 222 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 10W FRANCISCO 20250724 0600 249N 1279E 340 052 0987 0998 0454 20 249 0361 0296 -999 0121 M +JTWC 93S INVEST 20250127 1200 114S 0766E 280 021 1002 1004 0463 13 120 -999 -999 -999 -999 S +JTWC 08P EIGHT 20251216 1200 146S 1725E 065 021 1003 1008 0250 18 055 0121 0056 -999 -999 M +JTWC 08P EIGHT 20251215 0600 146S 1705E 135 037 0998 1006 0250 20 055 0130 0074 -999 -999 M +JTWC 01S ONE 20250717 1800 103S 0876E 255 032 1003 1010 0426 18 138 -999 0158 0176 -999 M +JTWC 25W NEOGURI 20250922 0000 297N 1510E 340 037 0950 1010 0407 54 009 0250 0213 0185 0213 D +JTWC 97W INVEST 20250805 1800 280N 1583E 320 052 0991 1009 0518 13 166 -999 -999 -999 -999 S +JTWC 07S DIKELEDI 20250114 1200 178S 0397E 190 042 0988 1006 0296 28 027 0056 0074 0056 0056 M +JTWC 96P INVEST 20250409 1200 088S 1319E 285 042 1007 1009 0185 13 092 -999 -999 -999 -999 S +JTWC 12W KROSA 20250801 0000 326N 1417E 340 042 0974 0998 0315 28 064 0185 0176 0121 0139 M +NHC 04E FOUR 20250612 1800 111N 1001W 295 036 1006 1012 0334 15 278 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 95W INVEST 20250803 0600 259N 1661E 205 011 1009 1012 0296 10 064 -999 -999 -999 -999 S +NHC 01E ALVIN 20250530 1200 170N 1086W 325 046 1001 1010 0352 23 074 0204 0111 0056 0148 M -999 -999 -999 -999 48 228N 1095W -999 -999 -999 -999 +JTWC 29S TWENTY-NI 20250412 0600 115S 1266E 235 047 0999 1007 0296 18 074 -999 0074 0111 -999 M + +JTWC 29S TWENTY-NI 20250414 0000 135S 1225E 250 037 1001 1009 0241 20 092 0084 0204 0167 -999 M +JTWC 05W DANAS 20250707 1200 271N 1217E 020 062 0991 1000 0241 23 120 0241 0278 0056 0056 M +NHC 01C IONA 20250801 1200 144N 1755W 285 098 1005 1011 0213 18 074 0093 -999 -999 0074 M -999 -999 -999 -999 72 213N 1714E -999 -999 -999 -999 +NHC 97E INVEST 20250919 1800 120N 0960W 290 051 1010 1011 0278 10 000 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 99S INVEST 20250220 0000 133S 1212E 255 057 1005 1008 0241 13 074 -999 -999 -999 -999 S +NHC 94L INVEST 20250721 0600 102N 0468W 310 041 1011 1013 0167 10 056 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 09W WIPHA 20250719 1200 210N 1177E 295 052 0979 0993 0407 26 092 0278 0185 0222 0195 D +JTWC 08W EIGHT 20250715 1200 365N 1410E 005 159 1002 1006 0093 20 046 0074 0185 -999 -999 S +JTWC 05W FIVE 20250704 1200 203N 1180E 285 021 0997 1005 0185 18 055 0102 0111 0074 -999 S +NHC 04L DEXTER 20250805 1800 382N 0628W 055 051 1005 1020 0315 18 056 0111 0130 -999 0093 M -999 -999 -999 -999 72 444N 430W -999 -999 -999 -999 +JTWC 03B THREE 20251026 1800 113N 0854E 280 037 0998 1009 0833 20 074 -999 -999 0139 -999 S +JTWC 12W KROSA 20250725 0600 173N 1433E 000 026 0997 1006 0370 20 064 0084 0204 0333 0047 M +JTWC 11S FAIDA 20250203 1800 192S 0513E 235 032 0998 1007 0352 20 074 -999 -999 0111 0111 M +NHC 75L KONG 20240710 0000 389N 0872W 045 134 1005 1012 0408 15 148 -999 -999 -999 -999 M -999 -999 -999 -999 48 460N 762W -999 -999 -999 -999 +JTWC 94S INVEST 20250101 0600 153S 1064E 230 057 1004 1008 0481 13 092 -999 -999 -999 -999 S +NHC 15E OCTAVE 20251007 0000 159N 1207W 120 031 0998 1009 0278 23 037 0074 0074 0056 0074 D -999 -999 -999 -999 48 158N 1152W -999 -999 -999 -999 +JTWC 23S HONDE 20250226 1200 237S 0392E 135 026 0982 1004 0537 28 129 0324 0352 0130 0232 M +JTWC 22W TAPAH 20250908 0000 218N 1126E 335 047 0984 1004 0250 33 037 0139 0195 0167 0102 D +JTWC 30W FENGSHEN 20251021 0600 171N 1116E 245 042 0993 1005 0232 23 083 0407 0222 0195 0333 M +JTWC 95S INVEST 20250223 0600 207S 0368E 355 032 1004 1008 0639 10 000 -999 -999 -999 -999 S +JTWC 98P INVEST 20250414 0000 143S 1677E 210 042 1002 1006 0407 15 212 -999 -999 -999 -999 S +NHC 13L MELISSA 20251026 0600 163N 0761W 250 021 0954 1008 0445 57 019 0278 0204 0093 0148 D 0056 0056 0037 0056 72 194N 761W 0037 0028 0028 0037 +JTWC 90S INVEST 20250803 0600 075S 0954E 190 042 1005 1008 0287 15 175 -999 -999 -999 -999 S +NHC 01C IONA 20250729 1800 109N 1550W 275 062 0957 1011 0334 57 028 0148 0111 0093 0130 D 0074 0056 0046 0065 72 130N 1730W 0046 0028 0019 0037 +JTWC 95W INVEST 20251007 0000 147N 1445E 310 072 1009 1010 0213 10 185 -999 -999 -999 -999 S +NHC 73L GENESIS01 20250806 1800 115N 0332W 300 046 1011 1014 0278 15 148 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 14S TALIAH 20250216 0600 273S 0810E 225 047 0991 1008 0463 20 148 0222 0463 0370 0241 M +JTWC 91S INVEST 20251211 1200 075S 1003E 175 032 1006 1010 0278 15 083 -999 -999 -999 -999 S +JTWC 10S SEAN 20250120 0600 216S 1117E 240 052 0940 1004 0925 56 009 0148 0278 0176 0158 D +JTWC 24W RAGASA 20250918 1800 162N 1323E 300 037 1004 1010 0333 18 120 -999 0185 -999 -999 M +JTWC 92W INVEST 20250712 0600 309N 1234E 325 026 1002 1008 0278 15 074 -999 -999 -999 -999 S +JTWC 93W INVEST 20251206 0600 118N 1260E 295 006 1004 1008 0296 10 148 -999 -999 -999 -999 S +NHC 13L MELISSA 20251028 1800 182N 0779W 020 036 0899 1008 0500 75 019 0315 0241 0111 0148 D 0093 0065 0056 0083 72 359N 615W 0046 0037 0037 0046 +JTWC 27S TWENTY-SE 20250324 1800 166S 1105E 245 052 0998 1003 0343 18 037 0074 0084 0158 0111 M +JTWC 21P SERU 20250226 0000 196S 1703E 195 047 0980 1008 0481 28 046 0296 0195 0111 0065 M +JTWC 92W INVEST 20250712 1200 303N 1231E 270 011 1002 1008 0278 15 074 -999 -999 -999 -999 S +NHC 96L INVEST 20250811 0600 263N 0526W 350 041 1018 1019 0278 13 222 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 24S IVONE 20250309 0600 152S 0841E 185 047 0993 1006 0518 23 120 0204 0407 0463 0130 M +NHC 90E INVEST 20251008 1800 152N 0956W 290 036 1006 1008 0222 15 037 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 11W CO-MAY 20250724 0000 162N 1186E 205 042 0975 1000 0232 36 037 0102 0093 0139 0158 D +JTWC 93A INVEST 20250521 1800 168N 0719E 310 026 1002 1005 0185 13 064 -999 -999 -999 -999 S +NHC 80L PASCH 20250701 1800 150N 0520W 275 082 0980 1009 0371 44 046 0204 0185 0185 0185 D 0130 0111 0111 0111 -9 -99N -999W 0056 0046 0046 0046 +JTWC 24S IVONE 20250314 1200 247S 0657E 225 021 0992 1008 0481 18 175 -999 0417 0370 -999 S +JTWC 90S INVEST 20250804 1200 090S 0916E 265 042 1006 1008 0361 13 166 -999 -999 -999 -999 S +NHC 80C CODY 20250716 1200 190N 1500W 280 051 1009 1010 0278 15 000 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 33W KOTO 20251127 1200 128N 1138E 260 021 0982 1006 0380 33 046 0333 0111 0111 0315 D +JTWC 18P ALFRED 20250302 1200 245S 1562E 160 032 0988 1008 0509 26 074 0259 0352 0296 0222 M +NHC 90C INVEST 20250726 1200 111N 1421W 280 041 1010 1012 0278 13 056 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 14S TALIAH 20250215 1800 257S 0826E 230 021 0980 1006 0463 28 111 0213 0454 0454 0213 M +JTWC 13S THIRTEEN 20250202 0600 157S 0989E 265 062 0990 1004 0666 20 074 0093 0111 0111 0111 M +JTWC 90W INVEST 20250918 0600 157N 1334E 290 032 1006 1008 0333 10 111 -999 -999 -999 -999 S +JTWC 14S TALIAH 20250209 0600 151S 0938E 290 026 0997 1006 0648 20 064 0167 0185 0204 0148 M +JTWC 18P EIGHTEEN 20250222 1800 140S 1512E 055 032 0998 1006 0278 20 055 0185 0148 0130 0093 M +NHC 92L INVEST 20250916 0600 125N 0419W 280 057 1008 1011 0408 15 222 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 29S TWENTY-NI 20250413 1200 132S 1240E 245 042 1000 1009 0259 18 092 -999 0167 0148 -999 M +JTWC 29W NAKRI 20251012 1200 317N 1365E 055 077 0982 1010 0315 33 055 0121 0176 0047 0074 D +JTWC 94S INVEST 20250107 0600 126S 0768E 280 072 1008 1010 0481 10 240 -999 -999 -999 -999 S +NHC 81C CPTEST 20250424 1200 285N 1661W 035 021 0985 1014 0463 31 093 0222 0222 -999 0222 M 0167 0130 -999 0167 -9 -99N -999W -999 -999 -999 -999 +JTWC 15P FIFTEEN 20250203 0000 207S 1678E 120 062 0996 1006 0324 23 111 0111 0241 0185 0111 M +JTWC 32W FUNG-WONG 20251112 0600 218N 1198E 040 026 0993 1008 0481 23 092 0518 0148 0148 0389 S +JTWC 32W FUNG-WONG 20251108 0600 130N 1306E 285 077 0971 1005 0851 46 083 0398 0222 0315 0444 D +JTWC 04S CHENGE 20251020 0000 089S 0674E 265 042 0996 1008 0463 23 074 0130 0213 0380 0195 D + +JTWC 02A SHAKHTI 20251005 1200 200N 0606E 240 037 0984 1004 0185 31 027 0111 0148 0148 0111 D +JTWC 07S BAKUNG 20251215 0000 109S 0913E 160 011 0990 1008 0241 28 018 0074 0084 0084 0074 M +JTWC 11W CO-MAY 20250727 1800 265N 1288E 095 016 0986 0996 0324 18 111 0084 0185 0093 0176 M +JTWC 14S TALIAH 20250204 1800 159S 1095E 260 047 0967 1004 0574 43 037 0324 0204 0222 0333 D +JTWC 11S FAIDA 20250205 0000 204S 0487E 235 037 1003 1010 0241 13 074 -999 -999 -999 -999 S +JTWC 23S HONDE 20250305 0600 326S 0490E 175 047 0991 1012 0352 26 083 0259 0296 0185 0148 M +JTWC 97S INVEST 20250224 1800 182S 0516E 125 021 1007 1011 0241 15 037 -999 -999 -999 -999 S +NHC 03L CHANTAL 20250707 1200 370N 0770W 035 051 1009 1015 0250 13 046 -999 -999 -999 -999 M -999 -999 -999 -999 12 381N 764W -999 -999 -999 -999 +JTWC 14S TALIAH 20250208 0600 158S 0959E 270 042 0992 1005 0583 26 074 0148 0204 0222 0167 D +JTWC 96B INVEST 20251126 1800 062N 0814E 340 011 1003 1009 0333 15 092 -999 -999 -999 -999 S +JTWC 01W ONE 20250611 0000 162N 1139E 340 016 0995 1004 0629 15 083 -999 -999 -999 -999 S +JTWC 33W KOTO 20251202 0600 137N 1117E 160 016 1005 1010 0222 13 055 -999 -999 -999 -999 S +JTWC 18P ALFRED 20250226 1800 163S 1553E 170 026 0966 1006 0648 46 037 0333 0306 0324 0176 D +JTWC 24S IVONE 20250310 1200 200S 0816E 210 052 0989 1007 0500 23 111 0370 0426 0370 0139 M +JTWC 23W TWENTY-TH 20250918 0000 198N 1189E 310 052 1003 1006 0213 15 064 -999 -999 -999 -999 S +JTWC 19W KAJIKI 20250825 0600 185N 1062E 280 052 0967 1006 0546 46 022 0232 0185 0176 0158 D +JTWC 98W INVEST 20250703 0000 196N 1224E 325 037 1005 1007 0176 10 111 -999 -999 -999 -999 S +NHC 14E NARDA 20250922 1200 156N 1023W 285 057 1000 1008 0334 23 074 0111 0056 0037 0093 M -999 -999 -999 -999 72 162N 1146W -999 -999 -999 -999 +JTWC 23S HONDE 20250303 1200 278S 0473E 130 021 0986 1006 0343 26 092 0158 0158 0158 0148 M +JTWC 26S TWENTY-SI 20250324 1800 130S 1019E 095 042 1005 1007 0278 13 101 -999 -999 -999 -999 S +NHC 02C KELI 20250730 1800 137N 1557W 280 082 1006 1012 0185 18 037 0074 -999 -999 0056 M -999 -999 -999 -999 24 149N 1615W -999 -999 -999 -999 +JTWC 23S HONDE 20250226 1800 240S 0396E 140 026 0981 1007 0583 31 129 0324 0296 0259 0232 M +JTWC 10S SEAN 20250120 1200 226S 1108E 225 057 0936 1005 0888 59 009 0148 0278 0176 0158 D +JTWC 93S INVEST 20250127 0000 124S 0758E 265 047 1005 1008 0518 10 120 -999 -999 -999 -999 S +JTWC 90S INVEST 20250803 0600 075S 0954E 190 042 1005 1008 0287 15 175 -999 -999 -999 -999 S +NHC 80C CODY 20250415 1200 190N 1500W 280 051 1009 1010 0278 15 000 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 18P ALFRED 20250226 1800 163S 1553E 170 026 0966 1006 0648 46 037 0333 0306 0324 0176 D +NHC 18E EIGHTEEN 20251024 1800 132N 1156W 275 057 1007 1010 0278 15 185 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 97S INVEST 20250109 1800 167S 1036E 180 052 1003 1009 0426 15 074 -999 -999 -999 -999 S +JTWC 13S VINCE 20250205 1800 188S 0839E 265 052 0951 1006 0481 56 009 0148 0195 0222 0148 D +JTWC 04B FOUR 20251125 1200 047N 0990E 280 021 0999 1006 0148 18 046 0093 0074 0074 0093 M +NHC 12E TWELVE 20250902 0000 170N 1048W 295 062 1007 1009 0222 15 111 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 03S THREE 20250910 0600 105S 0654E 260 047 1004 1012 0185 18 074 -999 0093 0130 0130 M +JTWC 08P PITA 20250112 1200 226S 1564W 100 067 0998 1004 0306 18 064 -999 -999 -999 -999 S +JTWC 96W INVEST 20251017 1800 131N 1269E 265 062 1002 1004 0352 10 129 -999 -999 -999 -999 S +JTWC 98W INVEST 20250915 0600 122N 1170E 270 052 1006 1008 0278 10 092 -999 -999 -999 -999 S +JTWC 12W KROSA 20250727 1200 227N 1454E 010 062 0971 1000 0333 31 064 0306 0315 0185 0250 D +JTWC 18P ALFRED 20250302 0000 234S 1555E 175 026 0984 1008 0491 28 074 0259 0315 0296 0222 M +NHC 11E KIKO 20250902 1800 138N 1286W 270 026 0984 1012 0334 41 019 0093 0074 0074 0093 D 0046 0046 0028 0046 72 144N 1354W 0028 0028 -999 0028 +JTWC 24S IVONE 20250314 1200 247S 0657E 225 021 0992 1008 0481 18 175 -999 0417 0370 -999 S +NHC 99L INVEST 20250823 0000 105N 0434W 270 082 1010 1013 0278 15 074 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 03S THREE 20250910 1800 102S 0647E 280 026 1006 1012 0185 18 055 -999 0093 0130 -999 M +JTWC 98W INVEST 20250723 0600 129N 1450E 290 088 1007 1009 0176 10 092 -999 -999 -999 -999 S +JTWC 21P SERU 20250225 1800 181S 1713E 160 026 0985 1008 0463 28 046 0259 0158 0047 0241 M +NHC 72L HAGEN 20250704 1200 462N 0200W 060 103 0958 1000 0371 26 111 0371 -999 -999 -999 S 0185 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 33W THIRTYTHR 20251124 1800 098N 1237E 290 072 1000 1004 0343 13 111 -999 -999 -999 -999 S +JTWC 23S HONDE 20250301 1800 270S 0458E 120 016 0980 1006 0555 31 055 0204 0222 0204 0204 D +JTWC 11S ELEVEN 20250203 0600 180S 0513E 275 057 0997 1008 0463 23 055 0074 0074 0111 0130 M +JTWC 11W CO-MAY 20250726 0600 263N 1265E 030 088 0994 1000 0259 13 111 -999 -999 -999 -999 S +JTWC 19P RAE 20250225 1200 245S 1777W 160 057 0994 1010 0269 26 037 0232 0139 0130 0195 M +JTWC 18P ALFRED 20250304 1800 281S 1575E 245 032 0980 1009 0555 28 120 0278 0537 0481 0370 S +JTWC 92W INVEST 20250818 0600 229N 1265E 335 021 1008 1011 0241 10 092 -999 -999 -999 -999 S +JTWC 90S INVEST 20250117 1200 155S 1197E 350 016 1000 1002 0454 10 064 -999 -999 -999 -999 S +JTWC 31P THIRTYONE 20250420 1200 126S 1402E 255 016 1002 1009 0232 15 055 -999 -999 -999 -999 S +JTWC 16W PODUL 20250810 0600 217N 1376E 270 057 0996 1008 0417 26 027 0102 0130 0111 0121 M +NHC 05L ERIN 20250814 1200 163N 0489W 270 072 0999 1012 0222 26 028 0074 0037 0037 0093 M 0028 -999 -999 -999 72 210N 641W -999 -999 -999 -999 +JTWC 96P INVEST 20250411 0600 089S 1291E 245 021 1000 1008 0204 15 083 -999 -999 -999 -999 S +JTWC 05W DANAS 20250708 1200 279N 1212E 280 021 0985 0996 0185 18 055 0130 0139 0195 0121 S +JTWC 24S IVONE 20250314 1200 247S 0657E 225 021 0992 1008 0481 18 175 -999 0417 0370 -999 S +NHC 09L NINE 20250927 1200 220N 0760W 320 026 1005 1010 0278 15 167 -999 -999 -999 -999 S -999 -999 -999 -999 72 302N 788W -999 -999 -999 -999 +JTWC 05B FIVE 20251127 1200 076N 0817E 345 026 1002 1010 0352 18 092 0130 0222 0278 0056 M +JTWC 11S ELEVEN 20250131 0600 157S 0665E 280 057 0997 1007 0426 18 055 0093 0185 0167 0084 M +JTWC 31W KALMAEGI 20251105 0600 121N 1171E 285 072 0972 1008 0648 41 027 0167 0139 0222 0222 D +JTWC 32W THIRTYTWO 20251104 1800 082N 1417E 235 042 1000 1004 0343 15 074 -999 -999 -999 -999 S +JTWC 25S JUDE 20250312 1200 179S 0355E 175 021 1003 1006 0296 13 185 -999 -999 -999 -999 M +JTWC 18P ALFRED 20250301 1800 227S 1554E 185 037 0979 1006 0481 31 074 0259 0333 0315 0222 M +JTWC 16W PODUL 20250809 1800 215N 1402E 275 042 0994 1012 0287 28 027 0130 0139 0102 0148 M +NHC 05L ERIN 20250822 0600 379N 0665W 055 093 0956 1011 0667 41 148 0519 0593 0500 0519 M 0259 0334 0241 0278 72 521N 281W 0130 0204 0148 0148 +JTWC 90S INVEST 20250715 1800 076S 0913E 195 037 1003 1009 0352 15 148 -999 -999 -999 -999 M +JTWC 11S FAIDA 20250204 1800 201S 0495E 190 032 1003 1010 0241 13 074 -999 -999 -999 -999 S +JTWC 18W EIGHTEEN 20250819 0600 271N 1276E 005 077 1009 1012 0222 15 111 -999 -999 -999 -999 S +JTWC 12S ELVIS 20250129 1200 249S 0425E 290 021 0993 1005 0352 20 055 0093 0278 0278 0093 M +JTWC 11S ELEVEN 20250201 0000 171S 0623E 250 072 0999 1008 0555 18 055 0093 0185 0167 0084 M +JTWC 95W INVEST 20250903 0600 255N 1315E 355 072 1004 1007 0296 10 092 -999 -999 -999 -999 S +JTWC 24S IVONE 20250309 1200 160S 0839E 185 047 0993 1006 0518 23 120 0204 0407 0463 0130 M +NHC 17E RAYMOND 20251011 1800 219N 1096W 330 057 1005 1008 0167 15 046 -999 -999 -999 -999 M -999 -999 -999 -999 24 268N 1111W -999 -999 -999 -999 +JTWC 12W KROSA 20250726 1200 185N 1445E 050 021 0987 1006 0444 26 064 0370 0352 0417 0176 M +NHC 02C KELI 20250729 0000 122N 1450W 280 046 1006 1011 0185 18 037 0056 -999 -999 0056 M -999 -999 -999 -999 72 119N 1595W -999 -999 -999 -999 +JTWC 29S TWENTY-NI 20250412 0000 112S 1275E 220 047 1000 1007 0185 20 083 0028 0028 0093 0047 M +JTWC 93W INVEST 20251207 0600 120N 1235E 270 037 1006 1008 0259 10 129 -999 -999 -999 -999 S +JTWC 96W INVEST 20250717 1200 163N 1256E 315 067 0998 1005 0555 15 333 -999 -999 -999 -999 M +JTWC 29W NAKRI 20251011 0600 277N 1310E 010 021 1000 1009 0315 18 055 -999 0130 0093 -999 M +JTWC 90W INVEST 20250822 1200 166N 1196E 280 067 1002 1008 0370 10 074 -999 -999 -999 -999 S +JTWC 99S INVEST 20250220 1200 138S 1200E 255 037 1006 1009 0241 13 064 -999 -999 -999 -999 S +JTWC 31P THIRTYONE 20250420 0000 124S 1411E 315 001 1001 1009 0222 15 055 -999 -999 -999 -999 S +NHC 08E HENRIETTE 20250809 1800 219N 1476W 300 072 1008 1013 0167 18 074 0074 -999 -999 -999 M -999 -999 -999 -999 72 320N 1604W -999 -999 -999 -999 +JTWC 94S INVEST 20250107 0600 126S 0768E 280 072 1008 1010 0481 10 240 -999 -999 -999 -999 S +JTWC 98P INVEST 20250413 1800 134S 1695E 155 026 1003 1005 0324 15 212 -999 -999 -999 -999 S +JTWC 92W INVEST 20251123 1800 086N 1304E 280 067 1004 1006 0278 10 111 -999 -999 -999 -999 S +JTWC 99W INVEST 20250722 1800 193N 1216E 255 037 1000 1004 0185 10 074 -999 -999 -999 -999 S +NHC 07L GABRIELLE 20250924 1800 361N 0469W 080 124 0966 1011 0278 46 028 0167 0259 0241 0130 D 0093 0148 0130 0074 72 409N 165W 0056 0074 0056 0037 +JTWC 11W CO-MAY 20250726 0000 253N 1257E 035 128 0997 1000 0259 13 111 -999 -999 -999 -999 S +JTWC 14S TALIAH 20250214 1800 245S 0838E 225 032 0992 1008 0574 20 148 -999 0167 0269 0167 M +JTWC 16W PODUL 20250811 1800 206N 1293E 265 067 0984 1006 0278 33 027 0167 0167 0111 0130 D +NHC 18E SONIA 20251029 0000 154N 1248W 280 041 1005 1011 0204 18 056 0074 -999 -999 0074 S -999 -999 -999 -999 36 150N 1300W -999 -999 -999 -999 +JTWC 18P ALFRED 20250225 1200 143S 1551E 110 011 0975 1006 0555 38 018 0130 0093 0102 0093 D +JTWC 24W RAGASA 20250924 1200 218N 1111E 280 062 0966 1001 0389 41 083 0296 0306 0259 0232 D +NHC 07L GABRIELLE 20250925 0000 359N 0440W 085 124 0978 1008 0278 39 074 0148 0297 0315 0130 D 0074 0148 0148 0074 72 407N 132W -999 0093 0093 -999 +JTWC 94S INVEST 20250104 0000 155S 0936E 265 088 1006 1008 0417 13 092 -999 -999 -999 -999 S +JTWC 93W INVEST 20251204 1800 114N 1279E 250 052 1004 1006 0278 10 129 -999 -999 -999 -999 S +JTWC 22S GARANCE 20250228 1200 225S 0551E 185 062 0974 1004 0130 38 022 0148 0315 0139 0111 D +JTWC 04W FOUR 20250702 0000 250N 1474E 345 047 1002 1009 0185 15 111 -999 -999 -999 -999 S +NHC 95E INVEST 20250626 0600 097N 0931W 305 026 1007 1010 0371 13 185 -999 -999 -999 -999 S -999 +JTWC 18P ALFRED 20250306 1800 272S 1550E 280 011 0985 1006 0435 23 064 0121 0407 0333 0204 M +JTWC 91S INVEST 20251211 0000 063S 1004E 140 047 1008 1011 0222 13 092 -999 -999 -999 -999 S +JTWC 02W TWO 20250623 0000 246N 1447E 325 042 1006 1009 0259 18 055 -999 -999 -999 -999 S +NHC 05L ERIN 20250816 0000 194N 0586W 295 088 0981 1012 0334 39 028 0204 0093 0056 0185 D 0074 0056 0028 0074 72 248N 695W 0046 -999 -999 0037 +NHC 14E NARDA 20250924 1200 151N 1111W 265 057 0972 1009 0482 46 019 0130 0148 0167 0185 D 0056 0074 0074 0056 72 176N 1233W 0037 0037 0019 0037 +JTWC 11S ELEVEN 20250130 0600 160S 0706E 250 077 0996 1008 0407 20 055 0093 0084 0139 0111 M +JTWC 90W INVEST 20250917 0000 136N 1366E 290 032 1007 1009 0426 10 111 -999 -999 -999 -999 S +JTWC 18P ALFRED 20250226 0600 153S 1553E 165 016 0970 1008 0592 43 018 0222 0278 0269 0176 D +JTWC 98W INVEST 20250914 0000 136N 1232E 290 047 1008 1010 0111 10 074 -999 -999 -999 -999 S +JTWC 97W INVEST 20250721 1800 156N 1331E 330 026 1006 1008 0222 08 120 -999 -999 -999 -999 S +JTWC 07S DIKELEDI 20250112 1200 141S 0448E 255 072 0989 1004 0102 28 037 0130 0065 0074 0084 D +JTWC 24S IVONE 20250310 0600 192S 0822E 205 057 0993 1007 0500 23 111 0241 0555 0444 0185 M +NHC 06E FLOSSIE 20250701 1800 175N 1065W 295 046 0966 1009 0241 49 028 0148 0111 0074 0130 D 0074 0074 0037 0056 72 222N 1132W 0037 0028 -999 0028 +JTWC 09W WIPHA 20250718 1800 198N 1208E 305 062 0984 0996 0518 23 092 0389 0352 0185 0241 D +JTWC 29S ERROL 20250417 0600 152S 1194E 150 016 0951 1005 0333 54 009 0130 0130 0093 0074 D +JTWC 24S IVONE 20250309 1800 174S 0831E 200 057 0993 1008 0537 26 111 0333 0481 0370 0185 M +JTWC 12W TWELVE 20250723 1800 132N 1441E 285 021 1004 1006 0222 13 148 -999 -999 -999 -999 S +JTWC 23S HONDE 20250226 0600 234S 0388E 130 016 0986 1004 0518 26 092 0296 0315 0102 0185 M +JTWC 97W INVEST 20250805 0000 258N 1598E 305 047 1008 1012 0481 10 166 -999 -999 -999 -999 S +JTWC 07S SEVEN 20251212 1200 084S 0967E 260 047 1003 1009 0333 20 092 0047 0111 0102 0019 M +NHC 98E INVEST 20250929 1200 103N 1120W 255 051 1008 1011 0371 15 037 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 18W LINGLING 20250822 0000 321N 1320E 075 032 1006 1009 0111 13 074 -999 -999 -999 -999 S +NHC 11E KIKO 20250904 0000 138N 1319W 265 041 0944 1011 0371 64 019 0111 0130 0111 0130 D 0065 0065 0056 0065 72 156N 1415W 0037 0028 0028 0037 +JTWC 33W KOTO 20251202 1800 135N 1112E 200 011 1007 1010 0204 10 055 -999 -999 -999 -999 S +JTWC 31W KALMAEGI 20251106 1200 136N 1091E 275 088 0960 1005 0352 51 018 0222 0204 0167 0222 D +JTWC 18P ALFRED 20250224 0000 140S 1540E 065 026 0986 1006 0167 31 022 0111 0139 0139 0148 D +JTWC 93A INVEST 20250522 1200 177N 0725E 030 016 1001 1004 0204 13 064 -999 -999 -999 -999 S +JTWC 96P INVEST 20250409 1800 086S 1320E 305 032 1005 1007 0389 13 166 -999 -999 -999 -999 S +JTWC 04B SENYAR 20251128 0600 038N 1018E 075 016 1005 1008 0148 13 046 -999 -999 -999 -999 S +JTWC 04S CHENGE 20251021 1200 100S 0634E 255 062 0984 1005 0509 31 074 0195 0204 0361 0333 D +JTWC 26W BUALOI 20250928 0000 164N 1094E 285 072 0982 1005 0463 36 046 0259 0222 0111 0195 D +JTWC 20W TWENTY 20250829 1200 172N 1112E 300 057 0999 1006 0444 15 074 -999 -999 -999 -999 S +JTWC 18P ALFRED 20250303 1200 267S 1582E 140 037 0986 1006 0500 26 120 0250 0222 0259 0287 M +NHC 99L INVEST 20250823 0600 109N 0452W 280 088 1010 1013 0259 15 074 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 04E DALILA 20250614 1200 162N 1043W 305 051 0996 1009 0426 26 056 0371 0222 0111 0222 M 0056 0037 0019 0056 72 178N 1152W -999 -999 -999 -999 +NHC 99L INVEST 20250825 0600 136N 0611W 280 093 1010 1013 0259 15 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 96P INVEST 20250223 1800 133S 1691E 130 026 1002 1004 0278 15 000 -999 -999 -999 -999 S +NHC 93L INVEST 20250716 1200 303N 0849W 280 051 1012 1016 0222 13 148 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 99E INVEST 20250728 1800 099N 1002W 280 031 1009 1011 0334 13 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 14W FOURTEEN 20250804 0600 280N 1630E 310 047 1008 1011 0296 13 064 -999 -999 -999 -999 S +NHC 07L GABRIELLE 20250925 1800 367N 0336W 080 139 0983 1006 0315 31 056 0130 0297 0278 0111 D -999 0093 0056 -999 72 379N 88W -999 -999 -999 -999 +NHC 90E INVEST 20250803 0600 114N 1139W 280 051 1009 1013 0297 13 222 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 19P NINETEEN 20250223 0600 153S 1788W 195 026 0989 1004 0269 26 064 0259 0241 0130 0287 M + +JTWC 14S TALIAH 20250204 1800 159S 1095E 260 047 0967 1004 0574 43 037 0324 0204 0222 0333 D +JTWC 04W MUN 20250704 0600 301N 1449E 355 032 0985 1008 0352 28 037 0148 0130 0102 0121 D +JTWC 11S ELEVEN 20250129 1800 153S 0744E 210 052 0996 1008 0370 15 074 -999 -999 -999 -999 M +JTWC 13S VINCE 20250210 0600 230S 0683E 210 042 0960 1007 0481 48 031 0259 0278 0222 0167 D +JTWC 24S TWENTY-FO 20250308 1800 131S 0839E 210 037 0996 1008 0648 20 148 0278 0407 0333 0056 M +NHC 14E NARDA 20250926 0600 163N 1200W 275 067 0980 1011 0482 41 028 0222 0297 0167 0185 D 0130 0130 0074 0074 72 206N 1277W 0074 0074 0037 0037 + +JTWC 08P PITA 20250111 1800 219S 1606W 105 118 0996 1006 0472 20 037 0130 0102 0074 -999 M +JTWC 94S INVEST 20250108 0600 148S 0722E 265 088 1004 1008 0398 15 138 -999 -999 -999 -999 M +NHC 09L IMELDA 20250930 1200 290N 0769W 035 031 0980 1005 0334 33 093 0259 0167 0185 0297 M 0111 0093 0130 0148 72 366N 518W 0074 -999 0093 -999 +JTWC 18P ALFRED 20250302 1800 250S 1566E 150 032 0983 1006 0481 28 074 0259 0296 0278 0185 M +JTWC 22W TAPAH 20250908 0000 218N 1126E 335 047 0984 1004 0250 33 037 0139 0195 0167 0102 D +JTWC 95W INVEST 20250622 0000 223N 1462E 335 016 1008 1010 0204 10 138 -999 -999 -999 -999 S +JTWC 90A INVEST 20251001 0600 220N 0686E 240 011 0997 1002 0259 13 111 -999 -999 -999 -999 S +NHC 10L JERRY 20251008 0000 125N 0477W 285 103 1003 1011 0222 23 046 0222 0185 -999 0111 S -999 -999 -999 -999 72 211N 626W -999 -999 -999 -999 +JTWC 95S INVEST 20250225 0000 226S 0383E 215 016 0996 1006 0574 15 148 -999 -999 -999 -999 S +JTWC 91P INVEST 20250202 0600 191S 1645E 190 026 0997 1002 0315 15 166 -999 -999 -999 -999 S +NHC 10L JERRY 20251009 1800 168N 0601W 300 082 1001 1011 0222 28 074 0278 0278 -999 0130 M 0130 0130 -999 -999 72 285N 624W -999 -999 -999 -999 +JTWC 33W KOTO 20251127 1800 123N 1136E 220 021 0986 1006 0306 31 046 0333 0111 0111 0315 D +JTWC 23S HONDE 20250303 0600 272S 0467E 105 006 0987 1008 0333 26 064 0158 0158 0158 0148 M +NHC 99E INVEST 20250729 1800 109N 1037W 290 046 1009 1011 0334 13 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 08P EIGHT 20251216 0600 151S 1721E 095 021 1003 1008 0250 18 055 0121 0056 -999 -999 M +JTWC 92S INVEST 20250908 1800 087S 0713E 250 072 1005 1011 0278 13 157 -999 -999 -999 -999 S +NHC 97L INVEST 20250811 0000 165N 0234W 295 103 1006 1010 0297 15 074 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 22S GARANCE 20250226 0600 176S 0535E 065 032 0992 1011 0315 31 037 0139 0084 0056 0093 M +JTWC 25S JUDE 20250314 1200 237S 0422E 135 057 0988 1007 0426 28 046 0222 0259 0222 0139 D +JTWC 24W RAGASA 20250920 1800 178N 1279E 315 037 0937 1006 0481 59 009 0324 0250 0222 0296 D +JTWC 14S TALIAH 20250210 0600 140S 0929E 325 021 0994 1008 0851 20 074 0148 0111 0167 0148 M +JTWC 19W KAJIKI 20250823 0600 176N 1150E 280 098 0995 1006 0278 26 074 0093 0093 0176 0176 M +NHC 95E INVEST 20250626 1200 100N 0944W 290 041 1007 1010 0417 13 185 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 11W CO-MAY 20250726 1800 269N 1274E 045 037 0994 0998 0176 13 138 -999 -999 -999 -999 S +NHC 97L INVEST 20251012 0600 085N 0330W 280 077 1008 1010 0278 13 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 04S CHENGE 20251022 0000 101S 0633E 255 042 0978 1008 0463 31 055 0204 0296 0204 0259 D +JTWC 32W FUNG-WONG 20251112 1200 222N 1206E 050 032 0997 1010 0444 20 092 0518 0148 0148 0389 S +JTWC 92W INVEST 20251124 0000 092N 1285E 280 083 1004 1006 0278 10 111 -999 -999 -999 -999 S +NHC 17E RAYMOND 20251011 1200 214N 1095W 310 077 1003 1008 0167 18 037 0167 0037 0037 0037 M -999 -999 -999 -999 36 282N 1109W -999 -999 -999 -999 +JTWC 21P SERU 20250226 1800 215S 1712E 160 037 0993 1007 0417 26 064 0269 0241 0195 0139 M +JTWC 07S DIKELEDI 20250117 0600 337S 0548E 115 128 0989 1007 0250 26 074 0213 0139 0121 0185 M +JTWC 93S INVEST 20250127 1800 116S 0759E 265 021 1003 1007 0555 13 074 -999 -999 -999 -999 S +JTWC 27S TWENTY-SE 20250324 1200 166S 1110E 235 062 0995 1004 0370 18 064 -999 -999 0148 0093 M +NHC 92E INVEST 20250607 1800 144N 1002W 300 067 1004 1008 0222 15 130 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 27W MATMO 20251005 1200 214N 1095E 300 062 0972 1006 0306 41 046 0278 0259 0241 0241 D +JTWC 25W NEOGURI 20250921 0600 277N 1518E 295 057 0936 1010 0444 64 022 0204 0204 0167 0176 D +JTWC 15P FIFTEEN 20250205 0000 213S 1741E 090 052 0998 1006 0241 18 055 0139 0167 0084 0102 S +JTWC 94S INVEST 20250107 0000 127S 0780E 285 077 1008 1010 0481 10 240 -999 -999 -999 -999 S + +NHC 08E HENRIETTE 20250806 1800 180N 1302W 280 067 1005 1014 0241 23 056 0111 0074 0056 0130 M -999 -999 -999 -999 72 215N 1466W -999 -999 -999 -999 +JTWC 21P SERU 20250226 1200 208S 1706E 180 037 0994 1008 0481 26 064 0232 0167 0176 0139 D +NHC 14E NARDA 20250923 1200 158N 1068W 270 057 0981 1008 0371 39 019 0111 0093 0074 0093 D 0046 0037 0037 0046 72 161N 1190W 0028 -999 -999 0019 +JTWC 20S BIANCA 20250224 0600 190S 1036E 230 052 0985 1010 0417 38 022 0074 0093 0121 0093 D +JTWC 97S INVEST 20250110 0000 173S 1035E 175 042 1003 1010 0426 15 074 -999 -999 -999 -999 S +JTWC 10W FRANCISCO 20250724 0600 249N 1279E 340 052 0987 0998 0454 20 249 0361 0296 -999 0121 M +JTWC 13S VINCE 20250208 1200 205S 0725E 260 057 0946 1004 0454 59 027 0121 0185 0176 0111 D +JTWC 24S TWENTY-FO 20250308 1800 131S 0839E 210 037 0996 1008 0648 20 148 0278 0407 0333 0056 M +NHC 96E INVEST 20250919 1200 184N 1121W 295 051 1001 1009 0334 15 111 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 15E OCTAVE 20251001 0600 109N 1146W 320 031 0996 1009 0278 26 028 0093 0093 0093 0074 M 0037 0037 -999 -999 72 144N 1205W -999 -999 -999 -999 +NHC 93L INVEST 20250717 0000 299N 0872W 265 051 1011 1016 0334 15 111 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 28S DIANNE 20250328 1200 156S 1238E 160 032 0992 1003 0213 20 046 0121 0074 0111 0130 M +JTWC 95W INVEST 20250714 1200 260N 1395E 345 047 1002 1004 0185 10 046 -999 -999 -999 -999 S +JTWC 98W INVEST 20250702 1200 179N 1234E 320 021 1006 1008 0185 08 111 -999 -999 -999 -999 S +JTWC 18W LINGLING 20250822 0600 324N 1326E 060 026 1006 1009 0130 13 074 -999 -999 -999 -999 S +JTWC 10S TEN 20250118 0000 193S 1191E 200 037 0996 1004 0611 18 046 0093 0074 0074 0074 M +NHC 09L IMELDA 20250928 1800 238N 0773W 355 031 0998 1009 0352 18 074 0148 -999 -999 -999 S -999 -999 -999 -999 72 299N 735W -999 -999 -999 -999 +JTWC 23S HONDE 20250227 1200 251S 0419E 120 037 0974 1006 0759 36 166 0352 0269 0167 0250 D +JTWC 93W INVEST 20250930 0000 143N 1366E 290 052 1008 1012 0278 10 101 -999 -999 -999 -999 S +JTWC 03B MONTHA 20251027 0600 127N 0843E 310 037 0999 1009 0694 20 101 0037 0185 0269 0185 S +JTWC 27W TWENTY-SE 20251001 0600 147N 1308E 285 057 1006 1008 0222 13 092 -999 -999 -999 -999 S +NHC 15E OCTAVE 20251006 1800 162N 1213W 095 031 0998 1009 0278 23 028 0074 0093 0093 0074 D -999 -999 -999 -999 72 176N 1118W -999 -999 -999 -999 +JTWC 97W INVEST 20250906 0000 179N 1176E 285 021 1005 1007 0195 10 092 -999 -999 -999 -999 S +JTWC 10W TEN 20250722 0600 179N 1325E 340 047 1003 1006 0222 13 055 -999 -999 -999 -999 S +NHC 18E SONIA 20251027 1200 138N 1208W 270 026 1004 1010 0297 21 056 0074 0056 0019 0074 M -999 -999 -999 -999 48 148N 1258W -999 -999 -999 -999 +JTWC 18W EIGHTEEN 20250820 1200 312N 1280E 020 047 1004 1008 0111 18 074 -999 0111 -999 -999 S +JTWC 29S TWENTY-NI 20250413 1800 133S 1231E 250 047 1000 1008 0259 20 092 0084 0204 0167 -999 M +NHC 09E IVO 20250811 0600 226N 1182W 295 046 1007 1013 0185 15 056 -999 -999 -999 -999 M -999 -999 -999 -999 36 228N 1238W -999 -999 -999 -999 +NHC 63L LIBRA 20251103 1800 216N 0900W 305 051 1007 1010 0278 18 111 0111 0074 -999 0111 M -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 92C INVEST 20250801 0600 116N 1527W 270 082 1010 1011 0222 13 111 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 11W CO-MAY 20250725 0000 173N 1208E 050 037 0989 0997 0222 23 027 0065 0074 0084 0093 M +JTWC 98W INVEST 20250722 0000 082N 1518E 280 026 1007 1009 0176 08 092 -999 -999 -999 -999 S +JTWC 93P INVEST 20250509 0600 078S 1363E 275 062 1004 1006 0426 13 129 -999 -999 -999 -999 S +JTWC 27S TWENTY-SE 20250325 1200 170S 1082E 260 037 0993 1003 0352 20 037 0093 0148 0148 0111 M +JTWC 23S HONDE 20250305 0000 318S 0490E 170 052 0987 1010 0352 26 074 0259 0370 0241 0130 M +JTWC 25S JUDE 20250315 0600 250S 0446E 120 042 0992 1008 0583 28 064 0167 0444 0296 0222 M +NHC 03L CHANTAL 20250706 0600 333N 0789W 350 041 1002 1014 0278 26 074 0185 0204 -999 0074 M 0074 -999 -999 -999 36 360N 780W -999 -999 -999 -999 +JTWC 25W NEOGURI 20250926 1800 316N 1544E 125 011 0986 1008 0444 26 046 0148 0204 0167 0148 M +JTWC 90S INVEST 20250117 1200 155S 1197E 350 016 1000 1002 0454 10 064 -999 -999 -999 -999 S +JTWC 27W MATMO 20251005 0600 208N 1105E 300 067 0966 1006 0333 46 055 0278 0259 0241 0241 D +JTWC 04B SENYAR 20251127 1200 036N 1009E 090 026 1005 1008 0148 13 046 -999 -999 -999 -999 S +JTWC 23S HONDE 20250302 0600 271S 0460E 110 011 0975 1005 0537 33 055 0167 0222 0222 0167 D +JTWC 32W FUNG-WONG 20251113 0600 258N 1253E 050 093 1003 1008 0278 18 092 0518 0148 0148 0389 S +JTWC 12W KROSA 20250727 0600 215N 1450E 005 052 0971 1000 0333 31 064 0278 0306 0185 0167 D +JTWC 29S TWENTY-NI 20250414 0600 139S 1231E 220 021 1000 1006 0204 18 055 0093 0130 0093 -999 M +NHC 13L MELISSA 20251021 1200 143N 0713W 280 062 1003 1009 0278 23 065 0185 0130 -999 0074 M -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 24S TWENTY-FO 20250308 1800 131S 0839E 210 037 0996 1008 0648 20 148 0278 0407 0333 0056 M +JTWC 24S IVONE 20250314 0000 243S 0659E 220 057 0993 1008 0389 18 175 -999 0417 0370 -999 M +NHC 04L DEXTER 20250804 1200 350N 0680W 055 046 1002 1014 0297 21 111 0148 0167 -999 0056 M -999 -999 -999 -999 72 395N 555W -999 -999 -999 -999 +JTWC 33W KOTO 20251201 0600 146N 1115E 270 011 1001 1008 0185 18 046 0102 0093 0074 0074 S +JTWC 03S BLOSSOM 20250913 0000 075S 0605E 305 021 1008 1011 0222 13 120 -999 -999 -999 -999 S +NHC 03L CHANTAL 20250707 0000 356N 0790W 360 041 1006 1013 0158 13 148 -999 -999 -999 -999 M -999 -999 -999 -999 24 379N 762W -999 -999 -999 -999 +NHC 91E INVEST 20250805 1800 100N 0920W 295 072 1010 1013 0371 13 222 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 04S CHENGE 20251023 0600 102S 0595E 275 037 0996 1011 0389 20 055 0111 0222 0204 0167 M +JTWC 18P EIGHTEEN 20250222 1800 140S 1512E 055 032 0998 1006 0278 20 055 0185 0148 0130 0093 M +JTWC 06W NARI 20250713 1200 302N 1433E 010 083 0993 1004 0296 20 064 0222 0269 -999 -999 M +JTWC 20S BIANCA 20250225 1200 228S 1022E 190 047 0965 1011 0352 48 022 0158 0148 0139 0121 D +JTWC 96W INVEST 20250623 1200 144N 1187E 300 016 1006 1008 0167 10 074 -999 -999 -999 -999 S +JTWC 30W FENGSHEN 20251019 1200 157N 1189E 300 072 0999 1005 0380 18 064 -999 0093 0130 0176 M +JTWC 95W INVEST 20250902 1800 223N 1324E 015 047 1004 1006 0296 10 092 -999 -999 -999 -999 S +JTWC 07S DIKELEDI 20250114 1200 178S 0397E 190 042 0988 1006 0296 28 027 0056 0074 0056 0056 M +JTWC 27S COURTNEY 20250327 0600 168S 1000E 280 052 0973 1004 0481 41 027 0121 0148 0176 0148 D +JTWC 95W INVEST 20250803 0600 259N 1661E 205 011 1009 1012 0296 10 064 -999 -999 -999 -999 S +NHC 93E INVEST 20250611 1200 092N 0965W 275 026 1010 1011 0334 10 278 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 27S COURTNEY 20250329 1800 195S 0893E 235 057 0939 1008 0518 64 022 0139 0167 0148 0121 D +NHC 11E KIKO 20250907 0600 168N 1429W 295 057 0957 1010 0278 59 019 0130 0130 0093 0130 D 0074 0074 0037 0074 72 232N 1548W 0056 0037 0019 0056 +JTWC 05W DANAS 20250706 0600 222N 1188E 030 026 0964 1000 0232 41 037 0241 0259 0139 0121 D +JTWC 27S COURTNEY 20250327 0600 168S 1000E 280 052 0973 1004 0481 41 027 0121 0148 0176 0148 D +JTWC 29S ERROL 20250416 1800 147S 1188E 230 021 0935 1007 0306 64 009 0111 0130 0130 0074 D +JTWC 16W PODUL 20250811 0000 212N 1334E 265 062 0990 1006 0204 28 027 0121 0111 0093 0102 M +JTWC 14S TALIAH 20250213 0600 220S 0872E 220 067 0984 1006 0435 31 092 0296 0389 0315 0269 D +JTWC 90W INVEST 20250916 1200 147N 1368E 260 037 1007 1009 0278 10 074 -999 -999 -999 -999 S +NHC 97L INVEST 20250810 0000 112N 0189W 295 051 1006 1010 0278 13 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 96P INVEST 20250108 0600 244S 1638W 125 113 0997 1003 0259 15 129 -999 -999 -999 -999 S +JTWC 26S TWENTY-SI 20250320 1800 144S 0963E 130 037 1001 1009 0426 18 166 0241 -999 -999 0278 S +JTWC 91S INVEST 20251211 1800 082S 0989E 225 042 1006 1010 0278 15 083 -999 -999 -999 -999 S +NHC 90E INVEST 20250803 0600 114N 1139W 280 051 1009 1013 0297 13 222 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 08E HENRIETTE 20250812 0000 303N 1584W 310 077 0987 1015 0167 36 019 0111 0093 0056 0093 D 0056 0046 0028 0046 72 414N 1707W 0028 0028 -999 0028 +JTWC 10S SEAN 20250122 0600 279S 1070E 200 037 0987 1006 0481 23 111 0213 0213 0213 0176 M +JTWC 18W LINGLING 20250822 0000 321N 1320E 075 032 1006 1009 0111 13 074 -999 -999 -999 -999 S +NHC 90L INVEST 20250622 1800 315N 0574W 020 026 1017 1019 0185 10 074 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 92S INVEST 20250104 0600 100S 0642E 100 047 1007 1009 0232 13 074 -999 -999 -999 -999 S +JTWC 98W INVEST 20250913 1800 134N 1240E 300 042 1008 1010 0111 10 074 -999 -999 -999 -999 S +JTWC 92S INVEST 20250323 1200 142S 1146E 210 026 1002 1005 0315 13 148 -999 -999 -999 -999 S +JTWC 12W KROSA 20250731 1800 316N 1420E 335 032 0980 0998 0296 23 055 0176 0158 0111 0148 M +JTWC 31W KALMAEGI 20251102 1800 110N 1301E 270 077 0993 1008 0333 31 037 0148 0093 0111 0158 D +NHC 05L ERIN 20250811 1200 173N 0273W 285 098 1004 1010 0297 21 037 0037 -999 -999 0056 M -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 14S TALIAH 20250207 1200 161S 0983E 245 057 0991 1006 0703 23 074 0241 0222 0222 0296 M +JTWC 18P ALFRED 20250303 0600 262S 1578E 140 037 0987 1004 0454 23 092 0259 0222 0315 0222 M +JTWC 06P SIX 20251205 0000 139S 1497W 110 083 1002 1006 0111 18 037 0074 -999 -999 0047 S +JTWC 11W ELEVEN 20250723 0000 188N 1205E 255 047 0997 1004 0278 15 055 -999 -999 -999 -999 M +JTWC 31P THIRTYONE 20250421 1200 116S 1366E 290 052 1003 1009 0167 15 037 -999 -999 -999 -999 S +JTWC 93P INVEST 20250221 0000 144S 1487E 155 037 1002 1009 0250 13 129 -999 -999 -999 -999 S +JTWC 31W KALMAEGI 20251104 1800 109N 1199E 275 057 0980 1008 0555 36 027 0195 0148 0185 0185 D +JTWC 04S CHENGE 20251023 1200 101S 0589E 270 037 0996 1008 0389 20 055 0111 0222 0204 0167 M +NHC 92C INVEST 20250731 0000 114N 1447W 275 077 1009 1011 0222 15 056 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 14S TALIAH 20250208 0000 157S 0962E 270 057 0982 1004 0685 26 074 0148 0204 0222 0167 D +JTWC 24S IVONE 20250313 0000 213S 0700E 240 077 0996 1007 0472 18 185 -999 0370 0259 -999 M +JTWC 94S INVEST 20250104 1200 149S 0927E 280 047 1004 1008 0417 13 120 -999 -999 -999 -999 S +JTWC 28W HALONG 20251009 0000 330N 1411E 050 067 0950 1010 0398 54 049 0232 0250 0259 0250 D +JTWC 20S BIANCA 20250225 1200 228S 1022E 190 047 0965 1011 0352 48 022 0158 0148 0139 0121 D +JTWC 93W INVEST 20250801 1800 269N 1364E 070 067 0997 0999 0259 10 111 -999 -999 -999 -999 S +JTWC 08P PITA 20250111 0600 214S 1642W 110 139 0996 1006 0426 20 012 0158 0056 0056 -999 M +JTWC 15W FIFTEEN 20250807 0000 330N 1566E 350 072 1005 1008 0167 13 074 -999 -999 -999 -999 S +NHC 07E GIL 20250802 0000 162N 1243W 290 088 0991 1010 0389 33 046 0204 0204 0093 0167 D 0093 0093 -999 0093 72 223N 1400W 0046 -999 -999 -999 +JTWC 13W BAILU 20250805 0600 384N 1587E 075 067 0998 1006 0315 15 111 -999 -999 -999 -999 S +JTWC 13W THIRTEEN 20250802 1800 310N 1405E 040 083 0997 1002 0287 18 120 -999 0222 0121 -999 S +JTWC 03S BLOSSOM 20250911 1200 092S 0632E 310 032 1004 1010 0185 18 055 -999 0065 0074 -999 M +NHC 69L INVEST 20250825 0600 136N 0611W 280 093 1010 1013 0259 15 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 31W KALMAEGI 20251103 0000 105N 1289E 260 072 0985 1008 0333 36 018 0167 0148 0130 0176 D +JTWC 11S FAIDA 20250204 1200 196S 0504E 205 016 1002 1009 0222 18 074 0093 -999 0111 0111 S +JTWC 08W EIGHT 20250715 1200 365N 1410E 005 159 1002 1006 0093 20 046 0074 0185 -999 -999 S +JTWC 05S FINA 20251122 1800 124S 1298E 250 032 0964 1004 0315 46 022 0121 0121 0111 0121 D +JTWC 33W KOTO 20251126 0000 125N 1176E 295 062 0991 1006 0352 28 055 0222 0102 0093 0278 D +JTWC 06P SIX 20251206 0000 187S 1470W 155 072 1000 1007 0148 18 037 0111 0093 -999 0074 M +JTWC 26S TWENTY-SI 20250321 0600 151S 0967E 160 026 1004 1009 0481 15 166 -999 -999 -999 -999 S +JTWC 30P TAM 20250415 1800 251S 1732E 150 118 0986 1004 0592 26 129 0398 0333 -999 -999 M +JTWC 07S DIKELEDI 20250114 0000 162S 0399E 220 032 0986 1005 0278 31 037 0056 0074 0056 0056 M +JTWC 98W INVEST 20251101 0000 094N 1389E 295 052 1007 1010 0278 10 101 -999 -999 -999 -999 S +JTWC 24S IVONE 20250311 1200 201S 0780E 270 047 0999 1007 0426 23 194 -999 0509 0333 -999 M +JTWC 96P INVEST 20250410 1200 087S 1303E 255 032 1001 1006 0241 13 101 -999 -999 -999 -999 S +NHC 13L MELISSA 20251028 1200 175N 0781W 025 036 0896 1006 0500 80 009 0315 0241 0111 0148 D 0093 0065 0056 0083 72 324N 654W 0046 0037 0037 0046 +JTWC 96W INVEST 20250717 1200 163N 1256E 315 067 0998 1005 0555 15 333 -999 -999 -999 -999 M +JTWC 29S TWENTY-NI 20250415 1200 139S 1208E 260 032 0992 1008 0222 28 037 0102 0121 0093 0065 D +JTWC 16W PODUL 20250812 0000 209N 1281E 270 067 0984 1007 0333 33 027 0185 0185 0130 0167 D +JTWC 27S COURTNEY 20250328 1800 174S 0930E 260 072 0948 1006 0444 59 012 0093 0148 0176 0111 D +JTWC 97S INVEST 20251117 1800 106S 1300E 075 026 1002 1004 0278 15 055 -999 -999 -999 -999 S +JTWC 14S TALIAH 20250217 1200 295S 0776E 240 026 0997 1011 0463 18 111 0204 0296 0222 0130 M +NHC 97E INVEST 20250725 1200 106N 1377W 270 057 1009 1012 0389 13 167 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +NHC 08E HENRIETTE 20250807 0000 181N 1317W 275 072 1004 1013 0259 23 056 0111 0074 0056 0130 M -999 -999 -999 -999 72 220N 1478W -999 -999 -999 -999 +JTWC 97W INVEST 20250805 1800 280N 1583E 320 052 0991 1009 0518 13 166 -999 -999 -999 -999 S +JTWC 16W PODUL 20250808 1200 208N 1442E 310 042 1001 1010 0278 23 027 0065 0074 0037 0056 M +JTWC 14S TALIAH 20250203 0600 151S 1143E 250 037 0975 1001 0333 36 027 0259 0241 0185 0259 D +JTWC 32W THIRTYTWO 20251105 0600 085N 1432E 105 026 0998 1008 0703 15 370 -999 -999 -999 -999 S +NHC 93E INVEST 20250829 0000 119N 1136W 285 041 1010 1012 0334 10 111 -999 -999 -999 -999 S -999 -999 -999 -999 -9 -99N -999W -999 -999 -999 -999 +JTWC 95S INVEST 20251023 0600 088S 0873E 250 067 1006 1009 0398 13 055 -999 -999 -999 -999 S +NHC 13L MELISSA 20251027 1800 165N 0783W 290 015 0906 1007 0445 77 009 0315 0241 0093 0148 D 0083 0065 0056 0083 72 259N 712W 0046 0037 0037 0046 +NHC 04L DEXTER 20250805 0000 366N 0660W 045 062 1002 1017 0297 21 093 0130 0148 -999 -999 M -999 -999 -999 -999 72 425N 482W -999 -999 -999 -999 +JTWC 08P PITA 20250111 1800 219S 1606W 105 118 0996 1006 0472 20 037 0130 0102 0074 -999 M +JTWC 05S FINA 20251125 0000 148S 1276E 220 011 0986 1004 0185 28 009 0084 0065 0056 0047 M diff --git a/tests/drivers/test_tracker.py b/tests/drivers/test_tracker.py index a1bf5ad2..4fc056ea 100644 --- a/tests/drivers/test_tracker.py +++ b/tests/drivers/test_tracker.py @@ -16,7 +16,7 @@ def config(tmp_path): return { "gfdltracker": { - "basins": "L", + "basins": "LWE", "execution": { "executable": "tracker.exe", "batchargs": {"walltime": "01:00:00"}, @@ -30,6 +30,7 @@ def config(tmp_path): ), }, "namelist": { + "base_file": str(tmp_path / "input" / "foo.nml"), "update_values": { "trackerinfo": { "trkrinfo": { @@ -42,14 +43,16 @@ def config(tmp_path): }, }, "rundir": str(tmp_path / "tracker"), - "tcvitals": "/path/to/tcvitals/syntdat_tcvitals.2025", + "tcvitals": str( + Path(__name__).parent.resolve() / "tests" / "data" / "syndat_tcvitals.2025" + ), } } @fixture def cycle(utc): - return utc(2024, 2, 1, 18) + return utc(2025, 10, 22, 18) @fixture @@ -102,7 +105,7 @@ def test_tracker_input_files(driverobj, tmp_path): fp.parent.mkdir(parents=True, exist_ok=True) fp.touch() driverobj.input_files() - expected_links = [f"mpas.trak.all.2024020118.f{fmin:05d}" for fmin in (0, 360, 720)] + expected_links = [f"mpas.trak.all.2025102218.f{fmin:05d}" for fmin in (0, 360, 720)] for infile, outlink in zip(infiles, expected_links): expected = tmp_path / "tracker" / outlink assert expected.is_symlink() @@ -127,5 +130,87 @@ def test_tracker_input_index_files(driverobj, ready_task): assert run.call_args_list == expected_calls +def test_tracker_input_vitals(driverobj): + # Expect two storms in the dataset at this cycle + expected_fn = driverobj.rundir / "allvit" + assert not expected_fn.is_file() + driverobj.input_vitals() + assert expected_fn.is_file() + expected_storms = [ + "JTWC 30W FENGSHEN", + "NHC 13L MELISSA", + ] + contents = expected_fn.read_text().strip("\n").split("\n") + assert len(contents) == 2 + for line, exp in zip(contents, expected_storms): + assert line.startswith(exp) + + +def test_tracker_input_vitals_other_names(driverobj): + paths = [driverobj.rundir / p for p in ("allvit", "tcvit_rsmc_storms.txt", "fort.12")] + for path in paths: + assert not path.is_file() + driverobj.input_vitals_other_names() + assert paths[0].is_file() + assert not paths[0].is_symlink() + for path in paths[1:]: + assert path.is_symlink() + assert path.resolve() == paths[0] + + +def test_tracker_namelist_file(driverobj, tmp_path): + base_nml = tmp_path / "input" / "foo.nml" + base_nml.parent.mkdir() + base_nml.touch() + expected = """&trackerinfo + trkrinfo%eastbd = 3313 + trkrinfo%northbd = 2646 + trkrinfo%southbd = 20 + trkrinfo%westbd = 20 +/ +""" + driverobj.namelist_file() + nml = driverobj.rundir / "namelist.gettrk" + contents = nml.read_text() + assert contents == expected + + +def test_tracker_provisioned_rundir(driverobj, ready_task): + with patch.multiple( + driverobj, + input_fcst_minutes=ready_task, + input_files=ready_task, + input_index_files=ready_task, + input_vitals=ready_task, + input_vitals_other_names=ready_task, + namelist_file=ready_task, + runscript=ready_task, + ): + assert driverobj.provisioned_rundir().ready + + def test_tracker_driver_name(driverobj): assert driverobj.driver_name() == tracker.GFDLTracker.driver_name() == "gfdltracker" + + +def test_tracker__input_file_map(driverobj, tmp_path): + infilepath = tmp_path / "input" + expected = { + 0: str(infilepath / "gribf00"), + 6: str(infilepath / "gribf06"), + 12: str(infilepath / "gribf12"), + } + filemap = driverobj._input_file_map() + assert filemap == expected + + +def test_tracker__validate(driverobj): + with ( + patch.object(tracker.Assets, "_validate") as asset_valid, + patch.object(tracker, "validate_internal") as internal_valid, + patch.object(tracker, "TrackerNamelist") as namelist_valid, + ): + driverobj._validate() + asset_valid.assert_called_once() + internal_valid.assert_called_once() + namelist_valid.assert_called_once() From 1a71c61b2c59454662d44cdd8906cef0308c199d Mon Sep 17 00:00:00 2001 From: Christina Holt Date: Thu, 8 Jan 2026 21:34:32 +0000 Subject: [PATCH 40/42] Updates from testing. --- parm/machines/ursa.yaml | 6 ++++++ parm/wflow/cold_start.yaml | 2 +- parm/wflow/tracker.yaml | 8 ++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/parm/machines/ursa.yaml b/parm/machines/ursa.yaml index e99873c1..ad1ccb57 100644 --- a/parm/machines/ursa.yaml +++ b/parm/machines/ursa.yaml @@ -49,3 +49,9 @@ graphics: execution: batchargs: partition: u1-compute +tracker: + gfdltracker: + execution: + batchargs: + partition: u1-compute + diff --git a/parm/wflow/cold_start.yaml b/parm/wflow/cold_start.yaml index 6b0d5dcc..2c8c2ed6 100644 --- a/parm/wflow/cold_start.yaml +++ b/parm/wflow/cold_start.yaml @@ -16,7 +16,7 @@ workflow: PLATFORM: "{{ user.platform }}" tasks: task_get_ics_data: - command: '&MPAS_APP;/scripts/get_external_data.sh' + command: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; && &MPAS_APP;/scripts/get_external_data.sh' account: "{{ platform.account }}" partition: "{{ platform.service_partition }}" join: diff --git a/parm/wflow/tracker.yaml b/parm/wflow/tracker.yaml index 75cade15..95da2ea9 100644 --- a/parm/wflow/tracker.yaml +++ b/parm/wflow/tracker.yaml @@ -34,10 +34,10 @@ workflow: join: cyclestr: value: '&LOGDIR;/{{ jobname }}_@Y@m@d@H.log' - walltime: "{{ tracker.execution.batchargs.walltime }}" - nodes: "{{ tracker.execution.batchargs.nodes }}:ppn={{ tracker.execution.batchargs.tasks_per_node }}" - exclusive: "{{ tracker.execution.batchargs.exclusive }}" - partition: "{{ tracker.upp.execution.batchargs.partition }}" + walltime: "{{ tracker.gfdltracker.execution.batchargs.walltime }}" + nodes: "{{ tracker.gfdltracker.execution.batchargs.nodes }}:ppn={{ tracker.gfdltracker.execution.batchargs.tasks_per_node }}" + exclusive: "{{ tracker.gfdltracker.execution.batchargs.exclusive }}" + partition: "{{ tracker.gfdltracker.execution.batchargs.partition }}" dependency: metataskdep: attrs: From f71ec46e1976e78d89b26969943e3039c3acffa9 Mon Sep 17 00:00:00 2001 From: Christina Holt Date: Thu, 8 Jan 2026 21:49:53 +0000 Subject: [PATCH 41/42] Clean up. --- scripts/run_tracker.sh | 267 ---------------------------------------- ush/default_config.yaml | 2 - 2 files changed, 269 deletions(-) delete mode 100755 scripts/run_tracker.sh diff --git a/scripts/run_tracker.sh b/scripts/run_tracker.sh deleted file mode 100755 index f0559ccc..00000000 --- a/scripts/run_tracker.sh +++ /dev/null @@ -1,267 +0,0 @@ -#!/bin/bash - -set -uex - -ymdh="$1" -syndat_prefix="$2" -mpicmd="$3" -fhour_step="$4" # 6 -fhour_last="$5" # 120 -mpas_app="$6" -eastbd="$7" # 3313 -westbd="$8" # 20 -northbd="$9" # 2646 -southbd="${10}" # 20 -atcfname="${11}" # MPAS -basin_list="${12}" # L -platform="${13}" # ursa - -mpas_upp=../upp -fhour_start=0 - -tracker="$mpas_app/exec/gettrk.x" - -cd tracker - -valid_basins='ABCELPQSW' -if [[ ! "$basin_list" =~ [$valid_basins] ]] ; then - set +x - echo "Invalid basin in list \"$basin_list\". Valid basins are: \"$valid_basins\" (Q is exceptionally rare)." - exit 2 -fi - -# Some sanity checks. More could be added, but these detected my mistakes. -min_width_height=80 -if ! [[ "$eastbd$westbd$northbd$southbd" =~ [0-9]+ ]] ; then - set +x - echo "Bounds must all be positive numbers. Got: east=$eastbd west=$westbd north=$northbd south=$southbd" - exit 2 -elif (( eastbd < westbd )) ; then - set +x - echo "East and west bound are probably switched. East bound ($eastbd) is less than west bound ($westbd)" - exit 2 -elif (( eastbd < westbd+min_width_height )) ; then - set +x - echo "East and west bound are close together ($eastbd vs $westbd). Recommend at least $min_width_height points." - exit 2 -elif (( northbd < southbd )) ; then - set +x - echo "North and south bound are probably switched. North bound ($northbd) is less than south bound ($southbd)." - exit 2 -elif (( northbd < southbd+min_width_height )) ; then - set +x - echo "North and south bound are close together. Recommend at least $min_width_height points." - exit 2 -fi - -rm -f fort.* -rm -f *.atcfunix -rm -f allvit tcvit_rsmc_storms.txt tracker.log - -#### - -ulimit -s unlimited - -cc=${ymdh:0:2} -yy=${ymdh:2:2} -mm=${ymdh:4:2} -dd=${ymdh:6:2} -hh=${ymdh:8:2} - -syndat=${syndat_prefix}.$cc$yy -if ( ! grep -E "^.....[0-49][0-9][$basin_list] ......... $cc$yy$mm$dd $hh" $syndat > allvit ) ; then - echo "No storms in basin list \"$basin_list\". There is nothing to track." - echo "Delivering an empty track." - cat /dev/null > mpas.trak.atcfunix - exit 0 -fi - -ln -sf allvit tcvit_rsmc_storms.txt - -i=0 -for fhr in $( seq $fhour_start $fhour_step $fhour_last ) ; do - i=$(( i + 1 )) - fmin=$(( fhr * 60 )) - printf '%4d %5d\n' $i $fmin >> fort.15 -done - -cat< namelist.gettrk -&datein - inp%bcc = ${cc} - inp%byy = ${yy} - inp%bmm = ${mm} - inp%bdd = ${dd} - inp%bhh = ${hh} - inp%model = 17 - inp%modtyp = 'regional' - inp%lt_units = 'hours' - inp%file_seq = 'multi' - inp%nesttyp = 'fixed' -/ - -&atcfinfo - atcfnum = 81 - atcfname = '$atcfname' - atcfymdh = ${cc}${yy}${mm}${dd}${hh} - atcffreq = 100 -/ - -&trackerinfo - trkrinfo%eastbd = $eastbd, - trkrinfo%westbd = $westbd, - trkrinfo%northbd = $northbd, - trkrinfo%southbd = $southbd, - trkrinfo%contint = 100.0 - trkrinfo%type = 'tracker' - trkrinfo%mslpthresh = 0.0015 - trkrinfo%use_backup_mslp_grad_check = 'y' - trkrinfo%v850thresh = 1.5 - trkrinfo%v850_qwc_thresh = 1.0 - trkrinfo%use_backup_850_vt_check = 'y' - trkrinfo%enable_timing = 1 - trkrinfo%gridtype = 'regional' - trkrinfo%want_oci = .true. - trkrinfo%out_vit = 'n' - trkrinfo%use_land_mask = 'y' - trkrinfo%read_separate_land_mask_file = 'n' - trkrinfo%inp_data_type = 'grib' - trkrinfo%gribver = 2 - trkrinfo%g2_jpdtn = 0 - trkrinfo%g2_mslp_parm_id = 198 - trkrinfo%g1_mslp_parm_id = 2 - trkrinfo%g1_sfcwind_lev_typ = 105 - trkrinfo%g1_sfcwind_lev_val = 10 - trkrinfo%max_mslp_850 = 400.0 -/ - -&phaseinfo - phaseflag = 'y' - phasescheme = 'both' - wcore_depth = 1.0 -/ - -&structinfo - structflag = 'n' - ikeflag = 'n' - radii_pctile = 95.0 - radii_free_pass_pctile = 67.0 - radii_width_thresh = 15.0 -/ - -&fnameinfo - gmodname = 'mpas' - rundescr = 'trak' - atcfdescr = 'all' -/ - -&cintinfo - contint_grid_bound_check = 50.0 -/ - -&waitinfo - use_waitfor = 'n' - use_per_fcst_command = 'n' -/ - -&netcdflist - netcdfinfo%num_netcdf_vars = , - netcdfinfo%netcdf_filename = '' - netcdfinfo%netcdf_lsmask_filename = '' - netcdfinfo%rv850name = '' - netcdfinfo%rv700name = '' - netcdfinfo%u850name = '' - netcdfinfo%v850name = '' - netcdfinfo%u700name = '' - netcdfinfo%v700name = '' - netcdfinfo%z850name = '' - netcdfinfo%z700name = '' - netcdfinfo%mslpname = '' - netcdfinfo%usfcname = '' - netcdfinfo%vsfcname = '' - netcdfinfo%u500name = '' - netcdfinfo%v500name = '' - netcdfinfo%u200name = '' - netcdfinfo%v200name = '' - netcdfinfo%tmean_300_500_name = '' - netcdfinfo%z500name = '' - netcdfinfo%z200name = '' - netcdfinfo%lmaskname = '' - netcdfinfo%z900name = '' - netcdfinfo%z800name = '' - netcdfinfo%z750name = '' - netcdfinfo%z650name = '' - netcdfinfo%z600name = '' - netcdfinfo%z550name = '' - netcdfinfo%z450name = '' - netcdfinfo%z400name = '' - netcdfinfo%z350name = '' - netcdfinfo%z300name = '' - netcdfinfo%time_name = '' - netcdfinfo%lon_name = '' - netcdfinfo%lat_name = '' - netcdfinfo%time_units = '' - netcdfinfo%sstname = '' - netcdfinfo%q850name = '' - netcdfinfo%rh1000name = '' - netcdfinfo%rh925name = '' - netcdfinfo%rh800name = '' - netcdfinfo%rh750name = '' - netcdfinfo%rh700name = '' - netcdfinfo%rh650name = '' - netcdfinfo%rh600name = '' - netcdfinfo%spfh1000name = '' - netcdfinfo%spfh925name = '' - netcdfinfo%spfh800name = '' - netcdfinfo%spfh750name = '' - netcdfinfo%spfh700name = '' - netcdfinfo%spfh650name = '' - netcdfinfo%spfh600name = '' - netcdfinfo%temp1000name = '' - netcdfinfo%temp925name = '' - netcdfinfo%temp800name = '' - netcdfinfo%temp750name = '' - netcdfinfo%temp700name = '' - netcdfinfo%temp650name = '' - netcdfinfo%temp600name = '' - netcdfinfo%omega500name = '' -/ - -&parmpreflist - user_wants_to_track_zeta700 = 'y' - user_wants_to_track_wcirc850 = 'y' - user_wants_to_track_wcirc700 = 'y' - user_wants_to_track_gph850 = 'y' - user_wants_to_track_gph700 = 'y' - user_wants_to_track_mslp = 'y' - user_wants_to_track_wcircsfc = 'y' - user_wants_to_track_zetasfc = 'y' - user_wants_to_track_thick500850 = 'n' - user_wants_to_track_thick200500 = 'n' - user_wants_to_track_thick200850 = 'n' - user_wants_to_track_zeta850 = 'y' -/ - -&verbose - verb = 3 - verb_g2 = 0 -/ - -&sheardiaginfo - shearflag = 'y' -/ - -&sstdiaginfo - sstflag = 'y' -/ - -&gendiaginfo - genflag = 'n' - gen_read_rh_fields = '' -/ -EOF - -time $mpicmd -n 1 "$tracker" < /dev/null 2>&1 | tee tracker.log - -cat fort.68 > mpas.trak.atcfunix - -echo Normal completion. diff --git a/ush/default_config.yaml b/ush/default_config.yaml index 53f4006b..50f27a5d 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -489,8 +489,6 @@ tracker: account: '{{ platform.account }}' scheduler: '{{ platform.scheduler }}' graphics: - basin_list: "L" - atcfname: "MPAS" execution: batchargs: walltime: 00:12:00 From 48a18987583ff6f46f9c85e2858bd3076b71100f Mon Sep 17 00:00:00 2001 From: Christina Holt Date: Thu, 8 Jan 2026 23:12:42 +0000 Subject: [PATCH 42/42] Changes needed for successful test. --- drivers/tracker.py | 4 ++-- parm/machines/ursa.yaml | 2 +- parm/wflow/tracker.yaml | 5 ++++- ush/default_config.yaml | 6 +++--- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/tracker.py b/drivers/tracker.py index 517306b4..dd97f371 100644 --- a/drivers/tracker.py +++ b/drivers/tracker.py @@ -86,7 +86,7 @@ def input_vitals(self): The TC vitals input data """ fn = "allvit" - yield self.taskname("TC vitals input file {fn}") + yield self.taskname(f"TC vitals input file {fn}") path = self.rundir / fn yield asset(path, path.is_file) tcvitals = Path(self.config["tcvitals"]) @@ -112,7 +112,7 @@ def input_vitals_other_names(self): TC Vitals file named differently. """ fns = ["tcvit_rsmc_storms.txt", "fort.12"] - yield self.taskname("TC vitals input file {' & '.join(fns)}") + yield self.taskname(f"TC vitals input file {' & '.join(fns)}") paths = [self.rundir / fn for fn in fns] yield [asset(path, path.is_file) for path in paths] yield self.input_vitals() diff --git a/parm/machines/ursa.yaml b/parm/machines/ursa.yaml index ad1ccb57..387141cf 100644 --- a/parm/machines/ursa.yaml +++ b/parm/machines/ursa.yaml @@ -12,7 +12,7 @@ platform: gfs: path: /public/data/grids/gfs/0p25deg/grib2 file_templates: '@y@j@H00{{ "%04d" % fcst_hr }}' - syndat_tcvitals: /scratch3/HFIP/hwrfv3/noscrub/input/SYNDAT-PLUS/syndat_tcvitals + syndat_tcvitals: /scratch3/HFIP/hwrfv3/noscrub/input/SYNDAT-PLUS create_ics: mpas_init: execution: diff --git a/parm/wflow/tracker.yaml b/parm/wflow/tracker.yaml index 95da2ea9..a99628ed 100644 --- a/parm/wflow/tracker.yaml +++ b/parm/wflow/tracker.yaml @@ -29,7 +29,10 @@ workflow: task_tracker: command: cyclestr: - value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; ; python &MPAS_APP;/scripts/tracker.py' + value: 'source &MPAS_APP;/load_wflow_modules.sh &PLATFORM; ; python &MPAS_APP;/scripts/tracker.py + -c &EXPERIMENT_CONFIG; + --cycle @Y-@m-@dT@H:@M:@S + --key-path tracker' account: "{{ platform.account }}" join: cyclestr: diff --git a/ush/default_config.yaml b/ush/default_config.yaml index 186b2df0..de705ecf 100644 --- a/ush/default_config.yaml +++ b/ush/default_config.yaml @@ -455,15 +455,15 @@ tracker: nodes: 1 walltime: 00:30:00 envcmds: - - module use {{ user.mpas_app }}/src/gfdl-tracker/modulefiles + - module use {{ user.mpas_app }}/src/GFDL-VortexTracker/modulefiles - module load {{ user.platform }} + - module load grib-util - ulimit -s unlimited executable: "{{ user.mpas_app }}/exec/gettrk.x" - mpicmd: srun -l input_files: endhour: !int "{{ forecast.mpas.length }}" filefreq: 6 - filepath: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/upp/COMBINED.GrbF{{ "%02d" % (leadtime.total_seconds() / 3600) }}' + filepath: '{{ user.experiment_dir }}/{{ cycle.strftime("%Y%m%d%H") }}/latlon/mpas.trak.all.{{ cycle.strftime("%Y%m%d%H") }}.f{{ "%05d" % (leadtime.total_seconds() / 60) }}' namelist: base_file: "{{ user.mpas_app }}/parm/tracker/namelist.gettrk" update_values: