MC_25km_jra_iaf+wombatlite-test5-38867fcd
25km JRA IAF test 5 (stopped)
❌ Latest submission: Run 16 failed (payu exit status 1): probably a model crash. See the logs below. Model date reached: 1974-01-01 (16.0 model years complete).
Notebooks: ocean_stats, timeseries, Timeseries_daily_extreme_from_2D_fields, temp-salt-vs-depth-time
📋 Summary for the GitHub issue
### OM3 Monitor summary: `MC_25km_jra_iaf+wombatlite-test5-38867fcd`
*25km JRA IAF test 5 (stopped)*
- **Latest submission:** ❌ Run 16 failed (payu exit status 1): probably a model crash. (run 16, PBS job 179499766.gadi-pbs, last recorded 2026-09-21 19:25 AEST, model date 1974-01-01)
- **Model date reached:** 1974-01-01 (16.0 model years complete)
- **Average throughput:** 5.40 SYPD
- **Truncations:** 10 in 1 of 16 output folders
<details><summary>Last lines of the model logs</summary>
`access-om3.err` [1]
```
(t_initf) profile_global_stats= T
(t_initf) profile_ovhd_measurement= F
(t_initf) profile_add_detail= F
(t_initf) profile_papi_enable= F
WARNING from PE 0: set_diffusivity_init: SIMPLE_TKE_TO_KD can not be used reliably with USE_REGRIDDING.
WARNING from PE 0: diag_manager_mod::closing_file: module/output_field ocean_model/total_hfevapds, skip one time level, maybe send_data never called
WARNING from PE 0: diag_manager_mod::closing_file: module/output_field ocean_model/total_heat_content_massin, skip one time level, maybe send_data never called
Memuse(MB) at Memory HiWaterMark= 8.617E+02 6.634E+03 8.294E+02 1.006E+03
```
`access-om3.out` [2]
```
(Ocean tracer global synch) 18105 14.281316 461.657668 147.898966 102.536214 0.009 41 0 2429
(Ocean diffuse tracer) 4380 51.033526 770.800106 597.495499 197.687638 0.037 31 0 2429
(Ocean epipycnal diffuse tracer) 0 0.000000 0.000000 0.000000 0.000000 0.000 31 0 2429
Ocean surface forcing 70081 78.797491 436.930813 177.380369 65.133821 0.011 11 0 2429
(Ocean forcing diagnostics) 39420 36.372946 39.472944 37.666157 0.465821 0.002 41 0 2429
MPP_STACK high water mark= 0
max rss=994824192.0 MB
med_finalize max rss=994824192.0 MB
```
</details>
| Where | Records | Output folders | Max speed (m/s) | Max CFL |
|---|---:|---|---:|---:|
| [65.2°W, 61.3°N](https://www.google.com/maps/place/61.34,-65.25/@61.34,-65.25,5z) | 9 | 000 | 32.6 | 2.22 |
| [65.6°W, 61.4°N](https://www.google.com/maps/place/61.43,-65.62/@61.43,-65.62,5z) | 1 | 000 | 8.1 | 0.55 |
**References**
1. `/scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd/output015/access-om3.err`
2. `/scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd/output015/access-om3.out`
3. Archive folder: `/scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd`
4. Status page: https://chrisb13.github.io/access-om3-live/live/MC_25km_jra_iaf%2Bwombatlite-test5-38867fcd/
*Generated automatically by the [OM3 Monitor](https://chrisb13.github.io/access-om3-live/live/) on 2026-10-19 16:38 AEDT; it may contain errors, so check against the files above.*
Archive folder: completed runs
Read from the payu archive folder /scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd.
- Output folders: 16 (latest
output015) - Model date reached: 1974-01-01
- Runs recorded by payu: 17, of which failed: 1
Check this on Gadi: these counts
# WHAT THIS DOES: re-counts the 'Archive folder' list: how many output folders there are, which is
# the latest, how many runs payu recorded, how many of those failed, and how far the model got. The
# four lines it prints should match the page.
A=/scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd
# Step 1: count the output folders (output000, output001, ...) and name the last one
ls -d "$A"/output[0-9]* | wc -l
basename "$(ls -d "$A"/output[0-9]* | tail -n 1)"
# Step 2: read payu's run records with a few lines of python, and count them
python3 - "$A" <<'EOF'
import glob, json, os, sys
# payu keeps one small file for every run: payu_jobs/<number>/run/<job>.json. Read them all.
archive = sys.argv[1] # the archive folder, handed over by the shell line above
runs = []
for path in glob.glob(archive + "/payu_jobs/*/run/*.json"):
try:
with open(path) as f:
record = json.load(f)
record["file"] = path # remember which file it came from
runs.append(record)
except (OSError, ValueError):
pass # skip a file we may not read, or that is not valid JSON
# Put the runs in order: by run number, and by start time if a run was tried more than once.
runs.sort(key=lambda r: (int(r.get("payu_current_run") or 0), r.get("timings", {}).get("payu_start_time") or ""))
# a run failed if payu's exit status for it is not 0 (a run with no status yet is still going)
failed = [r for r in runs if r.get("payu_run_status") not in (0, None)]
print(len(runs), "runs recorded by payu,", len(failed), "failed")
# the model date reached is the finish date of the last run that has one
finished = [r for r in runs if r.get("model_finish_time")]
print("model date reached:", finished[-1]["model_finish_time"][:10] if finished else "unknown")
EOF
Model throughput
Simulated years per day, made by plot_sypd.py from the outputNNN/log/med.log files of the completed submissions in /scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd.

Check this on Gadi: the rate in each output's med.log
# WHAT THIS DOES: for each output folder, finds the model's speed in its med.log (the mediator's
# log) and averages it. The speed, called the 'rate', is in simulated years per day (ypd). The
# figure plots these rates. You get one line per output folder: how many rate lines it had, and
# their average.
A=/scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd
for o in "$A"/output[0-9]*; do
[ -f "$o/log/med.log" ] || continue # skip folders that have no med.log
# A line looks like: Model Date: 1958-09-04T00:00:00 ... rate = 7.09 ypd. awk reads the number just before
# 'ypd' (the second-last word), adds them up and counts them, then prints the average at the end.
awk -v name="$(basename "$o")" '/Model Date:/ && /ypd/ {count++; total += $(NF-1)} END {if (count) printf "%s: %d rate lines, mean %.2f ypd\n", name, count, total/count}' "$o/log/med.log"
done
Recent runs
From payu's job records in /scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd/payu_jobs; times are Canberra time.
| Run | PBS job | Result | Model period | Wall time (h) | SYPD | Record last modified |
|---|---|---|---|---|---|---|
| 16 | 179499766.gadi-pbs | ❌ | 1974-01-01 → ? | 4.4 | 2026-09-21 19:25 AEST | |
| 15 | 179470130.gadi-pbs | ✅ | 1973-01-01 → 1974-01-01 | 4.5 | 5.36 | 2026-09-21 15:01 AEST |
| 14 | 179457069.gadi-pbs | ✅ | 1972-01-01 → 1973-01-01 | 4.4 | 5.41 | 2026-09-21 10:32 AEST |
| 13 | 179451713.gadi-pbs | ✅ | 1971-01-01 → 1972-01-01 | 4.4 | 5.45 | 2026-09-21 06:02 AEST |
| 12 | 179445135.gadi-pbs | ✅ | 1970-01-01 → 1971-01-01 | 4.5 | 5.39 | 2026-09-21 01:35 AEST |
| 11 | 179437528.gadi-pbs | ✅ | 1969-01-01 → 1970-01-01 | 4.4 | 5.40 | 2026-09-20 21:06 AEST |
| 10 | 179428622.gadi-pbs | ✅ | 1968-01-01 → 1969-01-01 | 4.5 | 5.39 | 2026-09-20 16:37 AEST |
| 9 | 179418051.gadi-pbs | ✅ | 1967-01-01 → 1968-01-01 | 4.5 | 5.39 | 2026-09-20 12:07 AEST |
| 8 | 179410390.gadi-pbs | ✅ | 1966-01-01 → 1967-01-01 | 4.4 | 5.39 | 2026-09-20 07:38 AEST |
| 7 | 179398831.gadi-pbs | ✅ | 1965-01-01 → 1966-01-01 | 4.4 | 5.44 | 2026-09-20 03:10 AEST |
Check this on Gadi: this table
# WHAT THIS DOES: prints the 'Recent runs' table: the 10 newest runs, newest first. 'ok' means
# payu's exit status was 0. SYPD is simulated years per day: the model time the run covered, divided
# by the wall-clock time it took. (If payu did not record a run's start date this shows ?; the page
# may fill it in from the previous run.)
A=/scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd
python3 - "$A" <<'EOF'
import glob, json, os, sys
# payu keeps one small file for every run: payu_jobs/<number>/run/<job>.json. Read them all.
archive = sys.argv[1] # the archive folder, handed over by the shell line above
runs = []
for path in glob.glob(archive + "/payu_jobs/*/run/*.json"):
try:
with open(path) as f:
record = json.load(f)
record["file"] = path # remember which file it came from
runs.append(record)
except (OSError, ValueError):
pass # skip a file we may not read, or that is not valid JSON
# Put the runs in order: by run number, and by start time if a run was tried more than once.
runs.sort(key=lambda r: (int(r.get("payu_current_run") or 0), r.get("timings", {}).get("payu_start_time") or ""))
import time
from datetime import datetime
print("Run PBS job Result Model period Hours SYPD Record last modified")
for r in reversed(runs[-10:]): # the last 10 runs, newest first
status = r.get("payu_run_status")
result = "ok" if status == 0 else ("failed" if status is not None else str(r.get("stage")))
start, finish = r.get("model_start_time"), r.get("model_finish_time")
seconds = r.get("timings", {}).get("payu_total_duration_seconds") # wall-clock seconds the run took
hours = "%.1f" % (seconds / 3600) if seconds else ""
sypd = ""
if start and finish and seconds:
# the model time the run covered, in whole days (dates look like 1958-01-01T00:00:00)
days = (datetime.strptime(finish[:19], "%Y-%m-%dT%H:%M:%S") - datetime.strptime(start[:19], "%Y-%m-%dT%H:%M:%S")).days
sypd = "%.2f" % (days / 365.25 / (seconds / 86400)) # model years divided by wall-clock days
changed = time.strftime("%Y-%m-%d %H:%M %Z", time.localtime(os.path.getmtime(r["file"])))
print("%-4s %-18s %-10s %-10s -> %-10s %6s %6s %s" % (r.get("payu_current_run"), r.get("scheduler_job_id"), result,
(start or "?")[:10], (finish or "?")[:10], hours, sypd, changed))
EOF
Latest logs in the archive folder
/scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd/output015/access-om3.err (last lines; modified 2026-09-21 15:00 AEST)
(t_initf) Read in prof_inparm namelist from: drv_in
(t_initf) Using profile_disable= F
(t_initf) profile_timer= 4
(t_initf) profile_depth_limit= 4
(t_initf) profile_detail_limit= 2
(t_initf) profile_barrier= F
(t_initf) profile_outpe_num= 1
(t_initf) profile_outpe_stride= 0
(t_initf) profile_single_file= F
(t_initf) profile_global_stats= T
(t_initf) profile_ovhd_measurement= F
(t_initf) profile_add_detail= F
(t_initf) profile_papi_enable= F
WARNING from PE 0: set_diffusivity_init: SIMPLE_TKE_TO_KD can not be used reliably with USE_REGRIDDING.
WARNING from PE 0: diag_manager_mod::closing_file: module/output_field ocean_model/total_hfevapds, skip one time level, maybe send_data never called
WARNING from PE 0: diag_manager_mod::closing_file: module/output_field ocean_model/total_heat_content_massin, skip one time level, maybe send_data never called
Memuse(MB) at Memory HiWaterMark= 8.617E+02 6.634E+03 8.294E+02 1.006E+03
/scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd/output015/access-om3.out (last lines; modified 2026-09-21 15:01 AEST)
(Ocean continuity equation) 105120 316.278032 815.474389 640.666294 93.623695 0.040 31 0 2429
(Ocean pressure force) 35040 1121.286055 1241.851387 1200.271244 20.732916 0.075 31 0 2429
(Ocean vertical viscosity) 175200 93.154705 1154.139869 876.146120 273.658007 0.055 31 0 2429
(Ocean horizontal viscosity) 35040 76.909790 338.213882 229.564631 47.924312 0.014 31 0 2429
(Ocean momentum increments) 70080 16.247861 44.465946 31.287701 4.557157 0.002 31 0 2429
(Ocean message passing) 490560 269.691718 2251.366592 708.810550 415.000420 0.044 31 0 2429
(Ocean barotropic mode calc) 70080 1.464687 5.743879 2.191464 0.499198 0.000 31 0 2429
(Ocean barotropic mode stepping) 70080 1188.730190 2513.055898 1553.674221 195.167821 0.097 31 0 2429
(Ocean barotropic forcing calc) 70080 20.744652 55.466532 35.689471 8.297128 0.002 31 0 2429
(Ocean kappa_shear) 4380 17.097308 949.126995 235.598296 116.105315 0.015 31 0 2429
(Ocean diabatic entrain) 0 0.000000 0.000000 0.000000 0.000000 0.000 31 0 2429
(Ocean vert remap) 4380 20.390865 156.488919 91.460146 25.727569 0.006 31 0 2429
(Ocean set_diffusivity) 8760 50.453790 1004.702299 287.922761 119.704878 0.018 31 0 2429
(Ocean KPP) 0 0.000000 0.000000 0.000000 0.000000 0.000 31 0 2429
(Ocean tracer_columns) 4380 1806.778606 3135.060078 2472.765297 108.480654 0.155 26 0 2429
(Ocean diabatic tridiag) 4380 1.914145 3.179507 2.300865 0.137853 0.000 41 0 2429
(Ocean diabatic message passing) 8760 3.951239 947.473819 193.872800 155.354471 0.012 41 0 2429
(Ocean differential diffusion) 0 0.000000 0.000000 0.000000 0.000000 0.000 41 0 2429
(Ocean find_uv_at_h) 8760 3.672232 7.684366 6.434889 0.956820 0.000 41 0 2429
(Ocean frazil) 8760 0.778075 7.008531 2.959415 1.362275 0.000 41 0 2429
(Ocean advect tracer) 4380 486.496114 589.521326 521.895336 21.485445 0.033 31 0 2429
(Ocean tracer halo updates) 26865 95.994359 515.843406 370.496124 101.176720 0.023 41 0 2429
(Ocean tracer global synch) 18105 14.281316 461.657668 147.898966 102.536214 0.009 41 0 2429
(Ocean diffuse tracer) 4380 51.033526 770.800106 597.495499 197.687638 0.037 31 0 2429
(Ocean epipycnal diffuse tracer) 0 0.000000 0.000000 0.000000 0.000000 0.000 31 0 2429
Ocean surface forcing 70081 78.797491 436.930813 177.380369 65.133821 0.011 11 0 2429
(Ocean forcing diagnostics) 39420 36.372946 39.472944 37.666157 0.465821 0.002 41 0 2429
MPP_STACK high water mark= 0
max rss=994824192.0 MB
med_finalize max rss=994824192.0 MB
/scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd/output015/log/med.log (last lines; modified 2026-09-21 15:01 AEST)
Model Date: 1973-12-20T00:00:00 wall clock = 2026-09-21T14:51:02 avg dt = 43.45 s/day, dt = 43.92 s/day, rate = 5.39 ypd
memory_write: model date = 1973-12-20T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
Model Date: 1973-12-21T00:00:00 wall clock = 2026-09-21T14:51:46 avg dt = 43.46 s/day, dt = 43.79 s/day, rate = 5.41 ypd
memory_write: model date = 1973-12-21T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
Model Date: 1973-12-22T00:00:00 wall clock = 2026-09-21T14:52:29 avg dt = 43.46 s/day, dt = 43.56 s/day, rate = 5.43 ypd
memory_write: model date = 1973-12-22T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
Model Date: 1973-12-23T00:00:00 wall clock = 2026-09-21T14:53:13 avg dt = 43.46 s/day, dt = 43.61 s/day, rate = 5.43 ypd
memory_write: model date = 1973-12-23T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
Model Date: 1973-12-24T00:00:00 wall clock = 2026-09-21T14:53:57 avg dt = 43.46 s/day, dt = 43.76 s/day, rate = 5.41 ypd
memory_write: model date = 1973-12-24T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
Model Date: 1973-12-25T00:00:00 wall clock = 2026-09-21T14:54:40 avg dt = 43.46 s/day, dt = 43.52 s/day, rate = 5.44 ypd
memory_write: model date = 1973-12-25T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
Model Date: 1973-12-26T00:00:00 wall clock = 2026-09-21T14:55:25 avg dt = 43.46 s/day, dt = 44.51 s/day, rate = 5.32 ypd
memory_write: model date = 1973-12-26T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
Model Date: 1973-12-27T00:00:00 wall clock = 2026-09-21T14:56:09 avg dt = 43.46 s/day, dt = 43.83 s/day, rate = 5.40 ypd
memory_write: model date = 1973-12-27T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
Model Date: 1973-12-28T00:00:00 wall clock = 2026-09-21T14:56:53 avg dt = 43.46 s/day, dt = 44.70 s/day, rate = 5.30 ypd
memory_write: model date = 1973-12-28T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
Model Date: 1973-12-29T00:00:00 wall clock = 2026-09-21T14:57:38 avg dt = 43.47 s/day, dt = 44.27 s/day, rate = 5.35 ypd
memory_write: model date = 1973-12-29T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
Model Date: 1973-12-30T00:00:00 wall clock = 2026-09-21T14:58:22 avg dt = 43.47 s/day, dt = 44.76 s/day, rate = 5.29 ypd
memory_write: model date = 1973-12-30T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
Model Date: 1973-12-31T00:00:00 wall clock = 2026-09-21T14:59:07 avg dt = 43.47 s/day, dt = 44.51 s/day, rate = 5.32 ypd
memory_write: model date = 1973-12-31T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
-------->(med_phases_restart_write) mediating for: 1973 12 31 23 45 0 0
(med_io_wopen) creating file access-om3.cpl.r.1974-01-01-00000.nc
Model Date: 1974-01-01T00:00:00 wall clock = 2026-09-21T15:01:03 avg dt = 43.67 s/day, dt = 115.81 s/day, rate = 2.04 ypd
memory_write: model date = 1974-01-01T00:00:00 memory = -0.00 MB (highwater) 948.74 MB (usage)
SUCCESSFUL TERMINATION OF CMEPS
: =============== # simulated years / cmp-day = 5.420 ===============
Check this on Gadi: when these logs were written, and their last lines
# WHAT THIS DOES: for each log file listed above, prints when it was last changed and its last 30
# lines, which are the lines the page shows.
# 'for' repeats the three lines below once for each file; $f is the file it is on.
# 'ls -l' lists a file with details; --time-style=long-iso writes its time as 2026-07-01 00:02.
for f in /scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd/output015/access-om3.err /scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd/output015/access-om3.out /scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd/output015/log/med.log; do
echo "== $f" # which file this is
ls -l --time-style=long-iso "$f" # when it was last changed (the date and time are in the middle)
tail -n 30 "$f" # its last 30 lines
done
/scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd/metadata.yaml
# ---- Automatically generated by Payu. Do not edit. ----
experiment_uuid: 38867fcd-509d-4559-b313-299de40bbff4
# ---- Automatically generated by Payu. User may edit if necessary. ----
name: MC_25km_jra_iaf+wombatlite-test5-38867fcd
contact: Andrew Kiss
email: 31054815+aekiss@users.noreply.github.com
created: '2026-09-18'
url: https://github.com/ACCESS-NRI/access-om3-configs
model: ACCESS-OM3
schema_version: 1-0-4
# ---- User feel free to update. ----
description: |-
25km ACCESS-OM3 global configuration under interannual forcing.
Initial conditions of temperature and salinity are from WOA23.
Run with JRA55-do v1.6.0 interannually-varying forcing, 1 Jan 1958 - 31 Dec 2023.
This configuration includes WOMBATlite biogeochemistry with time-varying, globally-
averaged atmospheric CO2 forcing. Initial WOMBATlite prognostic tracer
concentrations are:
- no3, o2: from WOA23
- dic, alk: from GLODAPv2 2016b
- fe: from Huang et al. 2022 (DOI: 10.5281/zenodo.6994318)
- remaining tracers: set to constant values
notes: |-
ACCESS-NRI and COSIMA request that users of this model acknowledge those organisations
following the examples at https://www.access-nri.org.au/resources/acknowledging-us/
and https://cosima.org.au/index.php/get-involved/
keywords:
- JRA55
- access-om3
- interannual
- global
- bgc
realm:
- ocean
- seaIce
- ocnBgchem
nominal_resolution: 25 km
license: CC-BY-4.0
version: 0.0
long_description: 5th test - see
https://github.com/ACCESS-NRI/access-om3-configs/issues/1534
# frequency: The frequency(/ies) included in the experiment (array of strings)
# variable: The variable(s) included in the experiment (array of strings)
# reference: Citation or reference information (string)
# parent_experiment: experiment_uuid for parent experiment if appropriate (string)
# related_experiments: experiment_uuids for any related experiment(s) (array of strings)
# parent_experiment_branch_time: The model time corresponding to the restart path used to create this branch, e.g., 1951-02-01T00:00:00 (string)
# parent_experiment_branch_commit: Git commit hash of the source branch when this new branch was created (string)
Truncation locations for all completed run segments
⚠️ MOM6 truncated velocities 10 times in 1 of 16 output folders (the Truncs column of each outputNNN/ocean.stats). MOM6 truncates a velocity when its CFL number exceeds CFL_TRUNCATE (0.5 by default), and stops the run if more than MAXTRUNC truncations happen between energy saves (MOM6's default is 0, so any truncation stops it; the ACCESS-OM3 configurations set 10,000). See MOM6 velocity truncations for how to read the records, and Examine_truncation_data.ipynb for mapping them.
Location records are the detailed records MOM6 also writes, one per truncation, to U_velocity_truncations (zonal velocity) and V_velocity_truncations (meridional velocity); the location table below is built from them. MOM6 writes at most 50 per PE per run, so there are usually fewer of them than truncations; – means no file of that kind.
| Output folder | Model period | Truncations | Max CFL | Location records (U / V) | PEs at the record cap |
|---|---|---|---|---|---|
| output000 | ? → 1959-01 | 10 | 0.33 | 1 / 9 | – |
The other 15 output folders had no truncations.
Where MOM6 truncates (1° boxes, most records first; from the U_velocity_truncations and V_velocity_truncations files):
| Location | Records | Grid cells | Seen in output | Velocity | Layers | Max speed (m/s) | Max CFL | Surface height (m) | Depth (m) |
|---|---|---|---|---|---|---|---|---|---|
| 65.2°W, 61.3°N | 9 | 5 | 000 | U, V | 1–1 | 32.6 | 2.22 | 0.04 | 153 |
| 65.6°W, 61.4°N | 1 | 1 | 000 | V | 1–1 | 8.1 | 0.55 | 0.02 | 243 |
* MOM6 writes at most 50 records per PE per run (MAX_TRUNC_FILE_SIZE_PER_PE), and this box's PE hit that cap in at least one run, so it truncated more often than the record count shows. Surface height is the top-interface height e, shown only for records that include layer 1; depth is the shallower of the two cells (D).
Check this on Gadi: the truncation counts, locations and settings
# WHAT THIS DOES: re-checks the 'Truncation locations' section from the files MOM6 wrote. A
# truncation is when MOM6 had to cut a velocity that was too fast (its CFL number was above 0.5): a
# sign of numerical trouble. The steps below are separate, so you can paste just the one you need.
# Each prints something you can compare with the page.
A=/scratch/x77/aek156/access-om3/archive/MC_25km_jra_iaf+wombatlite-test5-38867fcd
# Step 1: for each output folder: how many truncations MOM6 reported, the largest CFL number, and how many location records were written
for o in "$A"/output[0-9]*; do
# ocean.stats is a table with one line per time step. Its 3rd column ('Truncs') is the truncations at that
# step. awk adds that column up. (-F, means the columns are separated by commas. The header line is skipped
# because its first column is not a number.)
total=$(awk -F, '$1+0 == $1 {sum += $3} END {print sum+0}' "$o/ocean.stats" 2>/dev/null)
# The 5th column holds two numbers; the second one is the CFL number. awk keeps the largest.
cfl=$(awk -F, '$1+0 == $1 {split($5, a, " "); if (a[2] > max) max = a[2]} END {if (max != "") printf "%.2f", max}' "$o/ocean.stats" 2>/dev/null)
# Every truncation also gets a 'location record' in the U and V files. grep -c counts the matching lines.
u=$(grep -c 'velocity violation' "$o/U_velocity_truncations" 2>/dev/null)
v=$(grep -c 'velocity violation' "$o/V_velocity_truncations" 2>/dev/null)
# ${x:--} means: use x, or a dash if x is empty (no such file)
echo "$(basename "$o"): truncations ${total:--}, max CFL ${cfl:--}, location records U/V ${u:--}/${v:--}"
done
# Step 2: where it happens. Each record contains the place, like '( 73.27 E 67.89 N)'. This counts the records in
# boxes one degree wide (negative longitude means west), busiest first. The pipeline does this:
# grep: keep the lines that start a record sed: keep only the longitude and latitude
# awk: round them to whole degrees sort | uniq -c: count the records in each box
# sort -rn | head: busiest boxes first
grep -h 'velocity violation' "$A"/output[0-9]*/[UV]_velocity_truncations 2>/dev/null \
| sed -E 's/.*\( *(-?[0-9.]+) E +(-?[0-9.]+) N\).*/\1 \2/' \
| awk '{printf "%4.0fE %4.0fN\n", $1, $2}' \
| sort | uniq -c | sort -rn | head -n 15
# Step 3: MOM6 writes at most 50 records per PE (one of the parallel processes) in one run, then stops. A PE with
# 50 records may have truncated more often than the records show. This lists the PEs that reached 50.
for f in "$A"/output[0-9]*/[UV]_velocity_truncations; do
[ -f "$f" ] || continue # skip if there is no such file
# each record says which PE it came from ('violation at 6073:'); count the records per PE, keep PEs with 50
busy=$(grep -h 'velocity violation' "$f" | sed -E 's/.*violation at ([0-9]+):.*/PE\1/' | sort | uniq -c | awk '$1 >= 50 {printf "%s (%d records) ", $2, $1}')
echo "$(basename "$(dirname "$f")")/$(basename "$f"): $busy"
done
# Step 4: one record in full. The page reads the speed (u, v), the CFL number, the surface height (e) and the
# depth (D) from lines like these.
head -n 30 "$A"/output000/U_velocity_truncations
# Step 5: the model period of each output folder, from payu's run records (output NNN is run NNN)
python3 - "$A" <<'EOF'
import glob, json, os, sys
# payu keeps one small file for every run: payu_jobs/<number>/run/<job>.json. Read them all.
archive = sys.argv[1] # the archive folder, handed over by the shell line above
runs = []
for path in glob.glob(archive + "/payu_jobs/*/run/*.json"):
try:
with open(path) as f:
record = json.load(f)
record["file"] = path # remember which file it came from
runs.append(record)
except (OSError, ValueError):
pass # skip a file we may not read, or that is not valid JSON
# Put the runs in order: by run number, and by start time if a run was tried more than once.
runs.sort(key=lambda r: (int(r.get("payu_current_run") or 0), r.get("timings", {}).get("payu_start_time") or ""))
for r in runs:
run, finish = r.get("payu_current_run"), r.get("model_finish_time")
if str(run).isdigit() and finish: # only runs that finished have a model period
start = r.get("model_start_time") or "?" # payu did not record the start of the first run
print("output%03d %s -> %s" % (int(run), start[:7], finish[:7]))
EOF
Settings changed during this run
This comes from the git history of the payu control directory, and this experiment has no run_dir in experiments.yml. Add one to see here every edit made to the model's settings and build during the run, with the old and new values.